Nginx 配置多站点的本质,是通过 server 块 与 listen 端口、server_name 域名 的组合,实现一台服务器资源的高效复用,对于绝大多数业务场景,推荐采用“目录隔离 + 独立配置文件 + 域名区分” 的方案,它兼顾了可维护性、安全性与扩展性,是生产环境中最稳健的实践路径。
多站点的三种实现方案
在动手配置前,先厘清三种主流方案,以便按需选择:
- 端口区分:每个站点使用不同端口(如 8080、8081),配置简单,但用户访问需带端口号,体验较差,仅适合内部系统或调试场景。
- 域名区分:多个域名共用 80/443 端口,通过
server_name精准匹配,这是生产环境最常用的方式,对外表现为标准 Web 服务。 - IP 区分:服务器绑定多个 IP,每个 IP 对应一个站点,受限于 IP 资源,现已较少使用。
直接选择域名区分方案,若暂时没有域名,可用端口方案临时过渡,但上线前务必切换。
目录结构设计:从源头规范
推荐在 Nginx 配置目录下建立清晰的站点目录结构:
/etc/nginx/ ├── nginx.conf # 主配置文件 ├── sites-available/ # 站点可用配置(草稿区) ├── sites-enabled/ # 站点启用配置(软链接指向 available) └── conf.d/ # 全局共享配置片段
站点文件命名规范:使用域名命名,如 example.com.conf,这样的命名方式在站点数量增长后,仍能保持极高的可辨识度,避免出现 server1.conf 这类含义不明的文件。
核心配置步骤详解
主配置文件引入站点目录
编辑 nginx.conf 的 http 块,确保包含以下内容:

http {
# 其他全局配置...
include /etc/nginx/sites-enabled/.conf;
}
创建站点配置文件
在 sites-available/ 下为每个站点创建独立配置,以两个站点为例:
站点 A(blog.example.com):
server {
listen 80;
server_name blog.example.com;
root /var/www/blog;
index index.html index.php;
access_log /var/log/nginx/blog.access.log;
error_log /var/log/nginx/blog.error.log;
location / {
try_files $uri $uri/ =404;
}
# PHP 处理(如有)
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
}
站点 B(shop.example.com):
server {
listen 80;
server_name shop.example.com;
root /var/www/shop;
index index.html;
access_log /var/log/nginx/shop.access.log;
error_log /var/log/nginx/shop.error.log;
location / {
try_files $uri $uri/ =404;
}
# 静态资源缓存
location ~ .(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}
启用站点并重载
ln -s /etc/nginx/sites-available/blog.example.com.conf /etc/nginx/sites-enabled/ ln -s /etc/nginx/sites-available/shop.example.com.conf /etc/nginx/sites-enabled/ nginx -t && nginx -s reload
nginx -t 是必须执行的步骤,它能提前发现语法错误,避免线上服务中断。
深入优化:权限与安全性
多站点共存的服务器,安全隔离是容易被忽视的关键环节:
- 运行用户隔离:为每个站点创建独立的系统用户,并在
server块中通过user指令(需配合nginx主进程以 root 启动)指定,这能防止一个站点被入侵后波及其他站点。 - 目录权限最小化:站点根目录权限设为
750,文件设为640,属主为对应站点用户,杜绝使用777权限。 - 禁用未绑定域名的访问:在配置中增加一个默认拒绝的
server块,拦截通过 IP 或未知域名发起的请求:

server {
listen 80 default_server;
server_name _;
return 444;
}
444 是 Nginx 特有的响应码,直接断开连接而不返回任何内容,能有效减少恶意扫描。
性能调优建议
多站点场景下,Nginx 的性能瓶颈往往不在 Nginx 本身,而在于 站点间的资源争抢:
- 开启 Gzip 压缩:在
http块全局开启,减少带宽消耗。 - 调整 worker 进程数:设为 CPU 核心数,可通过
auto参数自动探测。 - 静态资源独立缓存:如站点 B 配置所示,对不同类型资源设置差异化过期时间。
- 日志切割:使用
logrotate按天切割日志,避免单个日志文件过大导致磁盘耗尽。
常见问题排查
- 访问站点时跳到默认站点:检查
server_name是否拼写错误,以及 DNS 解析是否生效。 - 静态文件 404:确认
root路径是否存在且权限正确,并检查try_files配置。 - 重载配置后服务异常:立即回滚配置,检查
nginx -t输出,注意是否因编辑不当破坏了文件格式。
酷番云经验案例
我们曾协助一家电商客户进行多站点迁移,客户原有 3 个站点零散分布在多台服务器上,管理混乱且资源利用率低,在酷番云

的云服务器上,我们采用上述“目录隔离 + 独立配置”方案,将站点统一规划,过程中重点处理了两个细节:
- 跨站数据隔离:每个站点使用独立数据库账号,Nginx 层面通过
fastcgi_param传递独立的环境变量,避免应用层串号。 - CDN 与源站协调:客户启用了 CDN 加速,我们在 Nginx 配置中为 CDN 回源请求单独设置
server块,并配置了精准的allow/deny规则,仅放行 CDN 节点 IP,保障源站安全。
迁移后,服务器成本降低约 40%,站点响应时间平均缩短 25%,运维效率显著提升。
相关问答
多站点配置中,sites-available 和 sites-enabled 目录的作用是什么?可以直接放在 conf.d 下吗?
sites-available 存放站点的“草稿”配置,sites-enabled 通过软链接方式“激活”需要的站点,这种模式便于临时禁用站点(删除软链接即可)而无需删除原配置,而 conf.d 更适合存放与站点无关的全局配置片段(如压缩、缓存参数),两者职能不同,建议按职责分离使用,若站点数量少、变更不频繁,将站点配置直接放入 conf.d 也可以,但不推荐,因为这会削弱配置管理的灵活性。
同一域名下,如何根据路径区分多个应用?
可以在一个 server 块内,用多个 location 块实现:
server {
server_name example.com;
location /blog/ {
alias /var/www/blog/;
}
location /shop/ {
alias /var/www/shop/;
}
}
注意使用 alias 而非 root,否则路径映射会出错,这种方式适合应用间耦合度较低的场景,但若应用包含独立后端逻辑,仍建议拆分为独立站点,便于独立升级与故障隔离。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/728570.html

