导航
导航
文章目录
  1. nginx的好处
    1. 热部署
    2. 高并发连接
  2. Nginx能做什么
    1. 反向代理
    2. 负载均衡
    3. HTTP服务器
    4. 正向代理
  3. node的特点
    1. node应用场景
    2. Event Loop、消息队列、事件轮询
  4. nginx和node的比较
  5. nginx与node的完美搭配

Nginx与Node的纠缠

前言:前几天面试被问到:“nginx的好处?nginx和node的比较”,所以在这里总结一波。

nginx的好处

  • 热部署
  • 高并发连接
  • 处理响应请求很快
  • 具有很高的可靠性

热部署

在不停止服务的情况下修改配置文件,更换日志文件等功能。

高并发连接

高并发:是指在同一个时间点,有很多用户同时的访问URL地址,比如:淘宝的双11,双12,就会产生高并发。

这是一个很重要的一个特性!在这一个 互联网 快速发展, 互联网 用户数量不断增加,一些大公司、网站都需要面对高并发请求,如果有一个能够在峰值顶住10万以上并发请求的Server,肯定会得到大家的青睐。理论上,Nginx支持的并发连接上限取决于你的内存,10万远未封顶。

Nginx能做什么

  • 反向代理
  • 负载均衡
  • HTTP服务器(包含动静分离)
  • 正向代理

反向代理

反向代理应该是Nginx做的最多的一件事了,什么是反向代理呢,以下是百度百科的说法:反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。

下面贴上一段简单的实现反向代理的代码:

1
2
3
4
5
6
7
8
9
server {  
listen 80;
server_name localhost;

location / {
proxy_pass http://localhost:8081;
proxy_set_header Host $host:$server_port;
}
}

当我们访问localhost的时候,就相当于访问localhost:8081了

负载均衡

负载均衡可以把用户的请求分摊到多个服务器上进行处理,从而实现了对海量用户的访问支持。负载均衡的架构如图所示:

简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
upstream test {
server localhost:8080;
server localhost:8081;
}

server {
listen 81;
server_name localhost;

location / {
proxy_pass http://test;
proxy_set_header Host $host:$server_port;
}
}

HTTP服务器

Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,同时现在也很流行动静分离,就可以通过Nginx来实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
listen 80;
server_name localhost;

location / {
root /home/hzzly;
index index.html index.htm;
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

正向代理

正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。当你需要把你的服务器作为代理服务器的时候,可以用Nginx来实现正向代理。

node的特点

  • 它是一个javascript运行环境
  • 依赖于Chrome V8引擎进行代码解释
  • 事件驱动
  • 非阻塞I/O
  • 轻量、可伸缩,适于实时数据交互应用
  • 并发连接(高并发)

node应用场景

NodeJS适合运用在高并发、I/O密集、少量业务逻辑的场景。(RESTful API,聊天)

Event Loop、消息队列、事件轮询

通过回调函数(Callback)和异步机制来实现非阻塞。
通过事件队列和事件循环来实现并发连接。

异步函数在执行结束后,会在事件队列中添加一个事件(回调函数)(遵循先进先出原则),主线程中的代码执行完毕后(即一次循环结束),下一次循环开始就在事件队列中“读取”事件,然后调用它所对应的回调函数。这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)

nginx和node的比较

  • 一个更专业,一个更全面。
  • Nginx 采用C编写,性能更高,但是它仅适合于做web服务器,用于反向代理或者负载均衡等服务。
  • NodeJs高性能平台,web服务只是其中一块,NodeJs在处理业务层用的是JS编写,采用的是异步编程方式和思维方式。
  • Node.js发展方向不再单独是一个Web服务器,而是一个面向网络的平台,它甚至可以是TCP服务器,或者变身为远端服务器的客户端。

nginx与node的完美搭配

node自己本身可以作为服务器进行驱动,但是node本身对文件的处理能力并不是很好,所以当我们的生产环境中应尽量使用nginx来处理静态的资源以及反向代理,同时也解决了node分布式以及负载均衡的相关问题。