配置運(yùn)行Nginx服務(wù)器用戶(組)
用于配置運(yùn)行Nginx服務(wù)器用戶(組)的指令是user,其語(yǔ)法格式為:
user user [group];
- user,指定可以運(yùn)行Nginx服務(wù)器的用戶。
- group,可選項(xiàng),指定可以運(yùn)行Nginx服務(wù)器的用戶組。
只有被設(shè)置的用戶或者用戶組成員才有權(quán)限啟動(dòng)Nginx進(jìn)程,如果是其他用戶(test_user)嘗試啟用Nginx進(jìn)程,將會(huì)報(bào)錯(cuò):
nginx: [emerg] getpwnam("test_user") failed (2:No such file or directory) in /Nginx/conf/nginx.conf:2
可以從錯(cuò)誤信息中看到,Nginx無(wú)法運(yùn)行的原因是查找test_user失敗,引起錯(cuò)誤的原因是nginx.conf的第二行內(nèi)容,即配置Nginx服務(wù)器用戶(組)的內(nèi)容。
如果希望所有用戶都可以啟動(dòng)Nginx進(jìn)程,有兩種辦法:一是將此指令行注釋掉:
#user [user] [group];
或者將用戶(和用戶組)設(shè)置為nobody:
user nobody nobody;
這也是user指令的默認(rèn)配置。user指令只能在全局塊中配置。
在Nginx配置文件中,每一條指令配置都必須以分號(hào)結(jié)束。
配置允許生成的worker process數(shù)
worker process是Nginx服務(wù)器實(shí)現(xiàn)病發(fā)處理的關(guān)鍵所在。從理論上來(lái)說(shuō),worker process的值越大,可以支持的支持的并發(fā)處理量也越多,但實(shí)際上它還要受到來(lái)自軟件本身、操作系統(tǒng)本身資源和能力、硬件設(shè)備(如CPU和磁盤驅(qū)動(dòng)器)等的制約。配置允許生成的worker process數(shù)的指令是worker_processes,其語(yǔ)法格式為:
worker_processes number | auto;
- number,指定Nginx進(jìn)程最多可以產(chǎn)生的worker process數(shù)。
- auto,設(shè)置此值,nginx進(jìn)程講自動(dòng)檢測(cè)。
在默認(rèn)的配置文件中,number = 1。啟動(dòng)Nginx服務(wù)器之后,使用一下命令可以看到Nginx服務(wù)器除了主進(jìn)程master process ../sbin/nginx之外,還生成了一個(gè)worker process:
Jorys-MBP:~ jory$ ps ax | grep nginx
11743 ?? Ss 0:00.00 nginx: master process nginx
11744 ?? S 0:00.00 nginx: worker process
11747 s000 S+ 0:00.00 grep nginx
如果將number改為3,重新運(yùn)行Nginx進(jìn)程,再次使用以上命令,則可以看到此時(shí)的Nginx服務(wù)器除了主進(jìn)程master process ../sbin/nginx之外,已經(jīng)生成了3個(gè)worker process:
Jorys-MBP:nginx jory$ ps ax | grep nginx
11796 ?? Ss 0:00.00 nginx: master process nginx
11797 ?? S 0:00.00 nginx: worker process
11798 ?? S 0:00.00 nginx: worker process
11799 ?? S 0:00.00 nginx: worker process
11811 s000 S+ 0:00.00 grep nginx
此指令只能在全局塊中設(shè)置。
配置Nginx進(jìn)程PID存放路徑
Nginx進(jìn)程作為系統(tǒng)的守護(hù)進(jìn)程運(yùn)行,我們需要在某文件中保存當(dāng)前運(yùn)行程序的主進(jìn)程號(hào)。Nginx支持對(duì)它的存放路徑進(jìn)行自定義配置,指令是pid,其語(yǔ)法格式為:
pid file;
其中,file指定存放路徑和文件名稱。
配置文件默認(rèn)將此文件存放在Nginx安裝目錄logs下,名字為nginx.pid。path可以是絕對(duì)路徑,也可以是以Nginx安裝目錄為根目錄的相對(duì)路徑。比如要把nginx.pid放置到Nginx安裝目錄sbin下,文件名為web_nginx,則可以使用一下配置:
pid sbin/web_nginx
注意
在指定[path]的時(shí)候,一定要包括文件名,如果只設(shè)置了路徑,沒(méi)有設(shè)置文件名,則會(huì)報(bào)一下錯(cuò)誤:
nginx: [emerg] open() "/Nginx/logs/" failed (21: Is a directory)
此指令只能在全局塊中進(jìn)行配置。
配置錯(cuò)誤日志的存放路徑
在全局塊、http塊和server塊中都可以對(duì)Nginx服務(wù)器的日志進(jìn)行相關(guān)配置。全局塊下日志的存放配置使用的指令是error_log,其語(yǔ)法結(jié)構(gòu)是:
error_log file | stderr [debug | info | notice | warn | error | crit | alert | emerg];
Nginx服務(wù)器的日志支持輸出到某一固定的文件file或者輸出到標(biāo)準(zhǔn)錯(cuò)誤輸出stderr,日志的級(jí)別是可選項(xiàng),由低到高分為debug(需要在編譯時(shí)使用--with-debug開(kāi)啟debug開(kāi)關(guān))、info、notice、warn、error、crit、alert、emerg等。需要注意的是,設(shè)置某一級(jí)別后,比這一級(jí)別高的日志也會(huì)被記錄。比如設(shè)置warn級(jí)別后,級(jí)別為warn以及error、crit、alert和emerg的日志都會(huì)被記錄下來(lái)。
如下面Nginx默認(rèn)的日志存放和級(jí)別設(shè)置:
error_log logs/error.log error;
注意
指定的文件對(duì)于運(yùn)行Nginx進(jìn)程的用戶具有寫(xiě)權(quán)限,否則在啟動(dòng)Nginx進(jìn)程的時(shí)候回出現(xiàn)以下報(bào)錯(cuò)信息:
nginx: [alter]: could not open error log file: open() "/Nginx/logs/error.log" failed
(13: Permission denied)
此指令可以在全局塊、http塊、server塊以及l(fā)ocation塊中配置。
配置文件的引入
在一些情況下,我們能需要將其他的Nginx配置或者第三方模塊的配置引用到當(dāng)前的主配置文件中。 Nginx提供了include指令來(lái)完成配置文件的引入,其語(yǔ)法格式為:
include file;
其中,file是要引入的配置文件,它支持相對(duì)路徑。
注意
新引用進(jìn)來(lái)的文件同樣要求運(yùn)行Nginx進(jìn)程的用戶對(duì)其具有寫(xiě)權(quán)限,并且符合Nginx配置文件規(guī)定的相關(guān)語(yǔ)法和結(jié)構(gòu)。
此指令可以放在配置文件的任意地方。
設(shè)置網(wǎng)絡(luò)連接的序列化
在《UNIX網(wǎng)絡(luò)編程》第1卷里提到過(guò)一個(gè)叫“驚群”的問(wèn)題(Thundering herd problem),大致意思是,當(dāng)某一時(shí)刻只有一個(gè)網(wǎng)絡(luò)連接到來(lái)時(shí),多個(gè)睡眠進(jìn)程會(huì)被同時(shí)叫醒,但只有一個(gè)進(jìn)程可獲得連接。如果每次喚醒的進(jìn)程數(shù)目太多,會(huì)影響一部分系統(tǒng)性能。在Nginx服務(wù)器的多進(jìn)程下,就有可能出現(xiàn)這樣的問(wèn)題。
為了解決這樣的問(wèn)題,Nginx配置中包含了這樣一條指令accept_mutex,當(dāng)其設(shè)置為開(kāi)啟的時(shí)候,將會(huì)對(duì)多個(gè)Nginx進(jìn)程接收連接進(jìn)行序列化,防止多個(gè)進(jìn)程對(duì)連接的爭(zhēng)搶。其語(yǔ)法結(jié)構(gòu)為:
accept_mutex on | off;
此指令默認(rèn)為開(kāi)啟(on)狀態(tài),其只能在events塊中進(jìn)行配置。
設(shè)置是否允許同時(shí)接收多個(gè)網(wǎng)絡(luò)連接
每個(gè)Nginx服務(wù)器的worker process都有能力同時(shí)接收多個(gè)新到達(dá)的網(wǎng)絡(luò)連接,但是這需要在配置文件中進(jìn)行設(shè)置,其指令為multi_accept,語(yǔ)法結(jié)構(gòu)為:
multi_accept on | off
此指令默認(rèn)為關(guān)閉(off)狀態(tài),即每個(gè)worker process一次只能接收一個(gè)新到達(dá)的網(wǎng)絡(luò)連接。此指令只能在events塊中進(jìn)行配置。
事件驅(qū)動(dòng)模型的選擇
Nginx服務(wù)器提供了多種事件驅(qū)動(dòng)模型來(lái)處理網(wǎng)絡(luò)消息。配置文件中為我們提供了相關(guān)的指令來(lái)強(qiáng)制Nginx服務(wù)器選擇哪種事件驅(qū)動(dòng)模型進(jìn)行消息處理,指令為use,語(yǔ)法結(jié)構(gòu)為:
use method;
其中,method可選擇的內(nèi)容有:select、poll、kqueue、epoll、rtsig、/dev/poll以及eventport,其中幾種模型是比較常用的。
注意
可以在編譯時(shí)使用--with-select_module和--without-select_module設(shè)置是否強(qiáng)制編譯select模塊到Nginx內(nèi)核。使用--with-poll_module和--without-poll_module設(shè)置是否強(qiáng)制編譯poll模塊到Nginx內(nèi)核。
此指令只能在event塊中進(jìn)行配置。
配置最大連接數(shù)
指令worker_connections主要用來(lái)設(shè)置允許每一個(gè)worker process同時(shí)開(kāi)啟的最大連接數(shù)。其語(yǔ)法結(jié)構(gòu)為:
worker_connections number;
此指令的默認(rèn)設(shè)置為512。
注意
這里的number不僅僅包括和前端用戶建立的連接數(shù),而是包括所有可能的連接數(shù)。另外,number值不能大于操作系統(tǒng)支持的文件最大句柄數(shù)量。該指令在后邊討論Nginx服務(wù)器高級(jí)配置時(shí)還會(huì)再次提到。
此指令只能在events塊中進(jìn)行配置。
定義MIME-Type
我們知道,在常用的瀏覽器中,可以顯示的內(nèi)容是HMTL、XML、GIF及Flash等種類繁多的文本、媒體等資源,瀏覽器為區(qū)分這些資源,需要使用MIME Type。換言之,MIME Type是網(wǎng)絡(luò)資源的媒體類型。Nginx服務(wù)器作為Web服務(wù)器,必須能夠識(shí)別前端請(qǐng)求的資源類型。
在默認(rèn)的Nginx配置文件中,我們看到在http全局塊中有一下兩行配置:
include mime.types;
default_type appliaction/octet-stream;
第一行從外部引用了mime_types文件,它的內(nèi)容:
types {
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/javascript js;
application/atom+xml atom;
application/rss+xml rss;
text/mathml mml;
text/plain txt;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/x-component htc;
image/png png;
image/tiff tif tiff;
image/vnd.wap.wbmp wbmp;
image/x-icon ico;
image/x-jng jng;
image/x-ms-bmp bmp;
image/svg+xml svg svgz;
image/webp webp;
application/font-woff woff;
application/java-archive jar war ear;
application/json json;
application/mac-binhex40 hqx;
application/msword doc;
application/pdf pdf;
application/postscript ps eps ai;
application/rtf rtf;
application/vnd.apple.mpegurl m3u8;
application/vnd.ms-excel xls;
application/vnd.ms-fontobject eot;
application/vnd.ms-powerpoint ppt;
application/vnd.wap.wmlc wmlc;
application/vnd.google-earth.kml+xml kml;
application/vnd.google-earth.kmz kmz;
application/x-7z-compressed 7z;
application/x-cocoa cco;
application/x-java-archive-diff jardiff;
application/x-java-jnlp-file jnlp;
application/x-makeself run;
application/x-perl pl pm;
application/x-pilot prc pdb;
application/x-rar-compressed rar;
application/x-redhat-package-manager rpm;
application/x-sea sea;
application/x-shockwave-flash swf;
application/x-stuffit sit;
application/x-tcl tcl tk;
application/x-x509-ca-cert der pem crt;
application/x-xpinstall xpi;
application/xhtml+xml xhtml;
application/xspf+xml xspf;
application/zip zip;
application/octet-stream bin exe dll;
application/octet-stream deb;
application/octet-stream dmg;
application/octet-stream iso img;
application/octet-stream msi msp msm;
application/vnd.openxmlformats-officedocument.wordprocessingml.document docx;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx;
application/vnd.openxmlformats-officedocument.presentationml.presentation pptx;
audio/midi mid midi kar;
audio/mpeg mp3;
audio/ogg ogg;
audio/x-m4a m4a;
audio/x-realaudio ra;
video/3gpp 3gpp 3gp;
video/mp2t ts;
video/mp4 mp4;
video/mpeg mpeg mpg;
video/quicktime mov;
video/webm webm;
video/x-flv flv;
video/x-m4v m4v;
video/x-mng mng;
video/x-ms-asf asx asf;
video/x-ms-wmv wmv;
video/x-msvideo avi;
}
從mime_types文件的內(nèi)容片段可以看到,其中定義了一個(gè)types結(jié)構(gòu),結(jié)構(gòu)中包含了瀏覽器能夠識(shí)別的MIME類型以及對(duì)應(yīng)于相關(guān)類型的文件后綴名。由于mime_types文件是主配置文件應(yīng)用的第三方文件,因此,types也是Nginx配置文件中的一個(gè)配置塊,我們可以稱之為types塊,其用于定義MIME類型。
第二行中使用指令default_type配置了用了處理前端請(qǐng)求的MIME類型,其語(yǔ)法結(jié)構(gòu)為:
default_type mime-type;
其中,mime-type為types塊中定義的MIME-type,如果不加此指令,默認(rèn)值為text/plain。此指令還可以在http塊、server塊或者location塊中進(jìn)行配置。
自定義服務(wù)日志
在全局塊中,我們介紹過(guò)error_log指令,其用于配置Nginx進(jìn)程運(yùn)行時(shí)的日志存放和級(jí)別,此處所指的日志與常規(guī)的不同,它是指記錄Nginx服務(wù)器提供服務(wù)應(yīng)答前端請(qǐng)求的日志,我們將其稱為服務(wù)日志以示區(qū)分。
Nginx服務(wù)器支持對(duì)服務(wù)日志的格式、大小、輸出等進(jìn)行配置,需要使用兩個(gè)指令,分別是access_log和log_format指令。
access_log指令的語(yǔ)法結(jié)構(gòu)為:
access_log path [ format [buffer=size]];
- path,配置服務(wù)日志的文件存放的路徑和名稱。
- format,可選項(xiàng),自定義服務(wù)日志的格式字符串,也可以通過(guò)“格式串的名稱”使用log_format指令定義好的格式?!案袷酱拿Q”在log_format指令中定義。
- size,配置臨時(shí)存放日志的內(nèi)存緩存區(qū)大小。
此指令可以在http塊、server塊或者location塊中進(jìn)行設(shè)置。默認(rèn)的配置為:
access_log logs/access.log combined;
其中combined為log_format指令默認(rèn)定義的日志格式字符串的名稱。
如果要取消記錄服務(wù)日志的功能,則使用:
access_log off;
和access_log聯(lián)合使用的另一個(gè)指令是log_format,它專門用于定義服務(wù)日志的格式,并且可以為格式字符串定一個(gè)名字,以便access_log指令可以直接調(diào)用。其語(yǔ)法格式為:
log_format name string ...;
- name,格式字符串的名字,默認(rèn)的名字為combined。
- string,服務(wù)日志的格式字符串。在定義的過(guò)程中,可以使用Nginx配置預(yù)設(shè)的一些變量獲取相關(guān)的內(nèi)容,變量的名稱使用雙括號(hào)括起來(lái),string整體使用單引號(hào)括起來(lái)。如下例:
log_format exampleLog '$remote_addr - [$time_local] $request ' '$status $body_bytes_sent $http_referer ' '$http_user_agent';
這條配置定義了服務(wù)日志文件的名稱為exampleLog。訪問(wèn)的日志內(nèi)容如下:
127.0.0.1 - [12/Jun/2017:23:50:17 +0800] "GET /orm3 HTTP/1.1" 200 11 " " "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
該條日志的分析如下,$remote_addr獲取到用戶的IP地址為127.0.0.1,$time_local獲取到本地時(shí)間為12/Jun/2017:23:50:17 +0800,$requst獲取到的請(qǐng)求為GET /orm3 HTTP/1.1,$status獲取到請(qǐng)求狀態(tài)為200,$body_bytes_send獲取到的請(qǐng)求體的大小為11B,$http_referer未獲取到任何內(nèi)容,$http_user_agent獲取到用戶使用Chrome瀏覽器。
在正常情況下,對(duì)于絕大多數(shù)的內(nèi)置變量,Nginx服務(wù)器都能獲取到相關(guān)內(nèi)容,但也會(huì)出現(xiàn)控制的情況。
此指令只能在http塊中進(jìn)行配置。
配置允許sendfile方式傳輸文件
sendfile的語(yǔ)法結(jié)構(gòu):
sendfile on | off
sendfile用于開(kāi)啟或者關(guān)閉使用sendfile()傳輸文件,默認(rèn)值為off,可以在http塊,server塊或者location塊中進(jìn)行配置。
sendfile_max_chunk的語(yǔ)法結(jié)構(gòu):
sendfile_max_chunk size;
其中,size值如果大于0,Nginx進(jìn)程的每個(gè)worker process每次調(diào)用sendfile()傳輸?shù)臄?shù)據(jù)量最大不能超過(guò)這個(gè)值。如果設(shè)置為0,則無(wú)限制。默認(rèn)為0。此指令可以再http塊、server塊或location塊中配置。
配置示例:
sendfile_max_chunk 128k
配置連接超時(shí)時(shí)間
與用戶建立會(huì)話連接后,Nginx服務(wù)器可以保持這些連接打開(kāi)一段時(shí)間,指令keepalive_timeout就是設(shè)置此事件,其語(yǔ)法結(jié)構(gòu)是:
keepalive_timeout timeout [header_timeout];
- timeout,服務(wù)器端對(duì)連接的保持時(shí)間。默認(rèn)值為75s。
- header_timeout,可選項(xiàng),在應(yīng)答報(bào)文頭部的Keep-Alive域設(shè)置超時(shí)時(shí)間:“Keep-Alive:timeout=header_timeout”。報(bào)文中的這個(gè)指令可以被Mozilla或者Konqueror識(shí)別。
此指令還可以出現(xiàn)在server塊和location塊中,如下是一個(gè)配置示例:
keepalive_timeout 120s 100s;
其含義是,在服務(wù)器端保持連接的時(shí)間設(shè)置為120s,發(fā)給用戶端的應(yīng)答報(bào)文頭部中Keep-Alive域的超時(shí)時(shí)間設(shè)置為100s。
此指令可以在http塊、server塊或location塊中配置。
單連接請(qǐng)求數(shù)上限
Nginx服務(wù)器端和用戶端建立會(huì)話連接后,用戶端通過(guò)此連接放請(qǐng)求。指令keepalive_requests用于限制用戶通過(guò)某一連接向Nginx服務(wù)器發(fā)送請(qǐng)求的次數(shù)。其語(yǔ)法結(jié)構(gòu)為:
keepalive_requests number;
此指令還可以出現(xiàn)在server塊和location塊中,默認(rèn)設(shè)置為100.
配置網(wǎng)絡(luò)監(jiān)聽(tīng)
配置網(wǎng)絡(luò)監(jiān)聽(tīng)使用指令listen,其配置方法主要有三種。
- 第一種配置監(jiān)聽(tīng)的IP地址,語(yǔ)法結(jié)構(gòu)為:
listen address[:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size]
[sndbuf=size] [deferred] [accept_filter=filter] [bind] [ssl];
- 第二種配置監(jiān)聽(tīng)端口,其語(yǔ)法結(jié)構(gòu)是:
listen port[defalut_server] [setfib=number] [backlog=number] [rcvbuf=size]
[sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on | off ] | [ssl];
- 第三種配置UNIX Domain Socket(一種在原有Socket框架上發(fā)展起來(lái)的IPC機(jī)制,用于在單個(gè)主機(jī)上執(zhí)行客戶/服務(wù)器通信),其語(yǔ)法結(jié)構(gòu)是:
listen unix:path [default_server] [baclog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ssl]
- address,IP地址,如果是IPv6的地址,需要使用中括號(hào)“[]”括起來(lái),比如[fe80::1]等。
- port,端口號(hào),如果只定義了IP地址沒(méi)有定義端口號(hào),就是用80端口。
- path,socket文件路徑,如/var/run/nginx.sock等。
- default_server,標(biāo)識(shí)符,將此虛擬機(jī)設(shè)置為address:port的默認(rèn)主機(jī)。
注意 在Nginx-0.8.21之前的版本,使用的是default。
- setfib=number,Nginx-0.8.44中使用這個(gè)變量為監(jiān)聽(tīng)socket關(guān)聯(lián)路由表,目前只對(duì)FreeBSD起作用,不常用。
- backlog=number,設(shè)置監(jiān)聽(tīng)函數(shù)listen()最多允許多少網(wǎng)絡(luò)連接同時(shí)處于掛起狀態(tài),在FreeBSD中默認(rèn)為-1,其他平臺(tái)默認(rèn)為511.
- rcvbuf=size,設(shè)置監(jiān)聽(tīng)socket接收緩存區(qū)大小。
- sndbuf=size,設(shè)置監(jiān)聽(tīng)socket發(fā)送緩存區(qū)大小。
- deferred,標(biāo)識(shí)符,將accept()設(shè)置為Deferred模式。
- accept_flter=filter,設(shè)置監(jiān)聽(tīng)端口對(duì)請(qǐng)求的過(guò)濾,被過(guò)濾的內(nèi)容不能被接收和處理。本指令只在FreeBSD和NetBSD 5.0+平臺(tái)下有效。filter可以設(shè)置為dataready或httpready。
- bind,標(biāo)識(shí)符,使用獨(dú)立的bind()處理此address:port。一般情況下,對(duì)于端口相同而IP地址不同的多個(gè)連接,Nginx服務(wù)器將只使用一個(gè)監(jiān)聽(tīng)命令,并使用bind()處理端口相同的所有連接。
- ssl,標(biāo)識(shí)符,設(shè)置會(huì)話連接使用SSL模式進(jìn)行,此標(biāo)識(shí)符和Nginx服務(wù)器提供的HTTPS服務(wù)有關(guān)。
listen指令的使用看起來(lái)比較復(fù)雜,但其實(shí)在一般的使用過(guò)程中,相對(duì)來(lái)說(shuō)比較簡(jiǎn)單,默認(rèn)的設(shè)置為:
listen *:80 | *:8080;
即監(jiān)聽(tīng)所有80端口和8000端口。下面為用法示例:
listen 192.168.1.10:8000; #監(jiān)聽(tīng)具體的IP和具體的端口上的連接
listen 192.168.1.10;#監(jiān)聽(tīng)具體IP的所有端口上的連接
listen 8000; #監(jiān)聽(tīng)具體端口上所有IP連接,等同于listen *:8000
listen 192.168.1.10 default_server backlog=1024; #設(shè)置192.168.1.10的連接請(qǐng)求默認(rèn)由此虛擬主機(jī)處理,并且允許最多1024網(wǎng)絡(luò)連接同時(shí)處于掛起狀態(tài)。
基于名稱的虛擬主機(jī)配置
這里的“主機(jī)”,就是指此server塊對(duì)外提供的虛擬主機(jī)。設(shè)置了主機(jī)的名稱并配置好DNS,用戶就可以使用這個(gè)名稱向此虛擬主機(jī)發(fā)送請(qǐng)求了。配置主機(jī)名稱的指令為server_name,起語(yǔ)法結(jié)構(gòu)為:
server_name name ...;
對(duì)于name來(lái)說(shuō),可以只有一個(gè)名稱,也可以由多個(gè)名稱并列,之間用空格隔開(kāi)。每個(gè)名字就是一個(gè)域名,由兩段或者三段組成,之間由點(diǎn)號(hào)“.”隔開(kāi)。如下例:
server_name myserver.com www.myserver.com
在該例中,此虛擬機(jī)的名稱設(shè)置為myserver.com或www.myserver.com。Nginx服務(wù)器規(guī)定,第一個(gè)名稱作為此虛擬主機(jī)的主要名稱。
在name中可以使用通配符“*”,但通配符只能用在由三段字符串組成的名稱的首段或尾段,或者由連貫字符串組成的名稱的尾段,如:
server_name *.myserver.com www.myserver.*
在name中還可以使用正則表達(dá)式,并使用波浪號(hào)“~”作為正則表達(dá)式字符串的開(kāi)始標(biāo)記,如:
server_name ~^www\d+\.myserver\.com$
在該例中,此虛擬主機(jī)的名稱設(shè)置使用了正則表達(dá)式(使用“”標(biāo)記),正則表達(dá)式的含義是:以www開(kāi)頭(使用“^”標(biāo)記),緊跟一個(gè)或多個(gè)09的數(shù)字,(“\d+”的含義,其中“\d”代表0~9的某一個(gè)數(shù)字,“+”代表之前的一個(gè)字符出現(xiàn)一次或者多次),在緊跟.myserver.co(由于“.”在正則表達(dá)式中有特殊含義,因此需要使用“\”進(jìn)行轉(zhuǎn)義),最后以m結(jié)束(由“$”標(biāo)記)。
上例的配置中,通過(guò)www1.myserver.com訪問(wèn)Nginx服務(wù)器的請(qǐng)求就可以使用此主機(jī)處理,而通過(guò)www.myserver.com的就不可以。因?yàn)椤皐ww”字符串之后必須有一個(gè)或者多個(gè)0~9的數(shù)字才能被正則表達(dá)式成功匹配。
注意
從Nginx-0.7.40開(kāi)始,name中的正則表達(dá)式支持字符串捕獲功能,即可以將正則表達(dá)式匹配成功的名稱中的一部分字符串拾取出來(lái),放在固定變量中供下文使用。拾取的標(biāo)識(shí)為一對(duì)完整的小括號(hào)“()”且后面不緊跟其他的正則表達(dá)式字符,括號(hào)中的內(nèi)容就是被拾取的內(nèi)容。一個(gè)正則表達(dá)式中可以存在多對(duì)捕潛逃的小括號(hào),這些內(nèi)容會(huì)從左到右依次存放在變量$1、$2、$3......中。下文使用時(shí),直接使用這些變量即可。這些變量的有效區(qū)域不超過(guò)本server塊。
如下例,虛擬主機(jī)的名稱設(shè)置如下:
server_name ~^www\.(.+)\.com$
當(dāng)請(qǐng)求通過(guò)www.myserver.com到達(dá)Nginx服務(wù)器端時(shí),其將會(huì)被上面的正則表達(dá)式匹配成功,其中的“myserver”將會(huì)被捕獲,并記錄到$1中。在本server塊的下文配置中,當(dāng)需要“myserver”時(shí),就可以使用$1代替“myserver”了。
由于server_name指令支持使用通配符和正則表達(dá)式兩種配置名稱的方式,因此在包含有多個(gè)虛擬主機(jī)的配置文件中,可能回出現(xiàn)一個(gè)名稱被多個(gè)虛擬主機(jī)的server_name匹配成功。那么,來(lái)自這個(gè)名稱的請(qǐng)求到底要交給哪個(gè)虛擬主機(jī)處理呢?Nginx服務(wù)器做出如下規(guī)定:
- 1.對(duì)于匹配方式不同的,按照以下的優(yōu)先級(jí)選擇虛擬主機(jī),排在前面的優(yōu)先級(jí)處理請(qǐng)求。
- 精準(zhǔn)匹配server_name
- 通配符在開(kāi)始時(shí)匹配server_name成功
- 通配符在結(jié)尾時(shí)匹配server_name成功
- 正則表達(dá)式匹配server_name成功
- 2.在以上四種配置方式中,如果server_name被處于同一優(yōu)先級(jí)的匹配方式多次匹配成功,則首次匹配成功的虛擬主機(jī)處理請(qǐng)求。
配置location塊
在Nginx的官方文檔中定義的location的語(yǔ)法結(jié)構(gòu)為:
location [ = | ~ | ~* | ^~ ] uri { ... }
其中,uri變量是待匹配的請(qǐng)求字符串,可以是不含正則表達(dá)的字符串,如/myserver.php等。也可以是包含有正則表達(dá)的字符串,如果.php$(表示以.php結(jié)尾的URL)等。
不含正則表達(dá)式的uri -> 標(biāo)準(zhǔn)uri
使用整則表達(dá)式的uri -> 正則uri
其中方括號(hào)里的部分,是可選項(xiàng),用來(lái)改變請(qǐng)求字符串與uri的匹配方式。在介紹四種標(biāo)識(shí)的含義之前,需要先了解不添加此選項(xiàng)時(shí),Nginx服務(wù)器是如何在server塊中搜索并使用location塊和uri和請(qǐng)求字符串匹配的。
在不添加此選項(xiàng)時(shí),Nginx服務(wù)器首先在server塊的多個(gè)location塊中搜索是否有標(biāo)準(zhǔn)uri和請(qǐng)求字符串匹配,如果有多個(gè)可以匹配,就記錄匹配度最高的一個(gè)。然后,服務(wù)器再用location塊中的正則uri和請(qǐng)求字符串匹配,當(dāng)?shù)谝徽齽turi匹配成功,結(jié)束搜索,并使用這個(gè)location塊處理此請(qǐng)求。如果正則匹配全部失敗,就使用剛才記錄的匹配度最高的location塊處理此請(qǐng)求。如果正則匹配全部失敗,就使用剛才記錄的匹配度最高的location塊處理此請(qǐng)求。
- “=”,用于標(biāo)準(zhǔn)uri前,要求請(qǐng)求字符串與uri嚴(yán)格匹配。如果匹配成功,就停止繼續(xù)向下搜索并立即處理此請(qǐng)求。
- “~”,用于表示uri包含正則表達(dá)式,并且區(qū)分大小寫(xiě)。
- “~*”,用于表示uri包含正則表達(dá)式,并且不區(qū)分大小寫(xiě)。
注意
如果uri包含正則表達(dá)式,就必須要使用“”或者“*”標(biāo)識(shí)。
- “^~”,用于標(biāo)準(zhǔn)uri前,要求Nginx服務(wù)器找到標(biāo)識(shí)uri和請(qǐng)求字符串匹配度最高的location后,立即使用此location處理請(qǐng)求,而不再使用location塊中的正則uri和請(qǐng)求字符串做匹配。
注意
我們知道,在瀏覽器傳送URI時(shí)對(duì)一部分字符進(jìn)行URL編碼,比如空格被編碼為“%20”,問(wèn)號(hào)被編碼為“%3f”等?!癪”有一個(gè)特點(diǎn)是,他對(duì)uri中的這些符號(hào)將會(huì)進(jìn)行編碼處理。比如,如果location塊收到的URI為“/html/%20/data”,則當(dāng)Nginx服務(wù)器搜索到配置為“ /html/ /data”的location時(shí),可以匹配成功。
配置請(qǐng)求的根目錄
Web服務(wù)器接收到網(wǎng)絡(luò)請(qǐng)求之后,首先要在服務(wù)器端指定目錄中尋找請(qǐng)求資源。在Nginx服務(wù)器中,指令root就是用來(lái)配置這個(gè)根目錄的,其語(yǔ)法結(jié)構(gòu)為:
root path;
其中,path為Nginx服務(wù)器接收到請(qǐng)求以后查找資源的根目錄路徑。path變量中可以包含Nginx服務(wù)器預(yù)設(shè)的大多數(shù)變量,只有$document_root和$realpath_root不可以使用。
此指令還可以再http塊,server塊或者location塊中配置。由于使用Nginx服務(wù)器多數(shù)情況下要配置多個(gè)location塊對(duì)于不同的請(qǐng)求分別作出處理,因此該指令通常在location塊中進(jìn)行設(shè)置。
這個(gè)指令的一個(gè)示例為:
location /data/
{
root /locationtest1;
}
當(dāng)location塊接收到“/data/index.htm”的請(qǐng)求時(shí),將在/locationtest1/data/目錄下找到Index.htm響應(yīng)請(qǐng)求。
更改location的URI
在location塊中,除了使用root指名請(qǐng)求處理根目錄,還可以使用alias指令改變location接收到的URI的請(qǐng)求路徑,其語(yǔ)法結(jié)構(gòu)為:
alias path;
其中,path即為修改后的根路徑。同樣,此變量中也可以包含除了$document_root和$realpath_root之外的其他Nginx服務(wù)器預(yù)設(shè)變量。
示例如下:
location ~ ^/data/(.+\.(htm|htm))$
{
alias /locationtest1/other/$1;
}
當(dāng)此location塊接收到“/data/index.htm”的請(qǐng)求時(shí),匹配成功,之后根據(jù)alias指令的配置,Nginx服務(wù)器找到/locationtest1/other目錄下找到index.htm并響應(yīng)請(qǐng)求??梢钥吹?,通過(guò)alias指令的配置,根路徑已經(jīng)從/data更改為/locationtest1/other了。
設(shè)置網(wǎng)站的默認(rèn)首頁(yè)
指令index用于設(shè)置網(wǎng)站的默認(rèn)首頁(yè),它一般可以有兩個(gè)作用:一是,用戶在發(fā)出請(qǐng)求訪問(wèn)網(wǎng)站時(shí),請(qǐng)求地址可以不寫(xiě)首頁(yè)名稱。二是,可以對(duì)一個(gè)請(qǐng)求,根據(jù)其請(qǐng)求內(nèi)容而設(shè)置不同的首頁(yè)。該指令的語(yǔ)法結(jié)構(gòu)為:
index file ...;
其中,file變量可以包括多個(gè)文件名,其間使用空格分隔,也可以包含其他變量。此變量默認(rèn)為“index.html”。
看一個(gè)示例:
location ~ ^/data/(.+)/web/ $
{
index index.$1.html index.my1.html index.html;
}
當(dāng)location塊接收到“/data/locationtest/web/”時(shí),匹配成功,它首先將預(yù)置變量$1置為“l(fā)ocationtest”,然后在/data/locationtest/web/路徑下按照index的配置次序依次尋找index.lcoationtest.html頁(yè)、index.my1.html頁(yè)和index.html頁(yè),首先找到哪個(gè)頁(yè)面,就是用哪個(gè)頁(yè)面響應(yīng)請(qǐng)求。
設(shè)置網(wǎng)站的錯(cuò)誤頁(yè)面
如果用戶端嘗試查看網(wǎng)頁(yè)時(shí)遇到問(wèn)題,服務(wù)器會(huì)將HTTP錯(cuò)誤從網(wǎng)站發(fā)送到Web瀏覽器。如果無(wú)法顯示網(wǎng)頁(yè),Web瀏覽器會(huì)顯示網(wǎng)站發(fā)送的實(shí)際錯(cuò)誤網(wǎng)頁(yè)或Web瀏覽器內(nèi)置的友好錯(cuò)誤信息。Nginx服務(wù)器支持自定義錯(cuò)誤網(wǎng)頁(yè)的顯示內(nèi)容??梢酝ㄟ^(guò)這一功能在網(wǎng)站發(fā)生錯(cuò)誤時(shí)為用戶提供人性化的錯(cuò)誤顯示頁(yè)面。
一般來(lái)說(shuō),HTTP 2XX代表請(qǐng)求正常完成,HTTP 3XX代表網(wǎng)站重定向,HTTP 4XX代表客戶端出現(xiàn)錯(cuò)誤,HTTP 5XX代表服務(wù)器端出現(xiàn)錯(cuò)誤。
常見(jiàn)的錯(cuò)誤如下表所示:
| HTTP 消息 | 代碼 | 含義 |
|---|---|---|
| 已移動(dòng) | HTTP301 | 請(qǐng)求的數(shù)據(jù)具有新的位置,并且更改是永久的 |
| 已找到 | HTTP302 | 請(qǐng)求的數(shù)據(jù)臨時(shí)具有不同的URI |
| 請(qǐng)參閱其他 | HTTP303 | 可在另一URI下找到請(qǐng)求的響應(yīng),并且應(yīng)使用GET方法檢索此響應(yīng) |
| 未修改 | HTTP304 | 未按照預(yù)期修改文檔 |
| 使用代理 | HTTP305 | 必須通過(guò)位置字段中提供的代理來(lái)訪問(wèn)請(qǐng)求的資源 |
| 未使用 | HTTP306 | 不再使用,但保留此代碼以便將來(lái)使用 |
| 無(wú)法找到網(wǎng)頁(yè) | HTTP400 | 可以連接到Web服務(wù)器,但是由于Web地址(URL)的問(wèn)題,無(wú)法找到網(wǎng)頁(yè) |
| 網(wǎng)站拒絕顯示此網(wǎng)頁(yè) | HTTP403 | 可以連接網(wǎng)站的,但I(xiàn)nternet Explore沒(méi)有顯示網(wǎng)頁(yè)的權(quán)限 |
| 無(wú)法找到網(wǎng)頁(yè) | HTTP404 | 可以連接到網(wǎng)站,但找不到網(wǎng)頁(yè)。導(dǎo)致此錯(cuò)誤的原因有時(shí)可能是網(wǎng)頁(yè)暫時(shí)不可用或網(wǎng)頁(yè)已被刪除 |
| 網(wǎng)站無(wú)法顯示該網(wǎng)頁(yè) | HTTP405 | 可以連接到網(wǎng)站,但網(wǎng)頁(yè)內(nèi)容無(wú)法下載到用戶的計(jì)算機(jī),這通常是由網(wǎng)頁(yè)的編寫(xiě)方式問(wèn)題引起的 |
| 無(wú)法讀取此網(wǎng)頁(yè)格式 | HTTP406 | 能夠從網(wǎng)站接受信息,但是Internet Explore不能識(shí)別其格式,因而無(wú)法正確地顯示消息。 |
| 該網(wǎng)站太忙,無(wú)法顯示此網(wǎng)頁(yè) | HTTP408或409 | 服務(wù)器顯示該網(wǎng)頁(yè)的時(shí)間太長(zhǎng),或?qū)ν痪W(wǎng)頁(yè)的請(qǐng)求太多 |
| 網(wǎng)頁(yè)不復(fù)存在 | HTTP410 | 可以連接到網(wǎng)站,但無(wú)法找到網(wǎng)頁(yè)。與HTTP錯(cuò)誤404不同,此錯(cuò)誤是永久的,而且由網(wǎng)站管理員打開(kāi) |
| 網(wǎng)頁(yè)無(wú)法顯示該頁(yè)面 | HTTP500 | 正在訪問(wèn)的網(wǎng)站出現(xiàn)了服務(wù)器問(wèn)題,該問(wèn)題阻止了此網(wǎng)頁(yè)的顯示。常見(jiàn)的原因是網(wǎng)站正在維護(hù)或使用腳本的交互網(wǎng)站上的程序出錯(cuò) |
| 未執(zhí)行 | HTTP501 | 沒(méi)有將正在訪問(wèn)的網(wǎng)站設(shè)置為顯示瀏覽器所請(qǐng)求的內(nèi)容 |
| 不支持的版本 | HTTP505 | 該網(wǎng)站不支持瀏覽器用于請(qǐng)求網(wǎng)頁(yè)的HTTP協(xié)議(最為常見(jiàn)的是HTTP/1.1) |
Nginx服務(wù)器設(shè)置網(wǎng)站錯(cuò)誤頁(yè)面的指令為error_page,語(yǔ)法結(jié)構(gòu)為:
error_page code ... [=[response]] uri
- code,要處理的HTTP錯(cuò)誤代碼,常見(jiàn)的在上面表里面已經(jīng)列出。
- response,可選項(xiàng),將code制定的錯(cuò)誤代碼轉(zhuǎn)化為新的錯(cuò)誤代碼response。
- uri,錯(cuò)誤頁(yè)面的路徑或者網(wǎng)站地址。如果設(shè)置為路徑,則是以Nginx服務(wù)器安裝路徑下的html目錄為根路徑的相對(duì)路徑。如果設(shè)置為網(wǎng)址,則Nginx服務(wù)器會(huì)直接訪問(wèn)該網(wǎng)址獲取錯(cuò)誤頁(yè)面,并返回給用戶端。
幾個(gè)示例如下:
error_page 404 /404.html;
設(shè)置Nginx服務(wù)器使用“Nginx安裝路徑/html/404.html”頁(yè)面響應(yīng)404錯(cuò)誤(“無(wú)法找到網(wǎng)頁(yè)”錯(cuò)誤)。
error_page 403 http://somewebsite.com/forbidden.html;
設(shè)置Nginx服務(wù)器使用“http://somewebsite.com/forbidden.html”頁(yè)面響應(yīng)403錯(cuò)誤(“拒絕顯示網(wǎng)頁(yè)”錯(cuò)誤)。
error_page 401 =301 /empty.gif;
設(shè)置Nginx服務(wù)器產(chǎn)生410的HTTP消息時(shí),使用“Nginx安裝路徑/html/empty.gif”返回給用戶端301消息(“已移動(dòng)”消息)
在前面對(duì)error_page指令的分析中可以看出,變量uri實(shí)際上是一個(gè)相對(duì)于Nginx服務(wù)器安裝路徑的相對(duì)路徑。那么如果不想讓錯(cuò)誤頁(yè)面放到Nginx服務(wù)器的安裝路徑下管理,該怎么做呢?
其實(shí)很簡(jiǎn)單,只需要使用另外一個(gè)location指令定向錯(cuò)誤頁(yè)面到新的路徑下面就可以了。比如對(duì)于上面的第一個(gè)示例,我們希望Nginx服務(wù)器使用“/myserver/errorpages/404.html”頁(yè)面響應(yīng)404錯(cuò)誤,那么在設(shè)置完:
error_page 404 /404.html
之后我們?cè)谔砑舆@樣一個(gè)location塊:
location /404.html
{
root /myserver/errorpages/
}
首先捕獲“/404.html”請(qǐng)求,然后將請(qǐng)求定向到新的路徑下面即可。
error_page指令可以在http塊、server塊和location塊中配置。
基于IP配置的Nginx的訪問(wèn)權(quán)限
Nginx配置通過(guò)兩種途徑支持基本訪問(wèn)權(quán)限的控制,其中一種是由HTTP標(biāo)準(zhǔn)模塊ngx_http_access_module支持的,其通過(guò)IP來(lái)判斷客戶端是否擁有對(duì)Nginx的訪問(wèn)權(quán)限,這里由兩個(gè)指令需要我們學(xué)習(xí)。
allow指令,用于設(shè)置允許訪問(wèn)Nginx的客戶端IP,語(yǔ)法結(jié)構(gòu)為:
allow address | CIDR | all;
- address,允許訪問(wèn)的客戶端的IP,不支持同時(shí)設(shè)置多個(gè)。如果有多個(gè)IP需要設(shè)置,需要重復(fù)使用allow指令。
- CIDR,允許訪問(wèn)的客戶端的CIDR地址,例如202.80.18.23/25,前面是32位IP地址,后面“/25”代表該IP地址中前25位是網(wǎng)絡(luò)部分,其余位代表主機(jī)部分。
- all,代表允許所有客戶端訪問(wèn)。
從Nginx 0.8.22版本之后,該命令也支持IPv6地址,比如:
allow 2620:100:e000:8001;
另一個(gè)指令是deny,作用剛好和allow指令指令相反,它用于設(shè)置禁止訪問(wèn)Nginx客戶端IP,語(yǔ)法結(jié)構(gòu)為:
deny address | CIDR | all;
- address,禁止訪問(wèn)的客戶端的IP,不支持同時(shí)設(shè)置多個(gè)。如果有多個(gè)IP需要設(shè)置,需要重復(fù)使用deny指令。
- CIDR,禁止訪問(wèn)的客戶端的CIDR地址。
- all,代表禁止所有客戶端訪問(wèn)。
這兩個(gè)指令可以在http塊、server塊或者location塊中配置。在使用這兩個(gè)指令時(shí),要注意設(shè)置all的用法。請(qǐng)看下面的例子:
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
deny all;
}
在上面的配置示例中我們首先配置禁止192.168.1.1訪問(wèn)Nginx,然后配置允許192.168.1.0/24訪問(wèn)Nginx,最后又使用all配置禁止所有IP的訪問(wèn)。那么,192.168.1.0/24客戶端到底可不可以訪問(wèn)呢?是可以的。Nginx配置在解析的過(guò)程中,遇到deny指令或者allow指令是按照順序?qū)Ξ?dāng)前客戶端的連接進(jìn)行訪問(wèn)權(quán)限檢查的。如果遇到匹配的配置時(shí),則停止繼續(xù)向下搜索相關(guān)配置。因此,當(dāng)192.168.1.0/24客戶端訪問(wèn)時(shí),Nginx在第3行解析配置發(fā)現(xiàn)允許該客戶端訪問(wèn),就不會(huì)繼續(xù)向下解析第4行了。
基于密碼配置Nginx的訪問(wèn)權(quán)限
Nginx還支持基于HTTP Basic Authentication協(xié)議的認(rèn)證。該協(xié)議是一種HTTP性質(zhì)的認(rèn)證辦法,需要識(shí)別用戶名和密碼,認(rèn)證失敗的客戶端不擁有訪問(wèn)Nginx服務(wù)器的權(quán)限。該功能由HTTP標(biāo)準(zhǔn)模塊ngx_http_auth_basic_module支持,這里由兩個(gè)指令需要學(xué)習(xí)。
auth_basic指令,用于開(kāi)啟或者關(guān)閉認(rèn)證功能,語(yǔ)法結(jié)構(gòu)為:
auth_basic string | off;
- string,開(kāi)啟該認(rèn)證功能,并配置驗(yàn)證時(shí)的指示信息。
- off,關(guān)閉該認(rèn)證功能。
auth_basic_user_file指令,用于設(shè)置包含用戶名和密碼信息的文件路徑,語(yǔ)法結(jié)構(gòu)為:
auth_basic_user_file file;
其中,file為密碼文件的絕對(duì)路徑。
這里的密碼文件支持明文或者密碼加密后的文件。明文的格式如下所示:
name1:password1
name2:password2:comment
name3:password3
加密密碼可以使用crypt()函數(shù)進(jìn)行密碼密碼加密的格式,在Linux平臺(tái)上可以使用htpasswd命令生成。在PHP和Perl等語(yǔ)言中,也提供crypt()函數(shù)。使用htpasswd命令的一個(gè)示例為:
htpasswd -c -d /nginx/conf/pass_file username
運(yùn)行后輸入密碼即可。
Nginx服務(wù)器基礎(chǔ)配置示例
下面是一個(gè)nginx.conf文件的配置內(nèi)容:
#### 全局塊 開(kāi)始 ####
user nobody nobody; # 配置允許運(yùn)行Nginx服務(wù)器的用戶和用戶組
worker_processes 3; # 配置允許Nginx進(jìn)程生成的worker process數(shù)
error_log logs/error.log; # 配置Nginx服務(wù)器運(yùn)行時(shí)錯(cuò)誤日志存放路徑
pid nginx.pid; # 配置Nginx服務(wù)器運(yùn)行時(shí)的pid文件存放路徑和名稱
##### 全局塊 結(jié)束 #####
#### events塊 開(kāi)始 ####
events
{
use epoll; # 配置事件驅(qū)動(dòng)模型
worker_connections 1024; # 配置最大連接數(shù)
}
#### events塊 結(jié)束 ####
#### http塊 開(kāi)始 ####
http{
include mime.types; #定義MIME-Type
default_type application/octet-stream;
sendfile on; #配置允許使用sendfile方式傳輸
keepalive_time 65; #配置連接超時(shí)時(shí)間
log_format access.log '$remote_addr-[$time_local]-"$request"-"$http_user_agent" '; #配置請(qǐng)求處理日志的格式
#### server塊 開(kāi)始 ####
## 配置虛擬主機(jī) myServer1
server {
listen 8081; #配置監(jiān)聽(tīng)端口和主機(jī)名稱(基于名稱)
server_name myServer1;
access_log /myweb/server1/log/access.log; #配置請(qǐng)求處理日志存放路徑
error_page 404 /404.html; #配置錯(cuò)誤頁(yè)
# 配置處理/server1/location1請(qǐng)求的location
location /server1/location1 {
root /myweb;
index index.ser1-loc1.htm;
}
# 配置處理/server1/location2請(qǐng)求的location
location /server1/location2{
root /myweb;
index index.svr1-loc2.htm;
}
}
## 配置虛擬主機(jī) myServer2
server {
listen 8082;
server_name 192.169.1.3;
access_log /myweb/server2/log/access.log;
error_page 404 /404.html; #對(duì)錯(cuò)誤頁(yè)面404.html做了定向配置
location /server2/location1 {
root /myweb;
index index.svr2-loc1.htm;
}
location /svr2/loc2 {
alias /myweb/server2/location2/; #對(duì)location的URI進(jìn)行更改
index index.svr2-loc2.htm;
}
location = /404.html {
root /myweb/;
index 404.html;
}
}
#### server塊 結(jié)束 ####
}
#### http塊 結(jié)束 ####
在該實(shí)例中,配置了兩個(gè)虛擬主機(jī)myServer1和myServer2,前者是基于名稱的,后者是基于IP的。在每個(gè)虛擬主機(jī)里,有分別使用了location塊對(duì)不同的請(qǐng)求進(jìn)行處理。主機(jī)myServer2除了對(duì)一般的請(qǐng)求進(jìn)行處理外,還對(duì)錯(cuò)誤頁(yè)面404.html做了定向配置,指向自定義的404處理頁(yè)面。
為了測(cè)試此Nginx配置,構(gòu)建了一個(gè)十分簡(jiǎn)單的靜態(tài)網(wǎng)站站點(diǎn)。它的目錄組織結(jié)構(gòu)如下:
myweb
404.html
server1
location1
index.svr1-loc1.htm
location2
index.svr1-loc2.htm
log
access.log
server2
location1
index.svr2-loc1.htm
location2
index.svr2-loc2.htm
log
access.log
上面的目錄結(jié)構(gòu)是比較清晰的。在結(jié)構(gòu)中的404.html這個(gè)文件,如果不適用myServer2中對(duì)錯(cuò)誤頁(yè)面定向的方法,而只是像myServer1那樣簡(jiǎn)單設(shè)置錯(cuò)誤頁(yè)面的路徑,那么Nginx服務(wù)器會(huì)在安裝路徑的html目錄下的相關(guān)路徑中尋找錯(cuò)誤頁(yè)面。
測(cè)試訪問(wèn)
首先測(cè)試myServer1,在用戶端瀏覽器中輸入“myserver1:8081/svr1/location1/”,可以看到網(wǎng)站頁(yè)面的顯示如圖所示,這說(shuō)明主機(jī)訪問(wèn)正常,也表明配置文件示例中配置正確。
同樣,在用戶端瀏覽器地址中輸入“myserver1:8081/server1/location2/”,可以看到location指向的頁(yè)面。
注意 為了能夠以主機(jī)名的方式訪問(wèn)站點(diǎn),我們需要配置自己的DNS服務(wù)器,使得瀏覽器能夠根據(jù)輸入的域名地址(myserver1)查找到對(duì)應(yīng)的IP地址(192.168.1.3)。
測(cè)試myServer2的訪問(wèn),在用戶端瀏覽器中輸入“192.168.1.3:8082/server2/location1”,可以看到頁(yè)面顯示正常,表明配置文件中配置正確。
在用戶端瀏覽器地址中輸入“192.168.1.3:8083/svr2/loc2”,則可以看到網(wǎng)站頁(yè)面的顯示。表明配置文件示例中對(duì)location塊的URI路徑有效。
如果在用戶瀏覽器中輸入“http://192.168.1.3:8082/server2/location2/”,由于使用location塊對(duì)URL路徑做了更改,導(dǎo)致無(wú)法找到網(wǎng)頁(yè),Nginx服務(wù)器返回404錯(cuò)誤消息,而生效的是自定義的404錯(cuò)誤頁(yè)面的定向。