入口这一个就够了:用 Nginx 把多服务收拢成一道门

举报
海是岛思念的泪 发表于 2026/09/17 10:10:01 2026/09/17
【摘要】 用 Nginx 做反向代理 + 负载均衡 + HTTPS 终止,把散在多端口的后端、前端、API 统一收到一个 80/443 入口,顺手加 gzip 和限流。

以前刚把项目拆成几个服务那阵子,前端跑在 8080、API 跑在 9000、后台跑在 8001,每换一个环境就得记一串端口,浏览器书签都快不够用。后来干脆在前面架了层 Nginx:所有流量先打到 80/443,由它按路径分流到后面不同的服务。对外只暴露一个域名,端口、证书、压缩、限流全在一处管。这篇讲最实用的那部分。

image.png

一、先搞清楚 Nginx 在这儿干啥

很多人把 Nginx 当"web 服务器"(放静态文件),但它更值钱的角色是反向代理:客户端以为自己在跟 Nginx 说话,其实 Nginx 把请求转发给了后面的真实服务,再把结果返回。和"正向代理"(你通过它访问外网)方向相反。

它在本套架构里能一口气干四件事:

角色 解决什么问题
反向代理 隐藏后端真实地址和端口,统一入口
负载均衡 一个服务起多个实例,流量分摊,挂一个不影响
HTTPS 终止 证书只在 Nginx 配一份,后端走内网 http
限流/压缩 在门口挡掉过量请求,返回前压一波体积

二、装一个能用的 Nginx

大多数 Linux 直接包管理装就行:

# Ubuntu / Debian
sudo apt update && sudo apt install -y nginx

# 起来后看状态
sudo systemctl status nginx

配置文件默认在 /etc/nginx/nginx.conf,我们一般不会去动它,而是在 /etc/nginx/conf.d/ 下新建一个 .conf,它会被主配置 include 进来。改完用 sudo nginx -t 检查语法,再 sudo systemctl reload nginx 热加载。

三、反向代理:把请求转给后端

最基础的,把 /api 开头的请求转发给跑在 9000 的 API:

server {
    listen 80;
    server_name example.com;

    location /api/ {
        proxy_pass http://127.0.0.1:9000/;   # 注意结尾的 /,会去掉 /api 前缀
        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 / {
        root /var/www/frontend;   # 前端静态文件
        try_files $uri $uri/ /index.html;
    }
}

proxy_set_header 那几行很重要——不传的话,后端拿到的 RemoteAddr 全是 Nginx 的地址,记日志、限流、定位问题都抓瞎。我把 X-Forwarded-For 带上,后端就能知道真实的客户端 IP。

四、负载均衡:一个服务多实例

当 API 扛不住了,最省事的办法是起两份,让 Nginx 在它们之间轮着发。用 upstream 块定义一组后端:

upstream api_backend {
    # 默认轮询;加 weight 可调权重,比如这台机器配置好就多分点
    server 127.0.0.1:9000 weight=2;
    server 127.0.0.1:9001 weight=1;
    # least_conn;   # 想按"谁最闲分给谁"就打开这行
}

server {
    listen 80;
    server_name example.com;

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

几种分流策略按需选:

  • 轮询(默认):一个一个轮流来,适合实例配置差不多。
  • weight 权重:给强机器更高权重,分更多流量。
  • least_conn:谁手头连接最少分给谁,适合请求耗时差异大的场景。
  • ip_hash:同一客户端 IP 总落到同一实例,解决"没做共享会话就乱跳"的问题(但某实例挂了会重新分配,会话还是丢)。

五、HTTPS 终止 + 限流

证书只在 Nginx 配,后端全程 http,省心。用 Let’s Encrypt 申请的证书路径大概是这样:

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # 顺手把 http 全跳 https
    location / {
        proxy_pass http://api_backend/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

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

限流也很简单,先定义一条"桶",再在 location 里用:

http {
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;

    server {
        location /api/ {
            limit_req zone=api_limit burst=20 nodelay;
            proxy_pass http://api_backend/;
        }
    }
}

rate=10r/s 是平均每秒 10 个请求,burst=20 允许瞬间多来 20 个排队,超了就直接 503。这对挡爬虫和恶意刷接口特别有用,而且是在"门口"就拦,后端完全无感。

总结

Nginx 配置看着麻烦繁琐,但是其实记住三块就够用了:server 定义"监听哪个端口哪个域名",location 定义"什么路径怎么处理",upstream 定义"后端有哪些实例"。把静态文件、API、多个后端都收拢到这一个门口,后面的服务想怎么扩、怎么换端口都行,对外纹丝不动。

新的项目第一步就先把 Nginx 这层搭好,证书、压缩、限流一次配齐。等后面流量真上来了,加实例、改 upstream 就行。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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