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
systemctl status 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;

放在 serverlocation 中。超过限制时会返回 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 看上传大小限制。