Linux:这啥命令?这台服务器我说了算-Nginx 反向代理——“一个门卫,怎么接待八百个网站?”

举报
yd_240046519 发表于 2026/11/12 10:07:20 2026/11/12
【摘要】 第十七章:Nginx 反向代理——“一个门卫,怎么接待八百个网站?”上一章跑起了网站。服务一多,总不能让用户记一串端口号吧?让 Nginx 当门卫,负责把请求送进正确的房间。环境:Ubuntu、Nginx、Python 3。仅供实验,勿直接用于生产。 1. 反向代理是啥?浏览器 ──> Nginx:8088 ──> /a/ ──> 服务A:9001 ...

第十七章:Nginx 反向代理——“一个门卫,怎么接待八百个网站?”

上一章跑起了网站。服务一多,总不能让用户记一串端口号吧?

让 Nginx 当门卫,负责把请求送进正确的房间。

环境:Ubuntu、Nginx、Python 3。仅供实验,勿直接用于生产。

1. 反向代理是啥?

浏览器 ──> Nginx:8088 ──> /a/ ──> 服务A:9001
                     └──> /b/ ──> 服务B:9002

客户端只找 Nginx,无需知道后端端口。这就是反向代理;它还能做 HTTPS 终止、负载均衡。

2. 先开两家“迷你店铺”

安装依赖(已有就跳过):

sudo apt update
sudo apt install -y nginx python3 curl

注意: 若 Docker 占用宿主机 80 端口,Nginx 可能启动失败。用 sudo ss -lntp 检查,勿随手停止生产服务。

准备两个网页:

mkdir -p ~/nginx-lab/{a,b}
printf '你好,我是 A 服务\n' > ~/nginx-lab/a/index.html
printf '你好,我是 B 服务\n' > ~/nginx-lab/b/index.html

分别启动两个仅监听本机的测试服务:

nohup python3 -m http.server 9001 --bind 127.0.0.1 \
  --directory "$HOME/nginx-lab/a" > ~/nginx-lab/a.log 2>&1 &

nohup python3 -m http.server 9002 --bind 127.0.0.1 \
  --directory "$HOME/nginx-lab/b" > ~/nginx-lab/b.log 2>&1 &

先验货:

curl http://127.0.0.1:9001/
curl http://127.0.0.1:9002/

应分别看到 A、B 的文字。

3. 给 Nginx 一张“带路地图”

在 Ubuntu 上新建配置:

sudo tee /etc/nginx/conf.d/lab-proxy.conf >/dev/null <<'EOF'
server {
    listen 8088;
    server_name _;

    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;

    location /a/ {
        proxy_pass http://127.0.0.1:9001/;
    }

    location /b/ {
        proxy_pass http://127.0.0.1:9002/;
    }
}
EOF

location 匹配路径,proxy_pass 指向后端,proxy_set_header 转发必要请求头。后端还须正确配置代理信任。

改完配置,先体检再上岗:

sudo nginx -t
sudo systemctl enable --now nginx
sudo systemctl reload nginx

启动失败先查端口和错误日志,别急着重启。

4. 验收:一个入口,两个服务

curl http://127.0.0.1:8088/a/
curl http://127.0.0.1:8088/b/

应分别返回 A、B。只需访问 8088,门卫负责带路。

一个斜杠引发的“迷路”

本例 proxy_pass 带末尾 /,因此 /a/test 会转成后端的 /test;去掉末尾 /,后端则收到 /a/test。

斜杠不是装饰品。 改完记得用 curl 验证。

5. 网站打不开,门卫怎么审?

现象 优先检查
502 Bad Gateway 后端进程是否存活、9001/9002 是否监听
404 Not Found location 匹配、路径前缀和后端文件
403 Forbidden 目录权限、访问规则
连接被拒绝 Nginx 是否监听 8088、防火墙是否放行

排障四连:

sudo nginx -t
sudo ss -lntp | grep -E ':(8088|9001|9002)\b'
curl -i http://127.0.0.1:9001/
sudo tail -n 30 /var/log/nginx/error.log

502 不一定是 Nginx 坏了,也可能是后端没上班。

6. 安全提醒与课后挑战

  • 测试后端只绑定 127.0.0.1;不要无故把内部端口暴露公网。
  • 本章用 HTTP 便于实验;正式对外服务应配置域名、HTTPS 和合理的访问控制。
  • 若只想在本机测试,可把 listen 8088; 改成 listen 127.0.0.1:8088;。

挑战: 新增一个 c 目录、在 9003 启动第三个测试服务,再配置 /c/ 转发。最后用 curl 验证三个路径。

实验结束后,如需删除代理配置:

sudo rm /etc/nginx/conf.d/lab-proxy.conf
sudo nginx -t && sudo systemctl reload nginx

测试进程先查 PID:pgrep -af 'http.server 900',然后 kill PID。


本章记住: Nginx 负责接待,后端负责干活;改配置先 nginx -t,出故障先看日志。

下一章:《第十八章:HTTPS 与证书——“浏览器说不安全,我说我很冤!”》

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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