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