Para facilitar la emisión de certificados del nginx en CloudPanel, este script ayuda listando todos los sitios activos y, si están configurados correctamente, permite la emisión de certificados para sus dominios:
__run_ssl_script() {
local VHOST_DIR="/etc/nginx/sites-enabled"
local files=("${VHOST_DIR}"/*.conf)
local count=1
local -A DOMAIN_CMD
clear
echo -e "\n\e[1;34mEscaneando $VHOST_DIR en busca de vhosts...\e[0m"
echo "==========================================================="
for file in "${files[@]}"; do
[ -e "$file" ] || continue
# 1. El dominio principal DEBE coincidir con el nombre del sitio de CloudPanel (nombre del archivo sin .conf)
local primary
primary=$(basename "$file" .conf)
# Ignorar configuraciones predeterminadas o archivos que no sean dominios
if [[ "$primary" == "default" || "$primary" == "custom-domain" ]]; then
continue
fi
# 2. Obtener TODAS las líneas server_name del archivo
local raw_domains
raw_domains=$(awk '/^[ \t]*server_name[ \t]/ {gsub(/;/, ""); gsub(/\r/, ""); gsub(/^[ \t]*server_name[ \t]+/, ""); printf "%s ", $0}' "$file")
if [ -n "$raw_domains" ]; then
local all_domains_arr
read -ra all_domains_arr Patrones de vhost:
Sitios PHP predeterminados:
### BEGIN Solo necesario para entornos con más de un server_name
server {
listen 443 quic;
listen 443 ssl;
listen [::]:443 quic;
listen [::]:443 ssl;
http2 on;
http3 on;
{{ssl_certificate_key}}
{{ssl_certificate}}
server_name www.-default-php.example;
return 301 https://-default-php.example$request_uri;
}
### END Solo necesario para entornos con más de un server_name
server {
listen 443 quic;
listen 443 ssl;
listen [::]:443 quic;
listen [::]:443 ssl;
http2 on;
http3 on;
server_name -default-php.example;
{{ssl_certificate_key}}
{{ssl_certificate}}
{{root}}
{{nginx_access_log}}
{{nginx_error_log}}
{{settings}}
index index.php index.html index.htm;
### BEGIN Incluye encabezados globales de seguridad y endpoints específicos .well-known
include /etc/nginx/global_settings;
### END Incluye encabezados globales de seguridad y endpoints específicos .well-known
### BEGIN Corrección para mejorar capacidades de la app si es necesario
# add_header Cache-Control no-transform;
# client_max_body_size 256M;
### END Corrección para mejorar capacidades de la app si es necesario
### BEGIN Manejo general de .well-known
location /.well-known/ {
auth_basic off;
allow all;
}
### END Manejo general de .well-known
### BEGIN Opcional: Prevenir ejecución de PHP en carpetas de carga personalizadas
# location ~* ^/(uploads|storage|media)/.*\.php$ {
# deny all;
# }
### END Seguridad opcional para cargas
### BEGIN Controlador principal Front Controller
location / {
try_files $uri $uri/ /index.php?$args;
}
### END Controlador principal Front Controller
### BEGIN Procesamiento y caché de activos estáticos
location ~* ^.+\.(css|js|jpg|jpeg|gif|png|ico|gz|svg|svgz|ttf|otf|woff|woff2|eot|mp4|ogg|ogv|webm|webp|zip|swf|map)$ {
include /etc/nginx/security_headers;
add_header Access-Control-Allow-Origin "*" always;
add_header Cache-Control "max-age=2592000, public, no-transform" always;
access_log off;
log_not_found off;
expires 30d;
}
### END Procesamiento y caché de activos estáticos
### BEGIN Procesamiento general de PHP
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_intercept_errors on;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS "on";
fastcgi_param SERVER_PORT 443;
fastcgi_read_timeout 300;
fastcgi_send_timeout 300;
fastcgi_pass 127.0.0.1:{{php_fpm_port}};
fastcgi_param PHP_VALUE "{{php_settings}}";
}
### END Procesamiento general de PHP
}Sitios predeterminados Reverse Proxy:
### BEGIN Solo necesario para entornos con más de un server_name
server {
listen 443 quic;
listen 443 ssl;
listen [::]:443 quic;
listen [::]:443 ssl;
http2 on;
http3 on;
{{ssl_certificate_key}}
{{ssl_certificate}}
server_name www.-default-reverse.example;
return 301 https://-default-reverse.example$request_uri;
}
### END Solo necesario para entornos con más de un server_name
server {
listen 443 quic;
listen 443 ssl;
listen [::]:443 quic;
listen [::]:443 ssl;
http2 on;
http3 on;
server_name -default-reverse.example;
{{ssl_certificate_key}}
{{ssl_certificate}}
{{root}}
{{nginx_access_log}}
{{nginx_error_log}}
{{settings}}
### BEGIN Incluye encabezados globales de seguridad y endpoints específicos .well-known
include /etc/nginx/global_settings;
### END Incluye encabezados globales de seguridad y endpoints específicos .well-known
### BEGIN Corrección para mejorar capacidades de apps reversas si es necesario
# add_header Cache-Control no-transform;
# client_max_body_size 256M;
### END Corrección para mejorar capacidades de apps reversas si es necesario
### BEGIN Manejo general de .well-known
location /.well-known/ {
auth_basic off;
allow all;
try_files $uri @reverse_proxy;
}
### END Manejo general de .well-known
### BEGIN Controlador principal Front Controller
location / {
try_files $uri @reverse_proxy;
}
### END Controlador principal Front Controller
### BEGIN Destino general Reverse Proxy
location @reverse_proxy {
proxy_pass {{reverse_proxy_url}};
proxy_http_version 1.1;
# Encabezados estándar de proxy
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;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
# Soporte WebSocket
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
# Soporte SSL SNI upstream
proxy_ssl_server_name on;
proxy_ssl_name $host;
proxy_pass_request_headers on;
# Tiempos de espera prolongados
proxy_connect_timeout 900;
proxy_send_timeout 900;
proxy_read_timeout 900;
# Correcciones para SSE y Streaming en tiempo real (descomentar para apps SSE, Streaming en tiempo real)
# proxy_buffering off;
# proxy_cache off;
# proxy_max_temp_file_size 0;
# chunked_transfer_encoding on;
# gzip off;
}
### END Destino general Reverse Proxy
}Sitios predeterminados Estáticos:
### BEGIN Solo necesario para entornos con más de un server_name
server {
listen 443 quic;
listen 443 ssl;
listen [::]:443 quic;
listen [::]:443 ssl;
http2 on;
http3 on;
{{ssl_certificate_key}}
{{ssl_certificate}}
server_name www.-default-static.example;
return 301 https://-default-static.example$request_uri;
}
### END Solo necesario para entornos con más de un server_name
server {
listen 443 quic;
listen 443 ssl;
listen [::]:443 quic;
listen [::]:443 ssl;
http2 on;
http3 on;
server_name -default-static.example;
{{ssl_certificate_key}}
{{ssl_certificate}}
{{root}}
{{nginx_access_log}}
{{nginx_error_log}}
{{settings}}
index index.html index.htm;
### BEGIN Incluye encabezados globales de seguridad y endpoints específicos .well-known
include /etc/nginx/global_settings;
### END Incluye encabezados globales de seguridad y endpoints específicos .well-known
### BEGIN Manejo general de .well-known
location /.well-known/ {
auth_basic off;
allow all;
}
### END Manejo general de .well-known
### BEGIN Enrutamiento principal
location / {
# Comportamiento estándar de sitio estático (devuelve 404 si no existe archivo o directorio):
try_files $uri $uri/ =404;
# PARA SPAs (React, Vue, Angular, Svelte) - Descomentar la línea siguiente y comentar la de arriba:
# try_files $uri $uri/ /index.html;
}
### END Enrutamiento principal
### BEGIN Procesamiento y caché de activos estáticos
location ~* ^.+\.(css|js|jpg|jpeg|gif|png|ico|gz|svg|svgz|ttf|otf|woff|woff2|eot|mp4|ogg|ogv|webm|webp|zip|swf|map|html|htm)$ {
include /etc/nginx/security_headers;
add_header Access-Control-Allow-Origin "*" always;
add_header Cache-Control "max-age=2592000, public, no-transform" always;
access_log off;
log_not_found off;
expires 30d;
}
### END Procesamiento y caché de activos estáticos
### BEGIN Seguridad: Bloquear explícitamente cualquier ejecución accidental de archivos PHP
location ~ \.php$ {
return 404;
}
### END Seguridad
}Sitios predeterminados Wordpress:
### BEGIN Solo necesario para entornos con más de un server_name
server {
listen 443 quic;
listen 443 ssl;
listen [::]:443 quic;
listen [::]:443 ssl;
http2 on;
http3 on;
{{ssl_certificate_key}}
{{ssl_certificate}}
server_name www.-default-wordpress.example;
return 301 https://-default-wordpress.example$request_uri;
}
### END Solo necesario para entornos con más de un server_name
server {
listen 443 quic;
listen 443 ssl;
listen [::]:443 quic;
listen [::]:443 ssl;
http2 on;
http3 on;
server_name -default-wordpress.example;
{{ssl_certificate_key}}
{{ssl_certificate}}
{{root}}
{{nginx_access_log}}
{{nginx_error_log}}
{{settings}}
index index.php index.html;
### BEGIN Incluye encabezados globales de seguridad y endpoints específicos .well-known
include /etc/nginx/global_settings;
### END Incluye encabezados globales de seguridad y endpoints específicos .well-known
### BEGIN Corrección para mejorar capacidades de la app si es necesario
# add_header Cache-Control no-transform;
# client_max_body_size 256M;
### END Corrección para mejorar capacidades de la app si es necesario
### BEGIN Manejo general de .well-known para este sitio proxy
location /.well-known/ {
auth_basic off;
allow all;
}
### END Manejo general de .well-known para este sitio proxy
### BEGIN Prevenir ejecución de PHP en directorio uploads (Endurecimiento de seguridad)
location ~* ^/wp-content/uploads/.*\.php$ {
deny all;
}
### END Prevenir ejecución de PHP en directorio uploads
### BEGIN Reescrituras para WordPress Multisite Subdirectorio (descomentar para usar MU Subdirectorio)
# if (!-e $request_filename) {
# rewrite /wp-admin$ $scheme://$host$uri/ permanent;
# rewrite ^/[_0-9a-zA-Z-]+(/wp-.*) $1 last;
# rewrite ^/[_0-9a-zA-Z-]+(/.*\.php)$ $1 last;
# }
### END Reescrituras para WordPress Multisite Subdirectorio
### BEGIN Controlador principal Front Controller
location / {
try_files $uri $uri/ /index.php?$args;
}
### END Controlador principal Front Controller
### BEGIN Procesamiento y caché de activos estáticos
location ~* ^.+\.(css|js|jpg|jpeg|gif|png|ico|gz|svg|svgz|ttf|otf|woff|woff2|eot|mp4|ogg|ogv|webm|webp|zip|swf|map)$ {
# Ruta estática multisite subdirectorio (descomentar para usar MU Subdirectorio)
# rewrite ^/[_0-9a-zA-Z-]+(/wp-.*) $1 break;
# Re-incluir encabezados globales de seguridad para evitar que Nginx borre herencia de encabezados
include /etc/nginx/security_headers;
add_header Access-Control-Allow-Origin "*" always;
add_header Cache-Control "max-age=2592000, public, no-transform" always;
access_log off;
log_not_found off;
expires 30d;
}
### END Procesamiento y caché de activos estáticos
### BEGIN WP-Admin y Login PHP (Timeout extendido de 1 hora para tareas/actualizaciones pesadas)
location ~* ^/(wp-admin/.*\.php|wp-login\.php)$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_intercept_errors on;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS "on";
fastcgi_param SERVER_PORT 443;
fastcgi_read_timeout 3600;
fastcgi_send_timeout 3600;
fastcgi_pass 127.0.0.1:{{php_fpm_port}};
fastcgi_param PHP_VALUE "{{php_settings}}";
}
### END WP-Admin y Login PHP
### BEGIN Procesamiento general de PHP (Timeout de 5 minutos)
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_intercept_errors on;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS "on";
fastcgi_param SERVER_PORT 443;
fastcgi_read_timeout 300;
fastcgi_send_timeout 300;
fastcgi_pass 127.0.0.1:{{php_fpm_port}};
fastcgi_param PHP_VALUE "{{php_settings}}";
}
### END Procesamiento general de PHP
}¡Hecho!