一台VPS跑多个网站:Nginx虚拟主机配置实战,小钱办大事


导读:手里三个博客、两个项目页,难道要买五台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多站托管是预算有限时的标准解法:域名成本之外零增量成本,配置模板化后新站上线是十分钟的事。


核心三步:目录规划 → 每站一个配置文件 → 启用重载。先拿两个站练手,把结构固化成自己的模板,后面加站就是流水线作业。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

流量计费、带宽计费、按时计费:看懂VPS套餐页的门道再下单

忘了root密码怎么办?VNC模式重置密码实录,别急着DD重装

评 论
更换验证码