web-dev-qa-db-ja.com

nginxでホストされている単一のドメインで複数のflaskアプリをホストする方法は?

私が達成しようとしていること:

Mydomain.comをホストしているnginx Webサーバーがあります。誰かが私のdomain.comをクライアントに入力するとき、私のサーバーが/var/www/mydomain/からindex.htmlを提供することを望みます。 mydomain.com/flaskapp2と入力すると、フラスコアプリ2が表示されます。

flaskここのチュートリアルを使用して提供されるアプリ http://www.markjberger.com/flask-with-virtualenv-uwsgi-nginx/ しかし、2つの別個のサービスを実装しようとすると、flaskアプリに問題が発生します。flaskアプリを表示する代わりに、しようとすると404メッセージが表示されますブラウザでflask mydomain.co.uk/flaskappまたはmydomain.co.uk/flaskapp2を使用してアプリにアクセスします。

これは私がこれまでに持っているものです:

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ファイルは/etc/nginx/sites-enabledにsimリンクされています。

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は問題なく正常に再起動し、稼働しています。フラスコapp.sockとフラスコapp2.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>

どちらの仮想環境にもflaskがインストールされており、開発サーバーを使用してflaskアプリを実行します。

それが私が見逃したシンプルなものであることを願っています。

15
Hoppo

NGINX here のuwsgiドキュメントを見てください。

具体的には:

残念ながら、nginxはSCRIPT_NAMEに応じてPATH_INFOを書き換えることができません。そのような理由で、いわゆる「マウントポイント」で特定のアプリをマップし、SCRIPT_NAMEとPATH_INFOを自動的に書き換えるようにuWSGIに指示する必要があります。

私のフラスコアプリ.iniファイルとフラスコアプリ2.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

そして今、両方のflaskアプリは、必要に応じてnginxを介してuwsgiを介して実行されています。

10
Hoppo

問題はここにあります:両方flaskアプリは、ドメイン内のサブディレクトリから提供されたことを認識していません。nginxは、そのディレクトリに相対するURLではなく、完全なURLをアプリに渡しているため、すべてのURLがディスパッチされますルートを基準にしています。例を見てみましょう。

フラスコアプリに3つのビューがあり、/one//two//three/のURLで提供されているとします。したがって、URL /one/のビューにアクセスしようとしているときは、アドレスhttp://yourdomain.com/flaskapp/one/を入力しています。 Flaskはnginx URL /flaskapp/one/から受信しますが、そのアプリにはそのようなビューがないため、404を応答として送信します。

あなたができることは、各フラスコアプリがドメインルートではなく特定のサブディレクトリで提供されていることを通知することです。これを実現するには、値にサブディレクトリの場所を指定してSCRIPT_NAMEuwsgi_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;
    }
5
GwynBleidD