apache 反向代理转发 ruby 应用需启用 mod_proxy、mod_proxy_http、mod_proxy_wstunnel 和 mod_headers 模块,配置 proxypass/proxypassreverse 映射本地端口(如 :3000),设置 proxypreservehost on 和 x-forwarded-* 请求头以确保 rails 正确识别协议、主机和客户端 ip。

Apache 反向代理转发 Ruby 应用(如 Rails、Sinatra 或 Puma 启动的服务)和转发 Node.js/Go 类似,核心是启用代理模块、正确映射路径、处理请求头与响应头,并适配 Ruby 应用的常见部署细节(如 X-Forwarded-* 头、静态资源、WebSocket 等)。
以下是可直接落地的操作要点:
启用必需的 Apache 代理模块
确保以下模块已加载(在 httpd.conf 或对应配置中取消注释):
- mod_proxy.so —— 代理基础框架
- mod_proxy_http.so —— 支持 HTTP/HTTPS 后端转发
- mod_proxy_wstunnel.so —— 若 Ruby 应用含 ActionCable(Rails WebSocket)、AnyCable 或自定义 WebSocket,必须启用
- mod_headers.so —— 用于设置或改写请求头(如传递真实 IP)
验证命令(Linux/macOS):httpd -M | grep proxy,应看到 proxy_module 和 proxy_http_module 状态为 (shared)。
配置虚拟主机并转发到 Ruby 服务
Ruby 应用通常监听本地端口(如 Puma 默认 :3000,Unicorn 常用 :8080),需通过 ProxyPass 映射。示例(以 Rails 应用为例):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<virtualhost>
ServerName myapp.local
ProxyPreserveHost On
<h1>转发所有请求到本地 Rails(Puma)</h1>
<p>ProxyPass / <a href="https://www.php.cn/link/307527f309aa633edcc5f228a5533f25">https://www.php.cn/link/307527f309aa633edcc5f228a5533f25</a>
ProxyPassReverse / <a href="https://www.php.cn/link/307527f309aa633edcc5f228a5533f25">https://www.php.cn/link/307527f309aa633edcc5f228a5533f25</a></p>
<h1>传递客户端真实 IP(Rails 日志和 request.remote_ip 依赖此)</h1>
<p>RequestHeader set X-Forwarded-Proto "http"
RequestHeader set X-Forwarded-Port "80"
RequestHeader set X-Forwarded-For expr=%{REMOTE_ADDR}</p>
<h1>若使用 HTTPS 前端,此处改为 "https",并在 SSL VirtualHost 中配置</h1>
<p></p></virtualhost>
关键说明:
-
ProxyPreserveHost On:让 Ruby 应用收到的 Host 头仍是
myapp.local,避免 Rails 生成错误的跳转链接 -
RequestHeader 设置确保 Rails 的
request.ssl?、request.base_url正确识别协议和来源 - 若 Ruby 应用只暴露子路径(如
/api/v1),可改为ProxyPass /api/ https://www.php.cn/link/307527f309aa633edcc5f228a5533f25api/
适配 Rails / Rack 应用的常见需求
Ruby 应用(尤其 Rails)对反向代理有明确要求,需同步调整后端配置:
-
Rails 生产环境配置(
config/environments/production.rb):config.force_ssl = true # 若前端是 HTTPS,且 Apache 终止 SSL<br>config.hosts config.action_dispatch.trusted_proxies = ["127.0.0.1"] # 允许 Apache 传来的 X-Forwarded-* 头
-
静态资源处理:建议由 Apache 直接提供(更高效)。例如 Rails public 目录挂载:
Alias /assets /var/www/myapp/public/assets<br><directory><br> Require all granted<br></directory>
-
ActionCable(WebSocket)支持:需额外添加 WebSocket 代理规则:
ProxyPass /cable ws://127.0.0.1:3000/cable<br>ProxyPassReverse /cable ws://127.0.0.1:3000/cable
HTTPS 前端 + HTTP 后端(推荐组合)
Apache 终止 SSL 是最常用方式。只需在 <virtualhost></virtualhost> 中复用上述 ProxyPass,并开启 SSLProxyEngine on(因后端是 HTTP,但 Apache 需理解上游协议):
<virtualhost> ServerName myapp.example.com SSLEngine on SSLCertificateFile /path/to/fullchain.pem SSLCertificateKeyFile /path/to/privkey.pem <p>SSLProxyEngine on # 必须启用,否则 https→http 代理失败 ProxyPreserveHost On ProxyPass / <a href="https://www.php.cn/link/307527f309aa633edcc5f228a5533f25">https://www.php.cn/link/307527f309aa633edcc5f228a5533f25</a> ProxyPassReverse / <a href="https://www.php.cn/link/307527f309aa633edcc5f228a5533f25">https://www.php.cn/link/307527f309aa633edcc5f228a5533f25</a></p> <p>RequestHeader set X-Forwarded-Proto "https" RequestHeader set X-Forwarded-Port "443" </p></virtualhost>
注意:无需修改 Ruby 应用的监听协议,它仍跑在纯 HTTP 上;所有加密由 Apache 完成。










