理解 Nginx

简介

nginx 是一款开源的、高性能的 HTTP 服务器和反向代理服务器;同时也是一个 IMAP、POP3、SMTP 代理服务器。

nginx 是一款轻量级的 HTTP 服务器,对系统资源的消耗比较低。

nginx 可以作为一个 HTTP 服务器进行网站的发布处理,此外,nginx 还可以作为反向代理来实现负载均衡。

反向代理

代理服务器

代理服务器(Proxy Server)是一种重要的服务器安全功能,它的工作主要在开放系统互联(OSI)模型的会话层,从而起到防火墙的作用。

代理服务器大多被用来连接INTERNET(国际互联网)和 INTRANET(局域网)。

代理服务器其实就是一个代表、一个渠道或一个中转站。

代理服务器的功能就是代替用户去获取目标站点的信息。形象地说,代理就是网络通信中的中转站。

代理过程主要涉及三个角色:

  • 用户(客户端浏览器)
  • 代理服务器
  • 目标站点

一般情况下,用户都是直接访问目标站点,来获取目标站点的信息。这是没有使用代理服务器的情况。

当然,用户还可以通过代理服务器来访问目标站点。具体过程如下:因为有了代理服务器,用户在浏览器输入目标站点的网址后,该请求并不是由浏览器直接发给目标站点的,而是浏览器将请求交给代理服务器,由代理服务器来发送请求到目标站点;目标站点接收到代理服务器的请求后,将响应返回给代理服务器;代理服务器再将响应返回给用户的浏览器。

代理服务器的功能

  • 具有缓存的功能。大多数代理服务器在本机都有一个存储器,就好象一个大的 Cache,它会将新获取的数据存储在本机的存储器,如果浏览器所请求的数据在存储器上已经存在而且是最新的,那么代理服务器就不会去请求目标站点,而是直接将存储器上的数据返回给用户的浏览器。这样就能显著提高访问速度和效率。
  • 突破自身 IP 的访问限制。对于国外的部分网站(比如 youtube、google),在国内无法直接访问,这时,我们就可以使用代理服务器来访问国外的站点。或者,局域网内的用户想要访问局域网外的站点,也可以通过代理服务器来实现。
  • 隐藏自身的真实 IP。用户也可以通过代理服务器来隐藏自身的 IP。因为,用户通过代理服务器去访问目标站点,对于目标站点来说,它只知道请求来自哪个代理服务器,而不知道请求的真实用户。

正向代理

上面所说的代理服务器的代理过程,就是正向代理。也就是传统的代理。

正向代理的显著特征:

  • 隐藏了真实的客户端信息
  • 客户端浏览器必须进行特别的设置才能使用正向代理

正向代理的典型用途是为局域网内的用户提供访问 Internet 中资源的途径。

如果把局域网外的 Internet 中的各种站点资源想象成一个巨大的资源库,则局域网中的客户端想要访问 Internet 中的资源,就需要通过代理服务器来访问,这种代理服务就称为正向代理。

反向代理

反向代理的逻辑正好和正向代理相反。

反向代理的典型用途是为 Internet 的用户提供访问局域网内资源的途径。

如果把局域网内的各种站点资源比作一个资源库,则如果想要把局域网内的资源提供给 Internet 的用户访问,就需要提供一个代理服务器,将资源通过代理服务器开放给用户。这种代理服务,就称为反向代理。

也就是说,用户能够直接访问的是代理服务器,对于用户来说,真正的服务器端是隐藏的。

反向代理的显著特征:

  • 隐藏了真实的服务器端信息
  • 需要在反向代理服务器内部进行特别的配置

下面,我们着重介绍 Nginx 的反向代理。

实例分析

比如淘宝网站,每天同时访问淘宝的用户非常多,单台服务器已经处理不了。此时,淘宝就采用了分布式部署,也就是通过部署多台服务器来解决访问人数限制的问题。多台服务器通过一个 Nginx 反向代理服务器给用户提供访问淘宝的途径。

对于用户来说,这多台业务处理服务器(服务器 A,服务器 B ...)是隐藏的;用户只需访问 Nginx 代理服务器即可。

用户给淘宝发送请求,实际上请求的是 nginx 代理服务器,nginx 代理收到请求后,按照一定的规则将请求分发给后端的某台业务处理服务器进行处理,处理完成后将响应返回给 nginx 代理,然后 nginx 代理再将响应返回给用户的浏览器。

反向代理,主要用于服务器集群分布式部署的情况,反向代理隐藏了真实的服务器端的信息。

负载均衡

负载均衡(Load Balance)是指将流量(请求)按照某种规则分摊到多台服务器上,从而减轻单台服务器的压力。

负载均衡的两种常见形式:

  • 硬件负载均衡:硬件负载均衡也称为硬负载,如 F5 负载均衡,成本很高,但数据的稳定性、安全性等有非常好的保障,如中国移动会选择硬负载。
  • 软件负载均衡:出于成本考虑,很多公司会选择使用软件负载均衡,软件负载均衡是利用现有的技术结合主机硬件实现的一种消息队列分发机制。

用户给 nginx 反向代理服务器发送的请求,nginx 代理如何将其分发给业务处理服务器呢?

nginx 支持的负载均衡调度算法,包含以下这些:

  • weight 轮询(默认): 接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,nginx 会自动将该服务器剔除队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
  • ip_hash: 每个请求按照客户端的 ip 的 hash 结果进行匹配,这样的算法下,一个固定 ip 地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下 session 共享的问题。
  • fair: 智能调整调度算法,动态的根据后端服务器的响应时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是 nginx 默认不支持 fair 算法,如果要使用这种调度算法,请安装 upstream_fair 模块。
  • url_hash: 按照访问的 url 的 hash 结果分配请求,每个请求的 url 会指向后端固定的某个服务器,可以在 nginx 作为静态服务器的情况下提高缓存效率。同样要注意 nginx 默认不支持这种调度算法,要使用的话需要安装 nginx 的 hash 软件包。

反向代理实现负载均衡的配置

# 配置负载均衡的服务器列表
upstream my_server {
    # weigth 表示权重,值越打被分配到的几率越大
    server 192.168.8.1:80    weight=2;
    server 192.168.8.2:80    weight=4;
    server 192.168.8.3:80    weight=2;
}
    
server
{
    listen 80;
    server_name www.example.com;   # 网站的域名(反向代理服务器)
    location / {
        proxy_pass http://my_server;  # 转发到 my_server 定义的服务器集群
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        
    }
}

你可能感兴趣的:(web服务器,Nginx,反向代理,负载均衡)