04.Nginx反向代理与负载均衡

代理服务器

正向代理是针对客户端,而反向代理是针对服务器

正向代理

image

反向代理(Reverse Proxy)

image

Nginx中的反向代理

简单的反向代理

实现反向代理功能的是一个叫做proxy_pass的模块。

worker_processes  1;

events {
    worker_connections  1024;
}

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

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  E:/temp/nginx-1.26.3/logs/access.log  main;
    error_log   E:/temp/nginx-1.26.3/logs/error.log;

    server {
        listen       80;
        server_name  localhost;

        location /8001 {                                    # 所有请求
            proxy_pass http://localhost:8001/;              # 把请求都交给http://localhost:8001来处理
        }
    }

}

请求 http://localhost/8001 时,将请求交给 http://localhost:8001/ 处理

反向代理的参数设置

此反向代理配置增加了一些反向代理属性,这些属性一般用于生产环境下对代理性能要求很高的环境中。

//仅显示server段

server {
    listen 80;
    server_name www.b.com;

    location / {

        proxy_redirect off;                                           # 禁用代理服务器响应头的Location重定向调整

        # 请求头设置
        proxy_set_header Host $host;                                  # 传递原始请求的Host头
        proxy_set_header X-Real-IP $remote_addr;                      # 传递客户端真实IP地址
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 构建完整的X-Forwarded-For头

        # 连接超时设置(单位:秒)
        proxy_connect_timeout 90;                                     # 初始连接超时时间
        proxy_send_timeout 90;                                        # 发送请求超时时间
        proxy_read_timeout 90;                                        # 读取响应超时时间

        # 缓冲区配置
        proxy_buffer_size 4k;                                         # 初始缓冲区大小
        proxy_buffers 4 32k;                                          # 使用4个32KB缓冲区(总128KB)
        proxy_busy_buffers_size 64k;                                  # 忙时允许使用的最大缓冲区大小
        proxy_temp_file_write_size 64k;                               # 临时文件写入阈值

        proxy_pass http://172.16.213.77:5601;
    }
}

提取代理参数配置文件

将 Nginx 配置参数提取到单独文件中,使用时直接引用即可

  1. 创建配置文件
    在 Nginx 配置目录下创建一个专门用来配置代理参数的配置文件(如 proxy.conf):

    sudo nano /usr/local/nginx/conf.d/proxy.conf
    
  2. 提取公共配置
    将需要复用的代理配置块提取到新文件:

    # proxy.conf - 公共反向代理配置
    # 存放于 /usr/local/nginx/conf.d/proxy.conf
    
    # 请求头设置
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
    # 连接超时设置
    proxy_connect_timeout 90;
    proxy_send_timeout 90;
    proxy_read_timeout 90;
    
    # 缓冲区配置
    proxy_buffer_size 4k;
    proxy_buffers 4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
    
  3. 在主配置中引用
    修改原 server 配置文件,通过 include 引入公共配置:

    server {
        listen 80;
        server_name www.b.com;
    
        location / {
            include /usr/local/nginx/conf.d/proxy.conf;  # 引入公共配置
    
            proxy_redirect off;
            proxy_pass http://172.16.213.77:5601;
        }
    }
    
  • 优势说明

    1. 模块化管理:配置逻辑分离,便于统一维护
    2. 复用性:多个 server/location 可共享此配置
    3. 可读性:主配置文件更简洁,核心逻辑更清晰
  • 注意事项

    • 确保配置路径正确,Nginx 默认搜索 conf.d/ 目录下的文件
    • 使用 nginx -t 测试配置语法
    • 修改配置后需执行 systemctl reload nginx 生效

location 和 proxy_pass 中的 斜杠/

image-20250312195305564

先开启nginx日志,修改配置之后,使用nginx -s reload重新加载配置,使用curl http://localhost/test4/xxx发起请求,通过error.log和access.log查看请求的网址与修改后的地址。

1、 结尾不带/,nginx 将会保留 location 中路径部分,

location /test1 {
    proxy_pass http://localhost:8080;
}
当访问 http://localhost/api1/xxx 时,会代理到 http://127.0.0.1:8080/api1/xxx

location /test3 {
    proxy_pass http://localhost:8080/ccc;
}
http://localhost/test3/xxx 被替换为 http://127.0.0.1:8080/ccc/xxx

2、 结尾带/,nginx 将对location中路径部分进行替换

location /test2/ {
    proxy_pass http://localhost:8080/;
}
访问 http://localhost/test2/xxx 被替换成了 http://127.0.0.1:8080/xxx

location /test4/ {
    proxy_pass http://localhost:8080/ccc/;
}
http://localhost/test4/xxx     http://127.0.0.1:8080/ccc/xxx

3、一个结尾带/,一个结尾不带/,结果可能会出错

location /test4 {
    proxy_pass http://localhost:8080/ccc/;
}
http://localhost/test4/xxx      http://127.0.0.1:8080/ccc//xxx

location /test3/ {
    proxy_pass http://localhost:8080/ccc;
}
http://localhost/test3/xxx     http://127.0.0.1:8080/cccxxx

location /test2 {
    proxy_pass http://localhost:8080/;
}
访问 http://localhost/test2/xxx 被替换成了 http://127.0.0.1:8080/xxx

location /test1/ {
    proxy_pass http://localhost:8080;
}
当访问 http://localhost/api1/xxx 时,会代理到 http://127.0.0.1:8080/api1/xxx

负载均衡

配置负载均衡

Nginx负载均衡是通过在Nginx配置文件中的http模块中,添加upstream模块定义后端服务器列表,并在server模块中使用proxy_pass将请求转发到upstream,从而提高系统的负载均衡。

http {
    upstream  myserver {
        server   192.168.12.181:80 weight=3 max_fails=3 fail_timeout=20s;
        server   192.168.12.182:80 weight=1 max_fails=3 fail_timeout=20s;
        server   192.168.12.183:80 weight=4 max_fails=3 fail_timeout=20s;
    }
    server {
        listen 80;
        server_name www.domain.com 192.168.12.189;
        index index.htm index.html;
        root  /data/web/wwwroot;  
        location / {
            proxy_pass http://myserver;
            proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;
            include    /usr/local/nginx/conf/proxy.conf;
        }
    }
}

支持的负载均衡算法

  1. 轮询(默认)

    • 原理:每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器死机,故障系统被自动剔除,使用户访问不受影响。
    • 配置示例
      upstream backend {
          server server1;
          server server2;
      }
      
    • 适用场景:简单均衡分配,无特殊需求时默认使用。
  2. 权重(Weight)

    • 原理:指定轮询权值,按权重比例分配请求,权重越高分配概率越大。主要用于后端每个服务器性能不均的情况下。
    • 配置示例
      upstream backend {
          server server1 weight=3;  # 权重3
          server server2 weight=2;  # 权重2
          server server3;           # 权重1(默认)
      }
      
    • 适用场景:服务器性能差异较大时,优先分配高性能服务器。
  3. IP哈希(ip_hash)

    • 原理:每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器。一定程度上解决了动态网页存在的session共享问题。
    • 配置示例
      upstream backend {
          ip_hash;
          server server1;
          server server2;
          server server3;
      }
      
    • 优缺点
      • 优点:解决Session共享问题(如用户会话保持)。
      • 缺点:局域网IP集中可能导致负载不均,且故障时用户体验受影响。
    • 注意事项:启用ip_hash时,不能同时使用weightbackup
  4. 最少连接(least_conn)

    • 原理:将请求分配给当前活跃连接数最少的服务器。
    • 配置示例
      upstream backend {
          least_conn;
          server server1;
          server server2;
      }
      
    • 适用场景:长连接场景(如WebSocket),避免服务器负载不均。
  5. 第三方算法

    • fair:此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。
    • url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包

服务器状态参数

在HTTP Upstream模块中,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:

  • down:表示当前的server暂时不参与负载均衡。

  • backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。

  • max_fails=int:允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream模块定义的错误。

  • fail_timeout=time:在经历了max_fails次失败后,暂停服务的时间。

max_fails可以和fail_timeout一起使用。

注意事项

  • ip_hash的限制:当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。

  • 健康检查:默认无主动检测,需依赖第三方模块(如nginx_upstream_check_module)或Nginx Plus增强功能。

Nginx + Tomcat整合

Nginx与Tomcat整合的必要性

  1. 性能优化

    • 动态请求处理:Tomcat在高并发环境下处理动态请求(如JSP/Servlet)性能较低,容易成为瓶颈。
    • 静态资源处理:Tomcat处理静态资源(如HTML、CSS、图片)的吞吐量远低于Nginx。即使Tomcat支持epoll等优化技术,Nginx在静态资源服务方面仍更具优势。
  2. 架构扩展性需求 Nginx与Tomcat的耦合分为两个部分

    • 动静分离:将静态资源请求交由Nginx处理,动态请求转发给后端Tomcat,充分发挥两者优势,提升整体性能。
    • 负载均衡:通过Nginx将请求分发到多台Tomcat服务器,实现负载均衡,提升系统整体吞吐能力和高可用性。

配置示例

1. 动静分离

  • 功能划分:静态资源与动态请求分离模式
    • Nginx:直接处理静态资源(如CSS、JS、图片),减少Tomcat负载。
    • Tomcat:专注处理动态请求(如Servlet、JSP)。

  • 配置示例
# 处理静态资源
location ~\.(css|js|png|jpg)$ {
    root /path/to/static/files;
    # 代理优化的参数配置
}
# 转发动态请求
location / {
    proxy_pass http://tomcat_server;
    # 代理优化的参数配置
}

这里要注意,填写本地地址的时候,要用正斜杠 / 不要用反斜杠 \

2. 负载均衡模式

  • 功能:将所有请求通过Nginx分发到多个Tomcat实例,实现高可用和负载均衡。

负载均衡 Session 问题

  • 配置示例
upstream tomcat_cluster {
    server tomcat1:8080;
    server tomcat2:8080;
    server tomcat3:8080;
}
server {
    listen 80;
    location / {
        proxy_pass http://tomcat_cluster;
        # 代理优化的参数配置
    }
}

架构优点

通过以上整合,既能发挥Nginx的高性能静态服务和负载均衡能力,又能利用Tomcat处理复杂业务逻辑,是企业级Web应用的常见架构选择。

  • 性能提升:Nginx高效处理静态资源,Tomcat专注动态逻辑,减少资源浪费。
  • 高可用性:通过负载均衡避免单点故障,提升系统可靠性。
  • 扩展灵活:可根据流量增长横向扩展Tomcat节点,Nginx统一管理请求分发。

nginx

posted @ 2025-12-25 15:01  姬雨晨  阅读(6)  评论(0)    收藏  举报