我努力将我的 Apache 服务器设置为包含 Docker 的反向代理绿灯实例。
在官方文档建议在 Docker 容器中运行 Greenlight,并使用 Nginx 实例作为反向代理(主要是为了方便与BBB 服务器)。但是,在我的设置中,我不想运行自己的 BBB 实例,而是使用 Greenlight 作为外部 BBB 服务器的前端。
但为了方便起见,我还是选择在 docker 容器中设置 Greenlight。
但由于我的服务器有很多用途(主要是用来提供几个网站和提供电子邮件帐户,均由弗罗克斯洛但它也可以作为一个矩阵服务器)我不想将 Nginx 设置为代理,因为这将迫使我大幅改变我实际运行的 Froxlor 管理的 Apache 设置。
因此我尝试将 Apache 配置为反向代理。不幸的是,文档中只有一个 Nginx 示例:
location /b {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
}
location /b/cable {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_http_version 1.1;
proxy_read_timeout 6h;
proxy_send_timeout 6h;
client_body_timeout 6h;
send_timeout 6h;
}
我尝试使用以下 VirtualHost 设置在 Apache 上完成此工作:
<VirtualHost MYIP:443>
ServerName greenlight.example.com
ProxyPreserveHost On
ProxyRequests Off
ProxyVia On
ProxyPass / http://127.0.0.1:5000
ProxyPassReverse / http://127.0.0.1:5000
<Location "/cable">
ProxyPass / http://127.0.0.1:5000 connectiontimeout=6h timeout=6h
ProxyPassReverse / http://127.0.0.1:5000
</Location>
</VirtualHost>
我偏离了示例,我不想使用虚拟子文件夹 »b«,而是使用子域 t 将特定流量重定向到本地端口5000
。不幸的是,这不起作用。服务器返回
502 Prox error
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
有人能向我解释一下这个错误的原因吗?如何将 Nginx Header 设置转换为 Apache 和其他超时设置,这些设置是否必要?
答案1
这里有几个问题:
- 顺序
第一个匹配的路径获胜。由于您放置/
在 之前/cable
,因此/
将始终匹配并且/cable
永远不会被使用。 - 匹配尾部斜杠
如果第一个参数以 结尾,ProxyPass
则/
需要在第二个参数中添加一个,反之亦然。否则,您最终会得到发送到后端的无效 URL <Location>
块内的 ProxyPass如果在 内
使用,则只会获取第二个参数。第一个参数被 替换。ProxyPass
<Location>
<Location>
例子:
<VirtualHost MYIP:443>
ServerName greenlight.example.com
ProxyPreserveHost On
ProxyRequests Off
ProxyVia On
ProxyPass /cable http://127.0.0.1:5000 connectiontimeout=6h timeout=6h
ProxyPassReverse /cable http://127.0.0.1:5000
ProxyPass / http://127.0.0.1:5000/
ProxyPassReverse / http://127.0.0.1:5000/
</VirtualHost>
最后,但并非最不重要的一点是,目前您正在将两个位置代理到同一个后端 URL。这通常是错误的。