Como adicionar um fallback ao meu proxy no nginx?

1

Estou tentando construir um proxy para meu aplicativo de nó por meio do nginx, pois isso me fornecerá páginas de erro se o aplicativo do nó falhar ou não estiver disponível na porta.

O aplicativo do nó é executado em 127.0.0.1:1337 e estou ouvindo mydomain:8080 e encaminhá-lo.

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

Infelizmente, é um gateway ruim para o meu 502 quando desativo o aplicativo do nó e solicito mydomain:8080 . Este é o comportamento esperado do nginx. O que eu quero é uma página que eu possa definir que será exibida quando o serviço do aplicativo do nó estiver inativo.

Alguma idéia de como fazer isso?

    
por Dominik 23.03.2016 / 02:40

2 respostas

2

Eu encontrei a resposta:

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

Isso redirecionará todo o tráfego de maindomain:8080 para https://domain.com/error/index.html se o serviço em http://127.0.0.1:1337 estiver indisponível (todos os erros).

Espero que isso ajude alguém no futuro.

    
por 23.03.2016 / 04:27
2

Você está perdendo que o Nginx está fazendo exatamente o que deveria, e suas expectativas estão incorretas. Você está dizendo ao Nginx "use este gateway", então quando o gateway não está lá, está reportando corretamente isso.

O que você deseja ou espera que aconteça se o seu aplicativo de nó parar de funcionar?

Atualização - aqui está como eu faço fallback do HHVM para o PHP5, porque o HHVM falha regularmente.

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;
}
    
por 23.03.2016 / 02:51