循序漸進nginx(一):介紹、安裝、hello world、Location匹配



前言:

  • 我為什么寫這個呢?我就是感覺其他的文章或者視頻都沒有從最開始的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服務器:
20200618094959


使用場景:

如果你不懂理解下面的場景,那你就把你學習的意圖定為“學習最受歡迎的服務器”也行,一般來說你都會有機會去使用nginx。當然也有可能分工過於明確導致你沒機會去碰部署相關的東西。

  • 代理服務:nginx支持反向代理,可以把發送給自己的請求代理給業務服務端來處理,類似於API網關的作用,可以把一個外網的請求代理給本地內網的服務端來處理,這樣就某種程度上保護了內網的服務器。
  • 負載均衡:nginx可以實現負載均衡,比如tomcat的單個服務端並發能力不大,當我們水平擴充成多個tomcat的時候,使用nginx的負載均衡功能把請求分發給多個tomcat,可以達到多個tomcat服務端達到負載均衡的效果。
  • 緩存:nginx有客戶端緩存的處理以及代理緩存的處理。客戶端緩存:在傳遞一些靜態資源的時候,如果瀏覽器能緩存下來,就避免了短時間內重復向nginx請求這個靜態資源。(代理緩存:)在代理請求的時候,可能有些響應數據是短期內不會變更或者長期不會變更的,為了提高響應速度,我們可能會需要對這些數據進行緩存,比如你需要菜單欄數據,在很長期可能菜單欄數據都不會變,而如果你每次都代理請求到業務服務端來響應的話,查數據庫就需要消耗不少資源,而使用nginx緩存之后,nginx就會直接返回,不需要查業務服務端了。
  • 其他。。。。。
    💡如果你學過一些微服務方面的知識的話,你會發現這三個場景其實也能在微服務方面見到,這就是nginx設計思想的優越性。

官方文檔說明

💡有時候文檔才是最有用的教程,我的教程並不會講的很詳盡,那么當你遇到問題的時候,參考文檔也是不錯的選擇。比如說我講了某個指令可以用在A上下文,但沒說能不能用在B上下文的時候,你可以參考一下官方文檔對於這個指令的上下文說明。
💡nginx中文文檔沒翻譯什么,但在入門階段,你可能更想看到一點中文的東西。指令雖然老舊,但部分還是有參考價值的
💡英文原始文檔注意中文文檔一般會比較舊,有些指令可能會沒有,但入門初期還能用。
💡文檔里面會分很多模塊,每一塊點進去可以看到類似如下的說明:
20200615170742
💡你點進去文檔的話會看到很多模塊,模塊的話,你可以認為模塊用於划分功能,比如HTTP Core模塊提供了核心的Http功能,負載均衡依賴於模塊HTTP Upstream,訪問控制依賴於HttpAccess模塊,Https依賴於HttpSSL模塊。nginx默認會自動安裝上不少模塊,可以通過nginx -V來查看自己的nginx安裝了什么模塊,內置模塊不會顯示出來。
💡當你從我這里學到了一個指令,但有疑問的時候,可以考慮搜索一下官方文檔。看官方文檔是你應該學會的能力。




安裝

windows下:

1.從下載地址下載到nginx/Windows-x.x.x,這個是面向win環境的。
2.下載到的是一個壓縮包,解壓出來,可以看到如下的目錄結構,其中nginx.exe就是用來啟動nginx的程序
20200521094657
3.你可以直接運行nginx.exe,然后訪問http://localhost/,如果能看到下面的頁面,那么代表安裝和啟動成功了。
20200521094350

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源:
20200521102950


4.使用yum安裝nginx,yum install nginx
5.啟動nginx,systemctl start nginx
6.訪問http://linux系統IP/,如果看到下面的圖就是安裝啟動成功。
💡防火牆默認防護了80端口,可能你需要執行systemctl stop firewalld來臨時關閉防火牆,這樣才可以訪問。
20200521094350


docker下:

1.docker pull nginx:1.18.0 【你也可以自行去dockerhub看看你想安裝什么版本】
2.docker images,查看是否拉取鏡像成功:
20200521101044
3.docker run --name nginx-8080 -p 8080:80 -d nginx:1.18.0 【運行nginx,如果你使用docker運行nginx,那么我默認當你有docker基礎了,這些命令就不介紹了。】
4.docker ps查看nginx是否已經運行了:
20200521101632
5.訪問http://docker宿主機IP:8080/,如果運行成功的話,會看到下圖:
20200521094350




目錄結構


🔵安裝成功之后,我們簡單介紹一下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安裝的目錄:
20200521104035

名字 類型 說明
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:

20200618103230


💡/etc/nginx/conf.d/default.conf:
20200612164314


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
    20200610233846

💡這個例子大概的給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:啟動nginx
  • systemctl 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.htmllocation = /代表只匹配主機根目錄,也就是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,只會匹配出hellohi 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,
    20200612104942
    比如上面的文件訪問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 ~ /hellolocation ~* /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`,你可以自己嘗試一下修改他們的順序,看結果會不會變化。 ![20200614034101](https://progor.oss-cn-shenzhen.aliyuncs.com/img/20200614034101.png)

😓就算這里給你介紹了匹配順序,但其實還是不推薦搞那些容易混亂的匹配
比如下面這種情況:按上面的規則訪問http://192.168.31.128/hello/a響應結果應該是location /hello/a,但實際上並不是,而是location ~* ^/hello,而當你去掉location /hello/a的時候,你又會發現結果變成了location ^~ /hello😀location /patternlocation [~|~*] 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時有什么區別呢?

20200614180101
不基於正則的時候,使用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;
    20200614221053

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.confinclude /etc/nginx/mime.types;,這里把mime.types中的類型映射導入了,比如text/html html htm shtml;代表什么意思呢?就是如果返回的文件格式是htmlhtmshtml,那么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可以用在httpserverlocationlimit_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之后就顯示文件所在的服務器的時間。

20200617144227


補充

大部分的內容都是location里面的內容,這里只簡單講講,后面根據需求再講了。




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM