使用 Let's Encrypt 为大型 WordPress Multisite 配置 Nginx

使用 Let's Encrypt 为大型 WordPress Multisite 配置 Nginx

大型 WordPress Multisite 安装有超过 150 个域名,预计将达到 900 多个。

我想简化 nginx 服务器配置。目前,由于 Let's Encrypt 限制每个 SSL 证书 100 个,我们必须将服务器列表拆分为 100 个组。这很好用。

但是,为了确保 www. 和根域都能正常工作,我使用 if 语句来评估传入请求是否为根,然后重定向到 www。这也能正常工作,但需要对托管的每个域都执行此操作,因此目前有 75 多个 if 语句。

我确信有更好、更高效、更优雅的方法来实现这一点。我研究过不同的方法,但大多数解决方案似乎都有效,因为您可以在一个服务器块中为所有域处理所有传入域。同样,在我的例子中,我们目前有 3 个服务器块,以便 Let's Encrypt 正常工作。

示例配置...

##Serve first 100 Sites
server {
    
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_certificate /etc/letsencrypt/live/domain.com-0010/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/domain.com-0010/privkey.pem; # managed by Certbot
    server_name domain1.com www.domain1.com domain2.com www.domain2.com domain3.com www.domain3.com

    if ($host = domain1.com) {
        return 301 https://www.domain1.com$request_uri;
    }
    if ($host = domain2.com) {
        return 301 https://www.domain2.com$request_uri;
    }
    if ($host = domain2.com) {
        return 301 https://www.domain2.com$request_uri;
    }
    if ($host = domain3.com) {
        return 301 https://www.domain3.com$request_uri;
    }

    ...rest of config

}
##Serve second 100 Sites
server {
    
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_certificate /etc/letsencrypt/live/domain.com-0020/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/domain.com-0020/privkey.pem; # managed by Certbot
    server_name domain101.com www.domain101.com domain102.com www.domain102.com domain103.com www.domain103.com

    if ($host = domain101.com) {
        return 301 https://www.domain101.com$request_uri;
    }
    if ($host = domain102.com) {
        return 301 https://www.domain102.com$request_uri;
    }
    if ($host = domain102.com) {
        return 301 https://www.domain102.com$request_uri;
    }
    if ($host = domain103.com) {
        return 301 https://www.domain103.com$request_uri;
    }
    ...rest of config

}

答案1

我更喜欢将主www.域拆分为其自己的server块并重定向到另一个块:

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_certificate ...;
    ssl_certificate_key ...;
    server_name example1.com example2.com example3.com;

    return 301 https://www.$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_certificate ...;
    ssl_certificate_key ...;
    server_name www.example1.com www.example2.com www.example3.com;

    ... rest of config
}

这样重定向配置就与主配置明显区分开来了。不需要if对每个发往主域的请求都进行处理,速度会稍微提高一些。

相关内容