Nginx 多站点虚拟主机

一台服务器往往要同时跑多个网站:a.com、b.com、管理后台、各种端口的小服务。虚拟主机(server 块)就是 Nginx 区分站点的机制,可按域名、IP、端口三个维度拆分。

同一 IP 按域名区分

server_name 声明站点域名,Nginx 按请求 Host 头匹配 server 块:

server {
    listen 80;
    server_name a.example.com;
    root /var/www/site-a;
}
server {
    listen 80;
    server_name b.example.com;
    root /var/www/site-b;
}
curl -s -H "Host: a.example.com" http://127.0.0.1/     # 命中 site-a
curl -s -H "Host: b.example.com" http://127.0.0.1/     # 命中 site-b

默认站点 default_server

域名匹配不到任何 server_name(或直接用 IP 访问)时落到 default_server,通常放拒绝页:

server {
    listen 80 default_server;
    server_name _;                # _ 匹配任意主机名
    return 444;                   # 兜底:直接断开连接
}

不同端口与不同 IP

站点也可按监听端口或绑定不同 IP 区分,每个 server 独立生效:

server {
    listen 8081;                  # 按端口区分
    root /var/www/status;
}
server {
    listen 192.168.1.10:80;       # 只响应指定 IP 的 80 端口
    root /var/www/intranet;
}

泛域名

server_name 支持通配符,把裸域名与所有子域名归到同一站点:

server {
    listen 80;
    server_name example.com *.example.com;    # 匹配 example.com 及任意子域
    root /var/www/example;
}

配置文件组织

站点多了建议一站点一文件,Debian/Ubuntu 惯例:文件放 sites-available/,用软链接链到 sites-enabled/ 即启用,主配置里 include 该目录:

sudo mkdir -p /etc/nginx/sites-available /etc/nginx/sites-enabled
sudo ln -s /etc/nginx/sites-available/a.conf /etc/nginx/sites-enabled/a.conf
sudo nginx -t && sudo systemctl reload nginx

nginx.conf 的 http 块里写 include /etc/nginx/sites-enabled/*; 即可;停用站点只需删软链接再 reload,原文件保留。

HTTPS 与 SNI

同一 443 端口要挂多张证书时靠 SNI:客户端在 TLS 握手告知域名,Nginx 按 server_name 选证书:

server {
    listen 443 ssl;
    server_name a.example.com;
    ssl_certificate     /etc/nginx/ssl/a.crt;
    ssl_certificate_key /etc/nginx/ssl/a.key;
}
server {
    listen 443 ssl;
    server_name b.example.com;
    ssl_certificate     /etc/nginx/ssl/b.crt;
    ssl_certificate_key /etc/nginx/ssl/b.key;
}

注:不支持 SNI 的极老客户端会落到 default_server 的证书上。

小结

虚拟主机即一个 server 块一个站点:按 server_name(Host 头)、端口、IP 或 default_server 区分;生产用 sites-available/enabled 软链接管理,443 多证书按域名各配 server_name 即完成 SNI。

笔记加载中…