Nginx 常用于对外提供 HTTPS 入口,然后把请求反向代理到后端服务。这样后端应用可以专注业务逻辑,TLS 证书、静态文件、压缩、限流、访问日志等由 Nginx 统一处理。
本文介绍一个常见配置:用户通过 https://example.com 访问 Nginx,Nginx 转发到本机 127.0.0.1:8080 的后端服务。
前提条件
假设已经具备:
- 域名
example.com 解析到服务器公网 IP。
- 后端服务监听
127.0.0.1:8080。
- 已安装 Nginx。
- 已获取证书文件和私钥文件。
Ubuntu 安装 Nginx:
1 2
| apt update apt install nginx
|
检查状态:
基础反向代理配置
创建站点配置:
1
| vim /etc/nginx/sites-available/example.com
|
HTTP 配置:
1 2 3 4 5 6 7 8 9 10 11 12
| server { listen 80; server_name example.com www.example.com;
location / { proxy_pass http://127.0.0.1:8080; 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; } }
|
启用配置:
1 2 3
| ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com nginx -t systemctl reload nginx
|
nginx -t 用于检查语法,生产环境修改配置后必须先执行。
配置 HTTPS
假设证书文件路径:
1 2
| /etc/ssl/example.com/fullchain.pem /etc/ssl/example.com/privkey.pem
|
HTTPS 配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| server { listen 80; server_name example.com www.example.com; return 301 https://$host$request_uri; }
server { listen 443 ssl http2; server_name example.com www.example.com;
ssl_certificate /etc/ssl/example.com/fullchain.pem; ssl_certificate_key /etc/ssl/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers off;
location / { proxy_pass http://127.0.0.1:8080; 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 https; } }
|
HTTP 请求会 301 跳转到 HTTPS。X-Forwarded-Proto 告诉后端原始请求协议是 HTTPS,很多框架生成回调地址或重定向地址时会用到。
后端超时配置
默认代理超时可能不适合所有业务。可以按需设置:
1 2 3 4 5 6 7 8 9 10 11
| location / { proxy_pass http://127.0.0.1:8080; 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 https;
proxy_connect_timeout 5s; proxy_send_timeout 30s; proxy_read_timeout 30s; }
|
如果后端有长轮询、文件上传或流式接口,超时需要单独调整,不建议全站设置过大。
上传大小限制
Nginx 默认上传大小可能不够。可以配置:
1
| client_max_body_size 20m;
|
放在 server 或 location 中。超过限制时会返回 413。
如果后端也有限制,例如 Spring Boot、FastAPI、网关层,也要同步调整,否则 Nginx 放行后后端仍然可能拒绝。
静态文件代理
如果有静态文件,可以让 Nginx 直接处理:
1 2 3 4 5 6 7 8 9 10 11 12 13
| location /static/ { alias /var/www/example/static/; expires 7d; add_header Cache-Control "public"; }
location / { proxy_pass http://127.0.0.1:8080; 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 https; }
|
注意 alias 路径最后的 /。路径配置错误时容易出现 404。
访问日志和错误日志
建议为站点单独配置日志:
1 2
| access_log /var/log/nginx/example.access.log; error_log /var/log/nginx/example.error.log;
|
排查问题时常用:
1 2
| tail -f /var/log/nginx/example.error.log tail -f /var/log/nginx/example.access.log
|
如果出现 502,通常表示 Nginx 无法连接后端服务。检查:
1 2
| curl -i http://127.0.0.1:8080 systemctl status app
|
如果出现 504,通常表示后端响应超时或网络阻塞。
配置安全响应头
可以增加一些基础安全头:
1 2 3
| add_header X-Content-Type-Options nosniff always; add_header X-Frame-Options SAMEORIGIN always; add_header Referrer-Policy strict-origin-when-cross-origin always;
|
HSTS 要谨慎开启:
1
| add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
|
只有确认整个域名和子域名都能长期支持 HTTPS 时再启用 HSTS,否则可能导致浏览器强制 HTTPS 后无法访问。
小结
Nginx 反向代理 HTTPS 的核心是:80 端口跳转 HTTPS,443 端口配置证书,proxy_pass 转发到后端,并正确传递 Host、真实 IP 和协议头。修改配置后先执行 nginx -t,再 reload。遇到 502 看后端连接,遇到 504 看超时,遇到 413 看上传大小限制。