如何在nginx上托管的单个域下托管多个烧瓶应用程序?

时间:2016-01-09 10:57:28

标签: nginx flask uwsgi

我想要实现的目标:

我有一个托管mydomain.com的nginx网络服务器。当有人将我的domain.com输入他们的客户端时,我希望我的服务器从/var/www/mydomain/提供index.html当他们输入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;
         }
 }

以上配置文件已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

<!DOCTYPE html>
<html>
<body>

<h1>mydomain.co.uk</h1>

<p>This is the index page of my domain.co.uk</p>

</body>
</html>

两个虚拟环境都安装了烧瓶,并将使用开发服务器运行烧瓶应用程序。

我希望它能让我错过一些简单的事情。

3 个答案:

答案 0 :(得分:9)

查看NGINX here的uwsgi文档。

具体做法是:

  

不幸的是,nginx无法相应地重写PATH_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运行。

答案 1 :(得分:5)

问题在于:两个烧瓶应用程序都不知道它们是从您域中的子目录提供的。 Nginx将完整的URL传递给它们,而不是相对于该目录的URL,因此每个URL都相对于root调度。让我们在示例中看到:

假设您在flaskapp中有3个观看次数,并在网址/one//two//three/上投放。因此,当您尝试访问网址/one/上的视图时,您输入的地址为:http://yourdomain.com/flaskapp/one/。 Flask将从nginx网址/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;
    }

答案 2 :(得分:2)

添加安装点对我有用。

/etc/uwsgi/apps-available/flaskapp.ini

callable = app
mount = /flaskapp=/var/www/flaskapp

/etc/uwsgi/apps-available/flaskapp2.ini

callable = app
mount = /flaskapp2=/var/www/flaskapp2

来源https://neginfinity.bitbucket.io/2017/09/hosting-multiple-flask-applications-in-nginx.html