我有一个在端口上运行的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-ForX-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来说,这将非常困难。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top