web-dev-qa-db-ja.com

nginxでプロキシにフォールバックを追加するにはどうすればよいですか?

ノードアプリケーションが失敗した場合やポートで利用できない場合にエラーページが表示されると考えて、nginxを介してノードアプリケーションのプロキシを構築しようとしています。

ノードアプリは127.0.0.1:1337で実行され、mydomain:8080をリッスンして転送します。

server {
    listen       8080;
    server_name  mydomain;
    access_log   /log/path/logging.log;
    root         /path/to/root/;
    error_page   400 401 402 403 404 500 501 502 503 504  /error/index.html;

    location / {
        proxy_redirect          off;
        proxy_pass_header       Server;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Scheme $scheme;
        proxy_set_header        Host $http_Host;
        proxy_set_header        X-NginX-Proxy true;
        proxy_connect_timeout   5;
        proxy_read_timeout      240;
        proxy_intercept_errors  on;

        proxy_pass              http://127.0.0.1:1337;
    }
}

残念ながら、ノードアプリをオフにしてmydomain:8080をリクエストすると、502の悪いゲートウェイが表示されます。ただし、これはnginxから予想される動作です。必要なのは、ノードアプリのサービスがダウンしたときに表示される定義可能なページです。

どのようにすればいいですか?

2
Dominik

私は答えを見つけました:

server {
    listen       8080;
    server_name  mydomain;
    access_log   /log/path/logging.log;
    error_page   400 401 402 403 404 405 500 501 502 503 504  @error_page;

    location     @error_page {
        root       /var/www/html/;
        rewrite ^  https://domain.com/error/index.html;
        break;
    }

    location / {
        proxy_redirect          off;
        proxy_pass_header       Server;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Scheme $scheme;
        proxy_set_header        Host $http_Host;
        proxy_set_header        X-NginX-Proxy true;
        proxy_connect_timeout   5;
        proxy_read_timeout      240;
        proxy_intercept_errors  on;

        proxy_pass              http://127.0.0.1:1337;
    }
}

これにより、maindomain:8080のサービスが利用できない場合(すべてのエラー)、すべてのトラフィックがhttps://domain.com/error/index.htmlからhttp://127.0.0.1:1337にリダイレクトされます。

これが将来の誰かを助けることを願っています。

5
Dominik

Nginxが本来あるべきことを正確に実行していることを見逃しており、期待は正しくありません。 Nginxに「このゲートウェイを使用する」と言っている場合、ゲートウェイが存在しない場合は、これが正しく報告されます。

ノードアプリケーションが機能しなくなった場合、何が発生するか、または何が発生すると予想されますか?

更新-HHVMはかなり定期的に失敗するため、HHVMからPHP5へのフォールバックを行う方法は次のとおりです。

upstream php {
  server 127.0.0.1:9001;
}
upstream php-fpm {
  server unix:/var/run/php-fpm/php-fpm.sock;
}

# Inside server block
location ~ \.(hh|php)$ {
    error_page 502 = @fallback;
    fastcgi_pass   php;
}
3
Tim