Tenía una aplicación similar a Shopify. Entonces, mi cliente obtiene un subdominio cuando crea una tienda (es decir customer1.myShopify.com ).
para manejar este caso de subdominios dinámicos con nginx:
server { listen 443 ssl; server_name admin.myapp.com; ssl_certificate /etc/letsencrypt/live/myapp/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/myapp/privkey.pem; location / { proxy_pass http://admin-front-end:80/; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; } } server { listen 443 ssl; server_name *.myapp.com; ssl_certificate /etc/letsencrypt/live/myapp/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/myapp/privkey.pem; location / { proxy_pass http://app-front-end:80/; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; } } esto funciona muy bien, así que si visita admin.myapp.com , verá la aplicación de administración y si visita cualquier xxx.myapp.com , verá la aplicación de la tienda.
Quiero permitir que mi cliente conecte su propio dominio. así que les dije que se conectaran con CNAME y A Record .
A Record => @ => 12.12.12.3(my root nginx ip)
CNAME => WWW => thier.myapp.com
no todas las solicitudes a customer.com serán resueltas por mi nginx.
así que agregué esta configuración a mi nginx, para capturar todas las demás solicitudes de server_name:
server { listen 80; server_name server_name ~^.*$; location / { proxy_pass http://app-front-end:80/; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; } }y funciona bien
pero ¿cómo puedo manejar SSL para este caso? porque podría ser cualquier nombre de dominio. No sé cuál será el nombre de dominio del cliente.
¿Cómo puedo darles la posibilidad de agregar un certificado SSL automáticamente y sin crear manualmente?
Este bloque de servidor debería funcionar ya que los nombres de variables son compatibles con las directivas ssl_certificate y ssl_certificate_key .
server { listen 443; server_name server_name ~^.*$; map "$host" $domain_name { ~(.*)\.(.*)\.(.*)$ $2.$3; } ssl_certificate /path/to/cert/files/$domain_name.crt; ssl_certificate_key /path/to/cert/keys/$domain_name.key; location / { proxy_pass http://app-front-end:80/; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; } }PD El uso de nombres de variables comprometería el rendimiento porque ahora nginx cargaría los archivos en cada protocolo de enlace SSL.
Referencia: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_certificate
Sugiero usar un bloque separado con diferentes certificados ssh, esa es la única solución que funcionó para mí
server { listen 80; root /var/www/html/example1.com; index index.html; server_name example1.com; ssl_certificate /etc/letsencrypt/live/example1.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example1.com/privkey.pem; location / { try_files $uri $uri/ =404; } } server { listen 80; root /var/www/html/example2.com; index index.html; server_name example2.com; ssl_certificate /etc/letsencrypt/live/example2.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example2.com/privkey.pem; location / { try_files $uri $uri/ =404; } }En mi opinión, en lugar de comprometer el rendimiento de nginx, deberíamos usar un trabajo cron, digamos el bot letsencrypt, que obtendrá el certificado en función del dominio solicitado por el usuario, y puede agregar el certificado en nginx conf y reiniciar el servidor.
Prima:
He usado traefik, que son soluciones basadas en kubernetes, cargan configuraciones sobre la marcha sin reiniciar.