一台 VPS 上跑多个站:nginx 站点隔离的正确姿势
一台 VPS 想挂好几个域名,很多人图省事把所有站都写进一个 server 块,或者干脆全部套同一个目录。正确做法是一个站点一个 conf 文件,互相不干扰。
核心思路
nginx 靠 server_name 区分流量。每个站点单独一个 server 块,各自指定自己的 root 和日志,谁也看不见谁的文件。
目录结构
/www/wwwroot/
site-a.com/ # A 站的静态文件
site-b.com/ # B 站的静态文件
/etc/nginx/conf.d/ # 每个 .conf 一个站点
site-a.com.conf
site-b.com.conf
单站模板
server {
listen 80;
server_name site-a.com www.site-a.com;
root /www/wwwroot/site-a.com;
index index.html;
access_log /var/log/nginx/site-a.com.log;
error_log /var/log/nginx/site-a.com.error.log;
}
几个要点
1. 加载配置前先测试。改完一定先 nginx -t 再 reload,语法错了 reload 会失败,在线站点直接 502。
2. 权限分开。每个站点目录单独 chown:chown -R www:www /www/wwwroot/site-a.com,避免一个站被写穿连累别人。
3. 默认站兜底。留一个 server_name _; 的 default server 指向空页面,恶意域名解析过来什么都拿不到。
4. 泛解析陷阱。检查是否有人配了 server_name _ 或者正则 server_name,它会"吃掉"新站点的流量——这也是我踩过最隐蔽的坑:新站怎么配都不生效,其实是被泛解析站截胡了。
就这么多。核心就一句:一站一 conf,目录权限分开,改完必测 nginx -t。