一台服务器,一个域名,想跑好几个网站,这件事不难,难的是别让请求打架。核心思路就一个:让Nginx或者Apache根据请求的不同部分,把流量分给不同的程序。常见做法有按路径分、按子域名分、按端口分,端口方式最不推荐,用户记不住还容易被网络环境拦。
假设域名是 example.com,服务器是2核4G。博客用WordPress跑在PHP-FPM,工具站用Node.js监听3000,API用Python监听5000。Nginx监听80和443,配置里可以这样写:
server {
listen 80;
server_name example.com;
location /blog/ { proxy_pass http://127.0.0.1:8080/; }
location /tools/ { proxy_pass http://127.0.0.1:3000/; }
location /api/ { proxy_pass http://127.0.0.1:5000/; }
}
注意proxy_pass末尾的斜杠,/blog/会去掉前缀再转发。前端资源要用绝对路径,比如/blog/static/app.js,否则浏览器会去根目录找,样式和脚本全丢。Cookie也要设置path=/blog,不然几个站之间会互相覆盖登录状态。Session同样得区分开,不然用户在这个站登录,跑到另一个站也显示已登录。
按子域名分更清爽。在DNS里加A记录,blog.example.com和tool.example.com都指向同一个服务器IP。Nginx里用server_name区分:

server { listen 80; server_name blog.example.com; location / { proxy_pass http://127.0.0.1:8080; } }
server { listen 80; server_name tool.example.com; location / { proxy_pass http://127.0.0.1:3000; } }
这样每个站有独立根路径,前端不用改base,Cookie也天然隔离。一个域名可以建很多子域名,不需要额外买域名。HTTPS可以用通配符证书 *.example.com,或者用Let''s Encrypt的certbot给每个子域名单独签。通配符证书需要DNS验证,三个月续期一次。如果只有主域名,路径方式一个证书就够,省事。
Docker方式适合环境隔离。每个网站一个容器,blog容器映射8080,tool容器映射3000,api容器映射5000。Nginx跑在宿主机或者另一个容器,统一入口。docker compose里定义服务,重启某个容器不影响其他。数据库可以共用MySQL,建不同库和用户,权限分开。也可以用SQLite,文件放在各自卷里。资源限制用--memory和--cpus,防止一个站崩了拖垮整台机器。2核4G跑三四个轻量站没问题,如果跑Java或者大模型,得升配置。
实际数据参考:Nginx空载内存约5到10MB,处理静态文件并发几千没问题。Node.js空进程约30到50MB,Python Flask约40到60MB,WordPress加MySQL约300到500MB。2核4G大概能跑一个WordPress加两个轻量API。带宽看访问量,1Mbps约支持每天几千PV的文本站,图片多要加CDN。
几个容易踩的坑。日志要分开,/var/log/nginx/blog.access.log,方便排查。防火墙只开80和443,后端端口绑127.0.0.1,不要暴露公网。备份数据库和上传目录,用cron每天打包到对象存储。如果国内服务器,域名备案后子域名和路径一般不用重复备案,但有些接入商要求子域名也添加,买之前问清楚。
选择建议:内容相关、想共享权重,用路径,比如 example.com/blog、example.com/shop。内容独立、想各自干净,用子域名,比如 blog.example.com、shop.example.com。需要环境隔离、频繁升级,用Docker加Nginx。一个域名不是限制,限制是思路。把请求分清楚,一台机器一个域名照样跑多个站。