nginx通过独立server块与精确server_name匹配实现主域名与二级域名完全隔离:各站点需专属server块、独立root路径、ssl证书、php-fpm进程、日志及listen指令,禁止多域名共用同一server块,否则无法真正隔离。

靠独立 server 块 + 准确的 server_name 匹配,不是靠子目录或端口硬凑。Nginx 根据请求里的 Host 头决定进哪个站点,每个站点必须有自己专属的配置块,否则会互相干扰或根本不生效。
每个站点单独一个 server 块
不能把多个域名塞进同一个 server_name 后面就想当多个站点用。比如写 server_name a.com b.com; 只会让它们共享同一套 root、证书、日志等配置,做不到真正隔离。
- 要让 a.com 和 b.com 完全独立(不同根目录、不同证书、不同访问日志),就得各自写一个
server块 - 每个块必须明确写
listen 80或listen 443 ssl,漏掉listen就收不到请求 -
server_name支持精确匹配(example.com)、泛域名(*.example.com),但*.example.com不匹配example.com,根域名得单独再写一块
配置文件组织推荐
别全堆在 /etc/nginx/nginx.conf 里,容易出错也难维护。
- 在
/etc/nginx/sites-available/下为每个站点建单独文件,如example.com - 用
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/启用 - 主配置里加
include /etc/nginx/sites-enabled/*;,重启或重载就能加载全部
权限和路径要到位
配置写对了,但访问返回 403,大概率是权限或 SELinux 拦着。
- Nginx 工作进程用户(通常是
www-data或nginx)必须对root目录有执行权限(x),才能进入子目录读文件 - 运行
ls -ld /var/www/example.com看是否至少是drwxr-xr-x - CentOS/RHEL 开启 SELinux 时,需执行
sudo setsebool -P httpd_read_content 1允许读取非标准路径
HTTPS 站点特别注意证书链
加了 ssl_certificate 和 ssl_certificate_key 还是白屏或报 ERR_SSL_PROTOCOL_ERROR,基本是证书链不全。
- Nginx 不会自动补中间证书,必须把完整证书链(域名证书 + 中间证书)合并到同一个 PEM 文件里
- 所有 HTTPS 的
server块,listen必须统一写成listen 443 ssl,混用listen 443和listen 443 ssl会导致匹配失败 - 如果多个域名共用一个证书,要用 SAN 证书,且
certbot申请时得一次性指定全部域名:certbot -d a.com -d www.a.com -d b.com











