阿里雲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()函數進行加密。