生产环境中Nginx多Virtual Host推荐基于域名的name-based方式,共用80/443端口,通过server_name匹配Host头;需按站点拆分配置、根目录权限隔离、代码目录置于Web根外、显式声明listen/server_name/root等关键项,并严格验证语法、DNS及路由命中。
生产环境中配置 Nginx 多 Virtual Host,核心是安全、可维护、可扩展,且不暴露源码。推荐采用基于域名的 name-based 方式,所有站点共用 80/443 端口,通过 server_name 匹配 Host 请求头,这是最主流、最符合真实部署场景的做法。
每个站点应有专属根目录,避免路径交叉和权限越界:
/var/www/example.com/html 和 /var/www/api.example.com/html
www-data:www-data 或专用用户),禁止写入权限开放给 web 用户index.php)之外的代码目录(如 app/、config/)必须放在 Web 根目录外,Nginx 的 root 只指向公开入口层location ~ .php$ 块时,确保 SCRIPT_FILENAME 指向正确的物理路径,避免因路径错误导致源码泄露不要把所有 server 块堆在 nginx.conf 里,而是按站点单独建配置文件:
/etc/nginx/conf.d/ 下新建 example.com.conf 和 admin.example.com.conf
server 块,开头加注释说明用途、负责人、上线时间include /etc/nginx/conf.d/*.conf;,便于批量启用/禁用.disabled 后缀),比注释更可靠每个 server 块不能依赖全局默认值,尤其要注意:
listen 80; 和 listen 443 ssl http2; 需分开写,HTTPS 必须配证书路径(ssl_certificate、ssl_certificate_key)server_name 明确列出主域和常用别名,如 example.com www.example.com,不建议用通配符泛匹配(除非子域名完全可控)root 路径结尾不带斜杠;index 至少含 index.html index.php
access_log /var/log/nginx/example.com.access.log main; 和 error_log /var/log/nginx/example.com.error.log warn;,便于按站排查配置不是写完就 reload,必须闭环验证:
sudo nginx -t 检查语法和路径有效性,失败立即修复/etc/hosts 测试(仅限测试环境)curl -H "Host: example.com" http://服务器IP 绕过 DNS 直接测路由是否命中正确 server 块Server 和 X-Powered-By 是否已隐藏,避免暴露技术栈