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