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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容