2016-01-09 9 views
8

Quello che sto cercando di ottenere:Come ospitare più applicazioni per flask in un singolo dominio ospitato su nginx?

Ho un server Web nginx che ospita mydomain.com. Quando qualcuno digita il mio dominio.com nel suo client, vorrei che il mio server servisse index.html da /var/www/mydomain/ Quando digitano mydomain.com/flaskapp1 dovrebbero vedere flaskapp1. Quando digitano mydomain.com/flaskapp2 dovrebbero vedere flaskapp2.

Sono riuscito a ottenere una o l'altra app di flask servite utilizzando il tutorial qui http://www.markjberger.com/flask-with-virtualenv-uwsgi-nginx/ ma quando si tenta di implementare servendo due app di flask separate, mi imbatto in difficoltà. Invece di vedere l'app della bottiglia, ricevo un messaggio 404 quando provo ad accedere ad una delle applicazioni di flask con mydomain.co.uk/flaskapp o mydomain.co.uk/flaskapp2 in un browser.

Questo è quello che ho finora:

gatto /etc/nginx/sites-available/mydomain.co.uk file di

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; 
     } 
} 

È possibile che questo conf è stato sim collegato in /etc/nginx/sites-enabled .

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

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

Entrambi. i file ini sono stati simmessi in /etc/uwsgi/apps-enabled. UWSGI si riavvia correttamente senza problemi ed è attivo e funzionante. Sia flaskapp.sock e flaskapp2.sock sono di proprietà di www-data

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

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

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

Entrambi gli ambienti virtuali hanno installato il pallone e eseguirà le applicazioni del pallone utilizzando il server di sviluppo.

Spero che sia qualcosa di semplice che mi sia sfuggito.

+1

Ma qual è il tuo problema? cosa non funziona? Qual'è il problema? – GwynBleidD

+1

Ricevo l'errore 404 per entrambe le app del pallone. index.html funziona correttamente. – Hoppo

risposta

6

Guardando la documentazione uwsgi per Nginx here.

In particolare:

Purtroppo nginx non è in grado di riscrivere PATH_INFO conseguenza per SCRIPT_NAME. Per tale motivo è necessario istruire uWSGI mappare applicazioni specifiche nel cosiddetto “punto di montaggio” e riscrivere SCRIPT_NAME e PATH_INFO automaticamente:

cambiare le mie flaskapp.ini e file flaskapp2.ini per contenere i punti di montaggio per le app e l'attivazione della variabile nome-script-gestione ha funzionato.

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

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

Ed ora entrambe le applicazioni di flask sono in esecuzione via uwsgi attraverso nginx come richiesto.

+1

Come configurare il supervisore in modo tale che funzioni con nginx su un proxy inverso su un sottodominio? – user805981

5

Il problema è qui: entrambe le applicazioni di flask non hanno idea di essere state servite dalla sottodirectory del tuo dominio. Nginx sta trasmettendo l'URL completo a loro, non l'URL relativo a quella directory, quindi ogni URL viene inviato relativamente a root. Vediamo che nell'esempio:

Supponiamo di avere 3 visualizzazioni nel tuo flaskapp, pubblicate sugli URL /one/, /two/ e /three/. Pertanto, quando stai tentando di accedere alla vista sull'URL /one/, stai digitando l'indirizzo: http://yourdomain.com/flaskapp/one/. Flask riceverà dall'URL nginx /flaskapp/one/ ma non esiste tale vista in quell'app, quindi invierà 404 in risposta.

Ciò che si può fare è informare ogni flaskapp che non sono serviti sulla radice del dominio, ma su una particolare sottodirectory. È possibile raggiungere questo obiettivo con l'invio di SCRIPT_NAMEuwsgi_param con la posizione sottodirectory di valore, così il vostro config nginx avrà:

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

Questo non sembra aver fatto alcuna differenza, tuttavia mi ha indicato nella direzione della risposta corretta, quindi l'ho contrassegnato come utile. – Hoppo

+0

Forse l'applicazione del pallone necessita di qualche ritocco per capire correttamente "SCRIPT_NAME". Non ho mai usato 'SCRIPT_NAME' con il pallone, ma so che è una soluzione con django (che può usare lo stesso nginx e una configurazione uWSGI). – GwynBleidD

Problemi correlati