1018
|
1 <!--
|
|
2 Copyright (C) Igor Sysoev
|
|
3 Copyright (C) Nginx, Inc.
|
|
4 -->
|
|
5
|
|
6 <!DOCTYPE article SYSTEM "../../../../dtd/article.dtd">
|
|
7
|
|
8 <article name="Come nginx processa una richiesta"
|
|
9 link="/it/docs/http/request_processing.html"
|
|
10 lang="it"
|
|
11 translator="Angelo Papadia"
|
|
12 rev="1"
|
|
13 author="Igor Sysoev"
|
|
14 editor="Brian Mercer">
|
|
15
|
|
16 <section name="Server virtuali name-based">
|
|
17
|
|
18 <para>
|
|
19 La prima cosa che nginx fa e' decidere quale <i>server</i> deve
|
|
20 processare la richiesta. Si consideri una semplice configurazione
|
|
21 in cui tutti i tre server virtuali sono in ascolto sulla porta *:80 :
|
|
22 <programlisting>
|
|
23 server {
|
|
24 listen 80;
|
|
25 server_name example.org www.example.org;
|
|
26 ...
|
|
27 }
|
|
28
|
|
29 server {
|
|
30 listen 80;
|
|
31 server_name example.net www.example.net;
|
|
32 ...
|
|
33 }
|
|
34
|
|
35 server {
|
|
36 listen 80;
|
|
37 server_name example.com www.example.com;
|
|
38 ...
|
|
39 }
|
|
40 </programlisting>
|
|
41
|
|
42 </para>
|
|
43
|
|
44 <para>
|
|
45 In questa configurazione nginx verifica solo il campo <header>Host</header>
|
|
46 dell'header di richiesta, per determinare a quale server la richiesta debba
|
|
47 essere assegnata.
|
|
48 Se il suo valore non corrisponde con quello di alcun nome di server,
|
|
49 oppure se la richiesta semplicemente non contiene tale campo dell'header,
|
|
50 allora nginx assegna la richiesta al server di default per la relativa porta.
|
|
51 Nella configurazione precedente, il server di default e' il primo—si
|
|
52 tratta del comportamento standard di nginx.
|
|
53 E' anche possibile indicare esplicitamente il server di default, tramite il
|
|
54 parametro <literal>default_server</literal> nella direttiva
|
|
55 <link doc="ngx_http_core_module.xml" id="listen"/> :
|
|
56 <programlisting>
|
|
57 server {
|
|
58 listen 80 <b>default_server</b>;
|
|
59 server_name example.net www.example.net;
|
|
60 ...
|
|
61 }
|
|
62 </programlisting>
|
|
63
|
|
64 <note>
|
|
65 Il parametro <literal>default_server</literal> e' disponibile a partire dalla
|
|
66 versione 0.8.21 di nginx.
|
|
67 Nelle versioni precedenti bisogna usare invece il parametro
|
|
68 <literal>default</literal>.
|
|
69 </note>
|
|
70 Si noti che il server di default e' una proprieta' della porta in ascolto,
|
|
71 e non del nome del server; l'argomento sara' ripreso in seguito.
|
|
72 </para>
|
|
73
|
|
74 </section>
|
|
75
|
|
76
|
|
77 <section id="how_to_prevent_undefined_server_names"
|
|
78 name="Come evitare di processare richieste in cui il nome del server non e' definito">
|
|
79
|
|
80 <para>
|
|
81 Se si desidera che le richieste prive dell'header <header>Host</header>
|
|
82 non siano processate, e' possibile definire un server che si limita a scartarle:
|
|
83 <programlisting>
|
|
84 server {
|
|
85 listen 80;
|
|
86 server_name "";
|
|
87 return 444;
|
|
88 }
|
|
89 </programlisting>
|
|
90 In questo caso il nome del server e' definito con una stringa vuota,
|
|
91 la quale corrispondera' a tutte le richieste prive del campo
|
|
92 <header>Host</header> dell'header; per chiudere la connessione nginx
|
|
93 restituisce il codice 444 (non standard).
|
|
94 <note>
|
|
95 A partire dalla versione 0.8.48 quella descritta e' la configurazione
|
|
96 default per i nomi di server, per cui e' possibile omettere
|
|
97 <literal>server_name ""</literal>.
|
|
98 Nelle versioni precedenti, come nome del server di default si utilizzava
|
|
99 l'<i>hostname</i> della macchina.
|
|
100 </note>
|
|
101 </para>
|
|
102
|
|
103 </section>
|
|
104
|
|
105
|
|
106 <section id="mixed_name_ip_based_servers"
|
|
107 name="Configurazione mista di server virtuali name-based e IP-based">
|
|
108
|
|
109 <para>
|
|
110 Una configurazione piu' complessa prevede vari server virtuali
|
|
111 in ascolto su indirizzi differenti:
|
|
112 <programlisting>
|
|
113 server {
|
|
114 listen 192.168.1.1:80;
|
|
115 server_name example.org www.example.org;
|
|
116 ...
|
|
117 }
|
|
118
|
|
119 server {
|
|
120 listen 192.168.1.1:80;
|
|
121 server_name example.net www.example.net;
|
|
122 ...
|
|
123 }
|
|
124
|
|
125 server {
|
|
126 listen 192.168.1.2:80;
|
|
127 server_name example.com www.example.com;
|
|
128 ...
|
|
129 }
|
|
130 </programlisting>
|
|
131 In tale configurazione nginx dapprima confronta l'indirizzo IP
|
|
132 e la porta della richiesta con le direttive
|
|
133 <link doc="ngx_http_core_module.xml" id="listen"/> dei blocchi
|
|
134 <link doc="ngx_http_core_module.xml" id="server"/>;
|
|
135 quindi, per ciascun blocco per cui c'e' corrispondenza, nginx confronta
|
|
136 il campo <header>Host</header> dell'header della richiesta con i
|
|
137 valori <link doc="ngx_http_core_module.xml" id="server_name"/> del blocco.
|
|
138 Se il nome del server non e' presente in alcun blocco, la richiesta
|
|
139 viene processata dal server di default.
|
|
140 Ad esempio, una richiesta per <literal>www.example.com</literal>
|
|
141 ricevuta sulla porta 192.168.1.1:80, sara' processata dal server di
|
|
142 default di 192.168.1.1:80, vale a dire dal primo server, in quanto non
|
|
143 c'e' alcun nome <literal>www.example.com</literal> definito per tale
|
|
144 combinazione di indirizzo e porta.
|
|
145 </para>
|
|
146
|
|
147 <para>
|
|
148 Si precisa nuovamente che il server di default e' una proprieta' di
|
|
149 indirizzo e porta in ascolto, e che e' possibile definire server di
|
|
150 default differenti per combinazioni differenti di indirizzo e porta:
|
|
151 <programlisting>
|
|
152 server {
|
|
153 listen 192.168.1.1:80;
|
|
154 server_name example.org www.example.org;
|
|
155 ...
|
|
156 }
|
|
157
|
|
158 server {
|
|
159 listen 192.168.1.1:80 <b>default_server</b>;
|
|
160 server_name example.net www.example.net;
|
|
161 ...
|
|
162 }
|
|
163
|
|
164 server {
|
|
165 listen 192.168.1.2:80 <b>default_server</b>;
|
|
166 server_name example.com www.example.com;
|
|
167 ...
|
|
168 }
|
|
169 </programlisting>
|
|
170
|
|
171 </para>
|
|
172
|
|
173 </section>
|
|
174
|
|
175
|
|
176 <section id="simple_php_site_configuration"
|
|
177 name="Configurazione per un semplice sito PHP">
|
|
178
|
|
179 <para>
|
|
180 Nel seguito si analizza come nginx scelga la <i>location</i> per
|
|
181 processare una richiesta nel caso di un tipico, semplice sito PHP:
|
|
182 <programlisting>
|
|
183 server {
|
|
184 listen 80;
|
|
185 server_name example.org www.example.org;
|
|
186 root /data/www;
|
|
187
|
|
188 location / {
|
|
189 index index.html index.php;
|
|
190 }
|
|
191
|
|
192 location ~* \.(gif|jpg|png)$ {
|
|
193 expires 30d;
|
|
194 }
|
|
195
|
|
196 location ~ \.php$ {
|
|
197 fastcgi_pass localhost:9000;
|
|
198 fastcgi_param SCRIPT_FILENAME
|
|
199 $document_root$fastcgi_script_name;
|
|
200 include fastcgi_params;
|
|
201 }
|
|
202 }
|
|
203 </programlisting>
|
|
204
|
|
205 </para>
|
|
206
|
|
207 <para>
|
|
208 Per prima cosa nginx individua fra tutte le location definite da una
|
|
209 stringa quella con il prefisso specifico piu' lungo (l'ordine con cui
|
|
210 sono elencate non e' rilevante); nella configurazione precedente il
|
|
211 solo prefisso definito e' “<literal>/</literal>”, che trova
|
|
212 corrispondenza in qualsiasi richiesta e che quindi verra' comunque
|
|
213 preso in considerazione, come ultima risorsa.
|
|
214 Successivamente, nginx analizza le location definite tramite una
|
|
215 espressione regolare, fermandosi appena ne individua una che
|
|
216 corrisponde (in questo caso l'ordine in cui sono inserite nel file
|
|
217 di configurazione e' rilevante in quanto nginx parte dalla prima e le
|
|
218 analizza una dopo l'altra). La prima location individuata fra quelle
|
|
219 definite come espressione regolare e' quella prescelta; se non ce n'e'
|
|
220 nessuna, nginx ripiega su quella individuata al passo precedente tramite
|
|
221 il prefisso.
|
|
222
|
|
223 </para>
|
|
224
|
|
225 <para>
|
|
226 Notare che tutti i tipi di location sono confrontati con il solo URI
|
|
227 della linea di richiesta, senza argomenti;
|
|
228 cio' e' dovuto al fatto che gli argomenti nella stringa di richiesta
|
|
229 possono essere inviati in vari modi, ad esempio:
|
|
230 <programlisting>
|
|
231 /index.php?user=john&page=1
|
|
232 /index.php?page=1&user=john
|
|
233 </programlisting>
|
|
234 Inoltre, nella stringa di richiesta e' possibile scrivere qualsiasi cosa:
|
|
235 <programlisting>
|
|
236 /index.php?page=1&something+else&user=john
|
|
237 </programlisting>
|
|
238
|
|
239 </para>
|
|
240
|
|
241 <para>
|
|
242 Seguono alcuni esempi di processo di richieste in base alla
|
|
243 configurazione precedente:
|
|
244 <list type="bullet" compact="no">
|
|
245
|
|
246 <listitem>
|
|
247 Una richiesta “<literal>/logo.gif</literal>” corrisponde al prefisso
|
|
248 di location “<literal>/</literal>”, ma anche all'espressione regolare
|
|
249 “<literal>\.(gif|jpg|png)$</literal>”, per cui si utilizzera' quest'ultima
|
|
250 corrispondenza in quanto, come spiegato in precedenza, le espressioni
|
|
251 regolari hanno sempre priorita' sulle stringhe fisse.
|
|
252 Usando la direttiva “<literal>root /data/www</literal>” la richiesta
|
|
253 e' mappata sul file <path>/data/www/logo.gif</path> , che quindi e' inviato
|
|
254 al client.
|
|
255 </listitem>
|
|
256
|
|
257 <listitem>
|
|
258 Una richiesta “<literal>/index.php</literal>” corrisponde sia al prefisso
|
|
259 “<literal>/</literal>” sia all'espressione regolare
|
|
260 “<literal>\.(php)$</literal>”, per cui sara' processata da quest'ultima
|
|
261 sezione della configurazione, e la richiesta sara' inoltrata al server
|
|
262 FastCGI in ascolto su localhost:9000.
|
|
263 La direttiva
|
|
264 <link doc="ngx_http_fastcgi_module.xml" id="fastcgi_param"/>
|
|
265 imposta il parametro FastCGI
|
|
266 <literal>SCRIPT_FILENAME</literal> a “<literal>/data/www/index.php</literal>”,
|
|
267 ed il server FastCGI esegue il file.
|
|
268 La variabile <var>$document_root</var> contiene il valore della direttiva
|
|
269 <link doc="ngx_http_core_module.xml" id="root"/>, e la variabile
|
|
270 <var>$fastcgi_script_name</var> il valore della richiesta URI, vale a dire
|
|
271 “<literal>/index.php</literal>”.
|
|
272 </listitem>
|
|
273
|
|
274 <listitem>
|
|
275 Una richiesta “<literal>/about.html</literal>” corrisponde al solo prefisso
|
|
276 “<literal>/</literal>”, per cui sara' processata da questa sezione.
|
|
277 La direttiva “<literal>root /data/www</literal>” mappa la richiesta sul file
|
|
278 <path>/data/www/about.html</path>, che e' inviato al client.
|
|
279 </listitem>
|
|
280
|
|
281 <listitem>
|
|
282 Una richiesta “<literal>/</literal>” e' processata in maniera piuttosto
|
|
283 complessa. Corrisponde al solo prefisso “<literal>/</literal>”, per cui e'
|
|
284 processata dalla relativa sezione; la direttiva
|
|
285 <link doc="ngx_http_index_module.xml" id="index"/>,
|
|
286 in accordo ai propri parametri e alla direttiva
|
|
287 “<literal>root /data/www</literal>”, verifica la presenza di eventuali file index.
|
|
288 Se il file <path>/data/www/index.html</path> non esiste, ma esiste invece il
|
|
289 file <path>/data/www/index.php</path> , allora la direttiva esegue una
|
|
290 redirezione interna su “<literal>/index.php</literal>”, e nginx ricerca
|
|
291 nuovamente le location, come se si trattasse di una richiesta del client.
|
|
292 Come visto in precedenza, alla fine la richiesta rediretta e' processata
|
|
293 dal server FastCGI.
|
|
294 </listitem>
|
|
295
|
|
296 </list>
|
|
297
|
|
298 </para>
|
|
299
|
|
300 </section>
|
|
301
|
|
302 </article>
|