nginx虚拟主机通过server块实现,支持基于域名、ip和端口三种类型:基于域名最常用,依赖host头;基于ip需多地址,隔离性强;基于端口适用于内部或测试场景。

Virtual Host(虚拟主机)在 Nginx 中就是通过 server 块实现的,核心是让同一台服务器能按域名、IP 或端口区分并响应不同网站。不需要额外硬件,配置清晰、 reload 即生效,适合多站共存场景。
明确类型:选对方式再动手
三种常见方式适用不同需求:
-
基于域名:最常用。多个域名指向同一个 IP,Nginx 读取 HTTP 请求里的
Host头来分发请求。适合公网部署多个独立站点。 -
基于 IP:服务器有多个公网 IP,每个
server块绑定不同 IP(如listen 192.168.1.10:80)。适合需严格隔离或旧协议兼容场景。 -
基于端口:同一 IP 下用不同端口区分服务(如
listen 8080、listen 8000)。常用于测试环境或内部管理后台。
标准结构:一个 server 块就是一台“虚拟服务器”
每个 server 块至少包含四个关键指令:
-
listen:指定监听地址和端口,例如
listen 80;或listen 127.0.0.1:8080; -
server_name:定义匹配的域名,支持多个(空格分隔),如
server_name example.com www.example.com; -
root:设置该站点的文件根目录,比如
root /var/www/example.com/public; -
index:指定默认访问文件,如
index index.html index.php;
完整示例:
server {
listen 80;
server_name mysite.com www.mysite.com;
root /var/www/mysite.com/public;
index index.html index.php;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
组织配置:推荐分离管理,避免主文件臃肿
不建议直接在 /etc/nginx/nginx.conf 里写所有 server 块。更规范的做法是:
- 把每个站点单独存为
/etc/nginx/conf.d/mysite.com.conf - 确保主配置中已启用
include /etc/nginx/conf.d/*.conf;(通常默认存在) - 配置完后执行
sudo nginx -t检查语法,再sudo systemctl reload nginx生效
特别注意:default_server 和未匹配请求
若某个请求的 Host 头无法匹配任何 server_name,Nginx 会交给标记为 default_server 的块处理:
- 在
listen后加default_server,例如:listen 80 default_server; - 通常用于返回 444(静默拒绝)、重定向到主站,或展示维护页
- 一个端口只能有一个
default_server,否则 reload 会报错











