【Nginx】配置参数和使用案例

【Nginx】配置参数和使用案例

【一】反向代理和负载均衡参数

【1】重点参数介绍

分为两大部分:

(1)http 块:负载均衡上游服务器池 upstream

(2)server 块:反向代理、转发规则、健康检查、超时、缓存、重试控制

listen:监听的端口

server_name:监听的服务ip

location /indapi/:过滤/indapi/的请求路径

proxy_pass:代理转发的服务池或者具体的ip端口路径

【2】完整模板案例

bash 复制代码
# nginx.conf 主配置文件
worker_processes auto;
worker_rlimit_nofile 65535;

events {
    worker_connections 10240;
    use epoll;
    multi_accept on;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    # 日志格式
    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  logs/access.log  main;

    sendfile        on;
    tcp_nopush     on;
    tcp_nodelay    on;

    keepalive_timeout  65;
    keepalive_requests 1000;

    gzip on;
    gzip_min_length 1k;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    # ===================== 负载均衡上游服务池 =====================
    upstream backend_server {
        # 后端服务节点
        server 127.0.0.1:8080 weight=1 max_fails=3 fail_timeout=30s;
        server 127.0.0.1:8081 weight=1 max_fails=3 fail_timeout=30s;
        server 192.168.1.100:8082 backup;
        server 192.168.1.101:8083 down;

        # 负载均衡算法(默认轮询)
        # ip_hash;                   # 固定IP分发,会话保持
        # least_conn;                # 最少连接优先
        # hash $request_uri consistent; # url一致性哈希

        # 后端长连接复用,提升性能
        keepalive 64;
    }

	# 服务池名称:damp.gateway,代理转发到gateway服务
	upstream damp.gateway {
        server 172.17.0.79:20110;
    }

    # ===================== 反向代理服务 =====================
    server {
        listen       80;
        server_name  api.example.com;

        # 错误页面
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }

        # 全局反向代理公共参数
        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_set_header X-Forwarded-Proto $scheme;

        # 转发超时控制
        proxy_connect_timeout 60s;
        proxy_read_timeout 120s;
        proxy_send_timeout 60s;

        # 缓冲区,避免后端小包频繁写响应
        proxy_buffer_size 64k;
        proxy_buffers 4 128k;
        proxy_busy_buffers_size 256k;

        # 开启后端长连接,配合 upstream keepalive
        proxy_http_version 1.1;
        proxy_set_header Connection "";

        # 核心业务转发规则
        location / {
            proxy_pass http://backend_server; # 指向上面的负载均衡池
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
            proxy_next_upstream_tries 3;      # 最多重试3台节点
            proxy_next_upstream_timeout 10s;   # 重试总超时
        }

        # 静态资源单独缓存,不走后端(可选)
        location ~* \.(jpg|png|css|js|ico)$ {
            proxy_pass http://backend_server;
            expires 1d;
            add_header Cache-Control "public";
        }
    }
}

【3】upstream 负载均衡模块参数

bash 复制代码
upstream backend_server {
    server 127.0.0.1:8080 weight=1 max_fails=3 fail_timeout=30s;
    server 127.0.0.1:8081 weight=1 max_fails=3 fail_timeout=30s;
    server 192.168.1.100:8082 backup;
    server 192.168.1.101:8083 down;
    keepalive 64;
}

(1)核心参数

(1)server ip:port

后端应用服务地址,SpringBoot 服务地址。

(2)weight = 数字

权重,默认 1,数值越大分配请求越多;权重轮询算法。

例:weight=2 接收两倍流量。

(3)max_fails=3

最大失败次数,3 次访问失败后标记节点故障。

(4)fail_timeout=30s

节点故障后,30 秒内不再转发流量到该节点,30 秒后重试探测。

(5)backup

备用节点,所有正常节点挂了才启用。

(6)down

永久下线节点,流量不分配,用于维护停机。

(7)keepalive 64

Nginx 与后端服务保持 64 个长连接,减少 TCP 握手开销,高并发优化。

(2)四种负载均衡调度算法

(1)默认轮询(不配置任何算法)

请求依次分配给每台后端,均匀分发。

(2)ip_hash;

根据客户端 IP 哈希固定分配同一台后端,实现会话保持。

缺点:IP 分布不均时流量倾斜;节点增减会哈希重分布。

(3)least_conn;

优先转发给当前活跃连接最少的后端,适合后端处理耗时不一致场景。

(4)hash 变量 consistent;

一致性哈希,常用 hash $request_uri consistent;

按 URL 哈希,相同接口固定打同一台服务;节点扩容影响小,适合缓存服务。

【4】proxy 反向代理核心参数解析

(1)listen 指令:监听端口 / 地址 / 附加参数

(1)基础语法

bash 复制代码
listen address[:port] [参数1] [参数2] ...;
# 最简写法
listen 80;
listen 443 ssl;
listen 127.0.0.1:8080;
listen [::]:80; # 监听所有IPv6地址80端口

(2)基础监听配置说明

1-listen 80;

监听本机所有网卡的 80 端口(0.0.0.0:80),外网、内网、本地均可访问。

2-listen 192.168.1.10:80;

只监听本机指定内网 IP 的 80 端口,其他网卡 IP 无法访问该 server 块。

3-listen :::443;

兼容 IPv6,同时监听所有 IPv6 地址 443 端口。

4-listen 80 default_server;

默认虚拟主机:当请求域名不匹配任何 server_name 时,全部交给这个 server 处理。

一个端口只能有一个 default_server。

(2)server_name 指令:虚拟主机域名匹配

作用:同一端口下多个网站 / API 域名区分,实现一台 Nginx 绑定多个域名分流。

(1)基础语法

bash 复制代码
server_name 域名1 域名2 泛域名;

(2)精准域名匹配

bash 复制代码
server_name api.example.com;
server_name api.example.com admin.example.com;

完全匹配请求 Header 里的 Host 字段,仅访问对应域名才进入当前 server 块。

(3)泛域名匹配

前缀泛域名,匹配所有二级域名:a.example.comadmin.example.compay.example.com,不匹配根域名 example.com

bash 复制代码
server_name *.example.com;

后缀泛域名,匹配 api.xxx.comapi.xxx.cn,极少用。

bash 复制代码
server_name api.*;

(3)透传客户端真实信息

bash 复制代码
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_set_header X-Forwarded-Proto $scheme;

Host $host:把原始请求域名传给后端,后端可拿到访问域名

X-Real-IP $remote_addr:单代理场景直接拿到客户端真实 IP

X-Forwarded-For:多级代理时,串联所有上游 IP,后端通过这个取真实客户端 IP

X-Forwarded-Proto:传递 http/https 协议,后端判断是否 HTTPS 访问

(4)超时时间(防止卡死)

bash 复制代码
proxy_connect_timeout 60s;   # 与后端建立TCP连接超时
proxy_read_timeout 120s;     # 连接成功后,读取后端响应超时(长接口/文件上传调大)
proxy_send_timeout 60s;      # 向后端发送请求数据超时

(5)缓冲区优化(高并发必配)

bash 复制代码
proxy_buffer_size 64k;          # 响应头缓冲区
proxy_buffers 4 128k;           # 4块128k缓冲区存响应体
proxy_busy_buffers_size 256k;   # 忙时最大缓冲

不配置会导致 Nginx 小块多次转发,增加 IO 损耗。

(6)长连接优化(配合 upstream keepalive)

bash 复制代码
proxy_http_version 1.1;
proxy_set_header Connection "";

HTTP1.0 默认短连接,开启后复用 TCP 连接,大幅提升 QPS。

(7)proxy_pass 转发地址规则

bash 复制代码
location /api/ {
    proxy_pass http://backend_server;      # 不带/:保留location前缀转发
    # proxy_pass http://backend_server/;   # 带/:抹掉location匹配前缀
}

示例区分:访问 /api/user

(1)不带 /:不会抹掉前缀:/api/,转发 http://xxx/api/user

(2)带 /:会抹掉前缀:/api/,转发 http://xxx/user

(8)故障自动重试 proxy_next_upstream

bash 复制代码
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_next_upstream_tries 3;
proxy_next_upstream_timeout 10s;

遇到网络错误、超时、5xx 错误自动切换下一台健康节点重试

tries:单请求最多换 3 台机器

timeout:整个重试流程总超时 10 秒

【5】模板案例

bash 复制代码
http {
    upstream backend_server {
        server 127.0.0.1:8080 weight=1 max_fails=3 fail_timeout=30s;
        server 127.0.0.1:8081 weight=1 max_fails=3 fail_timeout=30s;
        keepalive 64;
    }

    # HTTP 80 端口服务
    server {
        # listen完整参数示例
        listen       80 default_server reuseport backlog=65535;
        # 精准业务域名
        server_name  api.example.com www.example.com;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        location / {
            proxy_pass http://backend_server;
        }
    }

    # HTTPS 443 端口服务
    server {
        listen       443 ssl http2 reuseport backlog=65535;
        server_name  api.example.com www.example.com;

        ssl_certificate cert/api.pem;
        ssl_certificate_key cert/api.key;

        location / {
            proxy_pass http://backend_server;
        }
    }

    # 兜底非法域名拦截
    server {
        listen 80;
        server_name _;
        return 403;
    }
}

【二】反向代理和负载均衡案例

【1】反向代理转发请求到gateway案例

nignx 配置文件,监听的 ip 为localhost,端口为 20100,现在系统管理服务、公共管理服务、指标平台服务都注册在 nacos,统一通过 gateway 请求转发,如果请求前缀为 /api/ 就转发到系统管理,前缀为 /commapi/ 就转发到公共服务管理,前缀为 /indapi/ 就转发到指标平台管理,配置反向代理的案例

(1)请求url:http://172.17.0.79:20100/indapi/v1/indtable/syncDimLevelByTableId/2058813120728453121

(2)nginx部署在前端服务器,监听localhost的20100端口

(3)因为有/indapi/前缀,所以location匹配到proxy_pass转发http://gateway_cluster/damp-ind-api/,末尾带/表示抹掉/indapi/前缀,最终转发地址为:http://gateway_cluster/damp-ind-api/v1/indtable/syncDimLevelByTableId/2058813120728453121

(4)gateway_cluster时upstream配置的服务池,对应gateway网关服务

(5)此时http://172.17.0.79:20100/indapi/v1/indtable/syncDimLevelByTableId/2058813120728453121被反向代理到gateway网关服务

(6)gateway网关服务中配置路由,根据/damp-ind-api路由到指标平台服务

(7)指标平台服务中@Controller("/v1/indtable")匹配到请求,@GetMapping("/syncDimLevelByTableId")匹配到接口,完成本次请求

bash 复制代码
worker_processes auto;
worker_rlimit_nofile 65535;

events {
    worker_connections 10240;
    use epoll;
    multi_accept on;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    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  logs/api_20100.log  main;

    sendfile        on;
    tcp_nopush     on;
    tcp_nodelay    on;
    keepalive_timeout 65;

    gzip on;
    gzip_min_length 1k;
    gzip_types text/plain text/css application/json application/javascript text/xml;

    # 上游:SpringCloud Gateway 网关集群(网关注册nacos,这里写网关部署地址)
    upstream gateway_cluster {
        server 172.17.0.79:20110 weight=1 max_fails=3 fail_timeout=30s;
        # 多网关实例可追加
        # server 127.0.0.1:8100 weight=1 max_fails=3 fail_timeout=30s;
        keepalive 64;
    }

    server {
        # 仅监听本机localhost 20100端口,外部网络访问不到
        listen       20100;
        server_name  localhost;

		#文件最大值
        client_max_body_size 100m;
		
        # 透传客户端真实IP、协议、域名给网关&后端微服务
        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_set_header X-Forwarded-Proto $scheme;

        # 超时配置
        proxy_connect_timeout 60s;
        proxy_read_timeout 120s;
        proxy_send_timeout 60s;

        # 缓冲区优化
        proxy_buffer_size 64k;
        proxy_buffers 4 128k;
        proxy_busy_buffers_size 256k;

        # 开启长连接,提升网关转发性能
        proxy_http_version 1.1;
        proxy_set_header Connection "";

        # 故障自动切换网关节点
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_next_upstream_tries 2;
        proxy_next_upstream_timeout 10s;

        # 1. /api/ 系统管理服务
        location /api/ {
            proxy_pass http://gateway_cluster/damp-base-sys-api/;
            proxy_redirect off;
        }

        # 2. /commapi/ 公共管理服务
        location /commapi/ {
            proxy_pass http://gateway_cluster/damp-base-common-api/;
            proxy_redirect off;
        }

        # 3. /indapi/ 指标平台服务
        location /indapi/ {
            proxy_pass http://gateway_cluster/damp-ind-api/;
            proxy_redirect off;
        }

        # 未匹配前缀统一返回404
        location / {
            return 404;
        }

        # 统一错误页面
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }
}

【2】负载均衡datax集群案例

有 3 台 datax 服务器组成集群,通过 nginx 路由转发,默认轮询机制,nginx 配置反向代理和负载均衡的案例

bash 复制代码
worker_processes auto;
worker_rlimit_nofile 65535;

events {
    worker_connections 10240;
    use epoll;
    multi_accept on;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    # 访问日志
    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  logs/datax_proxy.log  main;

    sendfile        on;
    tcp_nopush     on;
    tcp_nodelay    on;
    keepalive_timeout 60;

    gzip on;
    gzip_min_length 2k;
    gzip_types text/plain application/json text/css application/javascript;

    # ===================== DataX集群上游池(默认轮询) =====================
    upstream datax_cluster {
        server 192.168.10.101:8088 max_fails=3 fail_timeout=30s;
        server 192.168.10.102:8088 max_fails=3 fail_timeout=30s;
        server 192.168.10.103:8088 max_fails=3 fail_timeout=30s;

        # 默认轮询,无需额外配置算法
        # ip_hash;       # 开启则会话保持,注释掉使用轮询
        # least_conn;    # 最少连接算法,本次不用

        # Nginx与DataX服务复用长连接,减少TCP握手开销
        keepalive 128;
    }

    # ===================== 反向代理服务块 =====================
    server {
        listen       8090 reuseport backlog=65535;
        server_name  localhost datax-proxy;

        # 透传客户端真实IP、域名、协议给后端DataX服务
        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_set_header X-Forwarded-Proto $scheme;

        # DataX同步任务执行时间长,调大读写超时
        proxy_connect_timeout 30s;
        proxy_read_timeout 600s;
        proxy_send_timeout 30s;

        # 响应缓冲区优化
        proxy_buffer_size 128k;
        proxy_buffers 4 256k;
        proxy_busy_buffers_size 512k;

        # 开启HTTP1.1长连接,配合upstream keepalive
        proxy_http_version 1.1;
        proxy_set_header Connection "";

        # 后端异常自动切换下一台节点重试
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_next_upstream_tries 2;
        proxy_next_upstream_timeout 20s;

        # 全局路由,全部转发至datax集群
        location /datax/ {
            proxy_pass http://datax_cluster;
        }

        # 统一错误页面
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }
}
相关推荐
啵啵鱼爱吃小猫咪2 小时前
Ubuntu 20.04 + ROS Noetic 源码安装 libfranka 0.8.0 和 franka_ros 0.8.0 完整教程
linux·运维·ubuntu
Piko6143 小时前
锐捷 VSU 虚拟化堆叠配置
运维·网络·笔记
ljs6482739513 小时前
Linux运维实操:vi编辑器永久配置静态IP(CentOS系列)
linux·运维·编辑器
2301_780303903 小时前
网络安全、自动化运维、ERP、CRM、MES
运维·web安全·网络安全·自动化·安全威胁分析
AOwhisky3 小时前
Python 学习笔记(第三期)——流程控制:条件判断与循环结构
运维·笔记·python·学习·云原生·流程控制·循环
IpdataCloud4 小时前
AI生成的Avalon恶意框架怎么防?用IP离线库识别模块化C2通信
运维·人工智能·网络协议·tcp/ip·ip
极客先躯4 小时前
高级java每日一道面试题-2026年03月30日-实战篇[Docker]-如何监控容器的网络流量?
java·运维·docker·容器·prometheus·高级面试
brave_zhao4 小时前
nginx的进程架构
java·学习·nginx
Waay5 小时前
Linux 三个核心环境变量配置文件、作用域、生效方式完整梳理
linux·运维·学习·云原生·容器