我在树莓派上托管了一个Web应用程序,我正试图从互联网上访问它。我正在使用Dataplicity(https://docs.dataplicity.com/docs/host-a-website-from-your-pi)来使用Nginx访问我的服务器。
在本地,一切正常。我会用
启动该应用flask run --host=0.0.0.0 --port=8000
使用端口8000或80在浏览器中转到我的pi地址,并成功获取应用程序的主页。直到那时,该过程在数据重复性方面同样有效。
当我调用redirect(url_for)函数(包括@login_required)时出现问题。通过数据多样性调用它后,立即获得“ 503服务暂时不可用”。
当我在本地工作时(或在外部使用端口转发->这使我认为问题出在Dataplicity和nginx上),当我尝试访问我的/ camera view函数而不先登录时,看到以下GET请求到应用程序:
127.0.0.1 - - [07/May/2019 22:27:47] "GET /camera HTTP/1.0" 302 -
127.0.0.1 - - [07/May/2019 22:27:47] "GET /login?next=%2Fcamera HTTP/1.0" 200 -
当我尝试通过数据一致性访问它时,我只会得到:
127.0.0.1 - - [07/May/2019 22:28:37] "GET /camera HTTP/1.0" 302 -
:“ GET / login?next =%2Fcamera HTTP / 1.0” 200-不存在。
如果这可以解决问题,则数据重复性中的每个URL均显示为https,除非我单击redirect(url_for)或@login_requested函数,否则它将变为http。
我尝试了在Stack Overflow上找到的几种不同的Nginx配置,并且还尝试通过阅读文档来对其进行一些调整。这是徒劳的。我不会分享它们,因为我尝试过的所有变化都会产生相同的效果。
这是我实际的nginx配置:
server {
listen 80 ;
server_name _;
access_log /var/log/app_access.log;
error_log /var/log/app_error.log;
location / {
proxy_pass http://localhost:8000;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
这是我应用中的重要代码:
@app.route("/")
def index():
return render_template('index.html', title='Cat')
@app.route('/login', methods=['GET', 'POST'])
def login():
if current_user.is_authenticated:
return redirect(url_for('index'))
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(username=form.username.data).first()
if user is None or not user.check_password(form.password.data):
flash('Invalid username or password')
return redirect(url_for('login'))
login_user(user, remember=form.remember_me.data)
next_page = request.args.get('next')
if not next_page or url_parse(next_page).netloc != '':
next_page = url_for('index')
return redirect(next_page)
return render_template('login.html', title='Sign In', form=form)
@app.route("/camera")
@login_required
def stream():
templateData = {
'title' : "Stream"
}
return render_template('camera.html', **templateData)
我希望在外部(通过数据多样性,因为我不喜欢开放端口的想法)获得与在本地获得的相同体验。就是说,能够使用我的“登录”视图功能而不会在每次重定向时出现错误。
我的应用终于可以运行了。我认为答案是Gunicorn。我有以下supervisor
文件,我几乎没有进行测试,因为我没有从文件中得到任何明确的反馈:
[program:app]
command=/var/www/html/app/sandbox/bin/gunicorn -b localhost:8000 -w 4 ...
directory=/var/www/html/app/
user=pi
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
今天,尝试了太多时间后,该应用程序在我重新加载supervisorctl
后才开始运行。我仍然必须找出是什么使此特定的nginx配置仅在Gunicorn运行时起作用。
flask run --host=0.0.0.0 --port=8000
仍然无法正常工作。
gunicorn -b 0.0.0.0:8000 -w 4 app:app
在工作。