ssl - Nginx 设置多个域与单个 ssl 证书到相同的上游

标签 ssl nginx ssl-certificate server-name

所以我有多个域,其中有多个 let's encrypt ssl 证书(每个域一个),它们都指向同一个应用程序(上游)。目前我正在使用下面的代码。然而,它是相当多的代码,特别是如果我必须为每个域复制它。所以我想知道是否有一种方法可以将它组合起来,这样我就可以只使用一次代码,这样可以更容易维护。

https://www.any-domain-here 的重定向以及最后一个主要的服务器 block 都有问题,因为两者都需要 ssl 证书,我需要包括那些针对所有不同领域的。那么有没有一种方法可以在不复制这些代码块的情况下做到这一点?

############################
#
# Upstream
#
upstream upstream {
    least_conn;
    server app:8080;
}
upstream blog.upstream {
    least_conn;
    server app_nginx;
}
############################
#
# redirect all 80 to 443
# and allow Let's Encrypt
#
server {
    server_name ~.;
    listen 80;
    listen [::]:80;
    # config for .well-known
    include /etc/nginx/includes/letsencrypt.conf;

    location / {
        return         301 https://$host$uri;
    }
}
############################
#
# Redirect all www to non-www
#
server {
    server_name "~^www\.(.*)$" ;
    return 301 https://$1$request_uri ;
    ssl_certificate /etc/letsencrypt/live/www.domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.domain.com/privkey.pem;
}
##########################
# HTTPS
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name domain.com;

    location /blog/ {
        proxy_set_header Host $host;
        proxy_pass  http://blog.upstream;
    }

    ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
    # access_log
    access_log            /var/log/nginx/access.log;
    # proxy_pass config
    location / {
        # include proxy presets
        include /etc/nginx/includes/proxy.conf;
        proxy_pass              http://domain.com$uri;
    }
    # general ssl parameters
    include /etc/nginx/includes/ssl-params-with-preload.conf;

    root         /var/www/html;
}

最佳答案

我通过创建相当多的包含文件解决了这个问题。

我现在有以下 default.conf:

# don't redirect proxy
proxy_redirect  off;
# turn off global logging
access_log off;
# DON'T enable gzip as it opens up vulnerabilities
# logging format
log_format compression '$remote_addr - $remote_user [$time_local] '
                       '"$request" $status $bytes_sent '
                       '"$http_referer" "$http_user_agent" "$gzip_ratio"';
############################
#
# redirect all 80 to 443
# and allow Let's Encrypt
#
server {
  listen 80;
  listen [::]:80;
  server_name ~. ;

  location /.well-known/acme-challenge {
    root /var/www/html;
    default_type text/plain;
    # allow all;
  }

  location / {
    return 301 https://$host$uri;
  }
}
# include website configs
include /etc/nginx/includes/nginx-server.conf;

我的 nginx-server.conf 有以下内容:

############################
#
# Upstream
#
upstream veare_upstream {
    server veare:8080;
}
############################
#
# redirect all 80 to 443
# and allow Let's Encrypt
#
server {
    server_name www.veare.de;
    listen 80;
    listen [::]:80;

    root /var/www/html;

    location /.well-known/acme-challenge {
        default_type text/plain;
    }

    location / {
        return         301 https://$host$uri;
    }
}
############################
#
# Redirect all www to non-www
#
server {
    listen 80;
    listen [::]:80;
    server_name "~^www\.(.*)$" ;
    return 301 https://$1$request_uri;
}
##########################
# HTTPS
include /etc/nginx/includes/domains/*.conf;

最后一行包括我所有的域文件,例如是 veare.de.conf 它们的名称都与域完全一样:

############################
#
# Redirect all www to non-www
#
#
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name www.veare.de;
    ssl_certificate /etc/letsencrypt/live/www.veare.de/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.veare.de/privkey.pem;
    return 301 https://veare.de$request_uri;
}
##########################
# HTTPS
server {
    server_name veare.de;
    ssl_certificate /etc/letsencrypt/live/veare.de/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/veare.de/privkey.pem;

    location ^~ /.well-known/acme-challenge {
      allow all;
      # Set correct content type. According to this:
      # https://community.letsencrypt.org/t/using-the-webroot-domain-verification-method/1445/29
      # Current specification requires "text/plain" or no content header at all.
      # It seems that "text/plain" is a safe option.
      default_type "text/plain";
      root /var/www/html;
    }

    include /etc/nginx/includes/main-server.conf;
}

这非常适合我。

关于ssl - Nginx 设置多个域与单个 ssl 证书到相同的上游,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40970252/

相关文章:

ssl - 为什么在通过 Firefox 使用客户端证书时必须将 Jmeter HTTP Sampler Settings 设置为 HTTPClient3.1 或 Java(而不是 HTTPClient4)?

ssl - IIS 压缩和 HTTPS (SSL)

amazon-web-services - Amazon ECS - 在 Docker 入口点上使用 IAM 角色时权限被拒绝

php - nginx 502 网关错误

java - 生成自签名 ssl 证书作为 Maven 构建的一部分

MYSQL远程连接需要SSL

apache - httpd.conf 文件中的 LDAPS 身份验证失败

ssl - Nginx 重写 http 为 https 并代理到另一个端口,ERR_TOO_MANY_REDIRECTS 错误

ios - 如何使用 NSURLConnection 与 SSL 连接以获得不受信任的证书?

wordpress - 如何在 GCE 上启用和接受 HTTPS 连接以及设置 SSL 证书