适用于 Apache for WordPress 的 Nginx 反向 SSL 代理的问题

Problems with Nginx Reverse SSL Proxy for Apache for WordPress

我正在建立一个 WordPress 网站供自己使用。我正在尝试使用 Nginx 作为 SSL 反向代理,至于我 运行 的其他 Webtools。我有三个 Linux 个容器:

我正在使用 Let's Encrypt 来提供 SSL 证书,而且效果很好。我的 Webtools 工作没有问题,它们每个都有自己的子域。 WordPress 网站应该位于 www.example.org. When I go to this URL, I get redirected to https://www.example.org:8080 which obviously gives me a timeout. On the other hand, the WordPress site does load correctly when I visit http://10.0.0.164:8080。听起来 Apache 正在重写 URL 以包含 :8080?

我的Nginx站点配置如下:

server {
        server_name www.example.org;

        location / {
            proxy_pass http://10.0.0.164:8080;
            include /etc/nginx/proxy_params;
        }

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

server {
    if ($host = www.example.org) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

        server_name www.example.org;

    listen 80;
    return 404; # managed by Certbot
}

Nginx proxy_params:

proxy_set_header Host $http_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-Server $host;

和 Apache VirtualHost 配置。其余为默认值:

<VirtualHost *:8080>
    ServerName domain.org
    ServerAlias www.example.org
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/example.org
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

# Allow .htaccess overwrites
<Directory /var/www/example.org/>
    AllowOverride All
</Directory>

这个问题最终源于 WordPress 并非设计为支持任何类型的反向代理。

这些 proxy_set_header 设置用于在 Nginx 中实现此功能:

proxy_set_header Host $http_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-Server $host;

因为这些不同于用于其他网络工具的正常 proxy_pass headers 我 运行,我制作了一个名为 wp_proxy_params.conf 的单独文件并将其包含在 WordPress 中Nginx 中的站点 SSL 服务器块。

下一步,我们必须改变 WordPress 对我们 URL 的期望。登录 WP-Admin 并转到“设置”>“常规”。在 WordPress 地址和站点地址下输入完整的 URL。在这个例子中,它将是 https://www.example.org。应用设置后,网站将无法访问。

最后,我们编辑站点根目录中的 wp-config.php 添加以下代码:

/**If we got HTTPS from Nginx, we must reply the same way */
if ( $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' )
{
        $_SERVER['HTTPS']       = 'on';
    $_SERVER['SERVER_PORT'] = '443';
        define('FORCE_SSL_ADMIN', true);
}

/**When replying make sure the reply HOST is set to Nginx Rerverse Proxy address, not us */
if ( isset($_SERVER['HTTP_X_FORWARDED_HOST']) )
{
        $_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
}

此部分必须在打开 <?php 语句后立即添加。如果添加到现有 wp-config.php 内容下方,将阻止访问 WP-Admin.