示例:
規(guī)則簡單總結(jié)就是優(yōu)先級(jí)從高到低依次為(序號(hào)越小優(yōu)先級(jí)越高):
鏈接: https://zhuanlan.zhihu.com/p/130819099
1. location = # 精準(zhǔn)匹配
2. location ^~ # 帶參前綴匹配
3. location ~ # 正則匹配(區(qū)分大小寫)
4. location ~* # 正則匹配(不區(qū)分大小寫)
5. location /a # 普通前綴匹配,優(yōu)先級(jí)低于帶參數(shù)前綴匹配。
6. location / # 任何沒有匹配成功的,都會(huì)匹配這里處理
負(fù)載均衡
鏈接:
1. Nginx學(xué)習(xí)---負(fù)載均衡的原理、分類、實(shí)現(xiàn)架構(gòu),以及使用場景, https://www.cnblogs.com/ftl1012/p/9570846.html
2. Nginx四層負(fù)載均衡概述, https://zhuanlan.zhihu.com/p/380727659
二層負(fù)載均衡(mac)
三層負(fù)載均衡(ip)
四層負(fù)載均衡(tcp)
用 ip + port 接收請(qǐng)求,再轉(zhuǎn)發(fā)到對(duì)應(yīng)的機(jī)器
七層負(fù)載均衡(http)
根據(jù)虛擬的 url 或 ip ,主機(jī)名接收請(qǐng)求,再轉(zhuǎn)向相應(yīng)的處理服務(wù)器
nginx怎么避免驚群?
accept 鎖和 epoll 鎖: https://zhuanlan.zhihu.com/p/51251700
accept
1. 內(nèi)核 2.6 以上,自然修復(fù)
2. 加鎖
epoll
加鎖 -> 支持原子操作的鎖,如 mmap,以及不支持原子操作的文件鎖
控制某個(gè)進(jìn)程的連接數(shù)量
ngx_accept_disabled = ngx_cycle->connection_n / 8 - ngx_cycle->free_connection_n;
邊緣觸發(fā)還是水平觸發(fā):
鏈接: https://blog.csdn.net/mrpre/article/details/80595540
ngx_add_conn 使用邊緣觸發(fā)(ET)
ngx_add_event 默認(rèn)使用水平觸發(fā)(LT)
ngx_handle_read_event 監(jiān)聽使用的是邊緣觸發(fā)
深入理解nginx學(xué)習(xí)記錄
ngx_conf_handler 處理單個(gè)配置:
比對(duì)所有模塊的 commands ,取第一條匹配的 command (module_type 類型也要一致), cmd->set()
每個(gè)配置都有一個(gè)偏移,這個(gè) cmd->conf ,用來決定是要存在哪一級(jí)別的配置里面
```c
#define NGX_HTTP_MAIN_CONF_OFFSET offsetof(ngx_http_conf_ctx_t, main_conf)
#define NGX_HTTP_SRV_CONF_OFFSET offsetof(ngx_http_conf_ctx_t, srv_conf)
#define NGX_HTTP_LOC_CONF_OFFSET offsetof(ngx_http_conf_ctx_t, loc_conf)
```
解析 http {} -> ngx_http_block()
創(chuàng)建 ngx_http_module 模塊的 http->ctx:
提取所有的 NGX_HTTP_MODULE 模塊,并創(chuàng)建 ctx->main_conf, ctx->srv_conf, ctx->loc_conf
再次提取,并且每個(gè)模塊都再次調(diào)用對(duì)應(yīng)的 create 函數(shù) ctx->main_conf[mi] = module->create_main_conf(cf)
=> 再執(zhí)行每個(gè)模塊的 preconfiguration
=> 再執(zhí)行每個(gè)模塊的 init_main_conf
再執(zhí)行每個(gè)模塊 main 配置和 server 級(jí)別的配置合并 ngx_http_merge_servers
module->merge_srv_conf
module->merge_loc_conf
再執(zhí)行每個(gè)模塊所有的 locations ngx_http_merge_locations -> 對(duì)每個(gè)server的location進(jìn)行排序和分類處理
對(duì)每個(gè) server 進(jìn)行 locations 排序和優(yōu)化
按匹配字符串進(jìn)行排序 -> ngx_http_init_locations
快速地構(gòu)建靜態(tài)的三叉查找樹 -> ngx_http_init_static_location_trees
初始化階段鉤子(引擎) phases -> ngx_http_init_phases
預(yù)設(shè)的一些頭部先計(jì)算 hash 值 -> ngx_http_init_headers_in_hash
=> 再執(zhí)行每個(gè)模塊 的 postconfiguration
初始化變量: ngx_http_variables_init_vars
設(shè)置每個(gè)階段的 checker() 函數(shù): ngx_http_init_phase_handlers
給每個(gè)階段添加 handler 函數(shù), checker() 函數(shù)主要是對(duì)于 handler 返回結(jié)果之后的校驗(yàn)以及是否走下個(gè)階段做判斷
優(yōu)化端口信息 -> ngx_http_optimize_servers
通配符等處理
深入理解nginx學(xué)習(xí)記錄
main 函數(shù):
解析參數(shù)
=> 平滑升級(jí): ngx_add_inherited_sockets
對(duì)模塊進(jìn)行編號(hào)和統(tǒng)計(jì)模塊數(shù)量
讀配置,并初始化 cycle : ngx_init_cycle
守護(hù)進(jìn)程模式判斷
創(chuàng)建 pid 文件
=> 單進(jìn)程模式: ngx_single_process_cycle
ngx_set_environment
init_process
ngx_process_events_and_timers
=> 考慮驚群效應(yīng), https://cloud.tencent.com/developer/article/1341088
=> 多進(jìn)程模式: ngx_master_process_cycle
初始化信息相關(guān)信息
主進(jìn)程名: master_process
子進(jìn)程名: ngx_argc
啟動(dòng) worker 進(jìn)程: ngx_start_worker_processes
啟動(dòng)cache manager, cache loader進(jìn)程: ngx_start_cache_manager_processes
=> 平滑升級(jí)
進(jìn)行熱代碼替換,這里是調(diào)用execve來執(zhí)行新的代碼: ngx_exec_new_binary
設(shè)置環(huán)境變量
把監(jiān)聽的 fd 寫到環(huán)境變量中
修改舊的 pid 文件
=> ngx_execute()
ngx_spawn_process()
socketpair 父進(jìn)程和子進(jìn)程通信管道,ngx_processes[s].channel
fork()
所有子進(jìn)程不再接受處理新的連接,實(shí)際相當(dāng)于對(duì)所有的予進(jìn)程發(fā)送QUIT信號(hào)量 => ngx_signal_worker_processes
ngx_init_cycle 核心步驟:
先初始化 core 核心模塊(框架只關(guān)心核心模塊): NGX_CORE_MODULE -> module->create_conf
創(chuàng)建一個(gè) ngx_conf_t 結(jié)構(gòu),要開始解析 conf->ctx
解析命令行參數(shù)信息到內(nèi)存結(jié)構(gòu)中: ngx_conf_param -> ngx_conf_parse(NULL)
==> 解析配置: ngx_conf_parse
解析完所有配置, core 核心模塊進(jìn)行綜合性處理, module->init_conf
創(chuàng)建 pid 文件: ngx_create_pidfile ,并加鎖: ngx_test_lockfile
創(chuàng)建相關(guān)的目錄,日志,文件,共享內(nèi)存
監(jiān)聽 socket : ngx_open_listening_sockets
==> 調(diào)用所有 NGX_CORE_MODULE 模塊的 init_conf
創(chuàng)建主進(jìn)程名: -> ngx_create_pidfile
創(chuàng)建所有文件路徑的文件夾: ngx_create_paths
==> 這個(gè)時(shí)間更換掉 log -> cycle->log = &cycle->new_log
初始化共享內(nèi)存
設(shè)置監(jiān)聽的 ip 和端口信息,并啟動(dòng)監(jiān)聽: ngx_open_listening_sockets
==> 調(diào)用所有模塊的 init_module
一些清理操作,如清理掉舊進(jìn)程沒有用到的文件等
深入理解nginx學(xué)習(xí)記錄
優(yōu)點(diǎn):
優(yōu)秀的模塊設(shè)計(jì)
事件驅(qū)動(dòng)架構(gòu)
請(qǐng)求的多階段異步處理
master-worker 的管理設(shè)計(jì)
平臺(tái)無關(guān)的代碼實(shí)現(xiàn)
內(nèi)存池的設(shè)計(jì)
使用統(tǒng)一管道過濾器模式的 HTTP 過濾模塊
缺點(diǎn):
1. 動(dòng)態(tài)處理差
2. rewrite 弱
3. 啟用狀態(tài)下,調(diào)試日志不好打??; HOOK 多,調(diào)試不方便; 多進(jìn)程同時(shí)監(jiān)聽一個(gè)端口,不能控制是哪個(gè)進(jìn)程來 accept
平滑升級(jí):
新的 master 進(jìn)程
讀環(huán)境變量中的 socket : ngx_add_inherited_sockets
把舊的 socket 還原值,保存到結(jié)構(gòu)體中(這里還沒有開始監(jiān)聽): ngx_set_inherited_sockets
深入理解nginx學(xué)習(xí)記錄
MEAELZILYQVAHULL
Python離線安裝第三方庫參考鏈接: pip的基本使用和離線安裝Python第三方庫 https://blog.csdn.net/Hanniel/article/details/81086459[ht...
僅以本人遇到的情況為例,在VS code 中編寫 python 的程序時(shí),會(huì)遇“unresolved import XXX” 的情況,經(jīng)查閱資料,是VS code 中自帶的 ...
安裝基礎(chǔ)插件 c/c++, c/c++ Extension Pack, find all reference 安裝gun globals 參考鏈接:讓VSCode支持 "Fi...
參考鏈接: pip的基本使用和離線安裝Python第三方庫 https://blog.csdn.net/Hanniel/article/details/81086459[ht...
參考鏈接: Linux安裝python2.7、pip和setuptools: https://www.cnblogs.com/xiaowenshu/p/10239834.ht...
參考鏈接:vscode+sftp開發(fā)模式環(huán)境的同步,https://segmentfault.com/a/1190000011844958 安裝sftp插件 打開一個(gè)目錄, ...
配合remote-ssh,可以很好地使用gdb直接調(diào)試遠(yuǎn)程服務(wù)器上的程序 比如我們此次使用GDB來直接調(diào)試nginx 配置gcc和gdb的路徑 配置此次項(xiàng)目的一些特殊配置 配...
官網(wǎng)下載鏈接: https://marketplace.visualstudio.com/ 搜索之后下載: 下載插件 安裝插件 使用命令行安裝: 圖形化界面安裝:
[TOC] 1. Vscode配置Remote遠(yuǎn)程開發(fā)環(huán)境 分為服務(wù)器可以連網(wǎng)和不能連網(wǎng)的兩種情況。首先服務(wù)器有網(wǎng)插件基本都可以裝,就很方便了。這里重點(diǎn)說一上斷網(wǎng)的情況下要如...
程序的內(nèi)存分配 轉(zhuǎn)載鏈接:https://blog.csdn.net/LG1259156776/article/details/52627565 https://blog.c...