You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多套同模板生成的Nginx站点配置合并为单套通用配置

可以通过单份Nginx配置管理所有同规则站点,核心思路是用变量动态匹配请求属性,替换掉原本需要硬编码的占位符,以下是可直接落地的方案:


前置前提

你的所有站点目录结构、PHP版本规则、用户命名规则、证书存放路径都符合统一的映射逻辑,这个方案的性能和单独生成300份配置几乎无差异。


具体实现步骤

  1. 先在Nginx全局http块中添加映射规则(放在所有server块之外)
# 自动提取不带www的主域名
map $host $primary_domain {
    ~*^www\.(?<domain>.+)$ $domain;
    default $host;
}

# 映射站点根目录,如果你所有站点根目录规则为/var/www/主域名/web,直接用下面的配置,按自己实际规则修改即可
map $primary_domain $site_root {
    default /var/www/$primary_domain/web;
}

# 映射PHP-FPM的用户名,比如你规则是把域名的点替换为下划线作为用户名,按自己实际规则修改
map $primary_domain $fpm_user {
    default ${primary_domain//./_};
}

# 开SSL会话缓存提升性能
ssl_session_cache shared:SSL:10m;
  1. 合并所有server块为3份通用配置
# 80端口统一跳转https,自动去掉www前缀
server {
    listen 80 default_server;
    server_name _;
    return 301 https://$primary_domain$request_uri;
}

# 443端口带www的请求统一跳转到不带www的主域名
server {
    listen 443 ssl default_server;
    server_name ~*^www\.;
    
    # Nginx 1.15.9及以上版本支持证书路径用变量,低版本升级即可
    ssl_certificate /etc/letsencrypt/live/$primary_domain/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/$primary_domain/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    
    return 301 https://$primary_domain$request_uri;
}

# 主站点通用配置
server {
    listen 443 ssl default_server;
    server_name _;
    
    ssl_certificate /etc/letsencrypt/live/$primary_domain/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/$primary_domain/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    
    root $site_root;
    index index.php index.html;

    recursive_error_pages off;
    error_page 403 = /HTTP_ERRORS/403.html;
    error_page 404 = /HTTP_ERRORS/404.html;
    error_page 500 = /HTTP_ERRORS/500.html;
    
    location ^~ /HTTP_ERRORS/ {
        alias 这里替换成你实际的共享错误页根目录路径;
        internal;
    }  
    
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location /manage {
        root $site_root/manage;  
        try_files $uri $uri/ /manage/index.php?$query_string;
    }

    # PHP版本如果所有站点统一就直接写死,不统一就再加个map映射$php_version变量即可
    location ~* \.php$ {
        fastcgi_pass unix:/run/php/php8.2-fpm-$fpm_user.sock;
        include         fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
    }

    location /assets/ {
        alias /public/assets/;
    }     
}

特殊情况处理

如果有个别站点规则和通用规则不一致,只需要单独给这个站点加一个优先级更高的server块配置即可,不需要修改通用配置。


折中方案(如果不想用动态变量)

你也可以把通用的SSL配置、location规则抽成单独的配置片段文件,每个站点的配置只需要写几行自定义参数,然后include通用片段即可,就算300个站点总配置体积也会缩小90%以上,维护成本也很低。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 15:36:10