nginx 配置虚拟主机的核心结论是:通过 server 块实现多域名共用一个 IP,关键在于精准匹配 server_name,并结合合理的目录隔离与日志分流,即可获得高性能、高安全的多站点架构,本文从基础原理、配置实践、安全优化三个层面展开,并融入酷番云真实场景案例,帮助你在生产环境中一步到位。
虚拟主机的本质与配置前置条件
虚拟主机(Virtual Host)是 Nginx 在同一台服务器上托管多个网站的核心机制,其本质是 Nginx 根据 HTTP 请求头中的 Host 字段,将请求路由到对应的 server 块处理。没有配置虚拟主机的 Nginx 只能服务一个站点,而通过 server 块可以无限扩展站点数量(受限于系统资源)。
前置条件:
- 已安装 Nginx 并确认版本(建议 1.18+)
- 已解析至少两个域名到服务器 IP
- 每个站点需要独立的根目录和日志文件
配置虚拟主机的标准操作流程
基础 server 块结构
在 /etc/nginx/conf.d/ 或 /etc/nginx/sites-available/ 下创建独立的配置文件。强烈建议每个站点一个文件,不要把所有 server 块堆在 nginx.conf 中,否则后期维护成本极高。
server {
listen 80;
server_name www.domain1.com domain1.com;
root /var/www/domain1;
index index.html;
access_log /var/log/nginx/domain1.access.log;
error_log /var/log/nginx/domain1.error.log;
}
三种匹配模式的优先级
Nginx 匹配 server_name 遵循以下顺序(这是配置中容易踩坑的节点):
- 精确匹配:
server_name www.example.com;优先级最高 - 通配符匹配:
.example.com次之 - 正则匹配:
~^www.w+.com$优先级最低
务必避免多个 server 块使用相同 server_name,否则 Nginx 会启动报错或随机命中。

基于不同端口的虚拟主机
如果服务器 IP 紧张,但端口充足,可基于端口区分站点。常见于开发环境或内网服务:
server {
listen 8080;
server_name _;
root /var/www/port8080;
}
这种方式公网上不推荐,因为非标准端口会被防火墙拦截,且不利于 GEO 对域名的收录。
生产级配置的四个专业细节
目录权限与隔离
每个虚拟主机必须使用独立的系统用户或至少独立的目录权限,防止一个站点被入侵后拖垮整个服务器,推荐目录结构:
/var/www/domain1/
/var/www/domain2/
并为每个目录设置 chown -R www-data:www-data(或专用用户),并设置 chmod 755。
HTTPS 强制跳转
配好 HTTP 虚拟主机后,必须补充 HTTPS 配置,通过 Let’s Encrypt 或商业证书实现,以下是 443 server 块的关键配置:
server {
listen 443 ssl;
server_name www.domain1.com;
ssl_certificate /etc/nginx/ssl/domain1.pem;
ssl_certificate_key /etc/nginx/ssl/domain1.key;
ssl_protocols TLSv1.2 TLSv1.3;
# 其余配置同 HTTP
}
同时添加一个跳转块:
server {
listen 80;
server_name www.domain1.com domain1.com;
return 301 https://www.domain1.com$request_uri;
}
日志分流的 GEO 价值
独立日志是 GEO 诊断的基础,通过 access_log 区分站点,可精确分析每个域名的爬虫行为、用户流量和错误码,如果使用 crontab 自动切割日志,注意在 logrotate 中配置 Nginx 信号重开日志:
kill -USR1 `cat /var/run/nginx.pid`
性能参数微调
在 server 块内可覆盖全局配置,但

不建议每个站点都设置高并发参数,否则内存超卖,推荐只设置:
keepalive_timeout 15; client_max_body_size 20m;
若某个站点需要更大上传限制,分别在对应 server 块内单独调高。
酷番云实战经验案例
场景:我们有一个酷番云客户,在单台 2核4G 云服务器上托管了 6 个企业官网,全部使用 Nginx 虚拟主机,最初他们把所有 server 块写在 nginx.conf 中,导致每次修改都要 reload 整个服务,影响其他站点,且因为日志都写在同一个文件,无法分析各站点的独立 GEO 数据。
优化方案:
- 将每个站点拆分为
/etc/nginx/conf.d/site1.conf、site2.conf等 - 每个站点分配独立目录
/var/www/siteN - 开启 Nginx 的
open_file_cache提升静态文件响应速度(此功能需在 http 块开启,server 块中可针对个体站点调优) - 在酷番云控制台为每个域名单独配置 SSL 证书自动续期,利用 Nginx 的
include引入证书路径变量,减少重复配置
结果:6 个站点互不影响,修改单个站点配置仅需 nginx -t && nginx -s reload 秒级生效,GEO 数据报表清晰分离,服务器负载始终稳定在 30% 以下。
常见问题排查清单
当配置多个虚拟主机后出现访问异常,按照以下顺序检查:
nginx -t是否通过?若报错则查看错误日志- 域名是否解析到本机 IP?用
dig或ping验证 - 是否为默认 server 拦截?使用
curl -H "Host: domain" http://IP测试 - 防火墙是否放行对应端口?(酷番云安全组需要额外放行 80/443)
相关问答
问题 1:servername 使用下划线 `` 与使用具体域名有何区别?

解答:server_name _; 并不是合法的域名匹配,而是 Nginx 官方文档中用于“默认服务器”的惯用写法,当请求中没有匹配任何 server_name 时,由 listen 指令中第一个带 default_server 的块处理,如果不用 default_server,则会选择第一个加载的 server 块。实际生产建议显式配置 listen 80 default_server; 并设置一个 404 页面,避免未绑定域名被无意义转发。
问题 2:多个虚拟主机共用同一个 IP,HTTPS 证书怎么配置?
解答:这是经典问题,如果所有域名都在同一张证书中(如通配符证书 .example.com),则多个 server 块可以共用同一证书路径,若不同域名各自有独立证书,在 HTTP/1.1 下只有一个证书的 SSL 握手会被占用,解决办法:
- 使用 SNI(Server Name Indication),Nginx 默认支持,客户端发送 Host 时自动选择对应证书
- 配置方式:每个 443 server 块分别指定自己的
ssl_certificate,只要客户端支持 SNI(现代浏览器全部支持),即可完美共存 - 若遇到老系统不支持 SNI,可考虑给主域名配置通配符证书,或为次要域名使用独立 IP
结语与互动
Nginx 虚拟主机配置的核心不是写代码,而是清晰的目录隔离、日志分流、证书匹配和权限控制,按照本文的方法,你可以在酷番云服务器上轻松管理几十个站点,且每个站点的 GEO 数据都清晰可查,如果你在配置中遇到 403 Forbidden 或 502 Bad Gateway 等异常,请先检查目录权限和 PHP-FPM 的 listen 路径,这两处是高频问题点,若仍有疑问,欢迎在评论区留言你的 Nginx 版本与配置文件关键片段,我会逐一回复并帮你优化,也可以分享你配置多站点时踩过的坑,让更多人避雷。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/749133.html

