导读:手里三个博客、两个项目页,难道要买五台VPS?完全不用。Nginx天生就是为多站点设计的:同一台机器、同一个80/443端口,靠域名区分请求转发到不同站点目录。这篇讲清虚拟主机的配置思路、完整实操(含多个网站共用一台服务器的目录规划)、证书怎么分别配,以及踩过的人最多的坑。一台2G内存的小鸡,托管七八个低流量站点毫无压力。
一、原理:Nginx怎么区分谁来的是谁
浏览器发请求时会带上Host头(你要访问的域名)。Nginx收到请求后,拿Host去匹配所有配置的server块,谁的server_name对得上就走谁的路由——站点A的请求去A的目录,站点B的请求反代到B的应用端口。
整个过程互不干扰,这就是虚拟主机(virtual host)。同一端口服务N个域名,是Web服务器的看家本领。
二、目录规划:别把文件堆一坨
多站点最容易乱的是文件。推荐结构:
/var/www/site-a/public 站点A根目录
/var/www/site-b/public 站点B根目录
/var/www/shared 公共资源(可选)
配置文件也按站点拆:
/etc/nginx/sites-available/ 里每站一个文件
/etc/nginx/sites-enabled/ 里放符号链接,启用哪个链哪个
这个结构的好处:新增站点是复制一个文件的事;排查问题单看单站文件;禁用一个站点删链接即可,源文件还在。
Debian/Ubuntu的nginx默认就是这个布局。CentOS系如果没这个目录,自己建两个目录再在nginx.conf的http块里加一行include /etc/nginx/sites-enabled/即可。
三、第一个虚拟主机:静态站
/etc/nginx/sites-available/site-a 写入:
server {
listen 80;
server_name site-a.com www.site-a.com;
root /var/www/site-a/public;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
启用(建软链接并重载配置):
ln -s /etc/nginx/sites-available/site-a /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
域名解析把site-a.com的A记录指到这台机器IP,浏览器访问即生效。
四、第二个:反代到后端应用
站点B不是静态文件而是跑在3000端口的Node或Python应用,配置改为反代模式:
server {
listen 80;
server_name site-b.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
后端应用只需要监听127.0.0.1,不暴露公网端口,由Nginx统一对外。多站点各自反代到不同端口(3000、8080),互不冲突。
两份配置同时存在于sites-enabled,Nginx按域名分发——多站托管的核心就是这两段配置的重复利用。
五、每站单独上HTTPS
各站点独立申请证书即可。用主流免费证书方案时,验证方式选webroot并指定各站根目录,或者用DNS验证最省事(不依赖站点目录)。
证书到手后每站的server块补443监听和证书路径,80补一条跳转:
server {
listen 80;
server_name site-a.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name site-a.com;
root /var/www/site-a/public;
ssl_certificate 和 ssl_certificate_key 按实际证书路径填写
}
续期配置时记得把所有域名都纳入,一次定时任务管全部站点证书。
六、高频坑清单
坑1:新站点打开却是另一个站的内容。通常是新server块没生效(忘了建软链接或没reload),或者server_name打错导致请求落进了默认站点。nginx -T 输出全部生效配置,搜你的域名确认。
坑2:证书串站。443配置不全时,Nginx可能用默认server块的证书响应所有请求,浏览器报证书域名不匹配。每个域名都要有明确的443配置。
坑3:面板用户顺手改了主配置。宝塔、1Panel这类面板生成的站点配置也在Nginx里,手工配置和面板配置混用时注意include顺序,避免互相覆盖。用面板管理的机器,新站也走面板建,保持一致。
坑4:默认站点裸奔。没有匹配到任何server_name的请求会走默认站点(通常是Nginx欢迎页或第一个配置)。建议加一个return 444的默认server块,把扫描器和敲错域名的请求直接掐断,减少暴露面。
坑5:内存焦虑是多余的。静态加反代模式下Nginx单worker才几兆内存,瓶颈在PHP这类动态后端。多静态站共用一台小鸡,512M绰绰有余;要跑多个WordPress再考虑升配。
七、什么规模该分家
多站合一的边界感:
放一起:静态站、低流量博客、内部工具面板——省机器省维护;
考虑分开:有一个站流量大涨、需要不同区域线路(比如一个国内业务一个外贸站)、安全等级要求不同——按业务属性拆,而不是简单按数量拆。
流量监控可以参考本站vnstat那篇:多站点共用机器时,盯总流量和各站日志(各站access log独立记),做到心里有数。
结语
一台VPS多站托管是预算有限时的标准解法:域名成本之外零增量成本,配置模板化后新站上线是十分钟的事。
核心三步:目录规划 → 每站一个配置文件 → 启用重载。先拿两个站练手,把结构固化成自己的模板,后面加站就是流水线作业。



