Nginx反向代理的核心配置与工作原理
Nginx作为反向代理服务器,在服务器运维中承担请求转发、负载均衡、SSL卸载等关键角色。反向代理的本质是客户端不直接访问后端应用服务器,而是通过Nginx中转,Nginx根据预设规则将请求分发到后端多台服务器上。
负载均衡策略配置详解
Nginx的upstream模块提供了多种负载均衡算法,配置语法如下:
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
upstream backend_weighted {
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=2;
server 192.168.1.12:8080 weight=1;
}
upstream backend_iphash {
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
upstream backend_least {
least_conn;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
加权轮询适合后端服务器性能不均的场景,weight值越大被分配到的请求越多。IP哈希适合需要会话保持的场景,同一客户端IP的请求始终路由到同一台后端服务器。最少连接数策略会优先将请求分配给当前连接数最少的服务器,适合请求处理时间差异较大的场景。
健康检查机制配置
Nginx开源版自带被动健康检查,当后端服务器返回错误时自动标记为不可用。但开源版不支持主动健康检查(需Nginx Plus或第三方模块)。以下是通过max_fails和fail_timeout实现被动健康检查的配置:
upstream backend {
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 max_fails=3 fail_timeout=30s backup;
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://backend;
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 5s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
}
location /health {
access_log off;
return 200 "healthy";
add_header Content-Type text/plain;
}
}
backup参数标记的服务器只在其他所有服务器都不可用时才接收流量。max_fails=3表示30秒内失败3次则标记为不可用,fail_timeout=30s表示不可用状态持续30秒后会重新尝试。
使用nginx_upstream_check模块实现主动健康检查
被动健康检查依赖实际请求触发的错误,无法在后端宕机后立即感知。安装nginx_upstream_check_module后可配置主动探测:
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
check interval=3000 rise=2 fall=3 timeout=2000 type=http;
check_http_send "HEAD /health HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
server {
listen 80;
location /status {
check_status;
access_log off;
}
}
interval=3000表示每3秒检测一次,rise=2表示连续2次成功后标记为可用,fall=3表示连续3次失败后标记为不可用。check_http_send定义发送的检测请求,check_http_expect_alive定义期望的响应状态码。
SSL卸载与性能优化
高并发场景下,SSL握手是重要的性能瓶颈。将SSL卸载到Nginx层,后端服务器只处理HTTP请求,能显著提升整体吞吐量:
server {
listen 443 ssl http2;
server_name api.example.com;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets on;
location / {
proxy_pass http://backend;
proxy_set_header X-Forwarded-Proto https;
}
}
server {
listen 80;
server_name api.example.com;
return 301 https://$host$request_uri;
}
ssl_session_cache缓存SSL会话参数,避免重复握手;ssl_session_tickets使用会话票据实现会话恢复,减少CPU消耗。开启http2能复用TCP连接,进一步降低延迟。在高并发场景下,建议将worker_processes设置为CPU核数,worker_connections设置为10240以上,并开启epoll模型。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/nginx-fan-xiang-dai-li-pei-zhi-shi-zhan-fu-zai-jun-heng-yu/