Перенаправление на другой апстрим при ошибке с помощью nginx - PullRequest
0 голосов
/ 04 февраля 2019

Описание

У меня есть две разные службы / серверы, работающие локально, один использует php5.6-fpm, работающий на порту 9000, другой - uwsgi, работающий на порту 5000, я хотел бычтобы иметь возможность остановить php5.6-fpm и перенаправить запрос в службу uwsgi.

upstream phpfpm {
    server 127.0.0.1:9000 max_fails=1 fail_timeout=5s;
}

upstream darkapp {
    server 0.0.0.0:5000 max_fails=1 fail_timeout=5s;
}



server {
    listen 2000;
    index index.php;

    location ~ \.php$ {
        root /var/www/html;
        fastcgi_pass phpfpm;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param QUERY_STRING $query_string;
        fastcgi_connect_timeout 5s;
        error_page 404 502 = /dark/home;
        #error_page 404 = @fallback;
    }

    #location @fallback
    location = /dark/home {
        #include uwsgi_params;
        uwsgi_pass darkapp;
        #proxy_pass http://localhost:4000;
    }
}

server {
    listen 4000;

    location / { 
        include uwsgi_params;
        uwsgi_pass darkapp;
    }
}

Примечание

Я могу получить доступ к приложениям phpна порту 2000 до тех пор, пока я вручную не остановлю службу fpm, я также смогу получить доступ к приложению python на порту 4000.

Что происходит

Когда я останавливаю php-fpmи я пытаюсь получить доступ к сайту через порт 2000 через мой браузер, когда я НЕ ВКЛЮЧАЮ uwsgi_params

2019/02/04 14:27:54 [error] 21062#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 127.0.0.1, server: , request: "GET /info/ HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "localhost:2000"


2019/02/04 14:27:54 [error] 21062#0: *1 upstream prematurely closed connection while reading response header from upstream, client: 127.0.0.1, server: , request: "GET /info/ HTTP/1.1", upstream: "uwsgi://0.0.0.0:5000", host: "localhost:2000"

я получаю следующее1022 *

Когда я включаю параметры uwsgi, он перенаправляет на /, и я получаю следующее

2019/02/04 14:42:34 [error] 22493#0: *43 connect() failed (111: Connection refused) while connecting to upstream, client: 127.0.0.1, server: , request: "GET /info/ HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "localhost:2000"
2019/02/04 14:42:34 [error] 22493#0: *43 directory index of "/usr/share/nginx/html/" is forbidden, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "localhost:2000"

1 Ответ

0 голосов
/ 05 февраля 2019

Используйте директиву return, чтобы передать запрос блоку сервера, который прослушивает процесс uwsgi

upstream phpfpm {
    server 127.0.0.1:9000 max_fails=1 fail_timeout=5s;
}

upstream darkapp {
    server 0.0.0.0:5000 max_fails=1 fail_timeout=5s;
}



server {
    listen 2000;
    index index.php;
    root /var/www/html;
    location ~ \.php$ { 

        fastcgi_pass phpfpm;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param QUERY_STRING $query_string;
        fastcgi_connect_timeout 5s;
        error_page 403 404 502 = @fallback;
    }

    location @fallback {
        return 301 http://$host:4000/;
    }
}

server {
    listen 4000;

    location / { 
        include uwsgi_params;
        uwsgi_pass darkapp;
    }
}
...