摘要:據(jù)統(tǒng)計(jì),截至年月,有商業(yè)網(wǎng)站使用做服務(wù)器或做代理,比如有有一個(gè)主進(jìn)程和幾個(gè)進(jìn)程。主進(jìn)程的作用是讀取并執(zhí)行配置,并維護(hù)進(jìn)程。進(jìn)程是實(shí)際處理請(qǐng)求的進(jìn)程。簡(jiǎn)單指令由指令名參數(shù)組成,指令名和參數(shù)間用空格隔開,最后以分號(hào)結(jié)束。
nginx入門 安裝(centos7)本文是官網(wǎng)文檔的入門學(xué)習(xí)筆記,官網(wǎng)鏈接:Beginner Guide
1) 配置yum源:vi /etc/yum.repos.d/nginx.repo
2) 按i進(jìn)入vi工具的編輯模式,輸入下面的yum配置:
[nginx] name=nginx repo baseurl=http://nginx.org/packages/OS/OSRELEASE/$basearch/ gpgcheck=0 enabled=1
其中baseurl部分,需要替換實(shí)際的參數(shù):
“OS” 換成 “rhel” 或 “centos”,
“OSRELEASE” 換成 “6” 或 “7”
由于我用的是centos7,所以baseurl=http://nginx.org/packages/centos/7/$basearch/
3) 按esc退出編輯模式,按:進(jìn)入命令模式,輸入wq,寫入內(nèi)容并退出vi工具。
4) 安裝:yum install -y nginx
nginx(讀作engine x)是一個(gè)HTTP服務(wù)器,也可以用作反向代理服務(wù)器、郵件代理服務(wù)器。作者是Igor Sysoev。俄羅斯很多指明網(wǎng)站如Yandex、 Mail.Ru、 VK、Rambler都長(zhǎng)期使用nginx。據(jù)Netcraft統(tǒng)計(jì),截至2017年9月,有29.38%商業(yè)網(wǎng)站使用ngnix做服務(wù)器或做代理,比如有:Dropbox、Netflix、Wordpress.com、FastMail.FM
nginx有一個(gè)主進(jìn)程和幾個(gè)worker進(jìn)程。主進(jìn)程的作用是讀取并執(zhí)行配置,并維護(hù)worker進(jìn)程。worker進(jìn)程是實(shí)際處理請(qǐng)求的進(jìn)程。
nginx采用事件驅(qū)動(dòng)模型和基于系統(tǒng)的一些機(jī)制來(lái)高效分發(fā)請(qǐng)求給多個(gè)worker進(jìn)程。worker進(jìn)程的數(shù)量可以在配置文件中配置。
nginx的配置文件默認(rèn)名稱是nginx.conf,一般在以下這些目錄中可以找到:
/usr/local/nginx/conf
/etc/nginx
/usr/local/etc/nginx
啟動(dòng)、停止、重新加載配置可以直接運(yùn)行nginx命令啟動(dòng),nginx啟動(dòng)后,可以通過(guò)一下的語(yǔ)法來(lái)控制nginx:
nginx -s signal
上面的s代表signal,信號(hào)的意思
signal可以是以下的值:
stop — 快速地關(guān)閉
quit — 優(yōu)雅地關(guān)閉
reload — 重新加載配置文件
reopen — 重新打開日志文件
例如,如果需要等待所有worker進(jìn)程完成請(qǐng)求之后停止nginx,可以執(zhí)行一下的命令:
nginx -s quit
假如您是使用userA帳號(hào)登錄linux后啟動(dòng)nginx的,您應(yīng)該同樣使用userA帳號(hào),而不是userB、userC
如果修改了配置文件,需要發(fā)送以下命令重新加載配置,否則配置不會(huì)生效:
nginx -s reload
當(dāng)主進(jìn)程收到重新加載配置的命令后,主進(jìn)程會(huì)檢查配置文件的語(yǔ)法并嘗試應(yīng)用新的配置。
如果成功了,主進(jìn)程會(huì)啟動(dòng)一個(gè)新的worker進(jìn)程,并發(fā)送消息給舊的worker進(jìn)程,讓舊的worker進(jìn)程關(guān)閉。
如果不成功,主進(jìn)程會(huì)回滾到舊的配置,并繼續(xù)用舊的配置繼續(xù)運(yùn)行。
至于收到關(guān)閉命令的舊worker進(jìn)程,會(huì)停止接收新的連接,處理完所有剩下的請(qǐng)求后,舊的worker進(jìn)程就會(huì)結(jié)束。
另外,使用Unix系統(tǒng)提供的kill命令也可以向nginx進(jìn)程發(fā)送關(guān)閉的信號(hào)(用進(jìn)程id)。進(jìn)程id默認(rèn)是記錄在/usr/local/nginx/logs或/var/run目錄下的nginx.pid文件中,知道了進(jìn)程id之后(假如進(jìn)程id是1628),就可以這樣輸入命令:
kill -s QUIT 1628
如果需要知道所有正在運(yùn)行的nginx進(jìn)程,可以使用ps命令:
配置文件的結(jié)構(gòu)ps -ax | grep nginx
nginx是由模塊組成的,這些模塊是通過(guò)在配置文件中聲明的指令來(lái)控制的。指令有兩種:簡(jiǎn)單指令(單條語(yǔ)句)和塊指令(代碼塊)。
簡(jiǎn)單指令由指令名、參數(shù)組成,指令名和參數(shù)間用空格隔開,最后以分號(hào)(;)結(jié)束。
塊指令跟簡(jiǎn)單指令結(jié)構(gòu)一樣,但是區(qū)別就是塊指令不以分號(hào)結(jié)束,而是用花括號(hào)( { 和 } )括起來(lái)。
如果一個(gè)塊指令可以在花括號(hào)內(nèi)包含其它指令,那這個(gè)塊指令叫context(例如:events, http, server, and location)。
在配置文件中,寫在context以外的的指令,就是在main context中。比如下面的代碼,events和http指令屬于main context,http中有server,server中有l(wèi)ocation。
events{ ... } http{ server{ location{ ... } } }
在配置文件中,井號(hào)#開頭的就是注釋。
通過(guò)vi /etc/nginx/nginx.conf打開配置文件,nginx配置文件內(nèi)容如下:
user nginx; worker_processes 1; //<--簡(jiǎn)單指令 error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events {//<--塊指令 worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; 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 /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; }配置靜態(tài)資源服務(wù)器
web服務(wù)器的一個(gè)重要功能是對(duì)外提供文件訪問(wèn)服務(wù),如圖片或靜態(tài)html頁(yè)面。接下來(lái),我們將實(shí)現(xiàn)這樣一個(gè)功能:
假設(shè)nginx所在的服務(wù)器有以下目錄:
/data/www目錄,用于存放html文件,請(qǐng)自行放一個(gè)index.html靜態(tài)html文件進(jìn)去
/data/images目錄,用于存放的是圖片,請(qǐng)自行放一些圖片進(jìn)去
我們需要設(shè)置nginx響應(yīng)外部的請(qǐng)求,把這些目錄下的文件提供對(duì)外訪問(wèn)。我們需要在配置文件的http塊中設(shè)置一個(gè)server塊,并在server塊中設(shè)置兩個(gè)location塊。完整的代碼如下:
http{ server { location / { root /data/www; } location /images/ { root /data; } } }
默認(rèn)情況下,nginx會(huì)監(jiān)聽(tīng)80端口,因此無(wú)需在server塊中配置端口80。
http下一般會(huì)有多個(gè)server配置,這些server塊可以用端口和名稱來(lái)區(qū)分。
當(dāng)nginx確定了采用哪個(gè)server來(lái)處理請(qǐng)求,nginx會(huì)拿到請(qǐng)求頭中的URI信息,與location指令的參數(shù)來(lái)匹配。
如下圖,就顯示了請(qǐng)求頭中的請(qǐng)求路徑信息:
在下面這段代碼中:
location / { root /data/www; }
location是一條指令,/是指令的參數(shù),location /的含義是:聲明一個(gè)前綴,這個(gè)前綴會(huì)與請(qǐng)求頭中的URI信息進(jìn)行匹配(上面截圖)。對(duì)于匹配的請(qǐng)求,URI路徑會(huì)追加到root指令聲明的參數(shù)后,組成服務(wù)器端文件的路徑,即:/data/www`。
再看一些例子來(lái)理解一下:
示例1:
location: /
root: /data/www
請(qǐng)求:http://127.0.0.1 (URI是"",匹配到location /)
服務(wù)器文件路徑:root的參數(shù) + URI = /data/wwww + "" = /data/www
示例2:
location: /
root: /data/www
請(qǐng)求:http://127.0.0.1/images/test1.jpg (URI是"/images/test1.jpg",匹配到location /)
服務(wù)器文件路徑:root的參數(shù) + URI = /data/wwww + "/images/test1.jpg" = /data/wwww/images/test1.jpg
示例3:
location: /images/
root: /data
請(qǐng)求:http://127.0.0.1/images/test1.jpg (URI是"/images/test1.jpg",匹配到location /images/)
服務(wù)器文件路徑:root的參數(shù) + URI = /data+ "/images/test1.jpg" = /data/images/test1.jpg
一定要看清楚上面2和3的區(qū)別??!服務(wù)器端文件路徑是由root的參數(shù)和請(qǐng)求的URI拼出來(lái)的,而不是root的參數(shù)和location的參數(shù),location的參數(shù)是用來(lái)匹配請(qǐng)求的
注意:如果有多個(gè)匹配的location,nginx會(huì)選前綴最長(zhǎng)的那個(gè)。如下面這段代碼:
location / { root /data/www; } location /images/ { root /data; }
當(dāng)請(qǐng)求http://127.0.0.1/images/test1.jpg時(shí),上面兩個(gè)location都能匹配到URI:/images/test1.jpg。但是由于/images/比/長(zhǎng),所以nginx最終會(huì)匹配到location /images/。
注意,這個(gè)配置:
location /images/ { root /data; }
如果請(qǐng)求是 http://localhost/images/test1.jpg ,由于匹配到/images/,在服務(wù)器上的文件路徑應(yīng)該是 root的參數(shù) + 請(qǐng)求的URI ,即:/data + /images/test1.jpg = /data/images/test1.jpg
加載新配置如果你未啟動(dòng)nginx,啟動(dòng)后就可以應(yīng)用新的配置了。如果nginx已經(jīng)啟動(dòng),需要執(zhí)行以下命令讓nginx加載新的配置:
nginx -s reload
如果nginx出現(xiàn)問(wèn)題了,你可以在/usr/local/nginx/logs或/var/log/nginx目錄下找到access.log和error.log,看日志找原因。
完整配置示例:
user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; 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 /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; server{ location / { root /data/www; } location /images/ { root /data; } } include /etc/nginx/conf.d/*.conf; }配置代理服務(wù)器
nginx作為代理服務(wù)器的時(shí)候,它扮演的是一個(gè)中間角色(proxy)。負(fù)責(zé)接收客戶端(client)的請(qǐng)求,代理請(qǐng)求到目標(biāo)服務(wù)器(target),接收目標(biāo)服務(wù)器的響應(yīng),最后把響應(yīng)發(fā)送給客戶端。其交互過(guò)程如下圖:
proxied |--------| request |--------| request |--------| | |------------>| |------------>| | | client | | proxy | | target | | |<------------| |<------------| | |--------| response |--------| response |--------|
例子:
需求:
假如瀏覽器請(qǐng)求http://localhost/,則把請(qǐng)求代理到http://localhost:8080/
假如瀏覽器請(qǐng)求http://localhost/test5.jpg,則不做代理,直接響應(yīng)本機(jī)的/data/images/test5.jpg
實(shí)現(xiàn):
# 省略其它代碼... http { # 省略其它代碼... #gzip on; server{ listen 8080; root /data/up1; location / { } } server{ location / { proxy_pass http://localhost:8080; } location ~ .(gif|jpg|png)$ { root /data/images; } } include /etc/nginx/conf.d/*.conf; }
代碼解釋:
代碼段1:server{ listen 8080; root /data/up1; location / { } }
代碼段1的作用是聲明一個(gè)server,監(jiān)聽(tīng)8080端口(listen指令是用來(lái)監(jiān)聽(tīng)的端口的,由于nginx默認(rèn)是監(jiān)聽(tīng)80端口,默認(rèn)監(jiān)聽(tīng)80端口則可以省略不寫)。
root /data/up1一行聲明把所有發(fā)送到8080端口的請(qǐng)求都用/data/up1目錄下的內(nèi)容來(lái)響應(yīng)(請(qǐng)自行在/data/up1目錄下創(chuàng)建測(cè)試用的index.html文件)。
請(qǐng)注意,root /data/up1是寫在server塊中,而不是location塊中。
當(dāng)我們配置了一個(gè) location / { },location塊中沒(méi)有root指令,那這個(gè)location就會(huì)用server塊下的root /data/up1的配置。
這個(gè)有點(diǎn)繞,但是這里是為了說(shuō)明特殊情況。一般我們用這樣就可以:
server{ listen 8080; location / { root /data/up1; } }代碼段2:
server{ location / { proxy_pass http://localhost:8080; } location ~ .(gif|jpg|png)$ { root /data/images; } }
代碼段2聲明了另一個(gè)server,監(jiān)聽(tīng)80端口(不是代碼段1中的8080端口了!)。
然后,映射了兩種不同的請(qǐng)求路徑:
1) location /,如果匹配到這個(gè)路徑的請(qǐng)求,那將會(huì)將請(qǐng)求代理到8080端口。
比如:
請(qǐng)求:http://localhost/(request-A),匹配到location /,就會(huì)再發(fā)送一個(gè)請(qǐng)求(request-B):http://localhost:8080/。
然后代碼段1配置的location /就會(huì)匹配到該請(qǐng)求(request-B),就會(huì)響應(yīng)/data/up1/index.html。
2) location ~ .(gif|jpg|png)$,用于匹配.gif、.jpg、.png后綴的圖片請(qǐng)求。
比如:
請(qǐng)求http://localhost/test5.jpg,在兩個(gè)location中會(huì)匹配到第二個(gè)(location ~ .(gif|jpg|png)$),因?yàn)榈诙€(gè)location的前綴比第一個(gè)location的前綴長(zhǎng)。
因此請(qǐng)求不會(huì)代理到http://localhost:8080,而是直接響應(yīng)配置的/data/images目錄下的test5.jpg文件(請(qǐng)自行添加測(cè)試圖片文件)
另外,還需要注意:location ~ .(gif|jpg|png)$用了正則表達(dá)式來(lái)匹配請(qǐng)求,location指令使用正則表達(dá)式,必須跟著一個(gè)波浪~符號(hào)做正則表達(dá)式的開頭。
配置好之后,記得重新加載配置:nginx -s reload
文字看不懂就看圖吧當(dāng)請(qǐng)求http://localhost/是,發(fā)生的代理過(guò)程如下:
|---------| http://localhost/ |------------------------------------------------| | A |----------------------->| B |----B同時(shí)是proxy和target | client | | match server at port 80 `location /` | | | | ? | | | | ?proxy to `http://localhost:8080` | | | | ? | | | | match server at port 8080 `location /` | | | | ? | | | | ?serve default index.html file | | | | ? | | |<-----------------------| /data/up1/index.html | |---------| /data/up1/index.html |------------------------------------------------|
當(dāng)請(qǐng)求http://localhost/test5.jpg是,沒(méi)有發(fā)生的代理,其響應(yīng)過(guò)程如下:
|---------| http://localhost/test5.jpg |--------------------------------------------------------| | A |--------------------------->| B | | client | | match server at port 80 `location ~ .(gif|jpg|png)$` | | | | ? | | | | ?serve match image file | | | | ? | | |<---------------------------| /data/images/test5.jpg | |---------| /data/images/test5.jpg |--------------------------------------------------------|
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/39654.html
摘要:從命名上就知道這是一篇簡(jiǎn)單粗暴的新手入門教程,為什么要簡(jiǎn)單粗暴我認(rèn)為有自學(xué)能力的人幫他入門就夠了,不能自學(xué)的一時(shí)半會(huì)兒也教不會(huì),不符合入門教程的初衷,建議出門左拐去找找視頻教程本章目標(biāo)大概了解是個(gè)什么玩意知道常用的指令參數(shù)能啟動(dòng)一個(gè)容器不然 從命名上就知道這是一篇簡(jiǎn)單粗暴的docker新手入門教程, 為什么要簡(jiǎn)單粗暴? 我認(rèn)為有自學(xué)能力的人幫他入門就夠了, 不能自學(xué)的一時(shí)半會(huì)兒也教不會(huì)...
摘要:還是回到萬(wàn)能的文件,添加匹配規(guī)則實(shí)現(xiàn)代理轉(zhuǎn)發(fā)設(shè)置代理轉(zhuǎn)發(fā)通過(guò)上面的設(shè)置,在重啟服務(wù),可以讓頁(yè)面中所有包含字段的請(qǐng)求都轉(zhuǎn)為由服務(wù)器去向地址發(fā)送請(qǐng)求,從而巧妙的解決了瀏覽器的跨域問(wèn)題。 1.Nginx入門與基本操作篇 注:由于服務(wù)器是windows系統(tǒng),所以本文主要講解Nginx在windows下的操作。 首先下載Nginx 解壓縮,我們所有的配置基本都在萬(wàn)能的 nginx/conf/...
上篇文章和大家聊了 Spring Session 實(shí)現(xiàn) Session 共享的問(wèn)題,有的小伙伴看了后表示對(duì) Nginx 還是很懵,因此有了這篇文章,算是一個(gè) Nginx 掃盲入門吧! 基本介紹 Nginx 是一個(gè)高性能的 HTTP 和反向代理 web 服務(wù)器,同時(shí)也提供了 IMAP/POP3/SMTP 服務(wù)。 Nginx 是由伊戈?duì)枴べ愃饕驗(yàn)槎砹_斯訪問(wèn)量第二的 Rambler.ru 站點(diǎn)開發(fā)...
摘要:即別名,與的匹配規(guī)則稍有不同。與的區(qū)別只能作用在中,而可以存在和中。后面必須要用結(jié)束,否則會(huì)找不到文件,而則對(duì)可有可無(wú)。 Nginx 安裝與配置規(guī)則入門 nginx 安裝與運(yùn)行 (Mac OS環(huán)境) nginx 規(guī)則配置入門 一些命令行的配置 一、nginx 安裝與運(yùn)行 (Mac OS環(huán)境) 1. 安裝 nginx 可通過(guò) Homebrew 可直接安裝: $brew install...
閱讀 3888·2021-10-08 10:05
閱讀 2973·2021-09-27 13:57
閱讀 2697·2019-08-29 11:32
閱讀 1022·2019-08-28 18:18
閱讀 1315·2019-08-28 18:05
閱讀 2000·2019-08-26 13:39
閱讀 878·2019-08-26 11:37
閱讀 2060·2019-08-26 10:37