【发布时间】:2018-03-08 14:48:45
【问题描述】:
我无法使用在 ubuntu 16 上运行的 haproxy 1.6.3 来设置反向代理。 这是我想要实现的目标:
- 在我的主机上,我有一个在 https://bar.com 下运行的带有 apache 的 web 应用程序,它使用 mod_rewrite 进行路由
- 各种内部服务器(机器 1..n)通过 vpn 链接到主机,都只在 vpn 适配器的端口 8081 上公开一个支持 websocket 的 http 接口
- 我希望内部机器可以通过主机的子目录访问,例如。对于机器 1,我想通过 https://bar.com/machine1 访问其网页 - 内部流量为 http,从主机到访问者的流量由主机的 ssl 证书保护
- 与 /machine1 不匹配的所有其他流量不应受到影响,应像以前一样由主机 apache 提供服务
- 机器 1..n 的转发 Web 界面上的路径不是问题,因为它们能够通过以下配置中的标头指令(Orig-Path 和 X-Script-Path)动态修改其路径李>
- 主机上的 apache2 被配置为仅使用
Listen 127.0.0.1侦听 localhost,并且到主站点的所有流量都由 haproxy 通过默认后端处理
以下是相关配置:
-
主站点的apache.htaccess(不包括相关子目录)
# Exclude machine1 subdirectory from rewrite RewriteRule ^(machine1)($|/) - [L] RewriteCond %{REQUEST_URI} !^/index\.php RewriteCond %{SCRIPT_FILENAME} !-f RewriteCond %{SCRIPT_FILENAME} !-d RewriteRule .* index.php [L] -
代理设置
frontend http-in bind <external-ip>:80 mode tcp option tcplog acl machine1 path_beg /machine1 use_backend machine1-backend if machine1 default_backend default-backend-http frontend https-in bind <external-ip>:80 mode tcp option tcplog default_backend default-backend-https backend machine1-backend reqrep ^([^\ :]*)\ /machine1/(.*) \1\ /\2 http-request set-header Orig-Path /machine1/ http-request set-header X-Script-Path /machine1/ http-request set-header Host bar.com option http-server-close server m1 10.0.0.4:8081 backend default-backend-https server main 127.0.0.1:443 mode tcp backend default-backend-http server main 127.0.0.1 mode tcp
我目前遇到的问题/疑问:
访问未加密的变体 (http://bar.com/machine1)有时 服务于 machine1 的正确页面,但大多数时候,我从主机 apache 得到 404 - 我认为这可能可以通过选项 http-server-close 解决,但不是 - 有人可以指出我在这里缺少什么吗?我在极少数有效响应的情况下验证了路径已使用 /machine1 正确扩展 - 例如用于 css 的 /machine1/css/main.css 包括 - 但即使在从 machine1 成功初始拉取之后 - 所有后续对脚本、图像和 css 的提取都会再次返回 404
我无法弄清楚如何正确设置 ssl 以使用 haproxy 处理 https->http 流量转换的 /machine1 请求,因此 ssl 部分目前不包括路由 - 如何我是否需要扩展配置以使其适用于https://bar.com/machine1? (假设 bar.com 的有效证书存在于 /etc/keys/web.pem 下)
额外问题:
- 是否有机会使此配置动态化?例如从数据库中提取相关信息(服务器 ip,子目录名称)/在此处使用某种逻辑,因为机器 1...n 链接将在运行时更改(新机器连接,其他机器断开连接,可能的机器数量为很大)
- 是否有在使用 /machine1 之前验证用户的选项?主 Web 应用程序进行用户管理,所以我最好在允许访问 /machine1 之前检查用户是否经过身份验证 - 可以这样做吗?
【问题讨论】:
标签: config reverse-proxy haproxy