nginx小記

nginx是個c語言寫的提供web和反向代理服務的開源軟件 

特性
高可靠   部署後常年穩定運行
高併發  高性能  c語言  nio+slab
高可擴展性   豐富的功能模塊
熱加載 熱部署  無需啓動更新配置文件  nginx主要就是玩配置 
開源BSD  最開放的協議自由度高 雖然高大上 不過咱基本用不上啊

主要功能 
靜態資源服務  動靜分離    依賴系統功能
反向代理         緩存  負載均衡  代理 
api服務    

結構
核心模塊    內核 核心服務
擴展模塊    基礎服務 功能服務
第三方模塊  功能服務  可有可無

進程
master進程   強有裏的管家  接受信號  管理監控worker進程
worker進程   負責處理具體的http請求   配置爲0個work進程時將停止處理客戶端請求

安裝
二進制安裝             更新源 添加nginx源  yum安裝
源碼編譯安裝          安裝依賴  config make  make install     

命令
nginx -h 幫助
nginx -c $configPath 指定配置文件啓動
nginx -t 測試配置文件是否正確
nginx -s reload 配置熱加載
nginx -s stop 強制停止
nginx -s quit 安全停止
nginx -s reopen 打開新的日誌文件
nginx -v 版本信息
nginx -V 版本和配置信息
-s爲發送信號量到master

熱加載流程  配置變更 需要刷新配置
master 接受到HUP信號 測試配置文件是否正確 
正確 嘗試使用新配置(如端口 worker等)  嘗試失敗 仍然使用舊配置(通過舊配置回滾?)
worker進程平滑過濾流程
master通過當前已加載配置(新配置)fork worker進程 成功後給老的worker發送QUIT信號 
老worker接受到QUIT信號後停止監聽新請求 當請求全部處理完畢後 結束進程

[root@ip-172-31-31-182 ~]# ps -ef|grep nginx
nginx     3027 23169  0 22:11 ?        00:00:00 nginx: worker process
nginx     3028 23169  0 22:11 ?        00:00:00 nginx: worker process
nginx     3029 23169  0 22:11 ?        00:00:00 nginx: worker process
root      3360  2933  0 22:12 pts/2    00:00:00 grep --color=auto nginx
root     23169     1  0 17:44 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
[root@ip-172-31-31-182 ~]# nginx -s reload
[root@ip-172-31-31-182 ~]# ps -ef|grep nginx
nginx     3027 23169  0 22:11 ?        00:00:00 nginx: worker process is shutting down
nginx     3028 23169  0 22:11 ?        00:00:00 nginx: worker process is shutting down
nginx     3029 23169  0 22:11 ?        00:00:00 nginx: worker process is shutting down
nginx     3363 23169  0 22:13 ?        00:00:00 nginx: worker process
nginx     3364 23169  0 22:13 ?        00:00:00 nginx: worker process
nginx     3365 23169  0 22:13 ?        00:00:00 nginx: worker process
root      3367  2933  0 22:13 pts/2    00:00:00 grep --color=auto nginx
root     23169     1  0 17:44 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf

reload後一下把所有的worker都啓動起來了  並沒有分批啓動   有可能是老的worker很快就會死沒必要 或者我的worker數量有點少

自動刷新  覺得沒必要
寫個watch sh  監聽配置文件的修改時間是否發生變化 發生變化後給master發送HUP信號

熱啓動   插件變更時 需要要重啓進程
給master發送USR2信號 master會根據新配置fork個新master
給舊master發送WINCH信號  會關閉所有的老worker
觀察一段時間是是否有異常
無異常 提交 給老master發送quit信號  
有異常 回滾 方式一 給老master發送HUP信號 已當前配置(老配置)啓動work 給新master發送quit信號 方式二給新master發送TERM信號

熱加載與熱啓動權威介紹

灰度發佈
爲配置創建副本   修改配置的端口或worker數量(可以結合cpu_affinity) 
給master發送USR2信號
觀察一段時間是否有異常(可以通過給老worker發送quit信號來修改比例 最終達到100%)  無異常提交   有異常回滾

配置文件
上下文   作用範圍  可以嵌套 由簡單指令和快指令構成  空文檔由主上下文構成
指令 由某塊提供  perl語法  
簡單指令   名稱和參數構成 空格分開 分號結尾   可以繼承或覆蓋
快指令       名稱與[參數]和一對大括號構成 括號內爲上下文即作用範圍 
                  有層級關係 http和event在全局上下文中 server在http中 location在server中
核心指令
user  worker進程工作在哪個用戶下
use   指定處理網絡io的事件模型  select  kqueue poll epool       在events下
worker_processes 指定運行多少個工作進程 非auto nginx啓動後master fork出所有工作進程  在events下
events 連接相關配置
worker_connections  worker進程能處理的最大連接數
worker_cpu_affinity  配合worker_connections使用 work進程和cpu內核關係 

worker_cpu_affinity指令
cpu用二進制數表示  幾個worker進程 就有幾個二進制數  一位數字代表一個內核  1爲綁定  實例如下
2核2線程  worker_connections 2    worker_cpu_affinity  01 10   
2個工作進程 進程1綁定到內核1 進程2綁定到內核2
2核4線程  假如內核1和內核3在一物理核心上  worker_connections 2    worker_cpu_affinity  0101 1010
2個工作進程  進程1綁定內核1內核3  進程2綁定到內核2內核4    
ab壓測 通過top -> 1查看核心負載情況和使用率

http核心指令
http      協議
server   虛擬主機
listen     監聽端口
location  url路由  有參數

location參數格式
完全匹配  最高優先級
=/monitor   /monitor  完全匹配
前綴匹配   選出匹配度最高的 最優的 
/monitor    /monitor開頭     命中後還會繼續正則匹配
^~/monitor  /monitor開頭  命中後不會繼續正則匹配  不允許出現邏輯一樣的參數 如/a ^~/a 會報錯
正則匹配   按順序匹配 命中則採用  沒命中採用前綴匹配中最長前綴匹配配置
~^/(monitor|config)  /monitor或/config開頭  
~*.(json|xml)   .json或.xml結尾 且不區分大小寫
最強備胎 萬金油  接盤俠
/  前綴匹配和正則匹配都沒有命中採用
非常規請求   用於重定向
@

location指令
proxy_http_version  http協議版本 結合keepalive
proxy_set_header   當前事務結束後是否完畢網絡連接 結合keepalive

http代理指令
proxy_pass  代理地址

代理類型
正向代理:客戶端知道服務端地址 但是不想讓服務端知道客戶端真實地址 
反向代理:   服務端想知道客戶端的地址  但是不想讓客戶端知道服務端的真實地址

http負載均衡指令
server  服務器
hash|ip_hash|least_conn|least_time|random
keepalive  ngin到服務器的最大空閒連接數   QPS/1000/請求耗時毫秒/(10-30)
keepalive_requests 一個keepalive連接允許的最大請求數  參考QPS
keepalive_timeout keepalive連接超時時間  參考QPS

負載算法
weight 加權輪詢 默認算法  參考for循環
ip_hash ip進行hash運算  一定程度解決服務器狀態問題
hash 參數進行hash運算  可以用來做緩存 提高緩存命中率 減少內存使用率  需安裝第三方插件
fair 智能調整調度算法 根據請求的相應時間進行均衡分配   需安裝第三方插件 
least_conn 最少活動連接 考慮權重
least_time 最小平均響應時間和最少活動連接 考慮權重

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章