2016-03-28 72 views
0

我运行一个烧瓶应用程序使用nginx代理后面的gunicorn,我试图让gaiohttp工人工作。当选择gaiohttp工作者时,该应用仅返回404所有URLSgunicorn与gaiohttp工人总是返回404与烧瓶的应用程序

当使用同步或gevent工作者时,一切正常。也不直接运行gunicorn和gaiohttp,即不使用nginx它工作正常。

我已阅读了所有我能找到的东西。

我错过了什么吗?运行在nginx代理后面时,gaiohttp worker是否有效?

我的nginx的配置:

location /app { 
    proxy_pass http://127.0.0.1:9002; 
    rewrite /app(.*) /$1 break; 
    proxy_redirect  off; 
    proxy_buffering on; 
    proxy_pass_header Server; 
    proxy_set_header X-Scheme $scheme; 
    proxy_set_header Host    $host; 
    proxy_set_header X-Real-IP  $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header X-Forwarded-Host $server_name; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_set_header X-Script-Name /app; 
    } 

gunicorn:

/usr/bin/gunicorn --workers 2 -k gaiohttp -b 127.0.0.1:9002 app:app 

使用

回答

0

我设法来解决这一问题的gunicorn等等等等的最新版本。

线在这里是造成问题的nginx的配置:

rewrite /app(.*) /$1 break;

,我需要在我的瓶的应用程序正确处理反向代理的代理中间件。

class ReverseProxied(object): 
'''Wrap the application in this middleware and configure the 
front-end server to add these headers, to let you quietly bind 
this to a URL other than/and to an HTTP scheme that is 
different than what is used locally. 

In nginx: 
location /myprefix { 
    proxy_pass http://192.168.0.1:5001; 
    proxy_set_header Host $host; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header X-Scheme $scheme; 
    proxy_set_header X-Script-Name /myprefix; 
    } 

:param app: the WSGI application 
''' 
def __init__(self, app): 
    self.app = app 

def __call__(self, environ, start_response): 
    script_name = environ.get('HTTP_X_SCRIPT_NAME', '') 
    if script_name: 
     server = environ.get('HTTP_X_FORWARDED_SERVER', '') 
     if server: 
      environ['HTTP_HOST'] = server 
     environ['SCRIPT_NAME'] = script_name 
     path_info = environ['PATH_INFO'] 
     if path_info.startswith(script_name): 
      environ['PATH_INFO'] = path_info[len(script_name):] 

    scheme = environ.get('HTTP_X_SCHEME', '') 
    if scheme: 
     environ['wsgi.url_scheme'] = scheme 
    return self.app(environ, start_response) 

在应用中的__init__.pyapp.wsgi_app = ReverseProxied(app.wsgi_app)