nginx反向代理配置

Nginx 反向代理配置

这份文档讲的是 Nginx 反向代理的常见写法,也就是:

  • 域名访问先到 Nginx
  • Nginx 再把请求转发到本机或内网服务

这也是最常见的服务部署方式。

你可以把它理解成:

  • 所有请求先到 NGINX
  • 再由 NGINX 分发给不同的后端服务或应用
  • 真实后端被隐藏在后面

统一仍然使用多站点结构:

/etc/nginx/sites-available/
├── example.com
├── another-site.com
└── default

0. 反向代理配置流程图

flowchart TD
A[开始] --> B[确认后端服务监听端口]
B --> C[写 /etc/nginx/sites-available/站点名]
C --> D[设置 server_name 和日志]
D --> E[location / 中写 proxy_pass]
E --> F[补齐常见代理头]
F --> G[启用到 sites-enabled]
G --> H[执行 nginx -t]
H --> I{配置是否通过}
I -- 否 --> J[修正代理配置]
J --> H
I -- 是 --> K[reload nginx]
K --> L[完成]

1. 你要怎么写

举个最常见的例子:

  • 用户访问:https://api.example.com
  • Nginx 收到请求
  • Nginx 转发到:http://127.0.0.1:8080

也就是说,用户看到的是域名,真正处理业务的是后面的应用服务。

2. 最基础的反向代理配置

假设后端服务监听在:

127.0.0.1:8080

站点文件:

sudo vim /etc/nginx/sites-available/api.example.com

内容:

server {
listen 80;
listen [::]:80;
server_name api.example.com;

access_log /var/log/nginx/api.example.com.access.log;
error_log /var/log/nginx/api.example.com.error.log warn;

client_max_body_size 50m;

location / {
proxy_pass http://127.0.0.1:8080;
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_connect_timeout 5s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}

3. 这些代理配置是什么意思

  • proxy_pass
    把请求转发给后端服务
  • proxy_http_version 1.1
    常见反代配置,很多服务会用到
  • Host
    把原始域名传给后端
  • X-Real-IP
    传真实客户端 IP
  • X-Forwarded-For
    传代理链中的客户端来源 IP
  • X-Forwarded-Proto
    传当前请求协议,告诉后端是 http 还是 https

4. 写完了怎么检查和启用

启用:

sudo ln -s /etc/nginx/sites-available/api.example.com /etc/nginx/sites-enabled/api.example.com

先检查配置:

sudo nginx -t

通过后重载:

sudo systemctl reload nginx

5. 带 WebSocket 的常见反向代理

如果你的后端服务有 WebSocket,通常还要补这几行:

server {
listen 80;
listen [::]:80;
server_name ws.example.com;

location / {
proxy_pass http://127.0.0.1:9000;
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;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

6. 按路径做反向代理

有时候不是一个域名全部转发,而是只把某个路径转发到后端,例如:

  • 静态页面自己处理
  • /api/ 转发给后端接口服务

示例:

server {
listen 80;
listen [::]:80;
server_name example.com;

root /var/www/example.com;
index index.html;

location / {
try_files $uri $uri/ /index.html;
}

location /api/ {
proxy_pass http://127.0.0.1:8080/;
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;
}
}

7. 一个默认兜底站点

多站点环境下,仍然建议保留默认兜底站点:

server {
listen 80 default_server;
listen [::]:80 default_server;
return 444;
}

8. 使用时要注意的事

  1. 后端服务最好监听 127.0.0.1 或内网地址,不要直接裸露到公网
  2. 一个域名一个站点文件
  3. 代理配置里尽量补齐常见请求头
  4. WebSocket 和普通 HTTP 反代写法不完全一样
  5. 改完配置一定先 nginx -t
  6. 如果后面要上 HTTPS,就在这个 server 基础上继续加 443 配置