Apache2配置SSL后与本地Docker后端应用通信的问题
嘿,我来帮你搞定这个问题!你遇到的ERR_SSL_PROTOCOL_ERROR根源其实很明确:浏览器看到你用https://myhost.com:8080发起请求,就会尝试和8080端口建立SSL连接,但你的Docker后端根本没配置SSL支持,自然就会抛出协议错误。
解决思路很简单——让Apache充当中间层:前端只和Apache的443端口(HTTPS)通信,由Apache把请求以HTTP方式转发给本地8080端口的后端,这样后端完全不需要配置SSL,就能和前端的HTTPS服务打通。
具体修改步骤:
修正反向代理规则
你原来的ProxyPass和ProxyPassReverse写法有问题,应该指定前端请求的路径(比如/api/),而不是直接写端口。修改后的虚拟主机配置如下:<IfModule mod_ssl.c> <VirtualHost *:443> ServerAdmin me@email.com ServerName myhost.com DocumentRoot /var/www/myhost.com/public_html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined # 启用代理相关功能 SSLProxyEngine on ProxyPreserveHost On # 核心修改:将前端的/api/路径转发到本地后端的HTTP服务 ProxyPass /api/ http://localhost:8080/api/ ProxyPassReverse /api/ http://localhost:8080/api/ Header set Access-Control-Allow-Origin "*" SSLCertificateFile /etc/letsencrypt/live/myhost.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/myhost.com/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf </VirtualHost> </IfModule>这里用
localhost代替myhost.com更合适,因为是本地通信,避免不必要的DNS解析,也更安全。调整前端请求地址
把前端代码里的请求地址从https://myhost.com:8080/api/fetchService改成https://myhost.com/api/fetchService——不用带8080端口,让Apache来处理转发。确保必要模块已启用
执行以下命令确认Apache的代理模块已启用:sudo a2enmod proxy proxy_http ssl重启Apache生效
sudo systemctl restart apache2
原理说明:
这样配置后,前端的所有HTTPS请求都会先到达Apache的443端口,Apache会根据路径规则,把/api/开头的请求转发给本地8080端口的Docker后端(用HTTP协议),后端处理完成后,再通过Apache把响应返回给前端。全程前端只和HTTPS交互,后端完全不需要配置SSL证书,完美解决你的问题。
备注:内容来源于stack exchange,提问作者TonyD

