Nginx配置参数和使用案例解析
作者:fixAllenSun
【一】反向代理和负载均衡参数
【1】重点参数介绍
分为两大部分:
(1)http 块:负载均衡上游服务器池 upstream
(2)server 块:反向代理、转发规则、健康检查、超时、缓存、重试控制
listen:监听的端口
server_name:监听的服务ip
location /indapi/:过滤/indapi/的请求路径
proxy_pass:代理转发的服务池或者具体的ip端口路径
【2】完整模板案例
# 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 负载均衡模块参数
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)基础语法
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)基础语法
server_name 域名1 域名2 泛域名;
(2)精准域名匹配
server_name api.example.com; server_name api.example.com admin.example.com;
完全匹配请求 Header 里的 Host 字段,仅访问对应域名才进入当前 server 块。
(3)泛域名匹配
前缀泛域名,匹配所有二级域名:a.example.com、admin.example.com、pay.example.com,不匹配根域名 example.com
server_name *.example.com;
后缀泛域名,匹配 api.xxx.com、api.xxx.cn,极少用。
server_name api.*;
(3)透传客户端真实信息
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)超时时间(防止卡死)
proxy_connect_timeout 60s; # 与后端建立TCP连接超时 proxy_read_timeout 120s; # 连接成功后,读取后端响应超时(长接口/文件上传调大) proxy_send_timeout 60s; # 向后端发送请求数据超时
(5)缓冲区优化(高并发必配)
proxy_buffer_size 64k; # 响应头缓冲区 proxy_buffers 4 128k; # 4块128k缓冲区存响应体 proxy_busy_buffers_size 256k; # 忙时最大缓冲
不配置会导致 Nginx 小块多次转发,增加 IO 损耗。
(6)长连接优化(配合 upstream keepalive)
proxy_http_version 1.1; proxy_set_header Connection "";
HTTP1.0 默认短连接,开启后复用 TCP 连接,大幅提升 QPS。
(7)proxy_pass 转发地址规则
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
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】模板案例
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”)匹配到接口,完成本次请求
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 配置反向代理和负载均衡的案例
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;
}
}
}到此这篇关于Nginx配置参数和使用案例解析的文章就介绍到这了,更多相关nginx配置参数和使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
