如何将多套同模板生成的Nginx站点配置合并为单套通用配置
可以通过单份Nginx配置管理所有同规则站点,核心思路是用变量动态匹配请求属性,替换掉原本需要硬编码的占位符,以下是可直接落地的方案:
前置前提
你的所有站点目录结构、PHP版本规则、用户命名规则、证书存放路径都符合统一的映射逻辑,这个方案的性能和单独生成300份配置几乎无差异。
具体实现步骤
- 先在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;
- 合并所有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
相关产品推荐
相关产品推荐

