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 最小平均響應時間和最少活動連接 考慮權重