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

一、先搞清楚 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 就行。
- 点赞
- 收藏
- 关注作者
评论(0)