
> 在有限的服务器资源下,如何通过 Nginx 反向代理同时托管博客、音乐站、API 服务、监控面板等十多个站点?本文分享实际生产环境中的配置经验。
当你只有一台 2C2G 的轻量云服务器,却要运行 Node.js、Java、PHP、Python 多种技术栈的应用时,问题来了:
答案是 Nginx 反向代理 — 所有流量走 443 端口,按域名分发到后端服务。
互联网 → Nginx(443) → ├─ blog.rmzdb.cloud → 127.0.0.1:8080 (PHP)
├─ music.rmzdb.cloud → 127.0.0.1:3001 (Node.js)
├─ api.rmzdb.cloud → 127.0.0.1:9020 (Spring Boot)
└─ admin.rmzdb.cloud → /var/www/admin (静态)以通配符 SSL 证书为例:
# SSL 基础配置
ssl_certificate /root/.acme.sh/*.rmzdb.cloud_ecc/fullchain.cer;
ssl_certificate_key /root/.acme.sh/.rmzdb.cloud_ecc/.rmzdb.cloud.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
安全头
add_header Strict-Transport-Security "max-age=63072000" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;配完好就可以按域名分发:
server {
listen 443 ssl http2;
server_name blog.rmzdb.cloud;
root /var/www/blog;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}
}
server {
listen 443 ssl http2;
server_name music.rmzdb.cloud;
location / {
proxy_pass http://127.0.0.1:3001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /api {
proxy_pass http://127.0.0.1:3001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;不设这些头,后端拿到的永远是 127.0.0.1,日志分析和 IP 限流全部失效。
如果后端用 WebSocket(如实时通知),要加:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;client_max_body_size 100m;
proxy_read_timeout 300s;防 DDoS,保护后端:
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
location /api {
limit_req zone=api_limit burst=20 nodelay;
proxy_pass http://127.0.0.1:3001;
}用 acme.sh 申请通配符证书,一次配置覆盖所有子域名:
acme.sh --issue --dns dns_ali -d rmzdb.cloud -d '*.rmzdb.cloud'自动续期:
acme.sh --install-cert -d rmzdb.cloud \
--key-file /etc/nginx/ssl/rmzdb.cloud.key \
--fullchain-file /etc/nginx/ssl/fullchain.cer \
--reloadcmd "systemctl reload nginx"分离每个站点的访问日志,方便排查:
access_log /var/log/nginx/blog-access.log;
error_log /var/log/nginx/blog-error.log;实时监控工具推荐:
tail -f 看实时请求goaccess 生成访问报告ngxtop 实时请求分析一台服务器跑十个网站,核心就三点:
server_name 转发这套配置已经稳定运行数月,内存占用不到 50MB,CPU 几乎无感。
---
如果你也在用一台服务器跑多个服务,欢迎在评论区交流你的配置经验。
本文为作者原创,未经授权禁止转载、洗稿、搬运。如需引用请保留原文链接。