Progetto

Generale

Profilo

NginxUwsgiSetup » Cronologia » Versione 2

Simone Piccardi, 19-01-2015 14:37

1 1 Simone Piccardi
h1. Configurare nginx e uWSGI per l'uso del protocollo nativo
2
3
A partire dalla versione 0.8.40 ngnix supporta direttamente il protocollo _uwsgi_, che consente di utilizzarlo come proxy per uWSGI in maniera ottimizzata. Per poterlo utilizzare in tal modo occorre però modificare opportunamente la sezione @location@. Una configurazione ordinaria, infatti prevede l'uso della direttiva @proxy_pass@, che dovrà essere sostituita da @uwsgi_pass@, un esempio delle modifiche da effettuare è il seguente:
4
5
<pre>
6
upstream mio-servizio {
7
       server 127.0.0.1:8000;
8
}
9
server {
10
        listen IL.MIO.IP.PUB:443 ssl;
11
        server_name miosito.it;
12
[...]
13
        location / {
14
# removed
15
#           proxy_pass http://mio-servizio;
16
#           proxy_http_version 1.1;
17
#           proxy_pass_header Server;
18
# added
19
            uwsgi_pass        mio-servizio;
20
            include           uwsgi_params;
21
# unchanged
22
            proxy_redirect off;
23
            proxy_set_header Host $http_host;
24
            proxy_set_header X-Real-IP $remote_addr;
25
            proxy_set_header X-Scheme $scheme;
26
            proxy_set_header X-Forwarded-Proto $thescheme;
27
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
28
        }       
29
</pre>
30
31 2 Simone Piccardi
Si abbia cura di verificare che il file @uwsgi_params@, fornito con l'installazione di uWSGI, sia correttamente installato in @/etc/nginx/@.
32 1 Simone Piccardi
33 2 Simone Piccardi
Ovviamente occorrerà anche lanciare il comando @uwsgi@ per indicargli di utilizzare nativamente il protocollo _uwsgi_, per questo invece di usare la direttiva @--http@ occorrerà utilizzare la direttiva @--socket@; in particolare una configurazione usata per la comunicazione in maniera ordinaria con @proxy_pass@ come la seguente:
34
35 1 Simone Piccardi
<pre>
36
/usr/local/bin/uwsgi --http 127.0.0.1:8000 --stats 127.0.0.1:8001 \
37
  --http-websockets --gevent 100 --module  mymodule.uwsgi
38
</pre>
39
40
dovrà essere modificata in: 
41
42
<pre>
43
/usr/local/bin/uwsgi --socket 127.0.0.1:8000  --stats 127.0.0.1:8001 \
44
  --http-websockets --gevent 100 --module mymodule.uwsgi
45
</pre>
46
47 2 Simone Piccardi
Come ulteriore ottimizzazione, se come negli esempi precedenti si sta facendo riferimento ad un servizio che gira sulla stessa macchina, è preferibile anche evitare l'ulteriore overhead di utilizzare socket TCP, ed usare direttamente un socket locale. In questo caso è necessario modificare opportunamente (rispetto all'esempio precedente) la direttiva @server@ nella sezione @upstream@ di ngnix per fargli utilizzare il socket, con qualcosa del tipo:
48 1 Simone Piccardi
49
<pre>
50
upstream mio-servizio {
51
       server unix:///tmp/my-application.sock;
52
}
53
</pre>
54
55 2 Simone Piccardi
mentre dall'altro lato si dovrà modificare la modalità con cui si avvia @uwsgi@ per fargli usare un socket locale lanciandolo come:
56 1 Simone Piccardi
57
<pre>
58
/usr/local/bin/uwsgi --socket /tmp/my-application.sock  --stats 127.0.0.1:8001 \
59
  --chmod-socket=640 --chown-socket=www-data \
60
  --http-websockets --gevent 100 --module mymodule.uwsgi
61
</pre>
62
63
in modo da creare il socket con i giusti permessi ed un proprietario che ne consenta l'accesso da nginx.