多语言外贸站点Nginx完整多域名隔离配置教程
多语言外贸站点用Nginx做多域名隔离,本质是给每个语言版本分配独立的 server 块和独立的根目录,让每个域名只加载自己的文件,互不干扰。
本文按零基础可操作的方式,讲清楚准备条件、核心配置、重载验证和常见报错处理,照着做就能把多语言外贸站从单站点迁到多域名独立部署。
为什么外贸站需要多域名隔离
做外贸时,很多站点用子目录区分语言,比如 example.com/en、example.com/de。
这种结构维护简单,但 SEO 语言属性不清晰,且某个语言文件出错容易影响全站。
改用多域名隔离后,英文站绑定 en.example.com,德语站绑定 de.example.com,各自有独立目录、独立配置和独立日志,排错、升级、迁移都更方便。
开始前准备好三样东西:
- 一台安装了 Nginx 的云服务器(国内部署域名需备案,海外服务器免备案,按你的业务地区选择)。
- 已解析到服务器的至少两个域名(或子域名),建议先做 A 记录解析。
- 各域名对应的 SSL 证书文件,配置 HTTPS 时使用。
规划目录并写入站点文件
先为每个语言创建独立根目录,这里以英文站和德语站为例:
mkdir -p /var/www/en
mkdir -p /var/www/de
把对应语言的程序文件分别上传到这两个目录,并设置属主为 Nginx 运行用户(常见是 www-data 或 nginx):
chown -R www-data:www-data /var/www/en /var/www/de
目录规划好后,开始写 Nginx 虚拟主机配置。
为了便于维护,建议在 /etc/nginx/conf.d/ 下按域名拆分配置文件。
编写多域名隔离 Nginx 配置
新建 /etc/nginx/conf.d/en.conf,内容如下:
server {
listen 80;
server_name en.example.com;
root /var/www/en;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
access_log /var/log/nginx/en_access.log;
error_log /var/log/nginx/en_error.log;
}
再新建 /etc/nginx/conf.d/de.conf,把 server_name 换成 de.example.com,root 换成 /var/www/de,日志文件名也对应改掉。
其余语言版本照此复制修改即可。
每个 server 块隔离了域名、根目录和日志,这就是多域名隔离的核心:一个域名对应一个 server 块,一个 server 块只服务一个目录。
测试配置并重载 Nginx
配置写完后,先检查语法:
nginx -t
看到 syntax is ok 和 test is successful 再执行重载:
systemctl reload nginx
然后验证域名是否映射到正确目录:
curl -H "Host: en.example.com" http://127.0.0.1
curl -H "Host: de.example.com" http://127.0.0.1
返回对应站点的首页内容即为成功。
如果域名已解析到服务器,也可以直接通过浏览器访问 http://en.example.com 检查。
避坑:多域名隔离最容易出错的四个点
1. 默认 server 抢占导致域名显示同一个站。 如果 Nginx 中没有设置默认 server,第一个加载的 server 块会接收所有未匹配域名。
建议在 nginx.conf 的 http 段里加一个默认返回 444 的空 server:
server {
listen 80 default_server;
return 444;
}
这样未绑定的域名访问会被直接断开,不会串到其他站点。
2. 根目录权限不对导致 403。 上传文件后如果目录没有执行权限,Nginx 会返回 Permission denied。
用 ls -l /var/www 检查目录权限,确保 Nginx 用户能读和进入。
3. PHP 解析路径配错。 不少外贸站使用 PHP 程序,fastcgi_param SCRIPT_FILENAME 必须写成 $document_root$fastcgi_script_name,否则会报 File not found。
注意 $document_root 会跟着 server 块里的 root 自动变化,所以每个配置都要确认 root 路径正确。
4. 只改了配置但没有重载。 修改配置文件后必须执行 systemctl reload nginx,很多“改了没生效”都是漏了这一步。
建议每次改完都跑一遍 nginx -t 再重载。
加上 HTTPS 并检查跳转
外贸站大多要做 HTTPS,在 server 块里加 80 跳 443 的配置即可:
server {
listen 80;
server_name en.example.com;
return 301 https://$host$request_uri;
}
然后在 443 server 块里引用对应证书:
server {
listen 443 ssl http2;
server_name en.example.com;
root /var/www/en;
ssl_certificate /etc/ssl/en.example.com.crt;
ssl_certificate_key /etc/ssl/en.example.com.key;
# 其余配置与 http 块一致
}
改完同样执行 nginx -t && systemctl reload nginx,
再用 curl -I https: 查看返回码是否为 301 或 200。
//en.example.com
如果你在配置过程中出现“A 域名跳转到 B 域名”“样式全部丢失”“403 错误”等问题,多数与 above 中的默认 server、根目录权限或路径错误有关。
尤其是刚接触多语言外贸站点的用户,先把例子中的配置完整跑通再改参数,比边写边试更少踩坑。
多域名隔离配置完成后,每个语言站点都可以独立更新、独立缓存、独立监控。
建议再按你的程序需求给每个 server 块补充 gzip、静态缓存和防盗链规则,让外贸站访问速度更稳。