2016-12-27 146 views
1

我正在嘗試使用flask + gunicorn + nginx來設置一個web應用程序。通過運行腳本可以,但是在nginx中有一些小問題。flask + nginx + gunicorn重定向錯誤

hello.py中,提交表單後應重定向到索引。在我的本地測試中,索引地址是http://127.0.0.1:8080,一切都很順利。
使用nginx和gunicorn的服務器,當提交表單時,它將重定向到http://192.168.1.108/而不是http://192.168.1.108:1025/。 192.168.1.108這裏是我的本地ip。

代碼重定向到的index.html在hello.py,所述科迪是從flasky克隆

from flask import Flask, render_template, session, redirect, url_for, flash 
from flask_script import Manager 
from flask_bootstrap import Bootstrap 
from flask_moment import Moment 
from flask_wtf import Form 
from wtforms import StringField, SubmitField 
from wtforms.validators import Required 
from werkzeug.contrib.fixers import ProxyFix 


app = Flask(__name__) 
app.wsgi_app = ProxyFix(app.wsgi_app) 
app.config['SECRET_KEY'] = 'hard to guess string' 

manager = Manager(app) 
bootstrap = Bootstrap(app) 
moment = Moment(app) 


class NameForm(Form): 
    name = StringField('What is your name?', validators=[Required()]) 
    submit = SubmitField('Submit') 


@app.route('/', methods=['GET', 'POST']) 
def index(): 
    form = NameForm() 
    if form.validate_on_submit(): 
     old_name = session.get('name') 
     if old_name is not None and old_name != form.name.data: 
      flash('Looks like you have changed your name!') 
     session['name'] = form.name.data 
     return redirect(url_for('index')) 
    return render_template('index.html', form=form, name=session.get('name')) 


if __name__ == '__main__': 
    manager.run() 

設置在nginx的:

worker_processes 2; 
events { 
    worker_connections 1024; 
} 
http { 
    include  mime.types; 
    default_type application/octet-stream; 
    sendfile  on; 
    server { 
     listen  1025; 
     server_name 127.0.0.1:8080; 

     #charset koi8-r; 

     #access_log logs/host.access.log main; 

     location/{ 
      proxy_pass http://127.0.0.1:8080; # gunicorn host address 
      proxy_set_header Host $host; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     } 
    } 
} 

正在運行由gunicorn -w 2 -b 127.0.0.1:8080 manage:app gunicorn。 我認爲在nginx配置中有錯誤。

回答

0

我懷疑你的問題是nginx沒有將端口和Host頭一起傳遞給gunicorn,以至於你的應用程序認爲它運行在默認端口而不是8080.嘗試將nginx中的第一個proxy_set_header改爲:

proxy_set_header Host $host:$server_port; 
+1

它的工作原理,非常感謝(^ u ^)。 – l0o0