前言:
- 我為什么寫這個呢?我就是感覺其他的文章或者視頻都沒有從最開始的location開始講。
- 有的直接從負載均衡講起,而將location的url匹配規則之類的放到后面再講。我就覺得缺少了前置知識。
- 所以我就寫下了這篇文章,盡量以一個零nginx基礎的角度來講述nginx。盡量循序漸進的講述。如果你看的時候感覺還是不夠循序漸進或許感覺有什么疏漏,希望能留下你的意見。
循序漸進Nginx將分成三節來講
1.介紹、安裝、hello world、Location匹配(已完成)✅
2.反向代理、負載均衡、緩存服務、靜態資源訪問(已完成)✅
3.日志管理、http限流、https配置,http_rewrite模塊,第三方模塊安裝,結語。(已完成)✅
Nginx是什么
- nginx讀作(engine x),engine是引擎的意思,這寓意着他強大的動力。
- nignx是一個高性能的http服務器、代理服務器和負載均衡服務器。
- nginx是開源的,由C語言編寫,創始人為俄國人伊戈爾·賽索耶夫。
- 如果要說最受歡迎的web服務器,莫過於nginx了吧,小廠大廠都在用 ,阿里自己都對nginx進行了自定義開發(Tengine)。除了一些非常小訪問量的業務(能用tomcat就可以解決的那種)之外,應該大部分都使用上了nginx。
- nginx基於事件驅動模型,nginx的並發能力都要高於其他的服務器(Apache:要素察覺❓)。
- nginx基於開源和模塊化設計,可以通過第三方模塊來豐富自己的功能。
💡netcraft的數據統計顯示nginx是目前最受歡迎的web服務器:
使用場景:
如果你不懂理解下面的場景,那你就把你學習的意圖定為“學習最受歡迎的服務器”也行,一般來說你都會有機會去使用nginx。當然也有可能分工過於明確導致你沒機會去碰部署相關的東西。
- 代理服務:nginx支持反向代理,可以把發送給自己的請求代理給業務服務端來處理,類似於API網關的作用,可以把一個外網的請求代理給本地內網的服務端來處理,這樣就某種程度上保護了內網的服務器。
- 負載均衡:nginx可以實現負載均衡,比如tomcat的單個服務端並發能力不大,當我們水平擴充成多個tomcat的時候,使用nginx的負載均衡功能把請求分發給多個tomcat,可以達到多個tomcat服務端達到負載均衡的效果。
- 緩存:nginx有客戶端緩存的處理以及代理緩存的處理。客戶端緩存:在傳遞一些靜態資源的時候,如果瀏覽器能緩存下來,就避免了短時間內重復向nginx請求這個靜態資源。(代理緩存:)在代理請求的時候,可能有些響應數據是短期內不會變更或者長期不會變更的,為了提高響應速度,我們可能會需要對這些數據進行緩存,比如你需要菜單欄數據,在很長期可能菜單欄數據都不會變,而如果你每次都代理請求到業務服務端來響應的話,查數據庫就需要消耗不少資源,而使用nginx緩存之后,nginx就會直接返回,不需要查業務服務端了。
- 其他。。。。。
💡如果你學過一些微服務方面的知識的話,你會發現這三個場景其實也能在微服務方面見到,這就是nginx設計思想的優越性。
官方文檔說明
💡有時候文檔才是最有用的教程,我的教程並不會講的很詳盡,那么當你遇到問題的時候,參考文檔也是不錯的選擇。比如說我講了某個指令可以用在A上下文,但沒說能不能用在B上下文的時候,你可以參考一下官方文檔對於這個指令的上下文說明。
💡nginx中文文檔沒翻譯什么,但在入門階段,你可能更想看到一點中文的東西。指令雖然老舊,但部分還是有參考價值的
💡英文原始文檔,注意中文文檔一般會比較舊,有些指令可能會沒有,但入門初期還能用。
💡文檔里面會分很多模塊,每一塊點進去可以看到類似如下的說明:
💡你點進去文檔的話會看到很多模塊,模塊的話,你可以認為模塊用於划分功能,比如HTTP Core模塊提供了核心的Http功能,負載均衡依賴於模塊HTTP Upstream,訪問控制依賴於HttpAccess模塊,Https依賴於HttpSSL模塊。nginx默認會自動安裝上不少模塊,可以通過nginx -V
來查看自己的nginx安裝了什么模塊,內置模塊不會顯示出來。
💡當你從我這里學到了一個指令,但有疑問的時候,可以考慮搜索一下官方文檔。看官方文檔是你應該學會的能力。
安裝
windows下:
1.從下載地址下載到nginx/Windows-x.x.x
,這個是面向win環境的。
2.下載到的是一個壓縮包,解壓出來,可以看到如下的目錄結構,其中nginx.exe就是用來啟動nginx的程序
3.你可以直接運行nginx.exe,然后訪問http://localhost/
,如果能看到下面的頁面,那么代表安裝和啟動成功了。
linux(CentOS7)下:
.在linux下既可以通過源代碼包來安裝(這里不講,有興趣自行百度),也可以通過其他方式來安裝,例如redhat/centos就支持yum安裝,下面主要講使用yum來安裝nginx(💡yum方式安裝的話,自定義可能沒那么強,但勝在方便,適合初學者,你可以后面再學使用其他方式安裝。yum模式安裝默認會按照額外的一些第三方模塊,但並沒有提供很多的第三方模塊安裝方法,安裝第三方模塊的時候還行建議使用編譯安裝的方式。但由於我們這里沒有怎么使用第三方模塊,所以暫時以yum方式為例)。RHEL-CentOS nginx官方安裝文檔,我們這里只講centos7下的安裝,沒有講ubuntu下的安裝,需要的可以自行看一下官方文檔或者百度一下。
💡centos7下使用yum來安裝
1.執行sudo yum install yum-utils
2.vim /etc/yum.repos.d/nginx.repo
,填入以下內容,設置nginx的yum源:
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
3.執行一下yum repolist
,更新一下yum源:
4.使用yum安裝nginx,yum install nginx
5.啟動nginx,systemctl start nginx
6.訪問http://linux系統IP/
,如果看到下面的圖就是安裝啟動成功。
💡防火牆默認防護了80端口,可能你需要執行systemctl stop firewalld
來臨時關閉防火牆,這樣才可以訪問。
docker下:
1.docker pull nginx:1.18.0
【你也可以自行去dockerhub看看你想安裝什么版本】
2.docker images
,查看是否拉取鏡像成功:
3.docker run --name nginx-8080 -p 8080:80 -d nginx:1.18.0
【運行nginx,如果你使用docker運行nginx,那么我默認當你有docker基礎了,這些命令就不介紹了。】
4.docker ps
查看nginx是否已經運行了:
5.訪問http://docker宿主機IP:8080/
,如果運行成功的話,會看到下圖:
目錄結構
🔵安裝成功之后,我們簡單介紹一下nginx的目錄結構。
查看一下nginx安裝相關目錄:
[root@localhost ~]# whereis nginx
nginx: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/share/nginx /usr/share/man/man8/nginx.8.gz
🔵/etc/nginx/
就是nginx安裝的目錄:
名字 | 類型 | 說明 |
---|---|---|
conf.d | 目錄 | nginx主配置文件存儲位置 |
mime.types | 文件 | 設置Content-Type與擴展名的關系,例如可以設置響應為html文件時,響應的Content-Type為text/html |
fastcgi_params scgi_params uwsgi_params |
文件 | 與fastcgi,scgi,uwsgi相關的配置文件 |
modules | 目錄 | nginx模塊目錄,nginx的模塊存儲在這里,比如安裝第三方模塊的時候就存儲在這里 |
nginx.conf | 文件 | nginx主配置文件 |
koi-utf koi-win win-utf |
文件 | 編碼轉換映射文件,用於在輸出內容到客戶端時,將一種編碼轉換到另一種編碼。 因為作者是俄國人,所以有koi這個編碼轉換。 |
🔵/usr/sbin/nginx是nginx啟動程序
🔵/usr/lib64/nginx里面放了模塊相關文件。
🔵/usr/share/nginx放了一些nginx的默認資源,比如index.html
🔵/usr/share/man/man8/nginx.8.gz存放了man語法幫助文件。
除了這些上面的文件/目錄,其實還有一些其他的文件/目錄,我們在后面教程中用到再講,比如/var/log/nginx
就是nginx默認的日志存儲目錄。
------------------- 分割線:下面介紹簡單使用,由於nginx非常少用於window,所以下面的例子基於linux -----------
Hello World
下面我會簡單介紹一下默認的配置文件,並做一個非常簡單的修改,這將作為后面的介紹nginx的基礎知識。
1.展示一下默認的核心配置:
下面的配置文件我都有打注釋,如果你能看懂注釋(😓應該都能稍微看懂吧),那就記一下,如果看不懂,那就記一下變量的名字吧,這樣我后面介紹的時候你還記得這個變量寫在哪里。
💡/etc/nginx/nginx.conf
:
💡/etc/nginx/conf.d/default.conf
:
在nginx.conf
中使用了include /etc/nginx/conf.d/*.conf;
來將conf.d下的文件導入到http塊中。
上面導入的server的效果等同於直接在http塊中寫server塊:
2.介紹一下效果:
- 我們首先啟動nginx,執行命令
systemctl start nginx
。 - 然后訪問機器的80端口,這個80端口由default.conf配置文件的listen指定。假設我的機器是192.168.48.128,那么此時訪問一下
http://192.168.48.128
,你會看到一個welcome頁面。 - 其實
http://192.168.48.128
這個請求剛好匹配到了location /
,而返回的資源頁面其實剛好就是root+index得到的路徑的內容,也就是/usr/share/nginx/html下的index.html
。 - 我們把index.html里面的的
Welcome to nginx!
修改成Welcome to my nginx
,然后刷新一下,會看到頁面的效果變了。
- 所以返回的確實是
/usr/share/nginx/html下的index.html
。
💡這個例子大概的給location匹配和資源返回開了個頭。
3.修改一下配置:
💡我們嘗試修改一下location來使得能夠訪問我們自己創建的文件。也相當於驗證上面的例子的一些內容。
💡我們在/usr/share/nginx/helloworld
下創建一個hello.html
<html>
<body>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<h1>我的第一個標題</h1>
<p>我的第一個段落。</p>
</body>
</html>
💡然后在conf.d/default.conf
增加一個location(直接與第一個location同級),location用於定義url匹配,做后端開發的可能更熟悉一個詞——路由分發,比如下面的location = /hello.html
就用於定義訪問nginx主機IP/hello.html
:
location = /hello.html {
#root用於定義資源根目錄,比如訪問/hello.html得到的是/usr/share/nginx/html/helloworld/hello.html
root /usr/share/nginx/html/helloworld;
}
4.展示修改后的效果:
訪問一下nginx主機IP/hello.html
就可以看到我們的內容,root用於定義根路徑,所以最終返回的文件的路徑是/usr/share/nginx/html/helloworld/hello.html
。
響應的是我們定義的內容就說明我們這個location配置成功了。
🤣這個例子可能沒什么營養。但舉這個例子是為了先讓讀者有參與感,能自己簡單地嘗試對nginx進行更改,給下面的location匹配和資源返回開個頭。
基礎nginx命令
下面的內容介紹還是需要一些基礎的nginx命令的,比如修改了配置信息之后需要檢查配置文件語法和重啟nginx之類的,所以這里舉例一下基礎的nginx命令。
systemctl start nginx
:啟動nginxsystemctl restart nginx
:重啟nginx,修改配置文件需要重啟nginx,改資源文件不需要,nginx -s stop
: 關閉nginx程序,不保存相關信息nginx -s quit
:正常退出nginx,並保存相關信息。【quit的時候,Nginx在退出前會完成已經接受的連接請求,而stop不會。】nginx -s reload
:重啟nginx。nginx -V
:查看編譯參數。可以用來查看安裝的模塊(不全的),模塊相關的事情,我們后面再介紹,你暫時只需要知道nginx的很多功能都是基於模塊的,比如http_ssl模塊就負責nginx的https配置。nginx -v
可以看到nginx的版本。nginx –t
檢查配置文件是否有語法錯誤。在每次重啟之前,都建議使用這個來檢查一下配置文件。不然關閉nginx之后不能快速重啟就糟糕了。nginx -h
查看簡單的幫助命令。nginx -c 主配置文件路徑
:以某個主配置文件為基礎來運行nginx。
location的url匹配
💡我們這里介紹一下location的url匹配語法,從上面的helloworld的例子中,其實你可以把location理解成一個請求映射。比如上面HelloWorld中我們使用下面的這個location把nginx主機IP/hello.html
的訪問結果定義成/usr/share/nginx/html/helloworld/hello.html
的結果。
location = /hello.html {
root /usr/share/nginx/html/helloworld;
}
💡location通過url匹配把location內部定義的結果返回給請求者。比如說可以使用return(直接返回,類似請求響應直接返回一個字符串),proxy_pass(代理服務器)等手段來定義返回的結果。如果不定義這些,就會基於路徑來嘗試訪問靜態的資源,所以上面的location才會得到/usr/share/nginx/html/helloworld/hello.html
的結果。
💡上面這個引出了不少東西,比如說return,比如說proxy_pass,但他們都與location有關,而且大多是location內部的內容,所以這里先簡單介紹一下location的url匹配語法,后面講location內部才會講到return,proxy_pass這些知識點。
💡資源拼接問題:這里先提前說一下免得看不懂下面的測試例子,有人疑惑只有root的話是怎么找到應該返回的資源的。 如果使用非正則的location的話,會把location部分拼接到root指定的目錄后,比如上面的/usr/share/nginx/html/helloworld
+匹配結果/hello.html
就得到了/usr/share/nginx/html/helloworld/hello.html
;如果是正則的,也會把匹配到的location部分拼接到root指定的目錄后。
loaction格式是location [=|~|~*|^~] pattern
,分成三部分就是location, [=|~|~*|^~]
和pattern
,location當然是固定的寫法了,所以不需要介紹,我們只介紹 [=|~|~*|^~]
和pattern
。
## URL匹配語法 URL語法匹配分成兩部分, `[=|~|~*|^~]` 和`pattern`。
🔵[=|~|~*|^~]
部分的用法如下,注意,這部分是可選的,可以沒有,沒有的話,此時情況會不同,此時pattern不一定是正則:
-
= pattern
代表精確匹配pattern,此時pattern不是正則。*
比如location = /error
就只能匹配nginx主機IP/error
,不能匹配nginx主機IP/Error
,nginx主機IP/error01
-
^~
代表匹配以某個字符串開頭的url,此時pattern不是正則表達式
比如location ^~ /test
可以匹配/test,/test001,/testAAA,/test/aaa
-
~ pattern
代表pattern這個正則匹配區分大小寫,pattern是一個正則,正則的內容我們下面講。 -
~* pattern
代表pattern這個正則不區分大小寫,pattern是一個正則,正則的內容我們下面講。
💡記清楚,哪些是正則,哪些不是。使用=
和^~
的不是正則,使用~
和~*
的是正則。
🔵pattern
部分語法遵循Linux正則表達式語法:
-
location = url
代表精確匹配url,url此時不被認為是一個正則表達式,比如location = /hello.html
只精確匹配nginx主機IP/hello.html
,location = /
代表只匹配主機根目錄,也就是ip/。 -
location ^~ /pattern
代表匹配以某個字符串開頭的url,此時pattern不是正則表達式。 -
location /
代表通用匹配,因為所有的路徑都有/
作為開頭。【這時候pattern也不算正則表達式】 -
location /pattern
代表匹配/pattern開頭的請求,此時pattern也不算正則,比如location /api/
匹配/api/
開頭的請求。但優先級比location [~|~*] pattern
低。 -
location [~|~*|^~] pattern
此時[~|~*|^~]
只是對正則表達式的大小寫區分的輔助標識,所以我們下面針對Pattern來講解的時候可以先忽視大小寫區分。pattern是一個正則表達式,我們講一下它正則表達式的寫法。【nginx的正則表達式使用的是Linux的正則表達式規則】
字符 | 說明 | 額外說明 |
---|---|---|
$ |
用於限定結尾,比如location ~* .(gif|jpg|jpeg)$ 就是匹配任何以.gif、.jpg 或 .jpeg 結尾的請求 |
|
^ |
用於限定開頭,比如^error 可以匹配error404 ,error500 ,不能匹配500error |
|
| |
滿足其中之一即可,例如A|B 代表可以匹配A,也可以匹配B。 |
|
[] |
代表范圍,比如[0-9] 代表匹配0-9的數字,[a-z] 代表匹配a-z的字符。可以同時有多個范圍,例如[a-zA-Z0-9] .如果范圍里面使用^ ,那么代表匹配除了范圍內的字符,比如[^0-9] 代表匹配0-9以外的字符。還可以是[abc] ,這代表匹配字符a、b、c。🔴注意,a-9是不合法的范圍。 |
|
. |
代表匹配任意的一個字符 | |
? |
匹配前面的字符零次或一次 | |
+ |
匹配前面的字符一次或多次 | |
* |
匹配前面的字符零次或多次 | 貪婪模式與懶惰模式: 比如abcdabcd,如果是貪婪模式 a.*d ,匹配的結果是abcdabcd;如果是懶惰模式 a.*?d ,那么是abcd,abcd |
{n} |
匹配前面的字符n次,必須是n次 | |
{n,} |
匹配前面的字符至少n次 | |
{n,m} |
匹配前面的字符,最少n次,最多m次。 | |
() |
用於划分字符范圍 划分字符范圍,比如 hello | hi Amy ,只會匹配出hello 和hi Amy ,而不是hello Amy ,划分范圍之后(hello|hi) Amy 就可以匹配到hello Amy 了。 |
|
\ |
用於轉義,比如. 代表匹配任意的一個字符,\. 就把. 變成了一個. ,這樣才可以來匹配.html 這樣使用. 來做擴展名 |
|
\d |
代表匹配任意一個十進制數字,相當於[0-9] |
|
\D |
代表匹配任務一個非十進制數字 | |
\w |
代表匹配任意一個非符號字符,相當於[a-zA-Z0-9] |
|
\W |
代表匹配任意一個符號字符 | |
\s |
代表匹配任意一個空白字符。 | |
\S |
代表匹配任意一個非空白字符 |
學了上面的正則的意思,那你應該能夠看懂下面的幾個正則了吧:
location ~ \.php$
:匹配以php結尾的請求。location ~* \.(gif|jpg|jpeg)$
匹配任何以.gif、.jpg 或 .jpeg 結尾的請求。location /api/
匹配/api/
開頭的請求。location /aaa/.*\.html$
代表匹配/aaa/
下后綴為.html
的請求。
location [=|~|~*|^~] @name
,用於內部跳轉,用於聲明一個pattern,
比如上面的文件訪問http://nginx主機IP/hello2.html
如果發生找不到,那么會顯示file not found
,因為這進行了一個內部跳轉,當發生404異常error_page 404 @file_err
的時候,會返回location @file_err
的響應,也就是上面定義的return 200 'file not found'
,return你可以理解成直接返回定義的數據,200是響應碼。
😓考慮到篇幅問題,不能給詳細例子,大家可以基於上面的正則教程來自行測試。
匹配順序
當一個url可以匹配多個規則的時候,核心優先級思想是匹配最精確的,實在沒有精確匹配的,再匹配模糊的,還有個最大前綴匹配的說法,在非正則表達式匹配的情況下,發起/data/log/2
時,匹配的會是location /data/log
,而不是location /data
。
優先級是【注意url和pattern有區別,pattern代表正則表達式】:
(精確匹配)location = url
> (帶完整精確路徑的)location url
> (帶部分前綴路徑的)location ^~ prefix_url
>(模糊匹配的)location [~|~*] pattern
> location /pattern
> 通用匹配location /
舉個例子:比如有個請求http://192.168.31.128/hello/a
那么下面的匹配順序是:
1.location = /hello/a
2.location /hello/a
3.location ^~ /hello
4.location ~ /hello
或location ~* /hello
5.location /hello
6.location /
💡測試上面這個例子的時候請兩兩測試。不要同時定義多個location。
server {
listen 80;
server_name localhost;
default_type text/html;
#location = /hello/a {
# default_type text/html ;
# return 200 'location = /hello/a';
#}
#location ^~ /hello {
# default_type text/html ;
# return 200 'location ^~ /hello';
#}
#location ~* ^/hello {
# default_type text/html ;
# return 200 'location ~* ^/hello';
#}
# 這個並不能與其他共存,會認為重復了。但可以與location /,location ~* ^/hello共存
location /hello {
default_type text/html ;
return 200 'location /hello';
}
location / {
default_type text/html ;
return 200 'location /';
}
#location /hello/a {
# default_type text/html ;
# return 200 'location /hello/a';
#}
}
那么有多個正則表達式`location [~|~*] pattern`都能夠匹配的時候,他們的優先級是怎么樣的呢?誰先配置就生效。 下面的兩個location都可以對應`192.168.48.131/long/long/a.html`,你可以自己嘗試一下修改他們的順序,看結果會不會變化。 
😓就算這里給你介紹了匹配順序,但其實還是不推薦搞那些容易混亂的匹配。
比如下面這種情況:按上面的規則訪問http://192.168.31.128/hello/a
響應結果應該是location /hello/a
,但實際上並不是,而是location ~* ^/hello
,而當你去掉location /hello/a
的時候,你又會發現結果變成了location ^~ /hello
😀location /pattern
和location [~|~*] pattern
單獨比較時,location [~|~*] pattern
的優先級比較高。
location ^~ /hello {
default_type text/html ;
return 200 'location ^~ /hello';
}
location ~* ^/hello {
default_type text/html ;
return 200 'location ~* ^/hello';
}
location /hello/a {
default_type text/html ;
return 200 'location /hello/a';
}
location內部的事
location內部可以有很多指令,我這里只介紹常見的。
root和index
上面的例子中,我們大多都只定義了root、index和return ,我們先來講root和index。
💡root用於指定網站的根目錄。
💡index指令用於設置網站的默認首頁。除了用在location,index還可以使用在http、server塊中。起到在當前塊的全局配置默認首頁。
上面的測試,你可能會感到一種疑惑。
❓比如我定義了如下的location:
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
但請求nginx主機IP/helloworld/hello.html
的時候返回/usr/share/nginx/html/helloworld/hello.html
,那么是怎么返回的呢?
首先nginx主機IP/helloworld/hello.html
在匹配了/
之后,匹配的剩余部分helloworld/hello.html
會基於root來查找資源位置。
所以root + location得到了最終的資源路由/usr/share/nginx/html/helloworld/hello.html
。
而直接訪問nginx主機IP/
時返回/usr/share/nginx/html/index.html
的內容這是因為index指令用於設置網站的默認首頁,root+index就是網站的默認首頁的資源文件/usr/share/nginx/html/index.html
。
💡root與alias
root和alias都可以用來定義網站的根目錄,但alias不會追加location匹配到的部分,比如下面的這個圖中location是可以匹配http://192.168.48.131/helloworld/a.png
的,那么使用root和alias時有什么區別呢?
不基於正則的時候,使用http://192.168.48.131/test/a.png
來測試:
- 使用root時,訪問的資源路徑是
/usr/share/nginx/html/test/a.png
,會把匹配到的/
和test/a.png
追加到root指定的路徑之后。 - 使用alias時,訪問的資源路徑是
/usr/share/nginx/htmltest/a.png
,你會看到它並沒有攜帶上匹配的/
,而是把test/a.png
追加到了alias路徑之后。
在location是正則表達式的時候,使用http://192.168.48.131/helloworld/helloworld/a.png
來測試:
- 使用root時,訪問的資源路徑是
/usr/share/nginx/html/helloworld/helloworld/a.png
,會把pattern部分直接追加到root指定的路徑之后。 - 使用alias時,訪問的資源路徑是
/usr/share/nginx/html/helloworld
,沒錯,就是alias的絕對路徑,它不會把正則表達式部分追加到alias指定的路徑之后。
return
上面的時候有個例子我使用了return,return是可以直接返回數據的。
💡通常使用return的時候還需要指定default_type,它用來定義當前返回的數據的類型,不然會默認當成下載流。會加在響應的Content-Type中。
語法格式如下:
return 響應碼 [響應的數據]
return 資源文件路徑
- 當return只有響應碼的時候,如果拋出的響應碼在error_page中有,那么會返回error_page的響應,比如
return 500;
default_type
上面的return的例子中,我們大多都定義了一個default_type
指令,這是什么呢?因為上面我們是直接返回數據,與之前的返回html之類的資源文件不同,所以我們需要指定返回的數據的類型,比如我們返回的是一個json數據的時候,就指定default_type application/json;
。
默認的default_type
類型會是application/octet-stream
,如果我們上面不設置default_type,這將導致我們的響應變成下載流。【這個默認值是在nginx.conf中配置的】
❓為什么返回html之類的資源文件時不需要手動指定?
其實我之前也提過了(Helloworld的nginx.conf的注釋中),可以參考nginx.conf
的include /etc/nginx/mime.types;
,這里把mime.types中的類型映射導入了,比如text/html html htm shtml;
代表什么意思呢?就是如果返回的文件格式是html
、htm
、shtml
,那么default_type
就是text/html
。
proxy_pass
🔵proxy_pass
用於設置被代理服務器的地址,可以是主機名稱(https://www.baidu.com
這樣的)、IP地址(域名加端口號)的形式。
🔵proxy_pass
用於反向代理,參考下面的“反向代理”的內容。
location
location里面還可以放location,可以繼續向下划分。
訪問限制deny與allow
deny和allow可以用來限制用戶訪問,比如說某個內容,你只希望讓IP為192.168.48.131
的能夠訪問。而不讓其他IP訪問,那么可以使用deny和allow來限制。(當然了,用if也可以達到類似的效果,但可能會寫的沒那么方便)
💡allow用於允許訪問
💡deny用於禁止訪問,默認會返回403 Forbidden。
💡allow和deny支持IP,CIDR(也就是這種192.168.10.0/24)和all
關鍵字,all代表全部。
💡當內部有多個規則時,💡自上而下判斷是否有權限,如果是deny all在前,后面的allow都沒用。有人會問,如果我配置了一個deny,不配置allow,那么其他的非deny的地址可以訪問嗎?答案是可以的,默認是放行的。
💡allow和deny可以用在http
、server
、location
、limit_except
(limit_except是Http Core模塊的內容)中
❗測試deny和allow的時候不要和return一起使用(但加個if之類進行判斷應該沒問題,總之不要在同一層),這兩個有點沖突,可以說return優先級比較高。
location / {
root /usr/share/nginx/html;
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
deny all;
}
💡deny和allow是http_access模塊的內容。
列出目錄autoindex
💡你在訪問一些頁面的時候,你會發現他把整個文件目錄給你返回了。在nginx中可以使用autoindex來達到這種效果。
💡如果設置了Index並且index文件存在(默認配置有Index,這代表你選定的root目錄不能有index.html),那么默認首頁的不會autoindex。
💡使用指令autoindex on;
來開啟列出目錄的功能。
💡另外還可以加上這兩個指令,autoindex_exact_size off;
代表顯示出文件的大小,單位是byte,默認是on,顯示精確大小,off代表顯示粗略大小,單位是kB/mB/GB(依文件大小而定);autoindex_localtime on;
用於顯示文件的創建時間,默認off是顯示GMT時間,換成on之后就顯示文件所在的服務器的時間。
補充
大部分的內容都是location里面的內容,這里只簡單講講,后面根據需求再講了。