Progetto

Generale

Profilo

NginxUwsgiSetup » Cronologia » Versione 1

Simone Piccardi, 19-01-2015 14:34

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
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 in maniera ordinaria con @uwsgi_pass@ come:
32
33
<pre>
34
/usr/local/bin/uwsgi --http 127.0.0.1:8000 --stats 127.0.0.1:8001 \
35
  --http-websockets --gevent 100 --module  mymodule.uwsgi
36
</pre>
37
38
dovrà essere modificata in: 
39
40
<pre>
41
/usr/local/bin/uwsgi --socket 127.0.0.1:8000  --stats 127.0.0.1:8001 \
42
  --http-websockets --gevent 100 --module mymodule.uwsgi
43
</pre>
44
45
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 modificar opportunamente (rispetto all'esempio precedente) la direttiva @server@ nella sezione @upstream@ di ngnix per fargli utilizzare il socket, con qualcosa del tipo:
46
47
<pre>
48
upstream mio-servizio {
49
       server unix:///tmp/my-application.sock;
50
}
51
</pre>
52
53
mentre dall'altro lato si dovrà modificare la modalità con cui si avvia @uwsgi@ lanciandolo come:
54
55
<pre>
56
/usr/local/bin/uwsgi --socket /tmp/my-application.sock  --stats 127.0.0.1:8001 \
57
  --chmod-socket=640 --chown-socket=www-data \
58
  --http-websockets --gevent 100 --module mymodule.uwsgi
59
</pre>
60
61
in modo da creare il socket con i giusti permessi ed un proprietario che ne consenta l'accesso da nginx.