proxy_pass、请求转发、header设置
反向代理是Nginx最重要的功能之一。客户端向反向代理发送请求,反向代理将请求转发到后端服务器,然后将后端服务器的响应返回给客户端。反向代理可以实现负载均衡、缓存、安全隔离等功能。
proxy_pass是Nginx反向代理的核心指令。
server {
listen 80;
server_name example.com;
location / {
# 代理到后端服务器
proxy_pass http://127.0.0.1:8000;
}
}
server {
listen 80;
server_name example.com;
# API请求代理到API服务器
location /api/ {
proxy_pass http://127.0.0.1:8000/;
}
# 静态资源代理到静态服务器
location /static/ {
proxy_pass http://127.0.0.1:8001/;
}
# 其他请求代理到Web服务器
location / {
proxy_pass http://127.0.0.1:8002;
}
}
server {
listen 80;
server_name example.com;
# 不带URI:保留原始请求路径
# 请求 /api/users -> http://backend/api/users
location /api/ {
proxy_pass http://backend;
}
# 带URI:替换匹配的路径
# 请求 /api/users -> http://backend/v1/users
location /api/ {
proxy_pass http://backend/v1/;
}
# 带URI(无斜杠)
# 请求 /api/users -> http://backend/v1users
location /api/ {
proxy_pass http://backend/v1;
}
}
代理请求时需要正确设置请求头,以便后端服务器获取客户端信息。
location / {
proxy_pass http://backend;
# 设置Host头为原始请求的Host
proxy_set_header Host $host;
# 设置真实客户端IP
proxy_set_header X-Real-IP $remote_addr;
# 设置代理链IP列表
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 设置原始协议(http或https)
proxy_set_header X-Forwarded-Proto $scheme;
# 设置原始请求的Host
proxy_set_header X-Forwarded-Host $host;
# 设置原始请求的端口
proxy_set_header X-Forwarded-Port $server_port;
}
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_set_header X-Custom-Header "MyValue";
proxy_set_header X-Request-ID $request_id;
proxy_set_header X-Client-IP $remote_addr;
# 删除某个请求头
proxy_set_header Authorization "";
}
代理缓冲可以提高性能,但需要合理配置。
location / {
proxy_pass http://backend;
# 启用代理缓冲(默认开启)
proxy_buffering on;
# 缓冲区大小(用于读取响应头)
proxy_buffer_size 4k;
# 缓冲区数量和大小(用于读取响应体)
proxy_buffers 8 4k;
# 繁忙时的缓冲区大小
proxy_busy_buffers_size 8k;
# 临时文件大小限制
proxy_max_temp_file_size 1024m;
# 临时文件写入大小
proxy_temp_file_write_size 8k;
}
合理设置超时时间可以避免请求长时间挂起。
location / {
proxy_pass http://backend;
# 连接后端服务器的超时时间
proxy_connect_timeout 60s;
# 从后端服务器读取响应的超时时间
proxy_read_timeout 60s;
# 向后端服务器发送请求的超时时间
proxy_send_timeout 60s;
# 长连接超时时间
proxy_next_upstream_timeout 0;
proxy_next_upstream_tries 0;
}
WebSocket需要特殊的代理配置。
location /ws/ {
proxy_pass http://backend;
# WebSocket必需的请求头
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 标准请求头
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 超时设置(WebSocket通常需要较长的超时时间)
proxy_connect_timeout 7d;
proxy_send_timeout 7d;
proxy_read_timeout 7d;
}
配置错误处理可以提高用户体验。
location / {
proxy_pass http://backend;
# 后端返回这些状态码时,尝试下一个服务器
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
# 拦截后端错误,返回自定义错误页面
proxy_intercept_errors on;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
upstream backend {
server 127.0.0.1:8000 weight=3;
server 127.0.0.1:8001 weight=2;
server 127.0.0.1:8002 backup;
}
server {
listen 80;
server_name 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_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
proxy_busy_buffers_size 8k;
# 超时配置
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
# 错误处理
proxy_next_upstream error timeout http_500 http_502 http_503;
proxy_intercept_errors on;
# 隐藏后端响应头
proxy_hide_header X-Powered-By;
proxy_hide_header Server;
# 添加自定义响应头
add_header X-Proxy-Cache $upstream_cache_status;
}
}
curl -H "Host: example.com" http://localhost/反向代理是Nginx的核心功能,通过proxy_pass指令可以将请求转发到后端服务器。合理配置请求头、缓冲区、超时时间和错误处理,可以构建高性能、高可用的反向代理系统。掌握反向代理配置是使用Nginx的基础。