Nginx配置多个域名与独立网站
多个域名可以指向同一台服务器,由Nginx根据请求的主机名选择站点。DNS负责找到服务器,server_name和root决定返回哪个网站;只添加解析而没有独立站点配置,容易看到默认页或另一个网站。本教程配置两个普通HTTP站点,适用于允许建站的产品,不适用于住宅云。
请先确认已有静态站点可用。尚未准备环境时,可先完成Nginx静态站点部署,已有正式环境只核对对应条件,不重复安装或覆盖旧配置。
先画清域名与目录对应关系
| 域名占位 | 配置文件 | 独立目录 |
|---|---|---|
| site-a.example.com | site-a.conf | /var/www/site-a |
| site-b.example.com | site-b.conf | /var/www/site-b |
把两个占位域名替换为自己拥有的名称。目录不要嵌套在另一个网站的上传目录内。每个域名只保留预期的A/AAAA记录;如果用了CDN,后续测试需区分CDN和源站。如所购产品要求域名过白,先按该产品购买须知完成域名提交并核对结果;流程有疑问或提交后出现异常,再通过工单说明情况。
准备能区分两个站点的页面
sudo install -d -m 0755 /var/www/site-a /var/www/site-b
printf '%s\n' '<h1>Site A</h1>' | sudo tee /var/www/site-a/index.html
printf '%s\n' '<h1>Site B</h1>' | sudo tee /var/www/site-b/index.html
以上目录必须是新站点目录,不能覆盖已有index文件。测试文字故意不同,避免两个网站用了相同模板后误以为匹配正确。
各建一个server块
创建/etc/nginx/sites-available/site-a.conf:
server {
listen 80;
server_name site-a.example.com;
root /var/www/site-a;
index index.html;
access_log /var/log/nginx/site-a.access.log;
error_log /var/log/nginx/site-a.error.log;
location / { try_files $uri $uri/ =404; }
}
另建site-b.conf,把域名、根目录和两项日志路径全部改成B站对应值,不只改文件名。配置中的default_server不是多站点的必需项,不给每个站点都加它。
sudo ln -s /etc/nginx/sites-available/site-a.conf /etc/nginx/sites-enabled/site-a.conf
sudo ln -s /etc/nginx/sites-available/site-b.conf /etc/nginx/sites-enabled/site-b.conf
sudo nginx -t
处理全部错误及重复server_name警告后,再执行sudo systemctl reload nginx。相同地址和端口中重复出现同一精确域名时,某份配置可能被忽略,不能带着警告判断部署成功。
用相同IP、不同Host验证
curl --resolve site-a.example.com:80:127.0.0.1 http://site-a.example.com/
curl --resolve site-b.example.com:80:127.0.0.1 http://site-b.example.com/
应分别出现Site A和Site B。再从外部电脑访问两个实际域名。直接输入IP没有携带这两个域名,可能进入默认站点,不能据此判定串站。访问HTTPS时还会涉及SNI和证书覆盖,不能直接把HTTP配置当成HTTPS配置。
串站和变更回退
- 本地Host测试正确、公网错误:检查DNS、CDN源站和缓存,确认访问的确是当前服务器。
- 两个Host测试都返回同一页面:查看sudo nginx -T输出中该域名、配置include和root;输出可能含内部路径,不公开整份配置。
- 只停用B站:移除B站sites-enabled软链接,检测后reload,不删除B站文件和数据库。
- 每次只改一个站点,保留原配置副本;网站文件与配置分开保存,避免删除站点时误删其他业务。