2016-01-09 16 views
8

達成しようとしているもの:nginxでホストされている単一のドメインの下で複数のフラスコアプリをホストするには?

私はmydomain.comをホストしているnginx Webサーバーを持っています。誰かが私のdomain.comを自分のクライアントに入力すると、自分のサーバがindex.htmlを/var/www/mydomain/から提供したいと思います。mydomain.com/flaskapp1と入力すると、flaskapp1が表示されます。 mydomain.com/flaskapp2と入力すると、flaskapp2が表示されます。

私は1つを得るために管理しているか、他のフラスコのアプリは、私が困難に遭遇する二つの別々のフラスコのアプリを提供する実装しようとしたときに、ここでhttp://www.markjberger.com/flask-with-virtualenv-uwsgi-nginx/チュートリアルを使用しますが務めました。フラスコのアプリを見る代わりに、ブラウザでmydomain.co.uk/flaskappまたはmydomain.co.uk/flaskapp2のいずれかのフラスコアプリにアクセスしようとすると、404メッセージが表示されます。

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

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にリンクされている/etc/nginx/sites-available/mydomain.co.uk

猫。

猫/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 

/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-データ

猫/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') 

猫/var/www/flaskapp2/flaskapp2.pyによって所有されています

01 /var/www/mydomain.co.uk/index.html

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') 

両方の仮想環境にフラスコがインストールされており、開発サーバーを使用してフラスコアプリを実行します。

私はそれが私が逃したシンプルなものだと願っています。

+1

あなたの問題は何ですか?何がうまくいかないの?どうした? – GwynBleidD

+1

両方のフラスコのアプリケーションでエラー404が表示されます。 index.htmlは正常に動作しています。 – Hoppo

答えて

6

nginxのhereためuwsgiのドキュメントを見てみます。具体的に

残念ながら、nginxのは SCRIPT_NAMEに応じてPATH_INFOを書き換えることができません。

をするためにマウントポイントを含むように私のflaskapp.iniとflaskapp2.iniファイルを変更する:このような理由から、あなたはuWSGIは、いわゆる「マウントポイント」に 特定のアプリをマッピングし、自動的にSCRIPT_NAME とPATH_INFOを書き換えるように指示する必要がありますアプリと管理スクリプト名変数を有効にしています。

/etc/uwsgi/apps-available/flaskapp2.ini猫/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 

[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 

そして今、両方のフラスコアプリは、必要に応じてuginiからnginxを介して実行されています。

+1

サブドメイン上のリバースプロキシでnginxと連携する方法でスーパーバイザを設定するにはどうすればよいですか? – user805981

5

問題はここにあります:両方のフラスコアプリはあなたのドメインのサブディレクトリから配信されたことを知らない。 Nginxは、そのディレクトリに関連するURLではなく、フルURLを渡しているので、すべてのURLはrootを基準にして送出されます。例を見てみましょう:

フラムフラスコには、/one/,/two//three/の3種類のビューがあります。したがって、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; 
    } 
+1

これは何の違いもありませんでしたが、正しい答えの方向に私を指摘しましたので、それを有用とマークしました。 – Hoppo

+0

フラスコのアプリケーションでは、 'SCRIPT_NAME'を正しく理解するには微妙な調整が必要かもしれません。私はフラスコで 'SCRIPT_NAME'を使用したことはありませんが、これはdjango(これは同じnginxとuWSGIの設定を使用できます)の解決策です。 – GwynBleidD

関連する問題