我正在尝试使用 podman-compose(类似于 docker-compose)在生产服务器上部署容器化的 Wordpress。 Web 服务在主机上的端口 8080 上公开。然后,我利用 Apache 的 ProxyPass 指令创建一个反向代理并将请求发送到 localhost:8080 提供 WordPress 的服务,从而使 WordPress 在 http://example.com.
上可用
我成功地设法将数据库和 wordpress 卷迁移到服务器。我遇到的第一个问题是 WordPress 在 wpoptions 中将 localhost 存储为
siteurl
和 home
,因此它不能在生产服务器上运行。将这些值更改为 example.com(我的域)后,它会继续重定向到本地主机。疯狂的!
这是我的 docker-compose.yaml:
version: "3.8"
services:
web:
image: wordpress
restart: always
volumes:
- wordpress:/var/www/html
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: user
WORDPRESS_DB_NAME: db
WORDPRESS_DB_PASSWORD: mypass
WORDPRESS_DEBUG: 0
depends_on:
- db
networks:
- wpnet
db:
image: mariadb:10.5
restart: always
ports:
- 6603:3306
volumes:
- wpdbvol:/var/lib/mysql
environment:
MYSQL_DATABASE: db
MYSQL_USER: user
MYSQL_PASSWORD: mypass
MYSQL_ROOT_PASSWORD: mypass
networks:
- wpnet
volumes:
wordpress: {}
wpdbvol: {}
networks:
wpnet: {}
这是我的反向代理配置:
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
ProxyPass "/" "https://localhost:8080"
#Allows modification of Location: headers from backend server to point to the reverse proxy
ProxyPassReverse "/" "http://localhost:8080"
</VirtualHost>
您遇到的问题可能是您在
/
、ProxyPass
网址末尾缺少 ProxyPassReverse
。
就我而言,我想在以下位置提供服务:https://example.com
所以,我所做的(在 wordpress 5.8.1 上)是:
1. 在数据库(或直接 ui)中,我必须同时更新
siteurl
和 home
(那里不需要尾随 /
)
update wp_options set option_value="https://example.com" where option_name in ("siteurl", "home");
2. 还粘贴 apache 的反向代理设置(
X-Forwarded-Proto
和 X-Forwarded-Port
是关键设置):
<VirtualHost *:443>
ServerName example.com
SSLEngine on
SSLCertificateFile "/sslcert/server.crt"
SSLCertificateKeyFile "/sslcert/server.key"
ProxyRequests Off
KeepAlive Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
# These are required for https reverse proxy to work with wordpress (They are read from `wp-config.php`)
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
ProxyPreserveHost On
ErrorLog "logs/wordpress.revproxy-sslerror_log"
CustomLog "logs/wordpress.revproxy-sslaccess_log" common
</VirtualHost>
注意: 在我的例子中,我已经使用反向代理测试它作为 docker-compose 的服务,所以在上面的设置中(步骤 2)而不是
http://localhost:8080/
我使用的是 http://wpcontainer/
。但在你的情况下,以上应该按原样工作。
这是一个远景,很可能行不通。
也许尝试在撰写 yml
https://example.com
environment
设置中将 WORDPRESS_CONFIG_EXTRA
定义为您的主页 url。
services:
web:
image: wordpress
restart: always
volumes:
- wordpress:/var/www/html
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: user
WORDPRESS_DB_NAME: db
WORDPRESS_DB_PASSWORD: mypass
WORDPRESS_DEBUG: 0
WORDPRESS_CONFIG_EXTRA: |
/** define our home url */
define('WP_HOME', 'https://example.com');
define('WP_SITEURL', 'https://example.com');
depends_on:
- db
networks:
- wpnet
这 might 强制 wordpress 安装到它的目的地并阻止它重定向回
localhost
.
另外,当我在让 ngrok 隧道 进入我的本地 wordpress 环境时遇到问题时,我不得不安装 Relative URL wordpress 插件,它让我的隧道正常工作。
不确定这是否与您的问题相关,但可能值得安装Relative URL插件并在尝试上述
WORDPRESS_CONFIG_EXTRA
想法之前查看这是否解决了您的本地主机重定向问题。
该插件已 2 年未更新,但仍可与 ngrok 配合使用。插件实际上是 20 行 php,我想可以将其放入您的函数中。
Ngrok 允许我通过像
http://example.ngrok.io/
这样的 https 协议 url 访问我的本地 docker compose wordpress 环境,这对我处理本地 webhook 响应回调(我与 stripe 一起使用)来说很方便。
对于在 ssl 上运行 WP 时遇到此问题的每个人:
如果您将 Nginx 作为 Apache 的代理,则必须使用
HTTPS
在 PHP 中显式设置 $_SERVER['HTTPS'] = 'On';
全局变量(最好在 wp-config.php 中),否则 WP 将继续重定向,因为 Nginx 在 ssl 上运行,但是Apache 不是,WP 只能看到 Apache 环境。
这可能为时已晚,但我在使用 nginx 和 apache 反向代理时遇到了同样的问题。解决方案非常简单,但同样很难找到根本原因。解决方案:
nginx 配置-> 将 $request_uri 添加到 proxy_pass
proxy_pass http://127.0.0.1:8080$request_uri;
更多信息在这里: