配置運(yùn)行Nginx服務(wù)器用戶(hù)(組)
用于配置運(yùn)行Nginx服務(wù)器用戶(hù)(組)的指令是user耿眉,其語(yǔ)法格式為:
user user [group];
- user菌瘪,指定可以運(yùn)行Nginx服務(wù)器的用戶(hù)。
- group征懈,可選項(xiàng)颜屠,指定可以運(yùn)行Nginx服務(wù)器的用戶(hù)組。
只有被設(shè)置的用戶(hù)或者用戶(hù)組成員才有權(quán)限啟動(dòng)Nginx進(jìn)程捕传,如果是其他用戶(hù)(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ù)器用戶(hù)(組)的內(nèi)容。
如果希望所有用戶(hù)都可以啟動(dòng)Nginx進(jìn)程维贺,有兩種辦法:一是將此指令行注釋掉:
#user [user] [group];
或者將用戶(hù)(和用戶(hù)組)設(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和磁盤(pán)驅(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指定存放路徑和文件名稱(chēng)胀蛮。
配置文件默認(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)程的用戶(hù)具有寫(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)程的用戶(hù)對(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不僅僅包括和前端用戶(hù)建立的連接數(shù)嗦锐,而是包括所有可能的連接數(shù)。另外沪曙,number值不能大于操作系統(tǒng)支持的文件最大句柄數(shù)量奕污。該指令在后邊討論Nginx服務(wù)器高級(jí)配置時(shí)還會(huì)再次提到。
此指令只能在events塊中進(jìn)行配置液走。
定義MIME-Type
我們知道碳默,在常用的瀏覽器中,可以顯示的內(nèi)容是HMTL育灸、XML腻窒、GIF及Flash等種類(lèi)繁多的文本昵宇、媒體等資源磅崭,瀏覽器為區(qū)分這些資源,需要使用MIME Type瓦哎。換言之砸喻,MIME Type是網(wǎng)絡(luò)資源的媒體類(lèi)型。Nginx服務(wù)器作為Web服務(wù)器蒋譬,必須能夠識(shí)別前端請(qǐng)求的資源類(lèi)型割岛。
在默認(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類(lèi)型以及對(duì)應(yīng)于相關(guān)類(lèi)型的文件后綴名剂买。由于mime_types文件是主配置文件應(yīng)用的第三方文件惠爽,因此癌蓖,types也是Nginx配置文件中的一個(gè)配置塊,我們可以稱(chēng)之為types塊婚肆,其用于定義MIME類(lèi)型租副。
第二行中使用指令default_type配置了用了處理前端請(qǐng)求的MIME類(lèi)型,其語(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)求的日志意蛀,我們將其稱(chē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ù)日志的文件存放的路徑和名稱(chēng)痒留。
- format谴麦,可選項(xiàng),自定義服務(wù)日志的格式字符串伸头,也可以通過(guò)“格式串的名稱(chēng)”使用log_format指令定義好的格式匾效。“格式串的名稱(chēng)”在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)定義的日志格式字符串的名稱(chēng)。
如果要取消記錄服務(wù)日志的功能河胎,則使用:
access_log off;
和access_log聯(lián)合使用的另一個(gè)指令是log_format闯袒,它專(zhuān)門(mén)用于定義服務(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)容通贞,變量的名稱(chēng)使用雙括號(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ù)日志文件的名稱(chēng)為exampleLog昌罩。訪(fǎng)問(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獲取到用戶(hù)的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獲取到用戶(hù)使用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í)間
與用戶(hù)建立會(huì)話(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ā)給用戶(hù)端的應(yīng)答報(bào)文頭部中Keep-Alive域的超時(shí)時(shí)間設(shè)置為100s胎食。
此指令可以在http塊、server塊或location塊中配置允懂。
單連接請(qǐng)求數(shù)上限
Nginx服務(wù)器端和用戶(hù)端建立會(huì)話(huà)連接后厕怜,用戶(hù)端通過(guò)此連接放請(qǐng)求。指令keepalive_requests用于限制用戶(hù)通過(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í)行客戶(hù)/服務(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ì)話(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)。
基于名稱(chēng)的虛擬主機(jī)配置
這里的“主機(jī)”蹈胡,就是指此server塊對(duì)外提供的虛擬主機(jī)渊季。設(shè)置了主機(jī)的名稱(chēng)并配置好DNS,用戶(hù)就可以使用這個(gè)名稱(chēng)向此虛擬主機(jī)發(fā)送請(qǐng)求了罚渐。配置主機(jī)名稱(chēng)的指令為server_name却汉,起語(yǔ)法結(jié)構(gòu)為:
server_name name ...;
對(duì)于name來(lái)說(shuō),可以只有一個(gè)名稱(chēng)荷并,也可以由多個(gè)名稱(chēng)并列合砂,之間用空格隔開(kāi)。每個(gè)名字就是一個(gè)域名源织,由兩段或者三段組成翩伪,之間由點(diǎn)號(hào)“.”隔開(kāi)。如下例:
server_name myserver.com www.myserver.com
在該例中谈息,此虛擬機(jī)的名稱(chēng)設(shè)置為myserver.com或www.myserver.com缘屹。Nginx服務(wù)器規(guī)定,第一個(gè)名稱(chēng)作為此虛擬主機(jī)的主要名稱(chēng)侠仇。
在name中可以使用通配符“*”轻姿,但通配符只能用在由三段字符串組成的名稱(chēng)的首段或尾段,或者由連貫字符串組成的名稱(chēng)的尾段逻炊,如:
server_name *.myserver.com www.myserver.*
在name中還可以使用正則表達(dá)式互亮,并使用波浪號(hào)“~”作為正則表達(dá)式字符串的開(kāi)始標(biāo)記,如:
server_name ~^www\d+\.myserver\.com$
在該例中余素,此虛擬主機(jī)的名稱(chēng)設(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訪(fǎng)問(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á)式匹配成功的名稱(chēng)中的一部分字符串拾取出來(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ī)的名稱(chēng)設(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á)式兩種配置名稱(chēng)的方式课梳,因此在包含有多個(gè)虛擬主機(jī)的配置文件中,可能回出現(xiàn)一個(gè)名稱(chēng)被多個(gè)虛擬主機(jī)的server_name匹配成功余佃。那么暮刃,來(lái)自這個(gè)名稱(chēng)的請(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è)作用:一是纸肉,用戶(hù)在發(fā)出請(qǐng)求訪(fǎng)問(wèn)網(wǎng)站時(shí),請(qǐng)求地址可以不寫(xiě)首頁(yè)名稱(chēng)喊熟。二是柏肪,可以對(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è)面
如果用戶(hù)端嘗試查看網(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í)為用戶(hù)提供人性化的錯(cuò)誤顯示頁(yè)面谢翎。
一般來(lái)說(shuō),HTTP 2XX代表請(qǐng)求正常完成沐旨,HTTP 3XX代表網(wǎng)站重定向森逮,HTTP 4XX代表客戶(hù)端出現(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)訪(fǎng)問(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ú)法下載到用戶(hù)的計(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 | 正在訪(fǎng)問(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)有將正在訪(fǎng)問(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ì)直接訪(fǎng)問(wèn)該網(wǎng)址獲取錯(cuò)誤頁(yè)面坟冲,并返回給用戶(hù)端磨镶。
幾個(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”返回給用戶(hù)端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的訪(fǎng)問(wèn)權(quán)限
Nginx配置通過(guò)兩種途徑支持基本訪(fǎng)問(wèn)權(quán)限的控制,其中一種是由HTTP標(biāo)準(zhǔn)模塊ngx_http_access_module支持的恒水,其通過(guò)IP來(lái)判斷客戶(hù)端是否擁有對(duì)Nginx的訪(fǎng)問(wèn)權(quán)限会放,這里由兩個(gè)指令需要我們學(xué)習(xí)。
allow指令钉凌,用于設(shè)置允許訪(fǎng)問(wèn)Nginx的客戶(hù)端IP咧最,語(yǔ)法結(jié)構(gòu)為:
allow address | CIDR | all;
- address,允許訪(fǎng)問(wèn)的客戶(hù)端的IP,不支持同時(shí)設(shè)置多個(gè)。如果有多個(gè)IP需要設(shè)置矢沿,需要重復(fù)使用allow指令滥搭。
- CIDR,允許訪(fǎng)問(wèn)的客戶(hù)端的CIDR地址捣鲸,例如202.80.18.23/25瑟匆,前面是32位IP地址,后面“/25”代表該IP地址中前25位是網(wǎng)絡(luò)部分栽惶,其余位代表主機(jī)部分愁溜。
- all,代表允許所有客戶(hù)端訪(fǎng)問(wèn)外厂。
從Nginx 0.8.22版本之后冕象,該命令也支持IPv6地址,比如:
allow 2620:100:e000:8001;
另一個(gè)指令是deny汁蝶,作用剛好和allow指令指令相反渐扮,它用于設(shè)置禁止訪(fǎng)問(wèn)Nginx客戶(hù)端IP,語(yǔ)法結(jié)構(gòu)為:
deny address | CIDR | all;
- address掖棉,禁止訪(fǎng)問(wèn)的客戶(hù)端的IP墓律,不支持同時(shí)設(shè)置多個(gè)。如果有多個(gè)IP需要設(shè)置啊片,需要重復(fù)使用deny指令只锻。
- CIDR玖像,禁止訪(fǎng)問(wèn)的客戶(hù)端的CIDR地址紫谷。
- all,代表禁止所有客戶(hù)端訪(fǎng)問(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訪(fǎng)問(wèn)Nginx,然后配置允許192.168.1.0/24訪(fǎng)問(wèn)Nginx乡洼,最后又使用all配置禁止所有IP的訪(fǎng)問(wèn)崇裁。那么,192.168.1.0/24客戶(hù)端到底可不可以訪(fǎng)問(wèn)呢束昵?是可以的拔稳。Nginx配置在解析的過(guò)程中,遇到deny指令或者allow指令是按照順序?qū)Ξ?dāng)前客戶(hù)端的連接進(jìn)行訪(fǎng)問(wèn)權(quán)限檢查的锹雏。如果遇到匹配的配置時(shí)巴比,則停止繼續(xù)向下搜索相關(guān)配置。因此,當(dāng)192.168.1.0/24客戶(hù)端訪(fǎng)問(wèn)時(shí)轻绞,Nginx在第3行解析配置發(fā)現(xiàn)允許該客戶(hù)端訪(fǎng)問(wèn)采记,就不會(huì)繼續(xù)向下解析第4行了。
基于密碼配置Nginx的訪(fǎng)問(wèn)權(quán)限
Nginx還支持基于HTTP Basic Authentication協(xié)議的認(rèn)證政勃。該協(xié)議是一種HTTP性質(zhì)的認(rèn)證辦法唧龄,需要識(shí)別用戶(hù)名和密碼,認(rèn)證失敗的客戶(hù)端不擁有訪(fǎng)問(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è)置包含用戶(hù)名和密碼信息的文件路徑,語(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ù)器的用戶(hù)和用戶(hù)組
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文件存放路徑和名稱(chēng)
##### 全局塊 結(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ī)名稱(chēng)(基于名稱(chēng))
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蜘欲,前者是基于名稱(chēng)的益眉,后者是基于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è)試訪(fǎng)問(wèn)
首先測(cè)試myServer1,在用戶(hù)端瀏覽器中輸入“myserver1:8081/svr1/location1/”剧罩,可以看到網(wǎng)站頁(yè)面的顯示如圖所示栓拜,這說(shuō)明主機(jī)訪(fǎng)問(wèn)正常,也表明配置文件示例中配置正確惠昔。
同樣幕与,在用戶(hù)端瀏覽器地址中輸入“myserver1:8081/server1/location2/”,可以看到location指向的頁(yè)面镇防。
注意 為了能夠以主機(jī)名的方式訪(fǎng)問(wèn)站點(diǎn)啦鸣,我們需要配置自己的DNS服務(wù)器,使得瀏覽器能夠根據(jù)輸入的域名地址(myserver1)查找到對(duì)應(yīng)的IP地址(192.168.1.3)来氧。
測(cè)試myServer2的訪(fǎng)問(wèn)诫给,在用戶(hù)端瀏覽器中輸入“192.168.1.3:8082/server2/location1”,可以看到頁(yè)面顯示正常啦扬,表明配置文件中配置正確中狂。
在用戶(hù)端瀏覽器地址中輸入“192.168.1.3:8083/svr2/loc2”,則可以看到網(wǎng)站頁(yè)面的顯示扑毡。表明配置文件示例中對(duì)location塊的URI路徑有效胃榕。
如果在用戶(hù)瀏覽器中輸入“http://192.168.1.3:8082/server2/location2/”,由于使用location塊對(duì)URL路徑做了更改瞄摊,導(dǎo)致無(wú)法找到網(wǎng)頁(yè)勋又,Nginx服務(wù)器返回404錯(cuò)誤消息,而生效的是自定義的404錯(cuò)誤頁(yè)面的定向泉褐。