1. 程式人生 > 實用技巧 >阿里雲nginx.conf檔案配置詳解

阿里雲nginx.conf檔案配置詳解

阿里雲nginx.conf檔案配置詳解

建議先去這個部落格看看 真牛寫的 段落清晰 目錄明確 看了人家寫的我都覺得不想寫了 然後我就抄了
https://blog.csdn.net/weixin_40792878/category_8122460.html
官方文件https://www.nginx.cn/doc/index.html

配置檔案位置: nginx-1.18.0\conf\nginx.conf
將這個nginx服務執行起來就直接進行訪問了,對吧,所以要知道你自己的服務上
注意點:nginx配置檔案的每一條指令都必須用分號結束 ,

去掉註釋的預設的配置檔案

 
worker_processes  1;
 
events {
    worker_connections  1024;
}
 
 
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
 
    }
 
}

實用修改:

如果你專案上要兩個或者多個vue專案 可以直接在你的80埠下新加一個location
也可以新開一個埠 也就是新建一個serve
目錄部署:


        location / {
            root  /usr/local/lawyer_wsla/frontend/dist;
	    	try_files $uri $uri/ @router;
            index  index.html index.htm;
        }

		location /zjwsla {
            alias /usr/local/lawyer_wsla/frontend/zjwsla;
            try_files $uri $uri/ /zjwsla/index.html;
    		index  index.html index.htm;
        }

		location @router {
	   		 rewrite ^.*$ /index.html last;
		}


新開一個埠:

    server {
        listen       8082;
        server_name  localhost;

            #charset koi8 - r;
            
            #        #access_log  logs / host.access.log  main;

        location / {
            root   / newfolder / dist;
            index  index.html index.htm;
        }
        
    }

一檔案結構:

下面指令配置中 “|”表示或者; “[]”表示可選

全域性塊,events塊 , http塊

http塊包含 http全域性塊多個server塊 server塊又包含server全域性塊location塊

注意:外層的指令可以作用於自身的塊和此塊中的所有低層級塊,並且還遵循低階優於高階,類似於Java中的全域性變數和區域性變數。

像這樣:

worker_processes 4;  
... #全域性塊
events  #events塊
{
  ...
}
http  #http塊
{
    ...   #http全域性塊
    server  #server塊 相當於一個虛擬機器
    {
        ... #server全域性塊
        location [Pattern]
        {
           ...
        }
    }
    server 
    {
        ...
    }
    ...
}
名稱 說明
全域性塊 (從檔案開始到events塊的內容)用來設定影響Nginx伺服器整體執行的配置,作用於全域性
作用:通常包括伺服器的使用者組,允許生成的worker process、Nginx程序PID的存放路徑、日誌的存放路徑和型別以及配置檔案引入等
events塊 涉及的指令主要影響Nginx伺服器和使用者的網路連線。
作用:常用到的設定包括是否開啟多worker process下的網路連線進行序列化,是否允許同時接收多個網路連線,選擇何種時間驅動模型處理連線請求,每個worker process可以同時支援的最大連線數等
http塊 這個很重要,包含代理,快取和日誌定義等絕大部分功能和第三方模組的配置都可以放在這個模組中
作用:配置的指令包含檔案引入,MIME-Type的定義,日誌定義,是否使用sendfile傳輸檔案、連線超時時間,單鏈接請求數的上限等。
server塊 server塊: 就相當於虛擬機器,一個server就相當於一個虛擬機器,所以一個nginx相當於對外可以提供多個虛擬機器;
server全域性塊: 配置虛擬機器的監聽配置和虛擬機器的名稱或者IP
作用:使得Nginx伺服器可以在同一臺伺服器上至執行一組Nginx程序,就可以執行多個網站。
location塊 一個server可以包含多個location ,'[Pattern]' 這裡對去除主機名稱或者IP後的字元做匹配(例如server_name/uri_string,那麼這裡就對‘/uri_string’ 匹配)
作用:基於Nginx伺服器接收到的請求字串,虛擬主機名稱(ip,域名)、url匹配,對特定請求進行處理。

一定要理解明白了,
要是隻是使用它來修改執行網站的話,就是隻去修改http李阿敏的server模組就可以,修改你的打包目錄,宣告埠,訪問網站,

二、配置檔案的指令解析

1. 全域性塊指令配置

1)配置執行Nginx使用者組 指令是user 只能在全域性塊中配置

語法格式: user user [group]

user(第二個):表示可以執行Nginx伺服器的使用者,group可選項表示執行Nginx伺服器的使用者組;只有被設定了使用者或者使用者組的成員才有許可權啟動Nginx程序。如果非這些使用者就無法啟動,還會報錯;

如果想所有的使用者都可以啟動這可以把當前行註釋掉,或者使用user nobody (預設是註釋掉的)

2)配置worker_process 。只能在全域性塊中配置

這個受軟體,作業系統本身,還有硬體本身等制約,一般和cpu數量相等;

語法格式:worker_process number | auto 

 number:指定Nginx程序最多可以產生的worker process數量,預設配置是1

 auto:設定此值,Nginx程序將自動檢測 

當我們啟動nginx,後使用ps -ef | grep nginx 可以看到除了master的nginx 還有相對應設定數量的worker process。

3)配置Nginx程序PID存放路徑。指令pid 只能在全域性塊中配置

  語法: pid     file  

file是指定存放路徑和檔名稱,預設是logs/nginx.pid。可以放相對和絕對路徑。

4)配置錯誤日誌的存放路徑 ,指令error_log ,可以在全域性塊、http塊、server塊、以及location塊中配置

   語法 error_log  file/stderr [debug | info | notice | warn | error | crit | alert | emerg] ;

  ‘[]’:表示可選 ,‘|’ 表示或者

   file表示檔案 ; stderr 表示輸出檔名稱 ,後面[]中表示資料的日誌級別,當設定某一個級別後,比這一級別高的都會被記錄下來,比如設定warn後| error | crit | alert | emerg都會被記錄下來。預設是error_log logs/error.log error; 指定檔案當前使用者需要有寫許可權

5)配置檔案的引入,指令include 可以在配置檔案的任何地方配置

    當我們需要其他Nginx的配置以及第三方模組的配置引用到當前的主配置檔案中時候就可以使用這個指令 語法 include file 

    file表示要引入的配置檔案,支援相對路徑,引入的檔案對當前使用者需要寫許可權

2.events塊指令配置

6)設定網路連線序列化 只能在events塊設定

    這個是是否開啟“驚群”,當某一時刻請求到來是否喚醒多個睡眠的程序

語法:accept_mutext on | off 

預設是on狀態,

7)設定是否允許同時接收多個網路連線 只能在events塊設定

每一個worker process都有能力接受多個新到達的網路連線。但是需要設定如下指令

 語法:multi_accept on | off

 預設是off狀態,即一個work process一次只能接受一個到達的網路連線

8)事件驅動模型進行訊息處理 只能在events塊設定

用來處理網路訊息,method選擇了理性有select,poll,kqueue,epoll,rtsig,/dev/poll,eventport

語法: user method;

也可以在編譯的時候通過--with-select-module,--without-select-modules設定是否強制編譯select模組到Nginx核心

9)配置最大連線數 只能在events塊設定

用來開啟work process 的最大連線數

語法:worker_connections number 

預設值是512,另外這裡的number不僅僅包含所有和前端的連線數,是包含所有的連線數,另外這裡的number是不能操作作業系統支援開啟的最大檔案控制代碼數量 

3.Http塊指令配置

10)定義MIME-Type ,預設如下 可以在http塊,server和location塊配置

include       mime.types;     //這個是匯入type塊
default_type  application/octet-stream;  //配置處理前端請求的MIME型別

這個是用用識別前端請求資源型別,模式使用的是include mime.type

mime.type中包含了很多資源型別

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;
.....
}

11)自定義服務日誌

    這個是記錄Nginx伺服器提供服務過程應答前端請求的日誌,我們用服務日誌和之前的error_log加以區分。Nginx伺服器支援對服務日誌的格式、大小、輸出等進行配置,需要使用兩個指令,分別是access_log和log_format

a:    access_log指令語法:access_log path [format []buffer=size]          可以在http塊,server塊和location塊中配置

path:配置服務日誌的檔案存放的路徑和名稱

format:可選項,自定義服務日誌的格式字串,也可以通過“格式串的名稱,使用log_format指令定義好的格式,格式串的名稱在log_format中定義

size:配置臨時存放日誌的記憶體快取區大小;

如果要取消服務日誌的功能使用  accesss_log off;

檔案中被註釋的:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
 
access_log  logs/access.log  main;   //這裡的main就是上面log_format中的格式

access_log和log_format是聯合使用的。

b:    log_format的格式  :log_format name string ...;           只能在http塊

name:格式字串的名字,預設是combined。

string:服務日誌的格式字串,在定義的時候可以通過變數獲取相關的內容。

如上所示的“$remote_addr”獲取的是使用者機的ip地址,

“$time_local”獲取的本地時間,

“$request”獲取到的是如GET.... 什麼請求等

“$status”這個是請求狀態

“body_bytes_sent”獲取到的是請求體的大小

“http_referer”指http的referer值,可以為1,0,_等

“http_user_agent”:獲取到使用者使用什麼瀏覽器

例如:日誌如下:

93.157.175.41 - - [14/Oct/2018:14:34:26 +0000] "GET /axis-cgi/jpg/image.cgi HTTP/1.1" 404 168 "1" "Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.9.168 Version/11.51"

12)配置檔案允許sendfile方式傳輸檔案 指令都可以在http塊,server塊和location塊中配置

用於是否開啟或者關閉傳輸檔案,模式是off

a:  語法  sendfile on | off

另外可以設定傳輸的大小

b:  語法:sendfile_max_chunk size;

如果size值大於0,Nginx程序的每一個worker process每次呼叫sendfile()傳輸的資料量最大不能超過這個值如果設定為0,則不限制。預設0;

13)配置連線超時時間 指令都可以在http塊,server塊和location塊中配置

和使用者建立會話連線後,Nginx服務可以保持連線開啟一段時間,指令keepalive_timeout用來設定整個時間

語法:keepalive_timeout timeout [header_timeout]  

timeout:表示服務端對連線保持的時間。預設是75秒

header_timeout:可選項,在應答報文頭部的Keep_Alive域設定超時時間,“Keep_Alive:timeout=header_timeout”.報文中的這個指令可以被Mozilla或者Konqueror識別

例如:

keepalive_timeout 120s 100s;  //含義是伺服器端保持連線的時間是120s,發給使用者端的應答報文頭部中的Keep-Alive域的超時時間設定為100s

14)單鏈接請求數上限 指令都可以在http塊,server塊和location塊中配置

Nginx伺服器和使用者端建立會話連線後,使用者通過此連結傳送請求,指令keepalive_requests用於限制使用者通過某一個連線想Nginx伺服器傳送請求的次數。預設值是100

語法:keepalive_requests number:

4 Server塊指令配置

15)配置網路監聽

配置監聽使用指令listen,方式有三種

方式一:監聽IP地址,

語法:listen address[:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferrred] [accept_filter=filter] [bind] [ssl];

方式二:監聽埠,

語法:listen port [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferrred] [bind] [ipv6only= on | off] [ssl];

方式三:配置UNIX Domain Socket(在原有Socket框架上發展起來的IPC機制)

語法:listen unix:path  [default_server]  [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferrred] [bind]  [ssl];

address:IP地址,如果是IPv6的地址,需要使用“[]”括起來,比如[fe22::1]等

port:埠號,如果只定義了IP地址 沒有定義埠號,就使用80埠

path:socket檔案的路徑,例/var/run/nginx.sock等

default_server,識別符號,將持虛擬主機設定為address:port的預設主機

sertfib=number:使用這變數監聽socket關聯的路由表,目前只對FreddBSD起作用,不常用

backlog=nubmer ,設定監聽函式listen()最多允許多少網路連線同時處於掛起狀態,在FreeBSD中預設是-1,其他平臺預設是511

rcvbug=size,設定監聽socket接受緩衝區的大小

sndbuf=size,設定監聽socket傳送緩衝區的大小

deferred,識別符號,將accept()設定為Deferred模式

accept_filter=filter,設定監聽埠對請求的過濾,被過濾內容是不能被接受和處理。這個指令只在FreeBSD和NetBSD5.0+平臺有效,filter可以設定為dataready或者httpready

bind:表示符,使用獨立的bind()處理此address:port,一般情況下,對於埠相同而IP地址不相同的多個連線,Nginx服務將只能使用一個監聽命令,並使用bind()處理埠相同的所有連線

ssl:識別符號,設定會話連線使用SSL模式進行,此識別符號和Nginx伺服器提供的HTTPS服務相關

常用例子:

listen 123.22.3.10:8000; //監聽具體的IP和具體埠上的連線

listen 123.22.3.10; //監聽具體Ip的所有埠的連線

listen 8000; //監聽具體埠上所有IP的連線,等同與 listen *:8000;

listen 123.22.3.10:8000 default_server backlog=1024; //設定123.22.3.10的連線請求預設由虛擬主機處理,並且允許最多1024網路連接出去掛起狀態。

16)基於名稱的虛擬主機配置

這裡的主機指用server塊對外提供的虛擬主機,設定了主機的名稱並配置好了DNS,使用者就可以使用這個名稱向此虛擬主機發送請求了。配置註解名稱的指令:

語法: server_name name...; //name 可以多個,中間用空格並列

例如:

server_name vison.com  ws.vison.com;  //這裡有兩個虛擬機器名稱,Nginx規定第一個為此虛擬機器主要的名稱

在name中可以使用萬用字元“*”,通常用在三段字串組成的名稱的首段或者尾段,或者兩段字串組成名稱的尾段

    例如server_name *.vison.com www.vison.*  vison.*;

在name中可以使用正則表示式,並使用“~”作為正則表示式字串的開始標記

例如:server_name ~^www\d+\.vison\.com$;  //這個表示用www開頭(“^”標記),緊跟一個或者多個0-9的數字,在緊跟.vison.com("."在正則表示式有特殊含義,需要使用轉義),最後com結束(“$”標記)

這個的名稱我們可以通過www33.vison.com 或者 www.2.vison.com等訪問。

name使用$1,$2...捕獲變數

注意點:從Nginx-0.7.40開始,name的正則表示式支援字串捕獲功能,就是把正則表示式中的某一段作為變數給後面表示式的使用,拾取的標識是一個完整的小括號“()”且後面不緊跟其他正則表示式字元,括號中的內容就是被拾取的內容;一個正則表示式可以存在多個不巢狀的小括號,這些內容依次從左到有存放在$1,$2,$3...中。下文使用時,直接使用這些變數,但是變數的有效區只能在server塊中

例如:server_name ~^www.(.+).com$;

當前伺服器請求www.vison.com時,我們的“vison”就會被記錄到$1中。後面我們需要vison的時候就可以通過$1使用了。

name用正則表示式和萬用字元有可能匹配到相同的配置,那麼當出現的是否怎麼選擇呢:nginx做出如下配置

排在前面的優先處理請求:

      1精確匹配server_name

      2萬用字元在開始時匹配server_name成功

     3萬用字元在結尾時匹配server_name成功

      4正則表示式匹配server_name成功

加粗樣式17) 基於IP的虛擬主機配置

和基於名稱的虛擬配置相同,也是使用server_name配置

例如: server_name 122.12.3.6;

5.location塊指令配置

18)location指令配置

這個location的值是匹配請求連線中的uri

 語法格式:         location [= | ~ | ~* | ^~]  uri  { ... }

a)uri表示待匹配的請求字元,可以是正則或者不是正則字元例如:vison.action 表示標準uri  ; \.action$表示以action結尾url

b) “[]”中括號中的是可選項,用來改變請求字串和uri的匹配方式,

這裡有四種:

“=”  用於標準的uri(沒有使用正則表示式等)前,要求請求字串和uri嚴格匹配,如果匹配成功就停止搜尋並立即處理請求

“~” 用於表示uri包含正則表示式,並且區分大小寫

“~*”,用於表示uri包含正則表示式,並且不區分大小寫 ,

 注意:如果包含uri正則表示式,必須使用“~” 或者 “~*” 標識

“^~” ,用於標準uri(沒有使用正則表示式),要求Nginx伺服器找到表示uri和請求字串匹配度最高的location後,立即使用location處理請求,而不使用location塊中的正則uri和請求字串做匹配。

 注意點:瀏覽器在傳送uri的時候會對部分字元url編碼,例如空格編碼為“%20”,問好編碼為“%3f”等,“^~”它可以對這些符號進行編碼處理。例如如果URI為“/html/%20/data”,則當Nginx可以收到配置“^~ /html/ /data” 同樣也是匹配成功的。

19)配置請求的根目錄 這個通常是在location塊中的配置

   這個通常是在location塊中的配置,當web伺服器接受到網路請求之後,首先需要在伺服器端指定目錄中尋找請求資源,在Nginx伺服器中,指令root就是用來配置這個根目錄的。

語法:root path;

其中path為Nginx伺服器接收到請求以後查詢資源的根目錄路徑,path變數中可以包含Nginx伺服器預設的大多數變數,只用$document_root和$realpath_root不可以使用。

例如:

location   /data/  {
       root  /locationtest1

}

當location塊接收到"/data/index.html" 請求後,將在nginx的“/locationtest1/data/”目錄下找到 index.html響應請求。

20)更改location的uri --轉發

在location塊中,除了使用root指令指明處理根目錄,還可以使用alias指令改變location接受到的URI的請求路徑

語法:alias path;

path:這個就為修改後的根路徑,同樣這個變數可以包含除了$document_root和$realpath_root的變數。

例如:

location ~ ^/data/(.+\.(htm|html))${
 alias /locationtest1/other/$1;

}  //  當location塊接收到“/data/index.html”的請求時,匹配到alias指令的配置,Nginx伺服器將到“locationtest1/other”目錄下找到index.html並響應請求,可以看到,通過alias指令的配置,根路徑已經從/data/ 更改為locationtest1/other了。

21 ) 設定網站的預設首頁

 指令index用來設定網站預設首頁、一般有兩個作用:

一是:使用者在發出請求網站時,請求地址可以不寫首頁名稱

二是:可以對一個請求,根據請求內容而設定不同的首頁

語法結構:index  file ...  ; file變數可以包含多個檔案,中間用空格隔開也可以包含其他變數,預設使用 "index.html";

例子:

location ~ ^ /data/(.+)/web/${
index index.$1.html  index.m1.html index.html 

}  //當location匹配到“/data/locationtest/web” 時,匹配成功,$1的值就為“locationtest”,那麼就會依次尋找這個頁面下的 index.locationtest.html   index.m1.html index.html  ,先找到那個就返回那個。

22) 設定網站的錯誤網頁 可以在http塊,server塊和location塊中配置

如果使用者嘗試檢視某一個網頁出現錯誤時,我們要返回Http錯誤網頁,用我們自定義的網頁顯得跟人性化,一般來說HTTP 2XX表示請求正常 ;HTTP 3XX表示網站重定向 ; HTTP 4XX表示客戶端出現錯誤 ; HTTP 5XX 表示服務端出現錯誤。nginx在設定網站錯誤頁面的指令為error_page。

語法: error_page code ... [=[response] ] uri;

code:表示要處理的HTTP錯誤程式碼,

response:可選項,將code指定的錯誤程式碼轉換為新的錯誤程式碼response

url,錯誤頁面的路徑或者網址地址,如果設定為路徑,則是以Nginx伺服器安裝路徑下的html目錄為根路徑的相對地址,如果設定為網址,nginx伺服器會直接訪問該網址獲取錯誤頁面,並返回給使用者端

例如 

error_page 404 /404.html      //通過 Nginx安裝路徑/html/404.html        響應404錯誤

error_page 404 http:/somewebsite.com      //出現404錯誤,直接響應這個連線

error_page 410=310 /empty.gif            //當產生410HTTP訊息時,使用Nginx安裝路徑/html/empty.gif 返回使用者端310訊息 

如果需要更改error_page 預設的安裝路徑,怎麼修改呢,那麼就需要新增location就可以了。

例如:

locatin  /404.html{
    root  /myserver/errorpages/

}   //首先捕獲到“/404.html頁面”請求,然後將請求定向到新的路徑下面,

23)基於IP配置Nginx的訪問許可權 可以在http塊,server塊和location塊中配置

Nginx配置通過兩種途徑支援基本訪問許可權控制,其中一種是由HTTP標準模組ngx_http_access_module支援的,其通過IP來判斷客戶端是否擁有對Nginx的訪問許可權,

a) allow指令,用於設定允許訪問Nginx的客戶端IP,

 語法: allow address | CIDR | all ;

address:表示允許訪問的客戶端IP,不支援同時設定多個,如果需要多個IP,那麼需要重複使用allow命令

CIDR:允許訪問的客戶端的CIDR地址,如果202.80.18.22/25,前面的32位IP地址,後面“/25”代表該IP地址中前25位網路部分,其餘位表示主機部分。

all:代表允許所有客戶端訪問。

從Nginx 0.8.22 該命令也支援IPv6地址。例如:allow 2301:333:e000::8001;

b) 另一個指令是deny,作用剛好和allow相反,用來禁止訪問Nginx的IP

語法: deny address | CIDR | all ;  

上面的字元解釋類似

24) 基於密碼配置的Nginx的訪問許可權

Nginx支援識別使用者名稱和密碼的方式認證客戶端是否能夠訪問Nginx,這個功能是由HTTP標準模組ngx_http_auth_basic_module支援

a)指令auth_basic ,用來開啟和關閉該認證功能

語法:auth_basic string | off

string:開啟該認證功能,並配置驗證時的指示資訊

off:關閉該驗證功能

b) auth_basic_user_file 用於設定包含使用者名稱和密碼資訊的檔案路徑,

語法:auth_basic_user_file file

file:表示密碼檔案的絕對路徑。檔案中的密碼可以使用明文或者加密後的密碼,

明文如下:

name1:password1

name2:password2:comment

name3:password3

加密密碼可以使用crypt()函式進行加密。