详细介绍:nginx代理配置详解
一、什么是 Nginx 代理?
Nginx 代理分为两类:
- 正向代理:客户端通过 Nginx 访问外部资源,外部服务器认为请求来自 Nginx。
- 反向代理:客户端访问 Nginx,Nginx根据配置将请求转发到后端服务器,客户端并不知道后端服务器的真实地址。
Nginx 最常用于 反向代理,实现负载均衡、缓存和安全防护等。
二、反向代理配置详解
1. 基本反向代理
server {listen 80;server_name www.example.com;location / {proxy_pass http://backend_server;}
}
upstream backend_server {server 127.0.0.1:8080;server 192.168.1.2:8080;
}
说明:
proxy_pass:将请求转发到指定地址(可以是 IP,也可以是 upstream 定义的集群)。upstream:定义后端服务器集群,实现负载均衡。
2. 代理头部配置(保持客户端信息)
location / {proxy_pass http://backend_server;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:设置转发请求时的 HTTP 头部,保持真实客户端信息。
3. 代理 HTTPS
server {listen 443 ssl;server_name www.example.com;ssl_certificate /path/to/cert.pem;ssl_certificate_key /path/to/key.pem;location / {proxy_pass http://backend_server;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}
4. 反向代理常用参数
| 参数 | 作用 |
|---|---|
| proxy_pass | 指定后端服务器地址 |
| proxy_set_header | 设置转发请求头 |
| proxy_read_timeout | 后端响应超时时间 |
| proxy_connect_timeout | 连接后端超时时间 |
| proxy_buffering | 是否开启缓冲 |
| proxy_redirect | 重定向后端响应 |
| proxy_cookie_domain | 替换后端响应中的 Cookie 域名 |
| proxy_intercept_errors | 拦截错误页面,由 Nginx 自己处理 |
示例:
location /api/ {proxy_pass http://api_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_read_timeout 60s;proxy_connect_timeout 10s;proxy_buffering off;
}
三、正向代理配置
Nginx 默认不支持正向代理,需要开启 ngx_http_proxy_connect_module 模块(编译时加上),或者使用第三方模块。
简单 HTTP 正向代理:
server {listen 8888;location / {proxy_pass $scheme://$http_host$request_uri;proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;}
}
注意:正向代理有安全风险,生产环境慎用。
四、实际应用场景
- 跨域代理:解决前端开发跨域问题。
- 负载均衡:多台后端服务器分流压力。
- SSL 终端:Nginx 负责 HTTPS,后端为 HTTP。
- 缓存加速:Nginx 缓存后端内容,提升性能。
五、常见问题与排查
- 代理后端无法访问:检查
proxy_pass地址是否正确,后端服务是否启动。 - 头部丢失:确保
proxy_set_header设置了必要的头部。 - 请求超时:调整
proxy_read_timeout和proxy_connect_timeout。
六、完整示例
upstream backend {server 127.0.0.1:8080;server 127.0.0.1:8081;
}
server {listen 80;server_name www.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_read_timeout 60s;proxy_connect_timeout 10s;proxy_buffering off;}
}
七、Nginx 反向代理高级配置
1. 路径重写与子路径代理
有时候需要将某个路径代理到后端的不同路径:
location /api/ {proxy_pass http://backend_server/api/;
}
如果需要去掉 /api/ 前缀,可以这样:
location /api/ {proxy_pass http://backend_server/;rewrite ^/api/(.*)$ /$1 break;
}
2. 负载均衡策略
Nginx 提供多种负载均衡算法:
upstream backend {server 192.168.1.2:8080 weight=3;server 192.168.1.3:8080 weight=1;# 轮询(默认)、权重、ip_hash、least_connip_hash; # 按客户端IP分配请求# least_conn; # 最少连接数优先
}
3. 健康检查(第三方模块)
Nginx 默认没有主动健康检查,可以用 nginx_upstream_check_module 实现:
upstream backend {server 192.168.1.2:8080;server 192.168.1.3:8080;check interval=3000 rise=2 fall=5 timeout=1000 type=http;check_http_send "GET /health HTTP/1.0\r\n\r\n";check_http_expect_alive http_2xx http_3xx;
}
4. 缓存代理内容(proxy_cache)
Nginx 可作为缓存服务器,减轻后端压力:
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:10m max_size=1g inactive=60m use_temp_path=off;
server {location / {proxy_pass http://backend;proxy_cache mycache;proxy_cache_valid 200 302 10m;proxy_cache_valid 404 1m;proxy_cache_key "$scheme$request_method$host$request_uri";}
}
八、常见问题排查技巧
代理后端返回 502/504 错误
- 检查后端服务是否启动、端口是否可达。
- 检查 Nginx 的
proxy_connect_timeout、proxy_read_timeout设置是否合理。
跨域问题
可以在 Nginx 配置中添加响应头解决:
add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; add_header Access-Control-Allow-Headers 'Authorization,Content-Type';
静态资源与代理混用
可以用 location 区分:
location /static/ {root /var/www/html; } location / {proxy_pass http://backend; }
WebSocket 代理
WebSocket 需要特殊头:
location /ws/ {proxy_pass http://backend;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade"; }
九、性能优化建议
合理设置连接数与超时时间
worker_processes、worker_connections、keepalive_timeout等参数根据服务器能力调整。
开启缓存与压缩
启用
proxy_cache和gzip,减少后端压力与带宽消耗。gzip on; gzip_types text/plain application/json text/css application/javascript;
限制请求速率和并发
防止恶意攻击或流量突发:
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; location /api/ {limit_req zone=one burst=5;proxy_pass http://backend; }
十、Nginx 日志分析与调试
访问日志:定位请求问题
access_log /var/log/nginx/access.log;错误日志:定位代理错误
error_log /var/log/nginx/error.log warn;可以用
tail -f实时查看日志,配合grep筛查特定请求或错误。
十一、完整生产环境示例
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {worker_connections 1024;
}
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 /var/log/nginx/access.log main;sendfile on;keepalive_timeout 65;upstream backend {server 127.0.0.1:8080 weight=2;server 127.0.0.1:8081 weight=1;ip_hash;}proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:10m max_size=1g inactive=60m use_temp_path=off;server {listen 80;server_name www.example.com;location /static/ {root /var/www/html;}location /api/ {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_cache mycache;proxy_cache_valid 200 302 10m;add_header Access-Control-Allow-Origin *;}location /ws/ {proxy_pass http://backend;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";}}
}