Nginx 配置學習

2022-03-02 21:58:10 字數 4644 閱讀 6466

官方文件

nginx的配置放在配置檔案nginx.conf/etc/nginx/nginx.conf中,大概的結構如下:

main                                # 全域性配置

}

主要有

全域性配置並不需要包含在大括號中。

user  nginx;

worker_processes 1;

error_log /var/log/nginx/error.log warn;

pid /var/run/nginx.pid;

worker_rlimit_nofile 1024;

event
http
location模組放在server模組裡面,表示乙個路由規則。

location的語法規則

location [ 空格 | = | ~ | ~* |^~|!~ | !~* ]  /uri/  {}
第一部分是location關鍵字

第二部分是修飾語(modifier)

第三部分是匹配的內容

第四部分是匹配成功後處理的方法

請求目錄是指客戶端發過了的請求的uri,例如客戶端訪問其中/dir1/dir2就是請求目錄

上面的修飾符,除了精確匹配=和正則的匹配之外,其他都是字首匹配,也就是請求目錄的前面匹配上,就算匹配上了,不管後面的。

為了安全起見,建議正在匹配盡量加上^$

當多個location都可以匹配請求目錄,那麼nginx會使用哪個location呢?

如果修飾語不同,那麼修飾語的優先順序是

=大於^~大於~大於~*大於空格

location = /dir1

location ^~ /dir1

location ~ /dir\d

location ~* /dir\d

location /dir1

使用上面的配置,訪問,第乙個location優先順序最高,然後逐漸下降(可以通過注釋location來測試)。

如果修飾語一樣,會找最長匹配字串

location /

location /d

如果訪問,兩個location都會匹配上,但是第二個location會匹配到請求目錄的/d,長度是2,而第乙個只會匹配到/,長度是1,前面的長度更長,所以使用第二個location。

注意這裡的長度是請求目錄的長度,不是匹配內容的長度。所以~ /\d~ /3,長度是一樣的,都是長度為1。

如果匹配字串的長度一樣,使用第乙個location

location ~ /\d 

location ~ /3

例如上面的配置,訪問,會返回601。

所以總結一下nginx尋找location的邏輯

根據修飾符的優先順序,從高到低,尋找匹配的location數量n

如果n==0,尋找下乙個優先順序的修飾符

如果n==1,使用該location

如果n>1,計算每個location匹配uri的最長的匹配字串長度l,能達到l的location的數量n1,

如果n1==1,返回該location

如果n1>1,返回第乙個location

如果所有location都不滿足,返回404

偽**:

modifier_list = ['=', '^~', '.......']  #修飾符的優先順序排序

def get_location(uri):

"""尋找最優的location"""

for modifier in modifier_list:

locations = get_match_location(uri, modifier) #獲取修飾符是modifier,匹配上uri的所有locations

num = len(locations)

if num == 0:

continue

elif num == 1:

return locations[0]

else:

max_length = 0

use_location = none

for location in locations:

length = get_match_uri_length(location, uri) #計算該location匹配上uri的最長匹配字串的長度

if length > max_length: #這裡是大於,不是大於等於,所以如果有多個location的length相同,會採用第乙個

use_location = location

return use_location

return 404

#root html;

#index test.html;

#精確匹配首頁

location = /

#靜態資源

#返回某個目錄下面的所有檔案

location ^~ /static/

當nginx找到最優的location來處理當前請求後,就會根據location的第四部分(大括號裡面)的指令來處理請求,並返回response。

4.1 返回靜態檔案

root和alias指令都是用來返回系統本地的問題。兩個指令的值都是本地檔案目錄,注意目錄後面要加/,例如/data/www/

例如配置:

location /static1/

location /static2/

location ~ ^/static3/(.+\.html)$

當訪問,會返回檔案/data/nginx_test/static1/test.html

當訪問,會返回檔案/data/nginx_test/test.html

當訪問,會返回檔案/data/nginx_test/test.html

注意第二個是沒有static2的。

使用alias的話,如果是正則的匹配方法,就需要使用正則的捕獲功能,把括號裡面的字串賦值到變數$1中。

如果配置後,找不到檔案,可以看看error_log,會報錯105415 open() "/data/demo/demo2018/nginx_test/static1/2/test.html" failed (2: no such file or directory),就可以看nginx

4.2反向**

普通**

nignx會把http請求通過socket連線,**給其他程序來處理

location /static1/

使用proxy_pass指令。

fastcgi**

location /

return指令使用者之間返回response

第乙個引數是http狀態碼,

第二個引數是body

可以直接重定向,也可以返回內容給前端。

location /test/
語法:

rewrite regex replacement [flag];
該指令會把看是否uri匹配regex,如果匹配,把replacement替換regex

flag可以:

官網介紹

301和302的區別

部落格nginx配置

upstream gunicorn_pool

server

}

配置乙個upstream,gunicorn_pool。裡面有兩個服務層(130和137)

如果兩個服務層都正常,nginx會把流量根據weight值,導流到兩個伺服器。

同乙個請求中,如果nginx導流到server1,發現返回的是錯誤響應(例如502),nginx會把請求再傳送server2,相當於重試。這時會記錄server1的fail次數+1

如果再fail_timeout時間內,server1的fail次數超過max_fails,在fail_timeout時間內,nginx就不會再把其他請求導流到server1了。

Linux 學習 nginx 配置

server 1.兩個 tomcat 分別啟動在 8080 和 8081 埠 2.8080 埠下有 edu 資料夾,下面有 index.html 檔案 3.8081 埠下有 vod 資料夾,下面有 index.html 檔案 server 配置 server location vod 說明 1 表示...

nginx配置學習記錄

第1步 先將nginx安裝包壓縮到無中文名目錄下。第2步 再在該資料夾的上框框裡面輸入cmd,開啟cmd頁面,然後輸入nginx.exe就可以開啟了,但是一般的nginx會預設80埠,所以需要將電腦上其他的80埠服務關。第3步 然後再到nginx的config目錄下開啟nginx.conf檔案。第4...

nginx配置學習總結

在講訴具體的配置之前,先說下正向 與反向 的區別。正向 是乙個位於客戶端和原始伺服器 origin server 之間的伺服器,為了從原始伺服器取得內容,客戶端向 傳送乙個請求並指定目標 原始伺服器 然後 向原始伺服器轉交請求並將獲得的內容返回給客戶端。客戶端才能使用正向 而且必須要進行一些特別的設...