【Nginx】Nginx配置文件解读和4种常用实现负载均衡的方式

艺帆风顺 发布于 2025-04-03 22 次阅读


 前提:首先先了解一下正向代理和反向代理的理论知识,再直接解读nginx配置文件和实现负载均衡的4种方式。

Nginx是一个强大的开源Web服务器和反向代理服务器,它支持正向代理和反向代理功能。下面是对两者的简要解释:

正向代理

        正向代理是在客户端和目标服务器之间充当中间人的代理服务器。当客户端请求访问目标服务器时,请求先发送到正向代理服务器,然后由代理服务器转发请求给目标服务器,并将目标服务器的响应返回给客户端。正向代理隐藏了客户端的真实IP地址,使得目标服务器无法直接识别和追踪客户端。

        简而言之:正向代理是客户端访问代理服务器去访问目标服务器,并且对目标服务器隐藏了客户端的真实信息(IP等信息)。

正向代理的主要用途包括:

  • 访问被限制的资源:当某些资源受到网络限制或访问限制时,可以使用正向代理绕过这些限制来获取资源。

  • 提高访问速度:代理服务器可以缓存经常请求的资源,从而提高客户端访问资源的速度。

  • 突破防火墙:正向代理可以帮助绕过企业或国家防火墙的限制,访问被封锁的网站或资源。

反向代理

        反向代理是在服务器端和客户端之间充当中间人的代理服务器。当客户端发送请求访问反向代理服务器时,代理服务器会根据一定的规则将请求转发给后端的多个服务器中的一台,然后将后端服务器的响应返回给客户端。反向代理隐藏了真实的服务端,对于客户端而言,它们并不知道具体访问的是哪一台后端服务器。

        简而言之:反向代理是指代理服务器接收客户端的请求,然后反向代理将客户端的请求分发给一个或多个目标服务器,最后将响应返回给客户端,对于客户端隐藏了真实的服务端信息。

反向代理的主要用途包括:

  • 负载均衡:反向代理可以根据一定的算法将请求均匀地分发给后端的多台服务器,从而实现负载均衡,提高系统的并发处理能力和稳定性。

  • 缓存静态资源:反向代理可以缓存经常请求的静态资源,减少后端服务器的负载,提高网站的访问速度。

  • 安全性和可靠性:反向代理可以作为防火墙和安全设备,提供安全认证、访问控制、DDoS攻击防护等功能。

总结:

  • 正向代理和反向代理都是利用代理服务器作为中间人来转发请求和响应。

  • 正向代理是客户端通过代理服务器发送请求,代理服务器帮助客户端发送请求到互联网上的目标服务器。隐藏客户端的真实IP地址(目标服务器并不知道是那个真实的客户端访问的)。

  • 反向代理是客户端通过代理服务器发送请求,代理服务器将请求转发到后端的多个服务器中的一个。反向代理隐藏真实的服务端(客户端并不知道那个后端服务器响应的结果)。

  • 两者的区别在于请求的流向和代理服务器与目标服务器的关系,正向代理中代理服务器与客户端处于同一侧(客户端通过代理服务器获取特定的资源),反向代理中代理服务器与目标服务器处于同一侧(服务端通过代理服务器处理客户端的请求)。

Nginx配置文件

nginx 的组成部分

        配置文件中有很多#, 开头的表示注释内容,我们去掉所有以 # 开头的段落,精简之后的 内容如下:

    • #user nobody; 是用来指定 Nginx 进程运行的用户和用户组的配置项。在 Linux 系统中,各个进程需要以某个用户的身份来运行,以限制权限并提高安全性worker_processes 1;

      events {worker_connections 1024;}

      http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;

      server {listen 8080;server_name localhost;

      location / {root html;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}}

    nginx 配置文件有三部分组成


    第一部分:全局块

    比如上面第一行配置的:

     worker_processes 1;

            这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是 会受到硬件、软件等设备的制约。

    第二部分:events块

    比如上面的配置:

    1. events {

    2. worker_connections 1024;

    3. }

            events 块涉及的指令 主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大网络连接数等。
    上述例子就表示每个 work process 支持的最大连接数为 1024.
    这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

    第三部分:http块
    1. http {

    2. include mime.types;

    3. default_type application/octet-stream;

    4. sendfile on;

    5. keepalive_timeout 65;

    6. server {

    7. listen 8080;

    8. server_name localhost;

    9. location / {

    10. root html;

    11. index index.html index.htm;

    12. }

    13. error_page 500 502 503 504 /50x.html;

    14. location = /50x.html {

    15. root html;

    16. }

    17. }

    18. }

    需要注意的是:http 块也可以包括 http全局块、server 块。

    http全局块

            http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

    server 块

             这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了 节省互联网服务器硬件成本。
    每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
    而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。

    Nginx常用的实现负载均衡的4种方式

    Nginx提供了多种方式实现负载均衡,以下是其中几种常用的方式:

    轮询(Round Robin):

            这是默认的负载均衡算法,Nginx按照请求的顺序依次将请求分配给后端的服务器。每个服务器按照其权重来处理请求,然后按顺序循环分配。这种算法简单且平均地将负载分配给后端服务器,适用于后端服务器配置相同、处理能力相当的场景。

    1. http {

    2. upstream backend {

    3. server 192.168.1.101:8080;

    4. server 192.168.1.102:8080;

    5. server 192.168.1.103:8080;

    6. }

    7. server {

    8. listen 80;

    9. location / {

    10. proxy_pass http://backend;

    11. }

    12. }

    13. }

    IP哈希(IP Hash):

            Nginx根据客户端的IP地址进行哈希运算,并根据计算结果将请求分配给固定的后端服务器。这种算法保证了相同的客户端IP每次请求都会被分配到相同的服务器,适用于需要保持会话状态的应用。

    1. http {

    2. upstream backend {

    3. ip_hash;

    4. server 192.168.1.101:8080;

    5. server 192.168.1.102:8080;

    6. server 192.168.1.103:8080;

    7. }

    8. server {

    9. listen 80;

    10. location / {

    11. proxy_pass http://backend;

    12. }

    13. }

    14. }

    加权轮询(Weighted Round Robin):

            Nginx根据每个后端服务器的配置权重将请求分配给服务器。权重越高的服务器,处理的请求就越多。这种方式适用于后端服务器之间配置不同、处理能力不同的情况下。

    1. http {

    2. upstream backend {

    3. server 192.168.1.101:8080 weight=3;

    4. server 192.168.1.102:8080 weight=2;

    5. server 192.168.1.103:8080 weight=1;

    6. }

    7. server {

    8. listen 80;

    9. location / {

    10. proxy_pass http://backend;

    11. }

    12. }

    13. }

     最少连接(Least Connections):

            Nginx会统计每个后端服务器当前的活动连接数,并将请求分配给活动连接数最少的服务器,以实现负载均衡。这种算法适用于后端服务器配置和处理能力不同、连接持续时间不均衡的场景。

    1. http {

    2. upstream backend {

    3. least_conn;

    4. server 192.168.1.101:8080;

    5. server 192.168.1.102:8080;

    6. server 192.168.1.103:8080;

    7. }

    8. server {

    9. listen 80;

    10. location / {

    11. proxy_pass http://backend;

    12. }

    13. }

    14. }

    什么是跨域?

            跨域(跨域资源共享(Cross-Origin Resources Sharing ,CORS))是指跨域名:域名,记忆网络电脑ip很难记,就给它取了一个名字来记忆,这个名字就要域名。域名最终要被转换为ip地址。跨域是指跨域名的访问,从一个域名的系统去访问另一个域名系统www.baidu.com-www.jd.com,以下情况都属于跨域:

    当一个请求url的协议、域名、端口号三者之间任意一个与当前页面url不同即为跨域。

    负载均衡

    什么是负载均衡【降低后端某个服务器的压力 】

    在高并发的情况下,一台服务器的负载承受不住,我们就需要使用服务器集群来解决高并发,但是又会出现另一个问题,就是客户端的请求如何分配给多个服务器,所以在服务器集群中,需要一个服务器充当一个【负载均衡器-Nginx】【NameServer-也可以是一个集群】的作用,用户的所有请求都会都会由负载均衡器【NameServer】进行接收,调度者根据每台服务器的负载情况通过负载均衡算法将请求分配给某一台后端服务器进行处理。

    负载均衡算法比如轮询、权重、随机、区域等等

    RoundRobbonRule:简单轮询,ribbon默认规则

    AvailabilityFilteringRule:忽略短路状态和并发过高的服务器

    WeightedResponseTimeRule:根据服务器响应时间作为权重,响应时间越长权重越小

    ZoneAvoidanceRule:根据区域选择可用的服务器

    BestAvailableRule:忽略短路的服务器,选择并发较低的服务器

    RandomRule:随机选择一个可用服务器

    Retry:重试机制的选择逻辑【不建议】

    动静分离

            为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速 度。降低原来单个服务器的压力。【各司其职】

    Nginx常用命令

    a. 使用nginx操作命令前提

    使用nginx操作命令前提:必须进入到nginx的自动生成目录的下/sbin文件夹下。

            就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序。

    查看 nginx 的版本号

    ./nginx -v

    启动 nginx

    ./nginx

    关闭nginx

    ./nginx -s stop

    重新加载 nginx

    在目录:/usr/local/nginx/sbin 下执行命令,不需要重启服务器,自动编译。

    ./nginx -s reload

      版权声明:本文内容来自CSDN:Mxin5,遵循CC 4.0 BY-SA版权协议上原文接及本声明。本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。原文链接:https://blog.csdn.net/m0_64210833/article/details/131954254如有涉及到侵权,请联系,将立即予以删除处理。在此特别鸣谢原作者的创作。此篇文章的所有版权归原作者所有,与本公众号无关,商业转载建议请联系原作者,非商业转载请注明出处。