柚子快報激活碼778899分享:網(wǎng)絡 運維 Nginx
柚子快報激活碼778899分享:網(wǎng)絡 運維 Nginx
什么是nginx?
是一個高性能的負載均衡服務器,處理并發(fā)能力強、效率高內(nèi)存消耗小:開啟10nginx服務才占150M內(nèi)存。運行時間長:即使運行數(shù)月也不需要重新啟動,還能在不間斷服務的情況下進行軟件版本的升級
nginx模塊講解
nginx主要分為三個模塊:全局塊、events塊、http塊。 其中http塊又由server塊、location塊、upstream塊組成
# 全局塊:定義影響全局的配置,如用戶、worker進程數(shù)量、錯誤日志等
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768; # 每個worker進程的最大連接數(shù)
}
http {
# http塊:定義HTTP服務器的配置,如mime類型、日志、壓縮等
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;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
# server塊:定義虛擬主機的配置,每個server塊代表一個虛擬主機
server {
listen 80; # 監(jiān)聽端口
server_name example.com; # 服務器域名
# location塊:定義URL匹配的處理規(guī)則
location / {
root /var/www/html; # 根目錄
index index.html index.htm; # 默認文件
}
location /images/ {
root /var/www/data; # 指定目錄
}
# 配置反向代理
location /proxy/ {
proxy_pass http://backend_servers; # 轉發(fā)到后端服務器池
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# 定義后端服務器池
upstream backend_servers {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
}
全局塊
主要定義一些全局屬性。如worker進程數(shù)、日志等全局屬性
user www-data; # 定義運行NGINX進程的用戶
worker_processes auto; # 自動檢測并設置worker進程數(shù)
pid /run/nginx.pid; # 定義存儲進程ID文件的位置
include /etc/nginx/modules-enabled/*.conf; # 包含額外的模塊配置
events塊
主要定義nginx的worker進程的最大連接數(shù)
events {
worker_connections 768; # 每個worker進程的最大連接數(shù)
}
http塊
定義所有與http服務(服務/應用)的相關配置;如連接超時時間。可以包含多個server塊,每個server代表一個服務
http {
include /etc/nginx/mime.types; # 包含mime類型定義
default_type application/octet-stream; # 默認的mime類型
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; # 提高TCP傳輸效率
tcp_nodelay on; # 減少TCP延遲
keepalive_timeout 65; # 連接保持的超時時間
types_hash_max_size 2048; # 提高mime類型的哈希表大小
include /etc/nginx/conf.d/*.conf; # 包含額外的配置文件
include /etc/nginx/sites-enabled/*; # 包含虛擬主機配置文件
server塊
定于一個服務的相關配置。一個server塊包含多個location塊。每個location定義特定URL的處理規(guī)則。
server {
listen 80; # 監(jiān)聽80端口
server_name example.com; # 定義虛擬主機的域名
location / {
root /var/www/html; # 定義根目錄
index index.html index.htm; # 默認文件
}
location /images/ {
root /var/www/data; # 定義/images/路徑的目錄
}
location /proxy/ {
proxy_pass http://backend_servers; # 配置反向代理
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
upstream塊
定義和管理后端服務器,用于負載均衡和反向代理
upstream backend_servers {
server backend1.example.com; # 定義后端服務器1
server backend2.example.com; # 定義后端服務器2
server backend3.example.com; # 定義后端服務器3
}
}
worker進程
nginx采用的是多進程架構;主要由一個主進程(master process)和多個worker進程組成,每個worker進程互相隔離,單獨處理請求。
主進程
負責管理(啟動、停止)所有worker進程,同時將請求路由分發(fā)給worker進程讀取和驗證配置文件處理系統(tǒng)相關級別工作(如重載配置,重啟服務)
worker進程
各個worker進程相互隔離,獨立處理客戶端請求。每個woker進程只有一個線程來進行工作。采用異步、非阻塞的事件驅動模型來處理連接和請求
流程:
啟動:nginx啟動時,主進程加載全局配置信息,并啟動對應數(shù)量的worker進程請求處理:客戶端請求到達時,主進程將請求分發(fā)worker進程,worker根據(jù)連接請求轉發(fā)到目標服務中。
示例配置解釋
# 全局塊
user www-data; # 定義運行NGINX進程的用戶
worker_processes auto; # 自動設置worker進程數(shù)量,通常設置為CPU核心數(shù)
pid /run/nginx.pid; # 定義存儲主進程ID文件的位置
events {
worker_connections 768; # 每個worker進程的最大連接數(shù)
}
連接:表示TCP或者websocket連接(nginx支持websocket)。連接的超時時間在http塊中定義
http {
# 全局配置
keepalive_timeout 65; # 保持連接的超時時間為65秒
keepalive_requests 100; # 每個連接最多處理100個請求
}
異步非阻塞事件處理機制
為什么都說nginx的性能高,其實nginx內(nèi)部是采用多進程架構+異步非阻塞事件處理機制。 線程一直持續(xù)工作,減少了大量的CPU上下文切換。
異步非阻塞事件處理機制:
線程是進程的執(zhí)行單元,線程獲取CPU使用權就會執(zhí)行任務(代碼)。但是線程在執(zhí)行過程因為某些情況會放棄CPU使用權,進入阻塞狀態(tài)。
示例1 線程執(zhí)行I/O(網(wǎng)絡I/O)任務時,線程會阻塞放棄CPU使用權,并等待I/O任務完成,重新等待CPU調(diào)用。示例2 線程獲取鎖資源時,會進行阻塞放棄CPU使用權,直到當前線程獲取鎖后,再次等待CPU調(diào)度。
這兩個實例中,線程在執(zhí)行過程中都會阻塞,會偷懶,不再往后執(zhí)行相關代碼,直到阻塞消失(I/O完成,獲取到鎖)。在這種情況下 線程執(zhí)行任務會非常慢。 那有沒有一種辦法 讓線程一直工作不讓線程阻塞(偷懶)。這種辦法就叫做 異步非阻塞事件處理機制
假設當前有多個請求進入到同一個worker進程中。 異步非阻塞:當?shù)谝粋€請求被處理時,線程不會一直等待該請求結果,而是直接處理其它請求,當?shù)谝粋€請求完成接收到結果后,線程再來處理該請求。這樣可以更好地利用系統(tǒng)資源,提高處理效率。
詳細步驟:
當有多個請求同時發(fā)送時,nginx的主進程會將請求分發(fā)不同worker進程或者是同一個worker進程進行處理worker進程都有一個循環(huán)監(jiān)聽事件,一個單獨的線程,線程請求發(fā)送給目標服務,就會立馬處理其它請求當目標服務處理完成請求后,會響應給nginx(具體worker進程),循環(huán)監(jiān)聽事件監(jiān)聽到了響應,就會告知線程處理響應。這樣就會提高線程的執(zhí)行效率.根據(jù)相關配置,關閉連接。
總結:請求會分發(fā)給多個worker進程,實際上同一時間還是有多個線程處理請求(并發(fā)處理請求)。只不過這些線程來自不同的進程,又因為線程不會休息,新的請求進來時很快就被處理,執(zhí)行效率快,所以并發(fā)能力也會提高。
參考鏈接:太詳細了!Java語言異步非阻塞模式(原理篇)
nginx監(jiān)聽規(guī)則
在server模塊經(jīng)常能看到這個屬性:listen、server_name
server {
listen 80; # NGINX監(jiān)聽80端口
server_name example.com;
location /image/{
root /home/image/;
expires 30d;
}
# 定義所有請求的處理規(guī)則
location / {
# 將請求轉發(fā)到目標網(wǎng)站
proxy_pass http://testServer.com:8848;
# 設置代理請求的頭部信息
# 將請求的Host頭部信息設置為客戶端請求中的Host
proxy_set_header Host $host;
# 將客戶端的IP地址傳遞給目標服務器
proxy_set_header X-Real-IP $remote_addr;
# 將客戶端的真實IP地址包含在請求的X-Forwarded-For頭部中
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
listen:表示監(jiān)聽的端口,通常為nginx所在服務器的端口 server_name:表示監(jiān)聽的IP/域名,通常為nginx所在服務器
在我們前端應用中,通常是指定具體的后端服務器IP進行交互,如testServer.com:8848/list。 但是部署到nginx后,項目是不需要指定后端服務器,nginx根據(jù)url會自動將請求路由到后端服務器。如下:
發(fā)送請求 example.com:80/image/xx.jpg 。就會從nginx所在服務器的/home/image/ 目錄下找 發(fā)送請求 example.com:80/list;就會轉發(fā)給testServer.com服務器。url就變成了testServer.com:8848/list
正向代理
代理對象是 客戶端 ;當客戶端想要訪問某一網(wǎng)站(服務器)時,nginx就會代理客戶端去發(fā)送請求,同時隱藏客戶端IP地址。 流程:
發(fā)送請求要目標網(wǎng)站(服務器)時,nginx會攔截請求并生成代理服務器,由它去與目標網(wǎng)站進行交互代理服務器將請求發(fā)送給目標網(wǎng)站目標網(wǎng)站返回響應給代理服務器代理服務器返回給客戶端 在服務器角度,與我交互的是代理服務器,所以我并不知道客戶端的IP地址
示例:客戶端通過監(jiān)聽端口發(fā)送請求到 example.com 網(wǎng)站,就會生成代理服務器與服務器進行交互,同時可以選擇是否隱藏真實IP地址。
# 定義代理服務器監(jiān)聽的端口
server {
listen 8080;
# 定義所有請求的處理規(guī)則
location / {
# 將請求轉發(fā)到目標網(wǎng)站
proxy_pass http://example.com;
# 設置代理請求的頭部信息
# 將請求的Host頭部信息設置為客戶端請求中的Host
proxy_set_header Host $host;
# 將客戶端的IP地址傳遞給目標服務器
proxy_set_header X-Real-IP $remote_addr;
# 將客戶端的真實IP地址包含在請求的X-Forwarded-For頭部中
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
反向代理
代理對象是 服務器;一個大的網(wǎng)站,通常會有多個服務器來處理請求,保證服務的高可用性。nginx就代理這些服務器,當檢測到有請求要進入到網(wǎng)站時,就會為網(wǎng)站生成一個代理服務器,并根據(jù)負載均衡策略決定將請求路由到哪個服務器中。
流程:
客戶端發(fā)送請求給目標網(wǎng)站,nginx會生成代理服務器nginx根據(jù)負載均衡策略,決定將請求路由到具體服務器中。同時隱藏真實服務器IP服務器處理請求并將響應結果返回給代理服務器。代理服務器將響應結果放回給客戶端。 在客戶端角度,與我交互的是代理服務器,我并不知道請求路由到哪個具體的服務器(IP)中
示例: 一個大型網(wǎng)站有很多后端服務器處理用戶請求,通過反向代理服務器分發(fā)請求以提高性能和安全性
# 定義代理服務器監(jiān)聽的端口
server {
listen 80;
# 定義所有請求的處理規(guī)則
location / {
# 將請求轉發(fā)到后端服務器池
proxy_pass http://backend_servers;
# 設置代理請求的頭部信息
# 將請求的Host頭部信息設置為客戶端請求中的Host
proxy_set_header Host $host;
# 將客戶端的IP地址傳遞給后端服務器
proxy_set_header X-Real-IP $remote_addr;
# 將客戶端的真實IP地址包含在請求的X-Forwarded-For頭部中
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# 定義后端服務器池
upstream backend_servers {
# 定義多個后端服務器
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
反向代理通常會使用 upstream 指令來定義和管理后端服務器。 其實在上方反向代理示例中,也有使用正向代理來代理客戶端。
正向、反向代理區(qū)別:從nginx配置文件中來看就是是否使用了 upstream 指令
nginx解決跨域
nginx采用CORS策略來跨域。
server {
listen 80;
server_name example.com;
location / {
# 允許所有來源的跨域請求
add_header Access-Control-Allow-Origin *;
# 允許指定的請求方法
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS, HEAD";
# 允許攜帶認證信息
add_header Access-Control-Allow-Credentials true;
# 允許指定的請求頭字段
add_header Access-Control-Allow-Headers "Authorization, Origin, X-Requested-With, Content-Type, Accept";
# 設置預檢請求的有效期
add_header Access-Control-Max-Age 3600;
# 配置處理請求的指令
}
}
負載均衡
輪詢
每個客戶端的請求有序的轉發(fā)到不同的服務器中,默認是輪詢
權重論詢
就如某一個服務器比其他服務器更好,我就讓客戶端的請求多轉發(fā)到這個服務器中,weight代表權重
在nginx.conf中的配置: 第一步:在http全局塊添加負載均衡的服務器列表 第二步:在server塊中的location中設置它的映射規(guī)則 想要加權重,可在服務器列表中加weight server 192.168.17.129:8080 weight=5; server 192.168.17.129:8081 weight=10; 這樣8080的服務器處理的量就多一倍
最小連接
下一個連接會被路由到連接數(shù)最小的服務器中
IP哈希
每個請求按訪問IP的hash結果進行路由,這樣每個客戶端固定一個后端服務器。 實際中,不考慮使用該方法
動靜分離
簡單來說就是把動態(tài)資源(請求)跟靜態(tài)資源(圖片)分開,分別部署到不同服務器中。
好處:靜態(tài)資源由nginx處理,減少了后端服務器的負載,提高了響應速度。同時后端服務器只需要處理動態(tài)請求即可。
示例:靜態(tài)資源部署到nginx所在服務器中 url為/image/xx.jpg時就會從/var/www/image/目錄下獲取
server {
listen 80;
server_name example.com;
# 處理靜態(tài)文件
location /image/ {
root /var/www/image/;
expires 30d;
}
# 處理動態(tài)請求
location / {
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
upstream backend_server {
server 127.0.0.1:8080; # 后端服務器地址
}
為什么說nginx處理靜態(tài)資源就快,而處理動態(tài)快呢
這是項目的靜態(tài)資源都部署在nginx所在的服務器上,所以nginx讀取靜態(tài)資源就非常快。 而處理動態(tài)資源,需要解析請求,將請求轉發(fā)到目標服務器。同時涉及到負載均衡策略等問題。目標服務器返回響應給nginx時還要將響應數(shù)據(jù)返回給客戶端。這一過程非常的繁瑣,所消耗的資源也比處理靜態(tài)資源時多。
限流規(guī)則
基于連接數(shù)限流基于每秒的請求數(shù)限流
注:nginx的限流是作用在目標服務器,而不是nginx服務本身。
基于連接數(shù)限流
說明:某個客戶端IP與nginx發(fā)起的連接數(shù)超過了閾值,那么超出的連接將會被nginx拒絕。防止某個客戶端ip地址與nginx的連接數(shù)過載。
http {
# 定義連接限制的共享內(nèi)存區(qū)域,10m是內(nèi)存大小
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
listen 80;
server_name example.com;
# 限制每個 IP 地址最多允許 10 個連接
limit_conn addr 10;
location / {
# 配置處理請求的指令
}
}
}
使用 limit_conn_zone 指令定義了一個共享內(nèi)存區(qū)域,用于存儲連接限制的狀態(tài)信息。$binary_remote_addr 是一個 NGINX 變量,表示客戶端的 IP 地址,zone=addr:10m 指定了共享內(nèi)存區(qū)域的名稱為 addr,大小為 10MB。
每個客戶端與nginx進行交互,都會進行一個TCP連接,后續(xù)的請求都會復用這個連接,連接過了超時時間后就會銷毀。
連接超時時間設置:
http {
keepalive_timeout 30s; # 設置連接超時時間為 30 秒
server {
listen 80;
server_name example.com;
location / {
# 配置處理請求的指令
}
}
}
基于每秒的請求數(shù)限流
說明:每秒最多處理多少個請求
http {
# 定義請求速率限制的共享內(nèi)存區(qū)域,10m是內(nèi)存大小,rate=10r/s表示每秒允許的請求速率
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=10r/s;
server {
listen 80;
server_name example.com;
# 每秒最多允許 10 個請求,突發(fā)量不超過 20 個,10-20之間的請求會延遲處理,超過20的請求會直接拒絕。
limit_req zone=req_zone burst=20 nodelay;
location / {
# 配置處理請求的指令
}
}
}
nginx的基于請求數(shù)量限流是根據(jù)令牌桶算法實現(xiàn)的。 參考文章:限流:計數(shù)器、漏桶、令牌桶 三大算法的原理與實戰(zhàn)(史上最全)
高可用主備模式
我們是無法確定一個軟件是一直運行下去的,所有當nginx壞了的時候,我們需要設置另外一個nginx來完善工作,這里需要下載keepalived來管理nginx,當keppalived檢測到主nginx壞了,就會啟用備用nginx
參考鏈接:Nginx配置參數(shù)詳解
全文參考連接: Nginx面試題(總結最全面的面試題?。。。?/p>
柚子快報激活碼778899分享:網(wǎng)絡 運維 Nginx
精彩文章
本文內(nèi)容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉載請注明,如有侵權,聯(lián)系刪除。