NGINX快速入門(03)Nginx的常用配置

上一篇文章我們主要介紹的Nginx的架構(gòu),其實(shí)主要是Nginx包含了哪些內(nèi)容,有哪些功能和技術(shù)點(diǎn)。知道了這些,我們就可以猜到,Nginx的配置大部分和這些功能有關(guān)系。下面逐步介紹一些常見配置。

首先進(jìn)入nginx安裝目錄的conf文件夾下,備份一下默認(rèn)的配置文件,防止修改錯(cuò)了恢復(fù)不了:

cp nginx.conf nginx.conf.bak


下面我們介紹幾種常用配置:

入門配置

靜態(tài)頁面配置

動靜分離

圖片防盜配置

黑白名單配置

下載限速配置

日志配置



先看一個(gè)簡單配置

備份完可以編輯文件了,首先刪除配置文件里的全部內(nèi)容,然后編寫下面這樣的配置:

Nginx里面也是分為一個(gè)個(gè)配置塊的,和大部分代碼一樣,用大括號括起來。比如上面的events {。。。}就是一個(gè)配置塊。

注意配置塊的名稱(events)和左大括號直接要有空格。

配置塊里面的以分號結(jié)尾的一行(如 worker_connections? 1024;)就是該配置塊的一個(gè)屬性。


上面這個(gè)簡單的配置共有一個(gè)外部屬性(worker_processes)和兩個(gè)配置塊(events、http)。以下是各個(gè)部分的含義:

1?worker_processes? 屬性表示的是worker進(jìn)程的進(jìn)程數(shù)

2 events 表示對事件的配置

2.1 events中worker_connections的含義是最大鏈接數(shù)

3 http表示對http請求的配置

3.1 http中的include屬性表示引入的意思,示例中表示nginx的配置文件引入了mime.types文件

3.2?default_type表示請求響應(yīng)的默認(rèn)數(shù)據(jù)類型

3.3 sendfile屬性值為on表示啟用sendfile,sendfile的作用是在底層拷貝數(shù)據(jù)的時(shí)候可以跳過應(yīng)用,直接從內(nèi)核拷貝到網(wǎng)卡,加快速度

3.4 keepalive_timeout表示長連接的一個(gè)?;顣r(shí)間,一個(gè)連接請求完并不是立馬銷毀,通過這個(gè)屬性可以等一段時(shí)間,以便下次有請求繼續(xù)用

3.5 server 配置塊代表配置一個(gè)虛擬機(jī),用來啟動并響應(yīng)

3.5.1 server中的listen屬性表示監(jiān)聽的端口,不能和其它重復(fù)

3.5.2 server中server_name用來配置域名,分發(fā)請求的時(shí)候會根據(jù)訪問的域名和配置的域名的對應(yīng)關(guān)系分發(fā)

3.5.3? server中l(wèi)ocation表示其中一個(gè)請求的地址 后面可以加斜杠,等于號等正則表達(dá)式方式匹配,其中的內(nèi)容是對應(yīng)的鏈接和頁面,root表示頁面所載目錄


上面的配置只是初級的很少的一部分配置,我們一一解釋了都是什么意思。接下來啟動測試一下,首先檢測一下配置文件有沒有錯(cuò)誤:

然后啟動,訪問:

沒有問題!



自定義一個(gè)頁面

接下來在安裝目錄的html文件夾下面新建www/test目錄,進(jìn)入test,新建test.html文件,輸入內(nèi)容 hello nginx test!

然后去nginx中增加對此頁面的配置:

listen端口與原來的監(jiān)聽一樣也可以,因?yàn)榭梢栽O(shè)置不一樣的域名,也就是server_name;

server_name可以寫域名www.test.com,也可以寫正則表達(dá)式形式,如 *.test.com,可以同時(shí)配置多個(gè)。

配置完后,去檢查一下配置是否正確:

沒問題后,不用重啟nginx,重新加載一次配置文件即可:

由于配置了域名訪問,所以要給本機(jī)host加一個(gè)域名配置:

然后從瀏覽器訪問一下:

可以看到訪問成功!

注意,如果不想帶端口,可以把nginx設(shè)置為80默認(rèn)端口。

還可以將root配置到location外面:

這樣server中無論配置幾個(gè)location都可以繼承server中的root。




實(shí)現(xiàn)動靜分離

很多時(shí)候?yàn)榱素?fù)載更高一些,會把靜態(tài)文件(如css,js,圖片等)和動態(tài)文件(如html,jsp等)進(jìn)行分開。也即是常說的動靜分離。這也是可以在nginx中配置的。

首先在上面的www目錄中新建路徑 static目錄,往里面拷貝一個(gè)圖片test.jps:

然后修改test.html文件,加入圖片的展示:

保存后,訪問頁面可以看到效果:

可以看到圖片展示失敗,是因?yàn)閳D片的位置并不在我們配置的root屬性的目錄下面。

下面我們把靜態(tài)文件也配置到nginx中:

新增一個(gè)location,路徑為/static,里面配置目錄root為文件的路徑,現(xiàn)在重新加載,直接訪問圖片試試:

可以看到訪問找不到,原因是因?yàn)殪o態(tài)文件配置了/static路徑,location里面又配置了root,那么在目錄中找文件的時(shí)候默認(rèn)會再加上一個(gè)static,真實(shí)的尋找路徑是 html/www/static/static路徑,這個(gè)路徑是沒有的因此404。下面吧root改為alias別名方式:

保存從新加載,可以看到訪問成功:

所以如果我們的設(shè)置的文件在static目錄下,設(shè)置的路徑本來也是/static,就不能用root,但是如果我們設(shè)置的文件夾是static,但是靜態(tài)文件在文件夾下的css文件夾中,那么可以用root,路徑設(shè)置為/css即可。為了防止混亂,最好靜態(tài)文件都建議用alias。此時(shí)修改html文件:

訪問頁面就可以了:

正則表達(dá)式也是常用的配置方式,下面介紹一種正則表達(dá)式的配置:

正則表達(dá)式匹配了以幾種后綴結(jié)尾的文件,這時(shí)候使用root就可以,然后可以訪問圖片:

可以看到路徑直接變成了根路徑,我們在static下面新建一個(gè)image文件夾,把圖片剪切到里面,

這時(shí)候在后面帶上/image/test.jpg即可:

可見上面這種正則表達(dá)式配置可以把static下面二級路徑下的所有靜態(tài)文件都訪問到,這是一種配置所有靜態(tài)文件省事的方式,但是正則表達(dá)式遺忘性比較大,所以使用哪種方式看個(gè)人。此時(shí)修改html文件即可訪問到:

頁面是:

上面介紹了三種location的配置方式,還有一種是直接用等號寫死的:

上面直接等于了一個(gè)/baidu.html的路徑,下面使用proxy_pass屬性代理了百度的官網(wǎng),關(guān)于反向代理后面會講。此時(shí)訪問baidu.html可以直接訪問到百度官網(wǎng):




防盜鏈配置

防盜鏈就是防盜的,主要是別的網(wǎng)站使用本網(wǎng)站的圖片等資源就視為被盜了,因此要做特殊防盜配置。配置如下:

valid_referers屬性表示只允許*.test.com的域名訪問圖片,下面的if是判斷不是設(shè)定的域名的時(shí)候,返回403.我們在server_name后面在配置一個(gè)域名:

然后訪問新的:

可以看到圖片是不顯示的,查看狀態(tài)

可以看到圖片返回403。此時(shí)直接輸入圖片地址還是可以訪問的,我們把配置再改一下:

把防盜配置中的none blocked去掉,這樣單獨(dú)直接訪問圖片也沒法訪問了:

只能在網(wǎng)站里看圖片:




黑白名單配置

經(jīng)常爬數(shù)據(jù)機(jī)器刷的ip,可以設(shè)置為黑名單禁止訪問,首先在別的機(jī)器上面訪問一下當(dāng)前配置的nginx:

目前可以訪問到,然后在安裝目錄的配置文件目錄下新建黑名單文件 black.ip,輸入一下內(nèi)容:

修改nginx配置文件,引入黑名單:

這個(gè)既可以防盜http下面,作為總的黑名單,也可以放到單獨(dú)一個(gè)server下面,現(xiàn)在在別的機(jī)器上再次訪問:

提示403,已經(jīng)進(jìn)入黑名單了!


下面設(shè)置白名單,先把黑名單的include注釋掉,然后再黑名單的同一個(gè)目錄新建一個(gè)白名單white.ip:

配置一個(gè)ip ,設(shè)置數(shù)值為1,然后修改配置文件:

文件中修改了兩個(gè)地方,geo是引入白名單,并設(shè)置出了白名單之外的默認(rèn)值是0,location里面做了判斷,只要是0的就不在白名單之列,一律返回403,下面在白名單機(jī)器上訪問:

看到可以成功,在其他機(jī)器上訪問頁面:

可以看到對應(yīng)的location路徑已經(jīng)不能訪問了。白名單功能適合單獨(dú)由內(nèi)網(wǎng)訪問的系統(tǒng)。



網(wǎng)絡(luò)限速配置

打開帶圖片的頁面,可以發(fā)現(xiàn)圖片加載的速度相當(dāng)快,這是瀏覽器下載圖片的速度快!

下面修改配置文件進(jìn)行限速:

limit_rate_after表示小于2k的部分不限速,大于的部分限速。limit_rate表示如果限速那么限速下載的速度為1k。然后我們從新打開頁面,發(fā)現(xiàn)圖片加載非常慢:


限速成功!如果是一個(gè)壓縮文件下載限速,也是同樣的道理。




日志配置

nginx的日志配置主要使用兩個(gè)屬性,log_format設(shè)置日志格式,access_log用來定義日志級別,日志位置。在原來默認(rèn)的配置文件中都能看到,可以在備份中查看:

常見的日志變量:

$remote_addr,?$http_x_forwarded_for?記錄客戶端IP地址

$remote_user記錄客戶端用戶名稱

$request記錄請求的URL和HTTP協(xié)議(GET,POST,DEL,等)

$status記錄請求狀態(tài)

$body_bytes_sent發(fā)送給客戶端的字節(jié)數(shù),不包括響應(yīng)頭的大?。?該變量與Apache模塊mod_log_config里的“%B”參數(shù)兼容。

$bytes_sent發(fā)送給客戶端的總字節(jié)數(shù)。

$connection連接的序列號。

$connection_requests?當(dāng)前通過一個(gè)連接獲得的請求數(shù)量。

$msec?日志寫入時(shí)間。單位為秒,精度是毫秒。

$pipe如果請求是通過HTTP流水線(pipelined)發(fā)送,pipe值為“p”,否則為“.”。

$http_referer?記錄從哪個(gè)頁面鏈接訪問過來的

$http_user_agent記錄客戶端瀏覽器相關(guān)信息

$request_length請求的長度(包括請求行,請求頭和請求正文)。

$request_time?請求處理時(shí)間,單位為秒,精度毫秒; 從讀入客戶端的第一個(gè)字節(jié)開始,直到把最后一個(gè)字符發(fā)送給客戶端后進(jìn)行日志寫入為止。

$time_iso8601 ISO8601標(biāo)準(zhǔn)格式下的本地時(shí)間。

$time_local通用日志格式下的本地時(shí)間。

下面我們先加一個(gè)簡單的日志:

日志格式很簡單,文件還是同樣的日志文件,把原來的日志備份走,新建一個(gè)日志,從新打開日志,執(zhí)行repon

然后刷新兩次頁面,查看日志:

可以看到日志里面只記錄了ip地址,我們再把日志內(nèi)容豐富一下:

'$remote_addr-$remote_user-[$time_local]-$request';

打印出ip,遠(yuǎn)程用戶,時(shí)間,和訪問地址,再次刷新查看日志:

再次豐富日志,打印請求狀態(tài),發(fā)送給用戶的字節(jié)數(shù),并記錄從哪個(gè)頁面訪問過來的:

log_format main '$remote_addr-$remote_user-[$time_local]-"$request"-$status-$body_bytes_sent-"$http_referer"';

刷新頁面,查看日志:

再次豐富日志格式,記錄客戶端瀏覽器相關(guān)信息等:

log_format main '$remote_addr-$remote_user-[$time_local]-"$request"-$status-$body_bytes_sent-"$http_referer"-"$http_user_agent"-"$http_x_forwarded_for"';

這個(gè)格式和默認(rèn)的基本一樣了,大家也應(yīng)該都知道每個(gè)部分的含義了,刷新查看:

自己使用的時(shí)候,根據(jù)需求配置日志格式即可。


配置的時(shí)候,文件還可以根據(jù)網(wǎng)址命名,如:

access_log logs/$host.access.log main;

如果原來沒有這個(gè)文件,那就需要創(chuàng)建,創(chuàng)建需要權(quán)限,要在整體配置文件的第一行加上

user root;


reopen一下,然后刷新頁面,可以看到對應(yīng)的網(wǎng)址的日志進(jìn)入到了對應(yīng)的日志文件中:

有的時(shí)候配置生成日志文件不成功是因?yàn)闆]有加上user root。上面再日志的格式上也加上了,日志文件中也會打?。?/p>

我們把生成的日志文件刪除,user root注釋掉,這樣肯定不會生成新日志文件,如果要從日志中查看原因,需要設(shè)置error日志,并設(shè)置為debug日志:

刷新并查看error日志:

日志中顯示,我們并沒有訪問該域名日志文件的權(quán)限,因此failed,這樣根據(jù)debug日志能很好的調(diào)試問題!

平時(shí)都這樣error的日志量肯定很大,可以針對指定客戶端,進(jìn)行debug日志輸出,

events {

????????debug_connection 192.168.1.100;?

????????debug_connection 192.168.168.128;

}

這樣其他客戶端訪問就不會打debug日志!

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

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

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