当我将 WordPress 移到 linuxserver/swag 容器后面以启用 https 后,我就无法让 WordPress 与 MySQL 数据库通信。
我正在使用 Docker 版本 20.10.2、build 2291f61 和 docker-compose 版本 1.27.4、build 40524192;它们在运行 Debian 10 的 VPS 上运行。
这是我创建的 docker-compose.yml 文件。简而言之,我有三个容器:
-wordpress:一个 WordPress 容器
-mysql:wordpress 的数据库,以及
-certman:管理 SSL/TLS 证书的 linuxserver/swag(安全 Web 应用程序网关)容器。
version: "3.8"
services:
mysql:
image: mysql:latest
container_name: mysql
environment:
- PUID=1000
- PGID=1001
- MYSQL_ROOT_PASSWORD=[password 1]
- TZ=America/New_York
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wpuser
- MYSQL_PASSWORD=[password 2]
ports:
- 3306:3306
- 33060:33060
volumes:
- /home/[my username]/appdata/mysql:/var/lib/mysql
restart: unless-stopped
swag:
image: linuxserver/swag:latest
container_name: certman
cap_add:
- NET_ADMIN
environment:
- PUID=1000
- PGID=1001
- TZ=America/New_York
- URL=[my domain name]
- SUBDOMAINS=www,
- VALIDATION=http
- EMAIL=[my email]
- CERTPROVIDER=zerossl #used up weekly quota from let's encrypt troubleshooting already
volumes:
- /home/noreply/appdata/swag:/config
ports:
- 443:443
- 80:80
depends_on:
- mysql
restart: unless-stopped
wordpress:
depends_on:
- mysql
image: wordpress:latest
ports:
- 8080:80
restart: unless-stopped
volumes:
- /home/noreply/appdata/swag/www/wordpress:/var/www/html
environment:
- WORDPRESS_DB_HOST=mysql
- WORDPRESS_DB_NAME=wordpress
- WORDPRESS_DB_USER=wpuser
- WORDPRESS_DB_PASSWORD=[password 2 from above]
container_name: 'wordpress'
运行此程序后,我转到 ~/appdata/swag/nginx/site-confs/default 并更改根位置,以便 nginx 使用 WordPress:
...
# main server block
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
root /config/www/wordpress; #the only change is adding /wordpress here
...
重新启动 certman 容器并等待片刻后,https://[我的域名] 仅显示来自 WordPress 的“建立数据库连接时出错”页面。
从日志来看,我认为 certman 运行良好(我可以在浏览器中检查证书,并且日志以“Server Ready”结尾)。
如果我跑docker 日志 mysql,得到这个输出(我不认为这里有什么了不起的?):
2021-01-26 00:01:49-05:00 [Note] [Entrypoint]: Creating database wordpress
2021-01-26 00:01:49-05:00 [Note] [Entrypoint]: Creating user wpuser
2021-01-26 00:01:49-05:00 [Note] [Entrypoint]: Giving user wpuser access to schema wordpress
2021-01-26 00:01:49-05:00 [Note] [Entrypoint]: Stopping temporary server
2021-01-26T05:01:49.440142Z 13 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.23).
2021-01-26T05:01:50.967557Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.23) MySQL Community Server - GPL.
2021-01-26 00:01:51-05:00 [Note] [Entrypoint]: Temporary server stopped
2021-01-26 00:01:51-05:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up.
2021-01-26T05:01:51.757509Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.23) starting as process 1
2021-01-26T05:01:51.770145Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2021-01-26T05:01:52.015633Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2021-01-26T05:01:52.134045Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
2021-01-26T05:01:52.225683Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2021-01-26T05:01:52.225949Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2021-01-26T05:01:52.231383Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
2021-01-26T05:01:52.254800Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.23' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.
然而,docker 日志 wordpress返回:
WordPress not found in /var/www/html - copying now...
Complete! WordPress has been successfully copied to /var/www/html
[26-Jan-2021 05:01:37 UTC] PHP Warning: mysqli::__construct(): (HY000/2002): Connection refused in Standard input code on line 22
MySQL Connection Error: (2002) Connection refused
MySQL Connection Error: (2002) Connection refused
MySQL Connection Error: (2002) Connection refused
MySQL Connection Error: (2002) Connection refused
MySQL Connection Error: (2002) Connection refused
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.32.4. Set the 'ServerName' directive globally to suppress this message
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.32.4. Set the 'ServerName' directive globally to suppress this message
[Tue Jan 26 05:01:52.428348 2021] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.38 (Debian) PHP/7.4.14 configured -- resuming normal operations
[Tue Jan 26 05:01:52.428437 2021] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
我读这里2002 错误意味着指定的用户无法编辑数据库,但由于两者设置为环境变量的访问参数相同(数据库名称、用户和密码),我不知道该怎么做。我还尝试在 wordpress 容器中使用 bash shell 来 ping 数据库主机名(“mysql”),并且工作正常(安装 inetutils-ping 后),所以我认为这不是网络问题。mysql 容器也可以很好地 ping wordpress。
我尝试修复该问题但没有看到任何变化:
-重新启动 wordpress 容器,以防 WordPress 启动速度对于 mysql 来说太快(代替等待函数或其他东西),反之亦然
- 删除所有内容(关闭 docker-compose,然后修剪图像并删除 ~/appdata 中的卷文件夹)并重复设置,但这也不起作用(我第一次这样做的时候只短暂地起作用了,但是如果不对 .yml 进行任何更改,我就无法多次复制它;我所做的就是用完了我本周的 let's encrypt 配额来尝试复制成功)。
-使用非最新的 MySQL 和 WordPress 镜像(灵感来自这)
-使用 root 密码而不是 wpuser 将 wordpress 连接到 mysql(灵感来自这,这与我在日志下方链接的页面相同)。
-使用docker-compose.yml中wordpress服务下的链接:mysql(灵感来自这)
还要注意的是,如果我从 docker-compose.yml 中删除 linuxserver/swag 内容并为 wordpress 容器设置 ports:80:80,我可以通过 http 获得 WordPress 设置屏幕。检查此工作实例的 wordpress 容器日志显示它短暂地出现了 2002 错误,但我认为它会自动解决:
[26-Jan-2021 05:48:24 UTC] PHP Warning: mysqli::__construct(): (HY000/2002): Connection refused in Standard input code on line 22
MySQL Connection Error: (2002) Connection refused
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.112.3. Set the 'ServerName' directive globally to suppress this message
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.112.3. Set the 'ServerName' directive globally to suppress this message
如果我在 wordpress 下设置 80:80(绕过 certman)并保留 certman 容器(使用 443:443),http://[IP 地址] 就可以工作(我认为我在 ~/appdata/swag/nginx/site-confs/default 中的 nginx 配置默认将 http://[我的域名] 流量重新路由到 https,因此 http://[我的域名] 只是重新路由到 https 并且不起作用是有道理的)。
由于在 wordpress 下设置 80:80 有效,我知道 wordpress 实际上可以与 mysql 通信。但将其移到 certman/nginx 后面会导致数据库连接中断或类似情况,我一直无法弄清楚。
有人知道是什么原因造成的,如何修复或如何进一步排除故障吗?提前感谢大家。
答案1
我想我终于明白了。
看完之后这,我在 wordpress 容器的 docker-compose.yml 文件中将镜像从 wordpress:latest 切换到 wordpress:fpm。之后,docker-compose up -d --force-restart 似乎解决了所有问题。
还要注意的是,该链接包含一个 docker-compose.yml 示例,该示例使用单独的 certbot 和 nginx 容器代替 linuxserver/swag 容器。该设置更轻量,并且写入将证书放在卷中(如果我这样做了,我可能就不会遇到达到他们为每个域颁发的证书的每周配额的问题)并使用暂存环境来测试所有内容。
还值得注意的是,那些关于 MySQL 连接错误的 wordpress 容器日志似乎只是由于 wordpress 容器启动速度更快,因为如果我在 MySQL 已经运行的情况下重新启动 wordpress 容器,它们就不会出现。