Nginx反向代理多外贸站点独立隔离配置
用Nginx反向代理隔离配置多外贸站点:从零开始的实操教程
做外贸的朋友通常会遇到一个场景:同一个服务器上跑多个独立站点,域名不同、后端应用不同,但希望每个站点互不干扰,流量、日志、资源都要隔离。
这时使用 Nginx反向代理 是最经典也是成本最低的方案。
本文将从零开始,教你如何用Nginx为多个外贸站点配置反向代理,实现真正的独立隔离。
读完你会明白:如何用同一个Nginx管理多个域名,如何把每个域名代理到不同的后端服务,以及踩坑后怎么快速恢复。
准备工作:了解你的环境
在动手之前,先确认三样东西:
- 服务器:一台Linux服务器(CentOS 7/8、Ubuntu 20.04+ 都可以),已安装Nginx。如果没有安装,可以运行以下命令快速安装(以Ubuntu为例):
sudo apt update
sudo apt install nginx -y
- 域名:两个不同的外贸站点域名,例如
shop-a.com和shop-b.com,并且已经解析到你的服务器IP。 - 后端服务:假设你已经用Docker或裸机跑了两个Web应用,分别监听本地的
127.0.0.1:3001和127.0.0.1:3002。
提示:如果你没有两个后端服务,可以先用两个简单的index.html页面本地开临时端口测试,比如用Python:
python3 -m http.server 3001 --directory /var/www/site-a和python3 -m http.server 3002 --directory /var/www/site-b。
配置Nginx:不同域名代理不同后端
Nginx的配置文件通常位于 /etc/nginx/nginx.conf,但最好为每个站点单独创建配置文件,放在 /etc/nginx/conf.d/ 或 /etc/nginx/sites-available/ 下(取决于发行版)。
下面我们创建两个独立的配置文件。
第一个站点:shop-a.com
创建文件 /etc/nginx/conf.d/shop-a.com.conf:
server {
listen 80;
server_name shop-a.com www.shop-a.com;
# 日志独立隔离(方便排查问题)
access_log /var/log/nginx/shop-a.access.log;
error_log /var/log/nginx/shop-a.error.log;
location / {
proxy_pass http://127.0.0.1:3001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
关键点:
server_name指定该配置仅匹配shop-a.com及其www子域名。proxy_pass将请求转发到本机的3001端口。proxy_set_header确保后端应用能获取真实的客户端IP和域名。- 日志独立:每个站点都有自己的日志文件,方便运维审计。
第二个站点:shop-b.com
创建文件 /etc/nginx/conf.d/shop-b.com.conf:
server {
listen 80;
server_name shop-b.com www.shop-b.com;
access_log /var/log/nginx/shop-b.access.log;
error_log /var/log/nginx/shop-b.error.log;
location / {
proxy_pass http://127.0.0.1:3002;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
启用配置并重启Nginx
# 检查配置文件语法
sudo nginx -t
# 如果没有报错,重新加载Nginx
sudo systemctl reload nginx
# 或者
sudo nginx -s reload
如果nginx -t提示错误,请根据提示检查配置文件路径或语法。常见错误:忘记写分号、server_name拼写有误、proxy_pass漏了端口。
隔离细节:除了域名,还有哪些需要隔离?
很多新手只配置了 proxy_pass,却忽略了其他隔离维度,容易导致站点之间互相干扰。
下面几个点必须注意:
- 日志隔离:上面我们已经做了,每个站点用独立的
access_log和error_log。 - 缓存隔离:如果站点使用了Nginx缓存(
proxy_cache),不同站点的缓存路径和proxy_cache_key要不同。例如:
proxy_cache_path /var/cache/nginx/shop-a levels=1:2 keys_zone=shop_a:10m max_size=1g inactive=60m;
proxy_cache_path /var/cache/nginx/shop-b levels=1:2 keys_zone=shop_b:10m max_size=1g inactive=60m;
然后在各自的 location 里引用 proxy_cache shop_a 或 proxy_cache shop_b。
- 限流隔离:如果某个站点被恶意攻击,你可以在
server块内单独配置限流(limit_req_zone),不影响其他站点。 - SSL证书隔离:如果使用HTTPS,每个站点的证书和私钥路径不同,直接在各自的
server块里配置ssl_certificate即可。
高频问题与避坑指南
Q1:配置后访问域名显示Nginx欢迎页或404?
- 检查
server_name是否和域名完全匹配(包括www子域名)。 - 检查后端服务是否正常运行:
curl http://127.0.0.1:3001看是否有响应。 - 确认防火墙开放了80端口(或443)。
Q2:如何让两个站点共用80端口但互不干扰?
就是上面配置的方法:Nginx会根据请求头中的 Host 字段自动匹配 server_name,只有匹配到的 server 块才会处理。
如果不匹配,会进入默认的 default_server。
建议将最后一个不匹配的请求返回444(直接断开连接):
server {
listen 80 default_server;
server_name _;
return 444;
}
这可以防止未绑定域名访问。
Q3:出现“upstream timed out”错误?
通常是因为后端服务响应太慢或连接不上。
检查后端应用是否启动、监听地址是否正确。
也可以在 proxy_pass 后加上超时参数:
proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 30;
效果验证:确保站点独立运行
配置完成后,用浏览器或 curl 分别访问两个域名:
curl -H "Host: shop-a.com" http://你的服务器IP
curl -H "Host: shop-b.com" http://你的服务器IP
正常会看到两个不同的页面内容。
接着你可以通过日志验证隔离:
# 查看shop-a的日志
sudo tail -f /var/log/nginx/shop-a.access.log
# 查看shop-b的日志
sudo tail -f /var/log/nginx/shop-b.access.log
只有访问对应域名时,对应日志才会写入。
如果在 shop-a 的日志里看到 shop-b 的请求,说明配置有误,需要检查 server_name 是否写错。
总结
通过以上步骤,你可以轻松实现 Nginx反向代理多外贸站点独立隔离配置。
关键在于为每个域名创建独立的 server 块,并为每个站点配置独立的日志、缓存和可能的限流规则。
遇到异常时,优先回看本文的避坑和高频问题部分,大部分都能快速解决。
如果你还涉及到HTTPS配额,可以在每个 server 块内加入SSL配置,原理相同。
如果你正在处理此类配置,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。