Nginx 反向代理:让一个域名同时服务多个应用

举报
yd_271493268 发表于 2026/10/28 09:31:40 2026/10/28
【摘要】 一台服务器上跑了三个服务:博客在 3000 端口、API 在 8000 端口、管理后台在 9000 端口。难道要让用户记三个带端口的地址?Nginx 反向代理就是干这个的:用户只访问一个域名,Nginx 在后面把请求分发到对应的服务。 正向代理 vs 反向代理,一句话分清正向代理是替客户端出门(比如你通过代理上网,服务器不知道你是谁);反向代理是替服务端接客(用户只看到 Nginx,不知道后...

一台服务器上跑了三个服务:博客在 3000 端口、API 在 8000 端口、管理后台在 9000 端口。难道要让用户记三个带端口的地址?Nginx 反向代理就是干这个的:用户只访问一个域名,Nginx 在后面把请求分发到对应的服务。

正向代理 vs 反向代理,一句话分清

正向代理是替客户端出门(比如你通过代理上网,服务器不知道你是谁);反向代理是替服务端接客(用户只看到 Nginx,不知道后面到底是哪个服务在干活)。我们今天说的就是后者。

最小可用配置

假设域名是 example.com,博客跑在本地 3000 端口。Nginx 配置只需要几行:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

改完检查配置、重载生效:

nginx -t && nginx -s reload

proxy_set_header 这两行别漏:没有它们,后端应用拿到的 Host 和客户端 IP 都是 127.0.0.1,日志、限流、HTTPS 跳转全会乱。

一个域名带多个应用:按路径分流

博客、API、后台共用一个域名,用路径区分:

location / {
    proxy_pass http://127.0.0.1:3000;   # 博客
}
location /api/ {
    proxy_pass http://127.0.0.1:8000;   # API 服务
}
location /admin/ {
    proxy_pass http://127.0.0.1:9000;   # 管理后台
}

注意 /api/ 后面的斜杠:location /api/ 配 proxy_pass http://127.0.0.1:8000;(末尾无 URI)时,完整路径会原样转发;如果写成 proxy_pass http://127.0.0.1:8000/;(末尾有斜杠),/api/ 前缀会被替换掉。两种写法结果不一样,配完一定要用 curl 实测一条请求看路径对不对。

两个常见坑

坑 1:改完配置没生效。 只改文件不重载等于没改。每次改完先 nginx -t 检查语法,再 nginx -s reload。nginx -t 报错时不要 reload,先把语法修好。

坑 2:后端拿不到真实 IP。 只写 proxy_pass 不写 proxy_set_header X-Real-IP,后端日志里所有请求都来自 127.0.0.1。上面最小配置里的两行 header 就是解药;如果后端是多层代理,再加 X-Forwarded-For。

进阶:HTTPS 一步到位

域名 + HTTPS 是生产标配。用 certbot 一条命令就能把证书和跳转都配好:

certbot --nginx -d example.com

它会自动改 Nginx 配置、加 443 监听、把 HTTP 跳转到 HTTPS。证书 90 天过期,certbot 会自动续,不用操心。

一句话总结

反向代理 = 一个入口、后面多个服务:proxy_pass 定去向,proxy_set_header 保真信息,location 按路径分流,改完 nginx -t + reload。先把最小配置跑通,再按需加路径分流和 HTTPS。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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