摘要:上面的代碼中定義了一個(gè)名為的負(fù)載均衡器,里面有三個(gè)后端服務(wù),他們是按的方式進(jìn)行輪詢(xún)的。在模塊中,可以設(shè)置后端服務(wù)器的信息,同時(shí)還可以設(shè)定每個(gè)后端服務(wù)器在負(fù)載均衡調(diào)度中的狀態(tài)。常用的狀態(tài)有表示當(dāng)前的暫時(shí)不參與負(fù)載均衡。
最近在學(xué)習(xí)如何對(duì) Nginx 進(jìn)行配置,故而對(duì) Nginx 的配置文件的結(jié)構(gòu)功能有了一些新的認(rèn)識(shí)。剛開(kāi)始接觸 Nginx 時(shí),感覺(jué)它的配置十分高深、難以理解,需要配置什么功能都是網(wǎng)上搜索現(xiàn)成的代碼,復(fù)制粘貼,重啟服務(wù)器。雖然也能夠按照預(yù)期來(lái)工作,但是這種做法只是知其然而不知其所以然,不可取。
俗話(huà)說(shuō),好記性不如爛筆頭。現(xiàn)在雖然能力理解看懂,但是過(guò)短時(shí)間之后還能不能記得那就得兩說(shuō)了。
以下是筆記內(nèi)容。
注意:這是針對(duì) Linux 平臺(tái)的筆記,有些內(nèi)容可能對(duì)其他平臺(tái)并不適用!
在安裝完 Nginx 程序之后,執(zhí)行 nginx 可執(zhí)行文件即可啟動(dòng) Nginx 服務(wù)了。一旦啟動(dòng)了服務(wù)之后,我們就可以使用那可執(zhí)行文件帶 -s 參數(shù)來(lái)控制 Nginx 服務(wù)器了,它的語(yǔ)法如下:
nginx -s signal
signal 是以下的信號(hào)之一:
stop 快速停止服務(wù)
quit 優(yōu)雅地停止服務(wù)
reload 重新加載配置文件
reopen 重新打開(kāi)日記文件
例如,重新加載配置文件的命令如下:
nginx -s reload
Nginx 的主進(jìn)程接收到重載配置文件的信號(hào)之后,它會(huì)對(duì)新配置文件進(jìn)行語(yǔ)法檢查并嘗試應(yīng)用所提供的配置文件。如果成功的話(huà),主進(jìn)程會(huì)啟動(dòng)新的工作者進(jìn)程,并且發(fā)送信號(hào)給舊的工作者進(jìn)程,要求他們關(guān)閉。否則的話(huà),主進(jìn)程會(huì)將更新回滾,然后繼續(xù)以舊的配置文件運(yùn)行。
根據(jù)使用的平臺(tái)不同,你的配置文件的路徑也會(huì)不同,大部分情況下它會(huì)在 /etc/nginx/nginx.conf 。如果不在這里,它還可能會(huì)在 /usr/local/nginx/conf/nginx.conf 或 /usr/local/etc/nginx/nginx.conf。
Nginx 的配置文件是按配置塊來(lái)組織的,從結(jié)構(gòu)看起來(lái)一目了然。最外一層是 main 配置塊,它是一個(gè)全局配置的區(qū)域;main 配置塊下面有 events 和 http 配置塊;http 下面又有 upstream 和 server 配置塊;server 里有 location 等配置塊。
從整體結(jié)構(gòu)上來(lái)看,它基本上是這個(gè)樣子:
# main .... events { .... } http { .... upstream myproject { ..... } server { .... location { .... if (test_condition) { ...... } } } server { .... location { .... } } .... }
常用的基本上就這七大塊了:
main 全局配置塊
events 可以配置 Nginx 的工作模式、工作者進(jìn)程連接數(shù)
http http 的相關(guān)配置塊
server 虛擬主機(jī)配置塊
upstream 負(fù)載均衡配置塊
location RUI 匹配快
if 條件判斷塊
在這里配置全局的配置信息,常用的有如下這些:
user nobody nobody; worker_processes 2; error_log /usr/local/var/log/nginx/error.log notice; pid /usr/local/var/run/nginx/nginx.pid; worker_rlimit_nofile 1024;
user 配置 Nginx 工作者進(jìn)程的運(yùn)行用戶(hù),默認(rèn)有 nobody 賬號(hào)運(yùn)行
woker_process 工作者進(jìn)程的數(shù)量
它的最優(yōu)值取決于多種因素,比如 CPU 的核數(shù),保存數(shù)據(jù)的硬盤(pán)驅(qū)動(dòng)的個(gè)數(shù)等等。一般情況下,可以將它設(shè)置為 CPU 的核數(shù)。error_log 錯(cuò)誤日記文件配置
第一個(gè)參數(shù)是錯(cuò)誤日記的文件,第二個(gè)參數(shù)決定了日記的級(jí)別,可選的值有 debug, info, notice, warn, error, crit, alert 或者 emergpid 定義一個(gè)保存主進(jìn)程的進(jìn)程 ID 的文件
worker_rlimit_nofile 這是工作者進(jìn)程的最大文件打開(kāi)數(shù)目
用指定 Nginx 的工作模式和工作模式及連接數(shù)上限,
events { use kqueue; #mac平臺(tái) worker_connections 1024; }
use 指定工作者進(jìn)程的連接方法
一般情況下是不需要設(shè)置這個(gè)的,因?yàn)?Nginx 會(huì)默認(rèn)會(huì)選擇最高效的方法worker_connections 設(shè)置每個(gè)工作進(jìn)程能夠同時(shí)打開(kāi)的最大連接數(shù)
需要注意的是:這個(gè)連接數(shù)是指所有的連接數(shù)(包括與代理服務(wù)器的連接數(shù),還有其它的連接數(shù)),還有一點(diǎn)就是,最大連接數(shù)(worker_connections)的值不能超過(guò)當(dāng)前工作者進(jìn)程能夠打開(kāi)的最大文件數(shù)目(worker_rlimit_nofile)的限制。還有一個(gè)關(guān)于最大客戶(hù)端數(shù)目的計(jì)算問(wèn)題,有些困擾這我。當(dāng)作為 HTTP 服務(wù)器時(shí),Max_clients=worker_processesworker_connections;當(dāng)作為代理服務(wù)器是,Max_clients=worker_processesworker_connections/4,這個(gè)為什么是除以 4 ,而不是 2 呢?
Nginx 的主要功能模塊都是在這里配置的,可以在這里配置 Nginx 作為 HTTP 服務(wù)器,可以在這里配置 Nginx 成為反向代理,也可以在這配置 Nginx 成為負(fù)載均衡器??梢哉f(shuō),這個(gè)配置塊里的配置內(nèi)容至關(guān)重要!
http{ include 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 /usr/local/var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 10; upstream myproject { ..... } server { .... } }
include 將其它的文件包含到配置文件中
default_type 定義一個(gè)相應(yīng)的默認(rèn) MIME 類(lèi)型
log_format 定義日記的格式
access_log 設(shè)置訪(fǎng)問(wèn)日記的路徑、格式
sendfile 啟用或者禁用 sendfile()
tcp_nopush 當(dāng) sendfile 啟用時(shí),該指令才會(huì)生效。
它的作用是啟用或者關(guān)閉在 freeDSB 中使用 TCP_NOPUSH socket 選項(xiàng),或者在 linux 中使用 TCP_CORK socket 選項(xiàng)tcp_nodelay 啟用或者禁用 TCP_NODELAY 選項(xiàng)
只有當(dāng)一個(gè)連接是 keep-alive 狀態(tài)時(shí),該指令才會(huì)生效keepalive_timeout 設(shè)置 keep-alive 連接在服務(wù)端保持打開(kāi)的時(shí)間
第一個(gè)參數(shù)表示鏈接打開(kāi)的時(shí)間,0 表示關(guān)閉 keep-alive 在客戶(hù)端的鏈接;可選的第二個(gè)參數(shù)設(shè)置響應(yīng)頭部的 “Keep-Alive: timeout=time”。這兩個(gè)參數(shù)可以不同
upstream 配置塊用來(lái)定義一組服務(wù),里面的服務(wù)可以監(jiān)聽(tīng)不同的端口。另外,服務(wù)也可以將 TCP 和 UNIX-domain sockets 進(jìn)行混合使用。
upstream backend { server backend1.example.com weight=5; server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; server unix:/tmp/backend3; server backup1.example.com backup; }
上面的代碼中定義了一個(gè)名為 backend 的負(fù)載均衡器,里面有三個(gè)后端服務(wù),他們是按 weight 的方式進(jìn)行輪詢(xún)的。在每七個(gè)請(qǐng)求中,其中的五個(gè)會(huì)分配到 backend1.example.com 服務(wù)器,另外的兩個(gè)請(qǐng)求分別分配給另外兩個(gè)服務(wù)器。
最后還定義了一個(gè)作為備份的服務(wù)器,只有當(dāng)所有的非備份服務(wù)器都掛掉之后才會(huì)請(qǐng)求備份服務(wù)器,所以他的負(fù)載時(shí)最輕的。
在HTTP Upstream模塊中,可以設(shè)置后端服務(wù)器的 socket 信息,同時(shí)還可以設(shè)定每個(gè)后端服務(wù)器在負(fù)載均衡調(diào)度中的狀態(tài)。常用的狀態(tài)有:
down 表示當(dāng)前的 server 暫時(shí)不參與負(fù)載均衡。
backup 預(yù)留的備份機(jī)器。
當(dāng)其他所有的非 backup 機(jī)器出現(xiàn)故障或者忙的時(shí)候,才會(huì)請(qǐng)求 backup 機(jī)器,因此這臺(tái)機(jī)器的壓力最輕。
max_fails 允許請(qǐng)求失敗的次數(shù),默認(rèn)為1。
當(dāng)超過(guò)最大次數(shù)時(shí),返回 proxy_next_upstream 模塊定義的錯(cuò)誤。
fail_timeout,在經(jīng)歷了 max_fails 次失敗后,暫停服務(wù)的時(shí)間。
max_fails 可以和 fail_timeout 一起使用。
Nginx 支持四種負(fù)載均衡的方法,它們分別是 Round-robin 、least_conn、ip_hash 和 hash 。
Round-robin 這是根據(jù)權(quán)重的輪詢(xún)方式,Nginx 默認(rèn)使用這種方法。
upstream backend { server backend1.example.com weight=3; server backend2.example.com; }
least_conn 具有最少活躍連接數(shù)的服務(wù)器將會(huì)被發(fā)送請(qǐng)求。
upstream backend { least_conn; server backend1.example.com; server backend2.example.com; }
ip_hash 根據(jù)客戶(hù)端的 ip 地址來(lái)決定將請(qǐng)求發(fā)送給哪個(gè)服務(wù)器。
upstream backend { ip_hash; server backend1.example.com; server backend2.example.com; }
hash 根據(jù)用戶(hù)自定義的 hash 值來(lái)決定將請(qǐng)求發(fā)送到哪個(gè)服務(wù)器
upstream backend { hash $request_uri consistent; server backend1.example.com; server backend2.example.com; }
server 配置塊是用來(lái)配置虛擬主機(jī)的信息的,可以在這里配置虛擬主機(jī)監(jiān)聽(tīng)的端口,域名,URL 重定向等。
server { listen 8080; server_name localhost 192.168.12.10 www.yangyi.com; # 全局定義,如果都是這一個(gè)目錄,這樣定義最簡(jiǎn)單。 root /var/www; index index.php index.html index.htm; charset utf-8; access_log usr/local/var/log/host.access.log main; aerror_log usr/local/var/log/host.error.log error; .... }
listen 用來(lái)設(shè)置虛擬主機(jī)要監(jiān)聽(tīng)的端口
server_name 設(shè)置虛擬主機(jī)的域名,多個(gè)域名使用空格隔開(kāi)
root 設(shè)置虛擬主機(jī)目錄
index 定義目錄中沒(méi)有指定文件時(shí)的默認(rèn)訪(fǎng)問(wèn)的文件。
服務(wù)器會(huì)根據(jù)指定的順序來(lái)檢查所指定的文件,文件名可以包含變量,最好一個(gè)可以指定絕對(duì)路徑,例如:index index.$geo.html index.0.html /index.html;charset 指定特定的字符集到響應(yīng)頭部的 “Content-Type” 首部。
access_log 設(shè)置訪(fǎng)問(wèn)日記的路徑及格式。
error_log 設(shè)置錯(cuò)誤日記的路徑及格式。
在這里可以針對(duì)指定的請(qǐng)求 URI 來(lái)設(shè)置配置。
location / { root /var/www/; index index.php index.html index.htm; }
root 和 index 指令的作用上面已經(jīng)提到過(guò)了,寫(xiě)在這里和寫(xiě)在 server 里面的區(qū)別是,前者是針對(duì)指定的 URI 生效,后者是全局生效的。
一個(gè) location 可以匹配字符串前綴,也可以匹配正則表達(dá)式。正則表達(dá)式會(huì)以 “~*”(大小寫(xiě)不敏感) 修飾符開(kāi)始,或者以 “~”(大小寫(xiě)敏感) 修飾符開(kāi)始。
為了尋找一個(gè)與當(dāng)前請(qǐng)求匹配的 location,Nginx 首先檢查那些以前綴字符串定義的 location,然后選中其中匹配的前綴最長(zhǎng)的 location 并將其記住。
接著再按照配置文件中定義的順序來(lái)檢查那些以正則表達(dá)式定義的 location,一旦查找到匹配的正則表達(dá)式就馬上停止查找,其相應(yīng)的配置將會(huì)被使用。
如果沒(méi)有找到與之對(duì)應(yīng)的正則表達(dá)式,那么之前匹配的前綴字符串 location 里面的配置將會(huì)被使用。
當(dāng)然,可以使用 “=” 修飾符來(lái)定義一個(gè)對(duì) URI 或者 location 的精確的匹配,Nginx 一旦找到一個(gè)精確匹配,檢查則立馬結(jié)束。舉個(gè)例子,假如 "/" 經(jīng)常被請(qǐng)求,那么定義一個(gè) "location = /" 會(huì)加速這些請(qǐng)求的處理,因?yàn)樵诘谝粋€(gè)比較之后就立馬停止了搜索。
如果最長(zhǎng)的前綴匹配包含有 "^~" 修飾符,那么 Nginx 將不會(huì)再檢查正則表達(dá)式。
可以通過(guò)下面幾個(gè)小例子來(lái)理解上面的內(nèi)容:
location = / { [ configuration A ] } location / { [ configuration B ] } location /documents/ { [ configuration C ] } location ^~ /images/ { [ configuration D ] } location ~* .(gif|jpg|jpeg)$ { [ configuration E ] }
"/" 請(qǐng)求會(huì)匹配配置 A
"/index.html" 會(huì)匹配配置 B
"/documents/document.html" 會(huì)匹配配置 C
"/images/1.gif" 請(qǐng)求會(huì)匹配配置 D
"/documents/1.jpg" 請(qǐng)求將會(huì)匹配配置 E。
對(duì)特定的條件進(jìn)行判斷,如果條件為真則執(zhí)行配置塊里面的配置項(xiàng)。
if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break; }
如果該請(qǐng)求是來(lái)自 IE 瀏覽器的則進(jìn)行重定向到指定的文件夾。
rewrite 將 URI 重定向到另一個(gè) URI
if 指令將會(huì)對(duì)特定的條件進(jìn)行判斷,如果條件為真,大括號(hào)里面的指令將會(huì)執(zhí)行,if 指令里面的配置將會(huì)分配到請(qǐng)求中。if 指令里面的配置將會(huì)繼承上一級(jí)的配置。
條件可以是以下列舉的任意一項(xiàng):
一個(gè)變量名,如果變量的值是空或者 "0" 則為假。
使用 "=" 或者 "!=" 進(jìn)行比較的變量
使用 "~*"(大小寫(xiě)不敏感) 或者 "~"(大小寫(xiě)敏感)的正則表達(dá)式進(jìn)行匹配的變量
使用 "-f" 和 "!-f" 運(yùn)算符來(lái)檢測(cè)文件是否存在
使用 "-d" 和 "!-d" 運(yùn)算符來(lái)檢測(cè)目錄是否存在
使用 "-e" 和 "!-e" 運(yùn)算符來(lái)檢測(cè)文件、目錄或者符號(hào)鏈接是否存在
使用 "-x" 和 "!-x" 運(yùn)算符來(lái)檢測(cè)文件是否可執(zhí)行
例子:
if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break; } if ($http_cookie ~* "id=([^;]+)(?:;|$)") { set $id $1; } if ($request_method = POST) { return 405; } if ($slow) { limit_rate 10k; } if ($invalid_referer) { return 403; }
split_clients
該配置塊可以將服務(wù)器接收到的請(qǐng)求根據(jù)百分比進(jìn)行劃分成幾個(gè)類(lèi)別。因此可以將不同的內(nèi)容提供給不同的客戶(hù)端來(lái)進(jìn)行 A/B 測(cè)試。
map
該配置塊可以根據(jù)一個(gè)變量的值來(lái)設(shè)置另一個(gè)變量的值。
geo
該配置快可以用來(lái)配置一個(gè)映射。
types
這也是用來(lái)配置映射的。
$args 這個(gè)變量等于請(qǐng)求行中的參數(shù),同 $query_string
$content_length 請(qǐng)求頭中的 Content-length 字段
$content_type 請(qǐng)求頭中的 Content-Type 字段
$document_root 當(dāng)前請(qǐng)求在root指令中指定的值
$host 請(qǐng)求主機(jī)頭字段,否則為服務(wù)器名稱(chēng)
$http_user_agent 客戶(hù)端 agent 信息
$http_cookie 客戶(hù)端 cookie 信息
$limit_rate 這個(gè)變量可以限制連接速率
$request_method 客戶(hù)端請(qǐng)求的動(dòng)作,通常為 GET 或 POST
$remote_addr 客戶(hù)端的IP地址
$remote_port 客戶(hù)端的端口
$remote_user 已經(jīng)經(jīng)過(guò) Auth Basic Module 驗(yàn)證的用戶(hù)名
$request_filename 當(dāng)前請(qǐng)求的文件路徑,由root或alias指令與URI請(qǐng)求生成
$scheme HTTP方法(如http,https)。
$server_protocol 請(qǐng)求使用的協(xié)議,通常是 HTTP/1.0 或 HTTP/1.1。
$server_addr 服務(wù)器地址,在完成一次系統(tǒng)調(diào)用后可以確定這個(gè)值
$server_name 服務(wù)器名稱(chēng)
$server_port 請(qǐng)求到達(dá)服務(wù)器的端口號(hào)
$request_uri 包含請(qǐng)求參數(shù)的原始URI,不包含主機(jī)名,如:"/foo/bar.php?arg=baz"
$uri 不帶請(qǐng)求參數(shù)的當(dāng)前 URI,$uri 不包含主機(jī)名,如 "/foo/bar.html"
$document_uri 與 $uri 相同
http://nginx.org/en/docs/
https://www.zybuluo.com/phper/note/89391
https://www.digitalocean.com/community/tutorials/understanding-the-nginx-configuration-file-structure-and-configuration-contexts
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/39650.html
摘要:博客寫(xiě)得差不多了,打算部署到云上因?yàn)樗俣鹊年P(guān)系,不打算部署在上,于是申請(qǐng)了阿里云,環(huán)境是上篇文章提到的位安裝和配置好和,又稍微了解點(diǎn)服務(wù)器的知識(shí)后,打算按這里的方法進(jìn)行部署,思路是用當(dāng)應(yīng)用容器,當(dāng)反向代理安裝安裝非常簡(jiǎn)單,一條命令就解決了測(cè) 博客寫(xiě)得差不多了,打算部署到云上因?yàn)樗俣鹊年P(guān)系,不打算部署在AWS上,于是申請(qǐng)了阿里云,環(huán)境是上篇文章提到的CentOS 7 64位安裝和配置好P...
摘要:筆記這周學(xué)習(xí)安裝和配置和,為測(cè)試做準(zhǔn)備。該軟件由創(chuàng)建,并于年首次公開(kāi)發(fā)布。同名公司成立于年,以提供支持。從年月開(kāi)始,的開(kāi)發(fā)由贊助,而年月至年月期間,其開(kāi)發(fā)由贊助。最后發(fā)現(xiàn)是因?yàn)橹械闹械膽?yīng)該為大寫(xiě)將其改為及解決了此問(wèn)題。 筆記 這周學(xué)習(xí)安裝和配置nginx和redis,為測(cè)試做準(zhǔn)備。showImg(https://segmentfault.com/img/bVbpdYF?w=660&h=...
摘要:搭建服務(wù)器因?yàn)檫@次我們實(shí)際上有在線(xiàn)安裝和離線(xiàn)安裝的不同的需求。參數(shù)可選需要重啟生效。改為后,顯示出文件的大概大小,單位是或者或者而默認(rèn)為,顯示的文件時(shí)間為時(shí)間。 Nginx搭建repo服務(wù)器 因?yàn)檫@次我們實(shí)際上有在線(xiàn)安裝和離線(xiàn)安裝的不同的需求。所以我們同時(shí)采用了兩種方法來(lái)安裝nginx。 1. 在線(xiàn)安裝nginx 安裝nginx對(duì)應(yīng)的源 rpm -Uvh http://nginx.or...
摘要:時(shí)間年月日星期六說(shuō)明本文部分內(nèi)容均來(lái)自慕課網(wǎng)。必填用于執(zhí)行命令,當(dāng)執(zhí)行完畢后,將產(chǎn)生一個(gè)新的文件層??蛇x指定此鏡像啟動(dòng)時(shí)默認(rèn)執(zhí)行命令??蛇x用于指定需要暴露的網(wǎng)絡(luò)端口號(hào)。可選向鏡像中掛載一個(gè)卷組。 時(shí)間:2017年09月16日星期六說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com 教學(xué)源碼:無(wú) 學(xué)習(xí)源碼:無(wú) 第一章:課程簡(jiǎn)介 1-1 課程介紹 Docke...
閱讀 1663·2021-09-22 15:25
閱讀 1544·2021-09-07 10:06
閱讀 3214·2019-08-30 15:53
閱讀 1118·2019-08-29 13:12
閱讀 3416·2019-08-29 13:07
閱讀 762·2019-08-28 18:19
閱讀 2306·2019-08-27 10:57
閱讀 1018·2019-08-26 13:29