我想要实现的目标:
我有一个托管mydomain.com的nginx web服务器.当有人将我的domain.com键入他们的客户端时,我希望我的服务器能够提供index.html./var/www/mydomain/
当他们输入mydomain.com/flaskapp1时,他们应该看到flaskapp1.当他们输入mydomain.com/flaskapp2时,他们应该看到flaskapp2.
我已经设法使用这里的教程http://www.markjberger.com/flask-with-virtualenv-uwsgi-nginx/获得了一个或另一个烧瓶应用程序但是当试图实现服务两个单独的烧瓶应用程序时遇到困难.当我尝试在浏览器中使用mydomain.co.uk/flaskapp或mydomain.co.uk/flaskapp2访问任一个烧瓶应用程序时,我没有看到烧瓶应用程序,而是收到404消息.
这是我到目前为止:
cat /etc/nginx/sites-available/mydomain.co.uk
server { listen 80; server_name www.mydomain.co.uk mydomain.co.uk; location / { root /var/www/html/; index index.html index.htm; } location /flaskapp { include uwsgi_params; uwsgi_pass unix:/tmp/flaskapp.sock; } location /flaskapp2 { include uwsgi_params; uwsgi_pass unix:/tmp/flaskapp2.sock; } }
上面的conf文件已被sim链接到/etc/nginx/sites-enabled
.
cat /etc/uwsgi/apps-available/flaskapp.ini
[uwsgi] vhost = true socket = /tmp/flaskapp.sock venv = /var/www/flaskapp/venv chdir = /var/www/flaskapp module = flaskapp callable = app
cat /etc/uwsgi/apps-available/flaskapp2.ini
[uwsgi] vhost = true socket = /tmp/flaskapp2.sock venv = /var/www/flaskapp2/venv chdir = /var/www/flaskapp2 module = flaskapp2 callable = app
两个.ini文件都已符号链接/etc/uwsgi/apps-enabled
.UWSGI重启没有任何问题,并且启动并运行.flaskapp.sock和flaskapp2.sock都归www-data所有
cat /var/www/flaskapp/flaskapp.py
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World from flaskapp1!' if __name__ == '__main__': app.run(host='0.0.0.0')
cat /var/www/flaskapp2/flaskapp2.py
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World from flaskapp2!' if __name__ == '__main__': app.run(host='0.0.0.0')
cat /var/www/mydomain.co.uk/index.html
mydomain.co.uk
This is the index page of my domain.co.uk
两个虚拟环境都安装了烧瓶,并将使用开发服务器运行烧瓶应用程序.
我希望我错过了一些简单的事情.
在这里查看NGINX的uwsgi文档.
特别:
不幸的是,nginx无法相应地将SCRH_INFO重写为SCRIPT_NAME.出于这个原因,您需要指示uWSGI在所谓的"mountpoint"中映射特定应用程序,并自动重写SCRIPT_NAME和PATH_INFO:
更改我的flaskapp.ini和flaskapp2.ini文件以包含应用程序的挂载点并打开manage-script-name变量已经起作用.
cat /etc/uwsgi/apps-available/flaskapp.ini
[uwsgi] vhost = true socket = /tmp/flaskapp.sock venv = /var/www/flaskapp/venv chdir = /var/www/flaskapp module = flaskapp callable = app mount = /flaskapp=flaskapp.py manage-script-name = true
cat /etc/uwsgi/apps-available/flaskapp2.ini
[uwsgi] vhost = true socket = /tmp/flaskapp2.sock venv = /var/www/flaskapp2/venv chdir = /var/www/flaskapp2 module = flaskapp2 callable = app mount = /flaskapp2=flaskapp2.py manage-script-name = true
现在,两个烧瓶应用程序都是根据需要通过ugingi通过nginx运行.
问题出在这里:两个烧瓶应用程序都不知道它们是从您域中的子目录提供的.Nginx将完整的URL传递给它们,而不是相对于该目录的URL,因此每个URL都相对于root分派.我们在示例中看到:
假设你的flaskapp有3个视图,在网址上提供/one/
,/two/
以及/three/
.因此,当您尝试访问URL上的视图时/one/
,您正在键入地址:http://yourdomain.com/flaskapp/one/
.Flask将从nginx URL收到,/flaskapp/one/
但该应用程序中没有此类视图,因此它将发送404作为响应.
您可以做的是通知每个flaskapp它们不在域根目录上提供,而是在特定子目录中提供.您可以通过SCRIPT_NAME
uwsgi_param
在子目录中输入值来实现此目的,因此您的nginx配置将具有:
location /flaskapp { include uwsgi_params; uwsgi_pass unix:/tmp/flaskapp.sock; uwsgi_param SCRIPT_NAME /flaskapp; } location /flaskapp2 { include uwsgi_params; uwsgi_pass unix:/tmp/flaskapp2.sock; uwsgi_param SCRIPT_NAME /flaskapp2; }