Nginx 反向代理

反向代理(Reverse Proxy)指 Nginx 接收客户端请求,转发给后端服务(Node/Java/Go/PHP 等)再把响应原样返回。客户端只跟 Nginx 通信、看不到后端,因此 Nginx 常被称为"流量入口"或"网关"。

最小反向代理

反向代理链路 把 80 端口的请求全部转给本机 8080 端口的应用:

server {
    listen 80;
    server_name app.example.com;

    location / {
        proxy_pass http://127.0.0.1:8080;   # 后端地址:IP:端口 或域名
    }
}
sudo nginx -t && sudo systemctl reload nginx
curl -I http://app.example.com/
# 输出:HTTP/1.1 200 OK  ...  Server: nginx

proxy_pass 带不带 URI 的区别

proxy_pass 的值是否含路径,直接决定转发给后端的 URI:

location /api/ {
    proxy_pass http://127.0.0.1:8080;    # 不含 URI:原样转发 /api/users → /api/users
}
location /api/ {
    proxy_pass http://127.0.0.1:8080/;   # 含 URI(/):替换匹配前缀 /api/users → /users
}

规律:不带 URI 时把原始请求 URI 整个传给后端;带 URI(含路径部分)时,用 proxy_pass 里的路径替换掉 location 匹配到的那段前缀,例如写成 proxy_pass http://127.0.0.1:8080/v2/ 时,/api/users 会被改写成 /v2/users。

常用的 proxy_set_header

后端需要知道客户端真实信息,必须显式传递以下请求头:

location / {
    proxy_set_header Host              $host;                # 保持原始 Host
    proxy_set_header X-Real-IP         $remote_addr;         # 客户端真实 IP
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;  # 追加代理链路 IP
    proxy_set_header X-Forwarded-Proto $scheme;              # 原始协议 http/https
    proxy_pass http://127.0.0.1:8080;
}

$proxy_add_x_forwarded_for 等价于"原 X-Forwarded-For 值 + 客户端 IP",多级代理时逐级追加。

HTTP/1.1 与 keepalive

默认 Nginx 以 HTTP/1.0 向后端发请求;开启长连接需显式切到 1.1 并清空 Connection 头(配合 upstream 的 keepalive 使用,见第 10 章):

location / {
    proxy_http_version 1.1;
    proxy_set_header Connection "";      # 清空,交给后端按 keepalive 处理
    proxy_pass http://127.0.0.1:8080;
}

常用超时参数

指令默认值作用
proxy_connect_timeout60s与后端建立 TCP 连接的超时时间
proxy_read_timeout60s两次读后端响应数据之间的间隔超时
proxy_send_timeout60s两次向后端发送数据之间的间隔超时
proxy_bufferingon是否缓冲后端响应再发给客户端

后端处理慢(如导出大文件)时,按需调大 read/send 超时,否则容易 504。

常见后端反代示例

Node、Java(Tomcat)、Go 的反代写法一致,只改端口与 upstream 策略即可:

server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_http_version 1.1;
        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_pass http://127.0.0.1:3000;   # Node 默认 3000;Java/Tomcat 改 8080 等
    }
}

WebSocket 长连接代理需要额外处理 Upgrade 头,将在第 19 章专门讲解。

小结:反向代理围绕三个点——proxy_pass 指向后端、proxy_set_header 传递真实客户端信息、超时与 HTTP 版本保证连接稳定。若后端有多台机器,把它升级为 upstream 负载均衡即可,见下一章。

笔记加载中…