← 返回首页
运维

一台 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