如何使用SSL为多个自定义域正确设置NGINX

如何使用SSL为多个自定义域正确设置NGINX,ssl,nginx,lets-encrypt,Ssl,Nginx,Lets Encrypt,我正在制作一个多租户平台。我的主url是example.com,每个新用户都会得到一个子域名username.example.com,这很有效。它运行在数字海洋上的Ubuntu微滴上。 我想更进一步,允许他们通过在DNS上创建名称记录来添加指向我的应用程序的自定义域。通过手动设置并为自定义域编写额外的服务器块,我也实现了这一点。我从certbot开始生成证书,但后来手动修改了很多代码 以下是我的nginx文件在/nginx/sites available/example.com上的外观: ser

我正在制作一个多租户平台。我的主url是
example.com
,每个新用户都会得到一个子域名
username.example.com
,这很有效。它运行在数字海洋上的Ubuntu微滴上。 我想更进一步,允许他们通过在DNS上创建名称记录来添加指向我的应用程序的自定义域。通过手动设置并为自定义域编写额外的服务器块,我也实现了这一点。我从certbot开始生成证书,但后来手动修改了很多代码

以下是我的nginx文件在
/nginx/sites available/example.com
上的外观:

server {

    server_name example.com *.example.com;

    # pass to NODEJS app running at :3000
    location / {
            proxy_pass http://localhost:3000;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
    }

    listen [::]:443 ssl ipv6only=on; 
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/example.com-0001/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/example.com-0001/privkey.pem; 
    include /etc/letsencrypt/options-ssl-nginx.conf; 
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 
}

server {
    server_name customdomain.com;
    location / {
            proxy_pass http://localhost:3000;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/customdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/customdomain.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

}

server {
    listen 80;
    listen [::]:80;

    server_name ~^(?<subdomain>.+)\.example.com$;
    return 301 https://$subdomain.example.com$request_uri;
}

server {
    listen 80;
    listen [::]:80;

    server_name customdomain.com$;
    return 301 https://customdomain$request_uri;
}
服务器{
server_name example.com*.example.com;
#传递到运行速度为:3000的NODEJS应用程序
地点/{
代理通行证http://localhost:3000;
proxy_http_版本1.1;
代理设置头升级$http\U升级;
代理集头连接“升级”;
代理设置头主机$Host;
代理缓存绕过$http\u升级;
}
侦听[:]:443 ssl ipv6only=on;
听443ssl;
ssl_证书/etc/letsencrypt/live/example.com-0001/fullchain.pem;
ssl_certificate_key/etc/letsencrypt/live/example.com-0001/privkey.pem;
包括/etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam/etc/letsencrypt/ssl-dhparams.pem;
}
服务器{
服务器名称customdomain.com;
地点/{
代理通行证http://localhost:3000;
proxy_http_版本1.1;
代理设置头升级$http\U升级;
代理集头连接“升级”;
代理设置头主机$Host;
代理缓存绕过$http\u升级;
}
侦听443 ssl;#由Certbot管理
ssl_certificate/etc/letsencrypt/live/customdomain.com/fullchain.pem;
ssl_certificate_key/etc/letsencrypt/live/customdomain.com/privkey.pem;
包括/etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam/etc/letsencrypt/ssl-dhparams.pem;
}
服务器{
听80;
听[:]:80;
服务器名称~^(?.+)\.example.com$;
返回301 https://$subdomain.example.com$request\u uri;
}
服务器{
听80;
听[:]:80;
服务器名称customdomain.com$;
返回301https://customdomain$request_uri;
}
因此,我的问题是:

  • 有没有一种方法可以让我自动做到这一点——动态获取自定义域的证书并允许它进入我的nodejs应用程序

  • 我应该在
    可用域下创建多个文件,而不是在同一文件中创建多个服务器块吗

  • 我是否应该改为默认设置
  • 请注意,位置块在每个服务器块中重复,是否可以用更干燥的方法执行此操作

  • 我对这一切都很陌生,所以,如果有更好的方法使用SSL和自定义域进行多租户设置


  • 谢谢。

    您能解决这个问题吗?我也希望这样做thing@CrhistianRamirez这是一个测试设置,我只使用certbot自动完成的,安装自定义证书仍然是手动的,我永远无法回答我在这里提出的所有4个问题。对于prod设置,我和证书管理员一起转到了Kubernetes。