Ruby on rails 欺骗Rails应用程序让其思考';它在另一个港口

Ruby on rails 欺骗Rails应用程序让其思考';它在另一个港口,ruby-on-rails,nginx,port,varnish,Ruby On Rails,Nginx,Port,Varnish,我有一个Rails应用程序,它运行在端口8080上,我需要欺骗它,以为它运行在端口80上 我正在端口80上运行Varnish,并将请求转发到端口8080上的nginx,但当用户尝试使用OmniAuth登录时,Desive gem生成一个url重定向回服务器,它认为它位于端口8080上,用户将看到该端口 有没有办法欺骗Rails应用程序将端口硬编码为80(我认为这是一种糟糕的做法),或者让nginx转发请求,就像它在端口80上运行一样 由于我没有在Rails应用程序上运行nginx代理,所以我想不

我有一个Rails应用程序,它运行在端口8080上,我需要欺骗它,以为它运行在端口80上

我正在端口
80
上运行Varnish,并将请求转发到端口
8080
上的nginx,但当用户尝试使用OmniAuth登录时,Desive gem生成一个url重定向回服务器,它认为它位于端口8080上,用户将看到该端口

有没有办法欺骗Rails应用程序将端口硬编码为80(我认为这是一种糟糕的做法),或者让nginx转发请求,就像它在端口80上运行一样

由于我没有在Rails应用程序上运行nginx代理,所以我想不出一种方法来欺骗端口

以前是否有人遇到过此问题,如果是,需要何种配置来修复此问题

提前谢谢

编辑:
nginx和Varnish都在同一台服务器上运行。

您可以制作一个代理,并将其作为您想要的任何端口进行服务器

也许是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>

您的问题似乎是正在重定向到端口8080。最好的解决方案是配置Rails(或OmniAuth/Desive gem)将请求视为在端口80上触发的请求(但我不知道如何或是否可能)

就像迈克说的;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");
  }
}
(如果使用清漆>=2.1,我认为必须用beresp替换obj)


如果您必须重写HTML页面,那么使用varnish完全纠正这一点会困难得多。

在varnish中设置
X-Forwarded-Port
。请参阅和Google搜索“”的其他结果

当然,您还必须设置
X-Forwarded-For
X-Forwarded-Proto


头文件
X-Forwarded-For
X-Forwarded-Proto
X-Forwarded-Port
是HTTP反向代理(如Nginx、Squid或Varnish)与“后端”HTTP应用程序服务器通信的一种方式,您的Rails应用程序在瘦版或Unicorn版上运行,用户实际是谁以及用户实际如何连接

例如,假设您的Rails应用程序前面有Nginx。您的Rails应用程序是使用Thin启动的,正在127.0.0.1:8080上侦听,而Nginx正在0.0.0.0:80上侦听HTTP,0.0.0.0:443上侦听HTTPS。Nginx被配置为代理所有到Rails应用程序的连接。然后,您的Rails应用程序会认为任何用户的IP地址是
127.0.0.1
,端口是
8080
,方案是
http
,即使实际用户从
1.2.3.4
连接,并通过端口
443
上的
https
请求页面。解决方案是配置Nginx以设置标头:

X-Forwarded-For: 1.2.3.4
X-Forwarded-Scheme: https
X-Forwarded-Port: 443
Rails应用程序应该使用这些参数,而不是默认参数


这同样适用于您使用的任何反向代理,例如您的案例中的Varnish。

我对Varnish在端口80上的设置和nginx在端口8080上的设置是相同的,OmniAuth(没有设计)也在做同样的事情。我尝试在Varnish中设置
X-Forwarded-Port
etc和
fastcgi\u param服务器\u端口80都没有成功。我的设置中的另一部分是乘客(您没有提到),但如果您确实使用乘客,则可以使用:

passenger_set_cgi_param SERVER_PORT 80; 
(文档说你可以在
http
块中设置,但这对我不起作用,我不得不将其添加到
服务器
块。)


我使用的是nginx,我没有将其作为独立实例运行。如果您计划在标准部署模型之外进行操作,请不要坚持这个理想。这不是一个非常描述性的答案。我需要在nginx或Varnish中设置X-Forwarded-For和X-Forwarded-Proto吗?端口80上还有Varnish listen吗?我已经用更多的描述更新了我的答案,希望使
X-Forwarded-For
系统变得清晰。这个答案非常有用。这帮助我解决了在ELB->Nginx->Unicorn(rails)配置中失败OAuth2回调的奥秘,2012年11月,18个月后,这仍然是一个很好的建议。FWIW,我还必须把它放在服务器上,而不是nginx config的http块上。
passenger_set_cgi_param SERVER_PORT 80;