apache配置反向代理并启用ssl需四步:一、启用ssl和proxy相关模块;二、部署证书并在443虚拟主机中正确引用;三、配置proxypass等指令实现路径转发;四、若后端为https,须启用sslproxyengine并校验证书有效性。

Apache 做反向代理并启用 SSL,核心是两件事:让 Apache 自己能用 HTTPS 对外服务(装证书),同时让它安全地把请求转发给后端(比如 Tomcat、Node.js 或其他内部服务)。不是只配一个地方就能跑通,得模块、证书、虚拟主机、代理规则四者协同。
一、先确保 SSL 模块和代理模块已启用
打开 httpd.conf(或对应发行版的主配置文件),确认以下几行没被注释:
LoadModule ssl_module modules/mod_ssl.soLoadModule proxy_module modules/mod_proxy.soLoadModule proxy_http_module modules/mod_proxy_http.so-
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so(如果后端是 Tomcat,建议加上) -
Include conf/extra/httpd-ssl.conf(或conf.d/ssl.conf,取决于系统)
改完保存,重启 Apache 验证是否加载成功:apachectl -M | grep -E "(ssl|proxy)"。看到带 shared 的输出才算生效。
二、放好证书,并在虚拟主机里正确引用
把证书三件套(yourdomain.crt、yourdomain.key、chain.crt)放到 Apache 可读路径,例如 conf/ssl/ 目录下。权限设为:
- 私钥:
chmod 600 conf/ssl/yourdomain.key - 公钥和链:
chmod 644 conf/ssl/*.crt
在 VirtualHost *:443 块中写明:
<virtualhost>
ServerName yourdomain.com
SSLEngine on
SSLCertificateFile "${SRVROOT}/conf/ssl/yourdomain.crt"
SSLCertificateKeyFile "${SRVROOT}/conf/ssl/yourdomain.key"
SSLCertificateChainFile "${SRVROOT}/conf/ssl/chain.crt"
# 其他常规配置(DocumentRoot、Directory 等可省略,因走代理)
</virtualhost>
三、配置反向代理规则,注意协议与路径匹配
在同一个 VirtualHost 块内添加代理指令:
- 关闭正向代理:
ProxyRequests off - 设置代理路径,例如把
/api转发到后端 HTTP 服务:ProxyPass /api http://127.0.0.1:3000/api - 同步响应头路径:
ProxyPassReverse /api http://127.0.0.1:3000/api - 如后端是 HTTPS(比如另一台带证书的服务),把
http://改成https://,并额外加一行:SSLProxyEngine on
若后端用的是 AJP 协议(如 Tomcat 默认),则用:ProxyPass /app ajp://localhost:8009/app,无需额外 SSL 配置。
四、后端 HTTPS 证书有效期校验(可选但推荐)
当 Apache 代理到另一个 HTTPS 后端时,它默认不检查对方证书是否过期。要强制校验,需在 VirtualHost 内补充四条指令:
SSLProxyEngine onSSLProxyVerify requireSSLProxyCheckPeerName onSSLProxyCheckPeerExpire on
这四条必须同时存在才生效。启用后,只要后端证书过期或未生效,Apache 就返回 502,并在 error_log 中记录 “Peer certificate has expired”。调试时可用一个故意设为昨天的测试证书验证是否触发。
配完别忘了重启 Apache:apachectl restart 或 systemctl restart httpd。访问 https://yourdomain.com 测试前端 HTTPS 是否正常,再试代理路径看后端是否连通。不复杂但容易忽略细节。











