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。