4

Mac OSX で RoR アプリケーションを開発しています。

でアプリにアクセスできるようにするhttp://localhostため、およびテストで SSL をサポートするために、次の構成で Webrick ポート 3000 へのプロキシとして nginx を使用します。

server {
    listen 80;
    server_name app.mysite.com;
    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect off;
        proxy_pass http://127.0.0.1:3000;
    }
}

server {
    listen       443 ssl;
    server_name  secure.app.mysite.com;

    ssl                  on;
    ssl_certificate      ssl/server.crt;
    ssl_certificate_key  ssl/server.key;

    keepalive_timeout 600;
    ssl_session_timeout 10m;
    ssl_protocols  SSLv2 SSLv3 TLSv1;
    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    ssl_prefer_server_ciphers   on;

    location / {
        proxy_pass http://127.0.0.1:3000;
        ### force timeouts if one of backend is died ##
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
        ### Set headers ####
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        ### Most PHP, Python, Rails, Java App can use this header ###
        proxy_set_header X-Forwarded-Proto https;
        ### By default we don't want to redirect it ####
        proxy_redirect     off;
   }
}

http://localhost/どちらかまたはサーバーでアプリケーションにアクセスするとhttps://localhost/ 、サーバーはすばやく応答し、オーバーヘッドhttp://localhost:3000は無視できます。

しかし、同じネットワーク上の別のコンピュータ (たとえば、http://10.0.1.9/) からマシンにアクセスしようとすると、サーバーの応答が非常に遅くなるか、まったく応答しなくなります。

この場合、nginx はポート 3000 に内部リクエストを送信していないように見えますが、リクエストは確実に外部から nginx に到達しており、外部からポート 3000 へのリクエストは非常に高速です。

私のアプリは開発モードで実行されており、アセット (かなりの数) はプリコンパイルされていないことに注意してください。

nginx 以外に、構成が簡単で、SSL をサポートしている、ネットワーク上の開発サイトを簡単に公開するための別のオプションはありますか?

ありがとう、アリエル

4

3 に答える 3

0

ローカルホストでは正常に動作するが、別のコンピューターからは動作しないというのは怪しいので、いくつかの項目を試してみてください。

  • また'netstat -na | grep 80'、Nginx が 127.0.0.1 ではなく 0.0.0.0 または *:80 でリッスンしていることを確認します。Nginx が 0.0.0.0 または * でリッスンしていない場合は、TCP ルーティングの問題である可能性があります。どのサーバーでも同じです。これは良い出力例です (私の例は 8000 でリッスンしています)

    tcp4 0 0 *.8000 *.* LISTEN

  • 楽しみのために、Nginx プロキシ ステートメントで「127.0.0.1」を「localhost」および/または「0.0.0.0」に変更します (ただし、ルーティングはここに到達するまでに行われます)。

また、Nginx のロギングを使用して、別の問題があるかどうかを確認することをお勧めします。ここには、より良いプロキシ/アップストリーム ロギングに関するスタックオーバーフローが既にあります: logging proxy activity in nginx

さらに、デバッグ ログをオンにする必要があります (私はこれで問題を解決しました)。これを access_log ディレクティブの下/上に配置します。このようなものはうまくいくはずです:

 error_log  /Users/your_name/nginx_test/logs/error.log  debug;

Nginx の場合、ログには絶対パスを使用する必要があることに注意してください。

幸運を。

于 2013-04-02T18:23:28.923 に答える