外观
3.1 站点配置
约 863 字
Nginx反向代理
本页对应「三、操作步骤」的 3.1,完成站点配置。返回上级:Nginx 反向代理配置指南。
前置条件
- nginx 已安装并运行,
nginx -t当前无报错,/etc/nginx/sites-enabled目录存在。 - 后端应用在 127.0.0.1:3000 监听,且提供
/healthz健康检查接口。 - 站点根目录 /srv/axis/www 存在,属主为 www-data 且可读,目录具备执行位。
- 已在 ufw 与安全组放通 80,便于配置完成后立即验证。
- 已确认后端健康检查接口不依赖外部服务,避免健康检查本身因依赖故障而返回非 200,干扰判断。
操作步骤
- 备份现有配置,回滚时整目录还原。备份放在 /root 下,避免被 nginx 误加载。
sudo cp -a /etc/nginx /root/nginx.bak
nginx -v- 新建
/etc/nginx/sites-available/example.com.conf。upstream 负责后端地址与连接复用,server 块负责域名匹配与请求分发。
upstream axis_app {
server 127.0.0.1:3000;
keepalive 32;
}
server {
listen 80;
server_name example.com www.example.com;
root /srv/axis/www;
index index.html;
access_log /var/log/nginx/example.access.log;
error_log /var/log/nginx/example.error.log warn;
location /assets/ {
expires 30d;
add_header Cache-Control "public";
try_files $uri =404;
}
location / {
proxy_pass http://axis_app;
proxy_http_version 1.1;
proxy_set_header Connection "";
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_read_timeout 60s;
}
}- 启用站点并移除默认站点。默认站点监听 80 且 server_name 为
_,不删除会抢走未匹配的请求。
sudo ln -sfn /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/example.com.conf
sudo rm -f /etc/nginx/sites-enabled/default- 校验并重载。校验失败时不要重载,先按提示行号修正。
sudo nginx -t
sudo systemctl reload nginx- 绕开 Nginx 直连后端,确认问题出在哪一层。直连正常而代理异常说明问题在 Nginx 侧,反之在应用侧。
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:3000/healthz
curl -sSI -H 'Host: example.com' http://203.0.113.10/ | head -n 3结果确认
nginx -t输出 successful,systemctl is-active nginx返回 active。curl -I http://example.com返回 200,响应头server为 nginx,X-Forwarded-For相关后端日志能看到真实客户端地址。- 直连 127.0.0.1:3000/healthz 返回 200,说明后端本身正常。
- 请求 /assets/ 下已存在的文件返回 200,不存在的返回 404 而非 502,说明静态规则命中且未转发到后端。
nginx -T输出中能搜到 example.com.conf 的内容,确认文件被实际加载。curl -sS -o /dev/null -w '%{http_code}\n' -H 'Host: example.com' http://127.0.0.1/healthz返回后端真实状态码,说明代理按原路径转发而未改写 URI。
注意事项
- upstream 名称与 proxy_pass 中的名称必须一致,改名要同步两处,否则报
no resolver defined或直接 502。 - 正则与前缀 location 的匹配顺序会影响结果,静态资源规则要放在
location /之前,否则资源请求会被转发到后端。 - keepalive 需配合
proxy_http_version 1.1与空 Connection 头,否则连接不会复用,高并发下会出现端口耗尽。 - 修改后不要用 restart 代替 reload,restart 会中断正在处理的请求,且会重建监听套接字。
X-Forwarded-Proto必须传递,否则应用生成的跳转链接会退回 http,在 HTTPS 场景下产生混合内容告警。- 配置中显式指定了 access_log 与 error_log 路径,多站点部署时按域名分文件,避免所有站点写入同一份全局日志。
- 静态目录的
try_files $uri =404不能省,省略后请求不存在文件会被转发到后端,返回 502 而不是 404,误导排查方向。