Nginx 反向代理实战:从一个后端服务到 HTTPS 上线的配置清单

举报
yd_281047095 发表于 2026/10/31 09:08:00 2026/10/31
【摘要】 很多小项目上线时都会遇到同一个问题:后端服务跑在 127.0.0.1:8080,怎么让用户通过域名、用 HTTPS 安全地访问?最常见的答案就是在前面放一层 Nginx 做反向代理。本文按照“能跑起来 → 配好头信息 → 上 HTTPS → 调优与排错”的顺序,整理一份可以直接照抄的配置清单。 一、为什么要加一层反向代理统一入口:一个 80/443 端口挂多个服务,按域名或路径分发。安全隔离...

很多小项目上线时都会遇到同一个问题:后端服务跑在 127.0.0.1:8080,怎么让用户通过域名、用 HTTPS 安全地访问?最常见的答案就是在前面放一层 Nginx 做反向代理。本文按照“能跑起来 → 配好头信息 → 上 HTTPS → 调优与排错”的顺序,整理一份可以直接照抄的配置清单。

一、为什么要加一层反向代理

  • 统一入口:一个 80/443 端口挂多个服务,按域名或路径分发。
  • 安全隔离:后端只监听本机地址,不直接暴露到公网。
  • 卸载 TLS:证书、加密都在 Nginx 处理,后端只管业务。
  • 附加能力:静态文件缓存、gzip 压缩、限流、访问日志,一处配置全站生效。

二、最小可用配置

以 Ubuntu 为例,安装后在 /etc/nginx/conf.d/app.conf 写入:

server {
    listen 80;
    server_name app.example.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
    }
}

检查并重载:

sudo nginx -t          # 先检查语法,养成习惯
sudo systemctl reload nginx

reload 不会中断已有连接,比 restart 更适合线上。

三、把真实信息传给后端

只写 proxy_pass 时,后端看到的客户端 IP 全是 127.0.0.1,协议也永远是 http。补上这几行:

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;
}

后端框架(如 Spring Boot、Express、Django)一般需要开启“信任代理”选项,才会读取这些头。

一个经典坑:proxy_pass 末尾带不带 / 含义不同。

  • location /api/ { proxy_pass http://127.0.0.1:8080; }:请求 /api/user 原样转发为 /api/user。
  • location /api/ { proxy_pass http://127.0.0.1:8080/; }:会去掉匹配前缀,转发为 /user。

路径对不上导致 404 时,先看这里。

四、支持 WebSocket

聊天、实时日志等场景用到 WebSocket,需要显式转发升级头:

location /ws/ {
    proxy_pass http://127.0.0.1:8080;
    proxy_http_version 1.1;
    proxy_set_header Upgrade    $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 3600s;
}

proxy_read_timeout 默认 60 秒,长连接空闲超过就会被断开,按业务调大。

五、上 HTTPS

用 Certbot 申请免费证书最省事:

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d app.example.com

Certbot 会自动改写配置并添加续期定时任务。也可以手动写成下面这样,结构更清晰:

server {
    listen 80;
    server_name app.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name app.example.com;

    ssl_certificate     /etc/letsencrypt/live/app.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/app.example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;

    location / {
        proxy_pass http://127.0.0.1:8080;
        include /etc/nginx/proxy_params;
    }
}

续期是否正常,可以用 sudo certbot renew --dry-run 演练一次。使用云服务器时,别忘了在安全组里放行 443 端口。

六、几个实用的调优项

client_max_body_size 50m;     # 上传文件过大报 413 时调这个
gzip on;
gzip_types text/css application/javascript application/json;

location /static/ {
    alias /var/www/app/static/;
    expires 7d;               # 静态资源直接由 Nginx 返回并缓存
}

简单限流可以防止接口被刷:

limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;

location /api/ {
    limit_req zone=api burst=20 nodelay;
    proxy_pass http://127.0.0.1:8080;
}

七、常见报错速查

现象 常见原因 排查方法
502 Bad Gateway 后端没启动或端口写错 ss -ltnp | grep 8080、curl 127.0.0.1:8080
504 Gateway Timeout 后端处理太慢 看后端日志,适当调大 proxy_read_timeout
413 Request Entity Too Large 上传体积超限 调大 client_max_body_size
403 Forbidden 静态目录权限不足 检查目录对 nginx 用户是否可读
配置改了不生效 没 reload 或被其他 server 块抢先匹配 nginx -T 查看最终生效配置

排错时最有用的两个文件:/var/log/nginx/error.log 和 access.log。用 tail -f 边访问边看,大部分问题一眼就能定位。

八、小结

一套靠谱的反向代理配置,核心就是:后端只听本机、Nginx 统一入口、头信息转发完整、HTTPS 强制跳转、改完先 nginx -t 再 reload。把本文的片段按需组合,基本能覆盖中小项目从开发到上线的大部分需求。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。