如何在 nginx 中向我的代理添加后备?

如何在 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;
    }
}

不幸的是,当我关闭节点应用程序并请求时,它给出了 502 错误网关mydomain:8080。但这是 nginx 的预期行为。我想要的是我可以定义的页面,当节点应用程序的服务关闭时将显示该页面。

有什么想法知道如何做吗?

答案1

我找到了答案:

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.htmlhttp://127.0.0.1:1337

希望这对将来的某人有所帮助。

答案2

您没有意识到 Nginx 正在做它应该做的事情,您的期望是错误的。您告诉 Nginx“使用此网关”,然后当网关不存在时,它会正确报告这一点。

如果您的节点应用程序停止工作,您希望或期望发生什么?

更新- 以下是我从 HHVM 回退到 PHP5 的方法,因为 HHVM 经常会失败。

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;
}

相关内容