适用于 Apache for WordPress 的 Nginx 反向 SSL 代理的问题
Problems with Nginx Reverse SSL Proxy for Apache for WordPress
我正在建立一个 WordPress 网站供自己使用。我正在尝试使用 Nginx 作为 SSL 反向代理,至于我 运行 的其他 Webtools。我有三个 Linux 个容器:
- 10.0.0.51:443:用于五个网络工具 + 一个 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. 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.
我正在建立一个 WordPress 网站供自己使用。我正在尝试使用 Nginx 作为 SSL 反向代理,至于我 运行 的其他 Webtools。我有三个 Linux 个容器:
- 10.0.0.51:443:用于五个网络工具 + 一个 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. 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.