Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nginx
GitHub Repository: nginx/nginx.org
Path: blob/main/xml/it/docs/http/request_processing.xml
1 views
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&mdash;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&amp;page=1
232
/index.php?page=1&amp;user=john
233
</programlisting>
234
Inoltre, nella stringa di richiesta e' possibile scrivere qualsiasi cosa:
235
<programlisting>
236
/index.php?page=1&amp;something+else&amp;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&nbsp;/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>
303
304