nginx - 使用 nginx 出错时重定向到不同的上游

标签 nginx flask server uwsgi

描述

我有两个不同的服务/服务器在本地运行,一个使用在端口 9000 上运行的 php5.6-fpm,另一个是在端口 5000 上运行的 uwsgi,我希望能够停止 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;
    }
}

注意

我能够访问端口 2000 上的 php 应用程序,直到我手动停止 fpm​​ 服务,我还能够访问端口 4000 上的 python 应用程序。

发生了什么

当我停止 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"

运行 Flask 应用程序的 Uwsgi 进程还提供以下内容

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 2309, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 2287, in wsgi_app
    ctx = self.request_context(environ)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 2204, in request_context
    return RequestContext(self, environ)
  File "/usr/local/lib/python2.7/dist-packages/flask/ctx.py", line 284, in __init__
    self.url_adapter = app.create_url_adapter(self.request)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 2021, in create_url_adapter
    subdomain=subdomain)
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/routing.py", line 1344, in bind_to_environ
    environ['REQUEST_METHOD'], path_info,
KeyError: 'REQUEST_METHOD'

当我包含 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"

最佳答案

使用 return 指令将请求传递到正在监听 uwsgi 进程的服务器 block

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

关于nginx - 使用 nginx 出错时重定向到不同的上游,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54522240/

相关文章:

go - 创建服务器并连接到它

php - 使用 docker、nginx、php-fpm 提供静态文件

python - 添加 CSS 使输入表单变形

laravel - 许多使用 https 和 nginx 的重定向

azure - 如何将 python 单元测试结果发布到 azure pipeline

python - 使用 spaCy NLP 的简单 Flask 应用程序间歇性挂起

python - 如何在Ubuntu服务器后台运行Python程序

php - Nginx + Xamp + SSL 奇怪的行为

php - 如何配置 Nginx 以将特定请求模式路由到托管 Symfony 应用程序的特定 php-fpm 上游?

nginx - 用于 NGINX Web 服务器的 Dockerfile