使用 nginx 重定向到不同的上游错误
Redirect to different upstream on error using nginx
描述
我本地有两个不同的services/servers 运行,一个在9000端口使用php5.6-fpm 运行,另一个是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;
}
}
备注
我可以在端口 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进程的服务器块
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;
}
}
描述
我本地有两个不同的services/servers 运行,一个在9000端口使用php5.6-fpm 运行,另一个是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;
}
}
备注
我可以在端口 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进程的服务器块
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;
}
}