4

ポートで実行されているRailsアプリがあり8080、ポート80で実行されていると考えるために騙す必要があります。

ポートでVarnishを実行し、80ポートでnginxにリクエストを転送して8080いますが、ユーザーがOmniAuthでログインしようとし、Devise gemがサーバーにリダイレクトするURLを生成すると、ポート8080であると見なされ、ユーザーに表示されます。

Railsアプリをだましてポートを80としてハードコーディングする方法はありますか(これは悪い習慣だと思います)、またはnginxにポート80で実行されているかのようにリクエストを転送させる方法はありますか?

Railsアプリへのnginxプロキシを実行していないため、ポートをだます方法を考えることができません。

誰かが以前にこの問題に遭遇したことがありますか?もしそうなら、それを修正するためにどのような構成が必要ですか?

前もって感謝します!

編集:nginxとVarnishの両方が同じサーバーで実行されています。

4

4 に答える 4

7

ポート80のVarnishとポート8080のnginxで同じ設定をしていて、OmniAuth(Deviseなし)はまったく同じことをしていました。X-Forwarded-PortVarnishとfastcgi_param SERVER_PORT 80;nginxで設定などを試しましたが、どちらも成功しませんでした。私のセットアップの他の部分はPassenger(あなたが言及しなかった)ですが、実際にPassengerを使用している場合は、次を使用できます。

passenger_set_cgi_param SERVER_PORT 80; 

(ドキュメントには、これをブロックに設定できると書かれていhttpますが、それは私にはうまくいきませんでしたserver。ブロックに追加する必要がありました。)

http://modrails.com/documentation/Users%20guide%20Nginx.html#passenger_set_cgi_param

于 2011-05-24T19:25:45.413 に答える
2

X-Forwarded-Portワニスでセットアップします。この例と、Googleで「 varnishx-forwarded-port 」を検索した他の結果を参照してください。

もちろん、とを設定する必要もX-Forwarded-ForありX-Forwarded-Protoます。


ヘッダー、、、X-Forwarded-ForおよびX-Forwarded-ProtoX-Forwarded-Port、Nginx、Squid、VarnishなどのHTTPリバースプロキシが「バックエンド」HTTPアプリケーションサーバー、ThinまたはUnicornで実行されているRailsアプリケーション、ユーザーが実際に誰であるか、およびユーザーが実際に接続しました。

たとえば、Railsアプリケーションの前にNginxがあるとします。RailsアプリケーションはThinで起動され、127.0.0.1:8080でリッスンしていますが、NginxはHTTPの場合は0.0.0.0:80、HTTPSの場合は0.0.0.0:443でリッスンしています。Nginxは、Railsアプリへのすべての接続をプロキシするように構成されています。次に、Railsアプリは、実際のユーザーがポートから接続してページを要求した場合でも、すべてのユーザーのIPアドレスが127.0.0.1、ポートが8080、スキームがであると見なします。解決策は、ヘッダーを設定するようにNginxを構成することです。http1.2.3.4https443

X-Forwarded-For: 1.2.3.4
X-Forwarded-Scheme: https
X-Forwarded-Port: 443

Railsアプリは、デフォルトのパラメーターの代わりにこれらのパラメーターを使用する必要があります。

同じことが、あなたの場合のワニスなど、使用するリバースプロキシにも当てはまります。

于 2011-01-04T17:07:37.220 に答える
0

プロキシを作成して、任意のポートとしてサーバーに接続できます。

たぶん、上にアパッチがあり、乗客は一人で立っています...

<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
于 2011-01-04T05:56:41.210 に答える
0

問題は、ポート8080にリダイレクトされているようです。最善の解決策は、リクエストがポート80で発生したかのように処理するように、Rails(またはOmniAuth / Devise gem)を構成することです(ただし、その方法や方法はわかりません)。可能です)。

ablemikeが言ったように; Apacheには、このための優れたモジュール(mod_proxy)があり、ProxyPassReverseを使用して、リダイレクトをポート80リダイレクトに書き換えます。さらに良いことに、mod_proxy_htmlを使用すると、HTMLページのポート-8080リンクがポート-80リンクに置き換えられます。

リダイレクトを書き換えるだけでよい場合は、VarnishVCLで次のようにリダイレクトを書き換えることができます。

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を使用する場合は、objをberespに置き換える必要があると思います)

HTMLページを書き直す必要がある場合、ニスで完全に修正するのは非常に困難になります。

于 2011-01-04T15:21:20.873 に答える