Nginx基于域名的虚拟主机通过解析HTTP请求头中的Host字段实现单IP多网站部署。需确保DNS解析、Nginx运行、站点目录及防火墙配置就绪;每个站点对应独立server块,用server_name指定域名;设置default_server处理未匹配请求;HTTPS需为每个域名单独配置SSL并强制跳转。

一台服务器一个IP,却要运行多个网站?Nginx 的基于域名的虚拟主机(Server Name Based Virtual Host)正是为此设计的。它通过解析 HTTP 请求头中的 Host 字段,将不同域名的请求精准路由到对应站点配置,无需额外IP或端口,是生产环境最常用、最实用的多站部署方式。
一、确认基础前提:DNS 与 Nginx 环境就绪
在写配置前,请确保:
- 你的多个域名(如 site1.example.com、site2.example.com)已正确解析到该服务器的公网IP(A记录),本地可先用
ping或dig验证; - Nginx 已安装并正常运行(执行
nginx -t测试语法,systemctl status nginx查看状态); - 每个站点的根目录已创建(如
/var/www/site1、/var/www/site2),且包含测试文件(如index.html); - 防火墙(如 firewalld 或 ufw)已放行 80(HTTP)和 443(HTTPS)端口。
二、编写独立 server 块:按域名区分站点
核心原则:每个站点对应一个 server 块,用 server_name 指令明确声明其服务的域名。以下为两个典型配置示例(保存在 /etc/nginx/conf.d/ 下,如 site1.conf 和 site2.conf):
站点一配置(/etc/nginx/conf.d/site1.conf):
server {
listen 80;
server_name site1.example.com www.site1.example.com;
<pre class="brush:php;toolbar:false;">root /var/www/site1;
index index.html;
location / {
try_files $uri $uri/ =404;
}}
站点二配置(/etc/nginx/conf.d/site2.conf):
server {
listen 80;
server_name site2.example.com www.site2.example.com;
<pre class="brush:php;toolbar:false;">root /var/www/site2;
index index.html;
location / {
try_files $uri $uri/ =404;
}}
注意:server_name 支持空格分隔多个域名,也支持通配符(如 *.example.com)或正则(~^www\.(.+)$),但普通场景推荐明确列出主次域名。
三、处理默认/未匹配请求:设置 fallback server
当请求的 Host 头不匹配任何 server_name 时,Nginx 会使用第一个 listen 80 的 server 块(按配置文件字典序加载)。为避免意外暴露,默认站点应显式定义并返回友好提示或 444(关闭连接):
return 444; # 或返回 404 页面、重定向到主站等
将此块放入单独文件(如 /etc/nginx/conf.d/default.conf),确保它被最先加载(文件名以数字开头,如 00-default.conf)。
四、启用 HTTPS:为每个域名添加 SSL 配置
启用 HTTPS 不是“加一个全局证书”,而是为每个 server 块单独配置 TLS:
- 获取证书(推荐用 Certbot 自动申请 Let’s Encrypt):
certbot --nginx -d site1.example.com -d www.site1.example.com; - Certbot 会自动修改对应 server 块,添加
listen 443 ssl、ssl_certificate和ssl_certificate_key; - 务必保留原 80 端口 server 块,并添加强制跳转(301):
server { listen 80; server_name site1.example.com www.site1.example.com; return 301 https://$server_name$request_uri; } - 每个域名需独立证书(或使用通配符证书
*.example.com覆盖子域);SNI 技术保证单IP可承载多HTTPS站点。
配置完成后,执行 nginx -t 校验无误,再 systemctl reload nginx 生效。打开浏览器分别访问各域名,即可看到对应站点内容。不复杂但容易忽略细节。










