欺骗铁轨应用程序以为它在其他端口上
-
15-10-2019 - |
题
我有一个在端口上运行的Rails应用程序 8080
我需要技巧以为它在端口80上运行。
我在端口上运行清漆 80
并转发请求到端口上的nginx 8080
, ,但是当用户尝试使用Omniauth登录,而设计GEM会生成一个URL,以将其重定向到服务器时,它会认为它在端口8080上,然后用户将看到。
有什么方法可以欺骗Rails应用程序将端口用力编码为80(我认为这是不良的做法),或者让Nginx转发请求,就好像它在端口80上运行一样?
由于我没有运行nginx代理Rails应用程序,因此我想不出一种欺骗端口的方法。
以前有人遇到过这个问题,如果是这样,则需要采取什么样的配置来修复它?
提前致谢!
编辑:nginx和varnish都在同一服务器上运行。
解决方案
我在端口80上具有相同的设置,而端口8080上的nginx和omniauth(无设计)的设置完全相同。我尝试设置 X-Forwarded-Port
等等 fastcgi_param SERVER_PORT 80;
在nginx中,两者都没有成功。我的设置中的另一个是乘客(您没有提及),但是如果您确实在使用乘客,则可以使用:
passenger_set_cgi_param SERVER_PORT 80;
(文档说您可以将其设置为 http
块,但这对我不起作用,我不得不将其添加到 server
堵塞。)
http://modrails.com/documentation/users%20Guide%20Nginx.html#passenger_set_set_cgi_param
其他提示
设置 X-Forwarded-Port
在清漆中。看 这个示例 以及Google搜索的其他结果”清漆X型港口".
当然,您还必须设置 X-Forwarded-For
和 X-Forwarded-Proto
.
标题 X-Forwarded-For
, X-Forwarded-Proto
, , 和 X-Forwarded-Port
是HTTP反向代理(例如Nginx,Squid或Varnish)与“后端” HTTP Application Server通信的一种方式,您的Rails应用程序在薄或Unicorn中运行的Rails应用程序,用户实际上是谁以及用户实际连接的方式。
例如,假设您在铁轨应用程序的前面有NGINX。您的Rails应用程序被稀薄启动,并在127.0.0.1:8080上聆听,而Nginx则在HTTP上以0.0.0.0.0:80聆听,而HTTPS则为0.0.0.0.0:443。 NGINX配置为代理与Rails应用程序的所有连接。然后,您的Rails应用程序会认为任何用户的IP地址是 127.0.0.1
, ,端口是 8080
, ,该计划是 http
, ,即使实际用户从 1.2.3.4
并要求通过 https
在港口 443
. 。解决方案是配置nginx以设置标头:
X-Forwarded-For: 1.2.3.4
X-Forwarded-Scheme: https
X-Forwarded-Port: 443
Rails应用程序应使用这些参数而不是默认参数。
您使用的任何反向代理,例如在您的情况下进行清漆。
您可以制作代理并将其作为所需的任何端口服务器。
也许Apache在顶部,乘客独自一人...
<VirtualHost *:80>
ServerName <name>
DocumentRoot /home/deploy/<name>
PassengerEnabled off
ProxyPass / http://127.0.0.1:<port>/
ProxyPassReverse / http://127.0.0.1:<port>/
</VirtualHost>
在外壳中:
passenger start -e staging -p 3003 -d
您的问题似乎正在重定向到端口8080。最好的解决方案是配置导轨(或omniauth/deapise gem)来对待请求,就像在端口80上被驱动一样(但是我不知道如何或是否是这样可能)。
就像Ablemike所说的那样; Apache具有一个很好的模块(mod_proxy),而ProxypassReverse则将重定向重写为端口80重定向。更好的是,使用mod_proxy_html,它将用port-80链接替换HTML页面中的port-8080链接。
如果您只需要重写重定向,则可以在Varnish VCL中重写以下内容:
sub vcl_fetch {
...
#Rewrite redirect from port 8080 to port 80
if ( obj.http.Location ~ "^http://[^:]+:8080/.*" ) {
set obj.http.Location = regsub(obj.http.Location, ""^(http://[^:]+):8080(/.*)","\1\2");
}
}
(我认为如果您使用varnish> = 2.1,则必须用beresp替换OBJ)
如果您必须重写HTML页面,那么对于Varnish来说,这将非常困难。