我不是专家,看不出问题出在哪里,但显然这个错误是由一个我无法调试的小细节引起的。有什么想法吗?
我拥有的:我配置了多个虚拟主机,使用 Apache2 来管理不同网站的流量。所有虚拟主机都使用 https,这要感谢 Let'sEncrypt certbot,它运行良好。
Apache 2.4.18(Ubuntu)服务器:Ubuntu 16.04 Docker 版本:19.03.5
我正在尝试做什么:
我想在保留当前 Apache 配置的同时添加一个 Docker 容器。我知道我可以使用类似nginx 反向伴侣并且我已经在另一台服务器上这样做了,但在这种情况下我不想这样做。
在此设置中,我尝试配置一个虚拟主机,充当 Apache 中的反向代理,它将流量重定向到相应的 Docker 容器(运行 Wordpress 容器作为测试,但我希望将来对多个应用程序执行此操作)。我知道这是法语的,但我发现这个家伙试图做和我完全一样的事情这里
我做了什么:
我所做的事情与上面链接的教程大致相同。
- Docker-compose 文件:
version: '3.3'
services:
wordpress:
depends_on:
- db
container_name: ${CONTAINER_WP_NAME}
image: wordpress:${WORDPRESS_IMAGE}
ports:
# - 8080:80
- 8081:443
restart: always
environment:
WORDPRESS_DB_HOST: ${CONTAINER_DB_NAME}:3306
WORDPRESS_DB_USER: ${MYSQL_USER}
WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}
WORDPRESS_DB_NAME: ${MYSQL_DATABASE}
WORDPRESS_TABLE_PREFIX: ${WORDPRESS_TABLE_PREFIX}
volumes:
- ${WP_CORE}:/var/www/html
- ${WP_CONTENT}:/var/www/html/wp-content
- ./docker/config/vhost.conf:/etc/apache2/sites-enabled/vhost-ssl.conf
- /etc/letsencrypt:/etc/letsencrypt:ro
- 容器的 config/vhost 文件
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerName mydomaine.tld
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/mydomaine.tld/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mydomaine.tld/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/mydomaine.tld/chain.pem
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
</VirtualHost>
</IfModule>
- apache2 的 sites-availabe/mydomaine.conf
<VirtualHost *:80>
ServerName mydomaine.tld
ProxyPreserveHost On
ProxyPass / http://localhost:8081/ retry=1 acquire=3000 timeout=600 Keepalive=On
ProxyPassReverse / http://localhost:8081/
ProxyPassReverseCookieDomain localhost mydomaine.tld
ErrorLog /srv/logs/error/mydomaine.log
CustomLog /srv/logs/access/mydomaine.log combined
RewriteEngine on
RewriteCond %{SERVER_NAME} =mydomaine.tld
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
- apache2 的 sites-available/mydomaine-le-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName mydomaine.tld
ProxyPreserveHost On
SSLProxyEngine On
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
ProxyPass / https://localhost:8081/ retry=1 acquire=3000 timeout=600 Keepalive=On
ProxyPassReverse / https://localhost:8081/
ProxyPassReverseCookieDomain locahost mydomaine.tld
ProxyRequests Off
ErrorLog /srv/logs/error/slice.log
CustomLog /srv/logs/access/slice.log combined
SSLCertificateFile /etc/letsencrypt/live/mydomaine.tld/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mydomaine.tld/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/mydomaine.tld/chain.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
我的问题:没有 SSL 它可以正常工作,但是一旦我激活 SSL 并插入 443 端口以通过 HTTPS 连接到网站,浏览器中就会出现 502 代理错误:
Proxy Error
The proxy server received an invalid response from an upstream server.
The proxy server could not handle the request
Reason: Error reading from remote server
网站日志返回此错误:
AH00898: Error reading from remote server returned by /
AH01102: error reading status line from remote server localhost:8081
我尝试过:
我几乎读了所有关于这种错误的问题,但无法调试。我明白了此用户有完全相同的错误和我一样,但他的解决方案并没有解决我的问题。我尝试在 docker 容器中使用 80 和 443 端口,但没有任何变化;没有重定向 http:// 可以工作,但 https:// 不行。每次我都遇到同样的错误。
我激活了必要和推荐的软件包,除了我描述的错误之外没有任何其他错误。
答案1
我也深入搜索了网络并尝试了迄今为止我能找到的所有解决方案和建议。
日志中的错误没有提供太多的指示,但为我解决问题的是添加一个指令,允许代理服务器使用一些弃用的密码套件,在我的情况下是 apache coyote。
添加 SSLProxyCipherSuite 指令。 https://httpd.apache.org/docs/current/mod/mod_ssl.html#sslproxyciphersuite
可以从这里剪切并粘贴值: https://wiki.mozilla.org/Security/Server_Side_TLS
可能尝试密码套件(TLS 1.0 - 1.2):ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES 128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA
看看它是否能让事情顺利进行并从那里变得更加强大。
答案2
可能是您在使用 iptables 时遇到了问题。Docker 会为 iptables 创建自己的规则。在我的例子中,我使用 iptables-persistent 来保存规则,但 docker 规则也保存了。这是一个问题,因为 docker 通常在每次启动时都会创建不同的规则。
以下是我的问题和解决方案的描述:由于与 iptables-persitent 冲突导致 Docker 连接问题
答案3
另一个可能的问题:
虚拟主机中缺少“ProxyPreserveHost On”。
原始问题中的情况并非如此,因为它包含该指令,但它可能会帮助其他有类似问题的人。
答案4
<VirtualHost *:80>
...
ProxyPass / http://localhost:8081/ retry=1 acquire=3000 timeout=600 Keepalive=On
因此端口 8081 有一个 http 监听器。
<VirtualHost *:443>
...
ProxyPass / https://localhost:8081/ retry=1 acquire=3000 timeout=600 Keepalive=On
您无法使用 https 连接到 hpps 服务器。