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. 最基础的反向代理配置 假设后端服务监听在:
站点文件:
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 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. 按路径做反向代理 有时候不是一个域名全部转发,而是只把某个路径转发到后端,例如:
示例:
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. 使用时要注意的事
后端服务最好监听 127.0.0.1 或内网地址,不要直接裸露到公网
一个域名一个站点文件
代理配置里尽量补齐常见请求头
WebSocket 和普通 HTTP 反代写法不完全一样
改完配置一定先 nginx -t
如果后面要上 HTTPS,就在这个 server 基础上继续加 443 配置