【问题标题】:Problems with Nginx Reverse SSL Proxy for Apache for WordPress用于 WordPress 的 Apache 的 Nginx 反向 SSL 代理问题
【发布时间】:2021-05-21 14:32:29
【问题描述】:

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

  • 10.0.0.51:443:五个 Web 工具 + 一个 WordPress 站点的 Nginx SSL 代理
  • 10.0.0.52:Web 工具容器,工具使用 HTTP 在各种端口上运行
  • 10.0.0.164:8080:适用于 WordPress 的 Apache

我正在使用 Let's Encrypt 提供 SSL 证书,这很好用。我的 Webtools 可以正常工作,并且它们都有自己的子域。 WordPress 网站应该位于www.example.org。当我转到这个 URL 时,我被重定向到 https://www.example.org:8080,这显然给了我一个超时。另一方面,当我访问http://10.0.0.164:8080 时,WordPress 站点确实可以正确加载。听起来 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_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 apache nginx


    【解决方案1】:

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

    这些是用于在 Nginx 中进行这项工作的 proxy_set_header 设置:

    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;
    

    由于这些与用于我运行的其他 Web 工具的普通 proxy_pass 标头不同,我制作了一个名为 wp_proxy_params.conf 的单独文件,并将其包含在 Nginx 中的 WordPress 站点 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'];
    }
    

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

    【讨论】:

      猜你喜欢
      • 2018-01-05
      • 2016-03-31
      • 2017-08-03
      • 2021-01-03
      • 2019-05-17
      • 2010-12-03
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      相关资源
      最近更新 更多