[code.nginx] Nginx配置說(shuō)明

配置運(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.comwww.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è)面的定向泉褐。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赐写,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子膜赃,更是在濱河造成了極大的恐慌,老刑警劉巖揉忘,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跳座,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡泣矛,警方通過(guò)查閱死者的電腦和手機(jī)疲眷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)您朽,“玉大人狂丝,你說(shuō)我怎么就攤上這事换淆。” “怎么了几颜?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵倍试,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蛋哭,道長(zhǎng)县习,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任谆趾,我火速辦了婚禮躁愿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沪蓬。我一直安慰自己彤钟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布跷叉。 她就那樣靜靜地躺著样勃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪性芬。 梳的紋絲不亂的頭發(fā)上峡眶,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音植锉,去河邊找鬼辫樱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛俊庇,可吹牛的內(nèi)容都是我干的狮暑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼辉饱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼搬男!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起彭沼,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缔逛,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后姓惑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體褐奴,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年于毙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了敦冬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡唯沮,死狀恐怖脖旱,靈堂內(nèi)的尸體忽然破棺而出堪遂,到底是詐尸還是另有隱情,我是刑警寧澤萌庆,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布溶褪,位于F島的核電站,受9級(jí)特大地震影響踊兜,放射性物質(zhì)發(fā)生泄漏竿滨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一捏境、第九天 我趴在偏房一處隱蔽的房頂上張望于游。 院中可真熱鬧,春花似錦垫言、人聲如沸贰剥。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蚌成。三九已至,卻和暖如春凛捏,著一層夾襖步出監(jiān)牢的瞬間担忧,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工坯癣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓶盛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓示罗,卻偏偏與公主長(zhǎng)得像惩猫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蚜点,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理轧房,服務(wù)發(fā)現(xiàn),斷路器绍绘,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 第一章 Nginx簡(jiǎn)介 Nginx是什么 沒(méi)有聽(tīng)過(guò)Nginx奶镶?那么一定聽(tīng)過(guò)它的“同行”Apache吧!Ngi...
    JokerW閱讀 32,642評(píng)論 24 1,002
  • Nginx API for Lua Introduction ngx.arg ngx.var.VARIABLE C...
    吃瓜的東閱讀 5,717評(píng)論 0 5
  • 國(guó)色天香脯倒,嬌艷芬芳实辑,柔情似水,花中之王...所有的好詞兒都給了你藻丢,而你在我心里其實(shí)不如蘭花,不如玉蘭摄乒,不如丁香.....
    劉佳畫(huà)室閱讀 343評(píng)論 11 3
  • Y小圓臉閱讀 211評(píng)論 0 0