Nginx 多站点配置的核心思路是通过“端口区分”或“域名区分”建立独立的 server 块,并配合日志、权限、SSL 的隔离,实现一台服务器高效承载多个网站。 相比 Apache,Nginx 采用事件驱动架构,配置多站点时资源占用更低、并发能力更强,但若未遵循规范配置,容易出现配置混乱、权限越界、性能下降等问题,本文将从基础原理到生产级实践,给出可直接落地的解决方案。
理解 Nginx 多站点的运行逻辑
Nginx 本身不区分“站点”,它只处理 server 块,每个 server 块定义了一组监听端口和主机名匹配规则,当请求到达时,Nginx 根据 listen 和 server_name 将请求路由到对应配置。
关键结论:多站点配置的本质是创建多个独立的 server 块,并确保每个站点的根目录、日志、进程权限互相隔离。
标准配置方案(基于域名)
最常用的方式是基于不同域名或子域名区分站点,假设服务器 IP 为 2.3.4,有两个站点:example.com 和 blog.example.com。
创建站点目录与文件
mkdir -p /var/www/example.com/html mkdir -p /var/www/blog.example.com/html echo "Welcome to example.com" > /var/www/example.com/html/index.html echo "Welcome to blog" > /var/www/blog.example.com/html/index.html
在 /etc/nginx/conf.d/ 下创建独立配置文件
建议每个站点一个 .conf 文件,便于维护。example.com.conf:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.html;
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
location / {
try_files $uri $uri/ =404;
}
}

blog.example.com.conf 同理,只需修改域名、目录和日志路径。
检查配置并重载
nginx -t systemctl reload nginx
重点:每个 server 块必须使用独立的 root 和日志文件,否则多站点间会互相干扰,且排查问题时难以定位。
基于不同端口的配置场景
当服务器只有一个公网 IP,但需要同时运行 HTTP 和 HTTPS 或临时测试环境时,可用不同端口区分,例如站点 A 用 8080,站点 B 用 8081。
server {
listen 8080;
server_name _;
root /var/www/site-a;
# 其他配置
}
server {
listen 8081;
server_name _;
root /var/www/site-b;
# 其他配置
}
注意:使用端口区分时,servername 通常设为 `` 匹配任意域名,但这种方式对用户不友好,生产环境建议优先使用域名区分,并配合防火墙限制非标准端口的访问。
多站点的性能与安全优化
启用 Gzip 与缓存
在 http 块或 server 块中加入:
gzip on;
gzip_types text/plain text/css application/json application/javascript;
location ~ .(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
配置静态文件分离
若站点有大量静态资源,可单独设置 location 指向独立目录,减少 PHP 或后端处理压力:
location /static/ {
alias /var/www/example.com/static/;
access_log off;
expires 7d;
}
限制访问与防盗链
location ~ .(gif|jpg|png)$ {
valid_referers none blocked .example.com;
if ($invalid_referer) {
return 403;
}
}

使用 Unix Socket 连接 PHP-FPM
多个站点共用 PHP-FPM 时,建议为每个站点创建独立的 Socket,避免资源争抢:
location ~ .php$ {
fastcgi_pass unix:/var/run/php/php8.2-site-a.sock;
include fastcgi_params;
}
酷番云实战经验案例
场景: 在酷番云一台 2核4G 的云服务器上,客户需要同时运行企业官网、商城和 API 服务,使用默认配置后,发现商城流量高峰时,官网响应变慢。
问题分析: 三个站点共用同一 PHP-FPM 池,导致进程互相抢占 CPU 和内存。
解决方案:
- 在酷番云控制台对服务器进行 内网带宽升级,并开启 CPU 弹性伸缩,确保峰值时资源充足。
- 为每个站点创建独立的 PHP-FPM 池,并设置不同的
listen端口(如9001、9002、9003),在 Nginx 的location ~ .php$中分别指向对应端口。 - 为 API 服务单独启用
keepalive和fastcgi_cache,显著降低响应时间。
效果: 调整后商城高峰期官网响应时间从 800ms 降至 200ms,API 服务吞吐量提升 3 倍。关键经验:多站点配置不仅是 Nginx 层面的隔离,更需结合底层资源(CPU、内存、带宽)做整体规划。 酷番云的云服务器支持按需升级和弹性伸缩,能快速匹配多站点业务增长需求。
常见错误与排查思路
- 所有站点共用同一个
error_log→ 日志混杂,难以定位问题,务必为每个站点设置独立日志。 root路径后多加斜杠 → 导致路径拼接错误。root /var/www/example.com/html;是正确的,若写成root /var/www/example.com/html/;
在某些场景会出错。
- 修改配置后未执行
nginx -t直接 reload → 语法错误会中断服务,每次修改后必须先测试。 - 站点目录权限过大 → 将目录设为
www-data:www-data并限制为755,避免其他用户读取敏感文件。
排查命令速查:
nginx -t # 检查语法 tail -f /var/log/nginx/error.log # 查看错误日志 ss -lntp | grep nginx # 查看监听端口 curl -H "Host: example.com" http://127.0.0.1 # 模拟请求
相关问答
问 1:多个站点共用 80 端口时,Nginx 如何区分请求?
答:Nginx 会根据 HTTP 请求头中的 Host 字段与 server 块中的 server_name 进行匹配,如果请求的域名没有对应配置,则会使用默认 server(通常是第一个加载的或标记为 default_server 的块),建议将默认 server 配置为返回 404 或跳转到主站,避免被恶意解析。
问 2:如何实现一个站点使用 HTTPS,另一个仅使用 HTTP?
答:为 HTTPS 站点配置 SSL 证书,并在其 server 块中 listen 443 ssl;,同时可添加一个 listen 80; 的 server 块用于强制跳转到 HTTPS,HTTP 站点则仅保留 listen 80;,需要确保两个站点的 server_name 不重叠,并正确设置证书路径。
结语与互动
多站点配置是 Nginx 运维的基石,掌握它不仅能节省服务器成本,还能提升资源利用率。建议从最小的两个站点配置开始实践,逐步加入日志、缓存、SSL 等进阶特性。 如果在配置过程中遇到任何问题,欢迎在评论区留言,我会为你提供一对一的排查思路,也可以分享你常用的多站点配置技巧,我们一起交流进步。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/728558.html

