Nginx初探

初識Nginx

Nginx 特點

  1. 高并發(fā)掂之,高性能
    • epoll io 模型處理大并發(fā)請求
    • 32核64G服務器能支持1000w請求連接客蹋,作為靜態(tài)資源服務器可以處理100wRPS
  2. 可擴展性好
    • 模塊化設計良好
    • 有豐富的第三方模塊(OpenResty/Tengine……)
  3. 高可靠性
    • 持續(xù)不間斷運行多年不需要重啟
  4. 熱部署
    • 可以在不停止服務的情況下完成升級
  5. BSD許可證

Nginx主要場景

  1. 靜態(tài)資源服務
    • 通過本地文件系統(tǒng)提供服務
  2. 反向代理服務
    • Nginx的強大性能
    • 緩存
    • 負載均衡
  3. API服務
    • OpenResty

Nginx的組成部分

  1. 二進制可執(zhí)行文件:各個模塊源碼編譯出來的一個文件
  2. Nginx配置文件:控制Nginx的行為
  3. 訪問日志:記錄每一條Http請求
  4. 錯誤日志:定位問題

Nginx的選擇

  1. 開源版本Ngixn
  2. Nginx-Plus
    1. 優(yōu)點:整合第三方模塊,運營監(jiān)控,技術支持
    2. 缺點:不開源
  3. Tengine
    1. 優(yōu)點:經(jīng)歷嚴苛考驗,設計領先于開源Nginx
    2. 缺點:不能跟隨Nginx一同升級
  4. OpenResty

Nginx的目錄結(jié)構(gòu)

  1. auto
    1. cc:編譯相關的目錄
    2. lib
    3. OS:對于操作系統(tǒng)的判斷
    4. types
  2. CHANGES文件:版本特性、Bugfix、重構(gòu)
  3. conf
    1. config示例文件
  4. configure腳本:生成中間文件苍姜,編譯前的必備動作
  5. contrib:提供兩個poll腳本和vim工具
    • vim工具使用(vim語法高亮提示)
      $ cp -r contrib/vim/* ~/.vim/
  6. html
    1. index.html:歡迎界面
    2. 50.html:錯誤頁面
  7. man:Linux 幫助文件
  8. src:Nginx源代碼
  9. objs:編譯目標文件

編譯Nginx

  1. 配置指令
    $ ./configure ....
  2. 編譯生產(chǎn)的中間文件
    • ngx_modules.cc:記錄有哪些模塊會被編譯
  3. 編譯:$ make(C語言編譯后的所有中間文件放在objs/src目錄下)
  4. 編譯安裝:$ make install

Nginx配置

  1. 配置語法

    1. 配置文件由指令和指令快構(gòu)成
    2. 每條指令以;結(jié)尾,指令間參數(shù)由空格分割
    3. 指令塊由{}大括號將多條指令組織在一起
    4. include指令組合多個配置文件以提升維護性
    5. 使用#符合添加注釋译蒂,提高可讀性
    6. 使用$符號使用變量
    7. 部分指令的參數(shù)支持正則表達式
  2. 配置參數(shù)

    1. 時間單位
      • ms:毫秒
      • d:天
      • s:秒
      • w:周
      • m:分
      • M:月
      • h:小時
      • y:年
    2. 空間單位
      • :bytes
      • k/K:kilobytes
      • m/M:megabytes
      • g/G:gigabytes
  3. http配置指令塊

    • http
    • server
    • upstream
    • location

Nginx命令行

Nginx基本命令
  1. -s 發(fā)送信號
    • stop:立刻停止服務
    • quit:優(yōu)雅的停止服務
    • reload:重載配置文件
    • reopen重新開始記錄日志
  2. -t/T 測試配置文件是否有語法錯誤
  3. -v/V 打印Nginx版本信息及編譯信息
  4. -c 使用指定配置文件
  5. -g 指定配置命令(在命令行覆蓋一些指令)
  6. -p 指定運行目錄(log/modules...)
Nginx熱部署
  1. 備份舊的二進制文件
    $ cp nginx nginx.old
  2. 拷貝新版本的二進制文件至sbin目錄
    $ cp -r /source/path/to/nginx /target/path/to/sbin/ -f
  3. 告訴Master進程進行熱部署做一次版本升級(新老的worker|master進程都在運行,老的worker進程已不在監(jiān)聽網(wǎng)絡端口,新的請求新的連接只會進入新的Ngixn進程中)
    $ kill -USR2 $ngx_master_pid
  4. 向老的Nginx進程發(fā)出信號曼月,優(yōu)雅的關閉所有的worker進程(老的worker進程全部退出,老的Master進程依然存在,用于通過reload信號拉起worker進程,實現(xiàn)快速回滾)
    $ kill -WINCH $ngx_master_pid
日志切割
  1. 備份日志文件
    $ mv access.log 2018-xx-xx-access.log
  2. 重新開始記錄日志
    $ /path/to/sbin/nginx -s relaod

Nginx應用

搭建靜態(tài)資源服務器
  1. root VS alias:root會將URL的路徑帶入文件系統(tǒng),通常使用alias
  2. 靜態(tài)資源可通過gzip進行壓縮
    1. 開啟gzip:gzip on
    2. 設置需要壓縮的文件的最小大小為一字節(jié):gzip_min_length 1
    3. 設置壓縮級別:gzip_comp_level: 2
    4. 設置需要壓縮的文件類型(后綴):gzip type text/plain application/x-javascript ...
  3. 顯示目錄結(jié)構(gòu):autoindex on
  4. 設置發(fā)送響應的速度為1K:set $limit_rate 1k
  5. 配置access日志
    1. log_formate:設置日志格式:log_formate main 'xxx-xxx'
    2. access_log:path/to/file main
    3. access_log在配置文件中的位置覺得記錄日志的范圍
搭建反向代理服務器
  1. location配置
location / {
    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_cache cache_name;
    # 設置緩存的key
    proxy_cache_key $host$uri$is_args$args;
    # 設置不返回的響應
    proxy_cache_valid 200 304 303 1d;
    proxy_pass http://upstream-name;
}
  1. 設置緩存文件路徑:proxy_cache_path
http {
    proxy_cache_path /temp/nginx/cache levels=1:2 keys_zone=cache_name:10m(cache_size) max_size=10g inactive=60m use_temp_path=off
}
利用GoAccess實現(xiàn)access日志的可視化實時監(jiān)控
  1. access日志的作用
    1. 定位問題
    2. 用戶行為分析
  2. GoAccess的使用
$ goaccess access.log -o ../html/report.html --real-time-html --time-format='%H:%M:%S' --date-format='%d/%b/%Y' --log-format=COMBINED
  1. GoAccess使用websocket實時更新數(shù)據(jù)
網(wǎng)絡安全協(xié)議SSL
  1. TLS/SSL的發(fā)展歷程(Secure Socket Layer/Transport Layer Security)
    1. SSL3.0(1995)
    2. TLS1.0(1999)
    3. TLS1.1(2006)
    4. TLS1.2(2008)
    5. TLS1.3(2018)
  2. ISO/OSI模型
graph TD
A[表示層] --> B(握手)
A[表示層] --> C(記錄)
B --> E(交換秘鑰)
E --> F(警告)
F --> G(對稱加密應用數(shù)據(jù))
G --> H(應用層)
C --> H
  1. TLS安全密碼套件組成


    image.png
    1. 密鑰交換:ECDHE(橢圓曲線加密算法)
    2. 身份驗證:RSA
    3. 對稱加密算法、強度柔昼、分組模式
      • 算法:AEC(對稱加密算法)
      • 強度:128
      • 模式:GCM(提升多核CPU情況下加解密性能)
    4. 簽名HASH算法
  2. 對稱加密與非對稱加密

    1. 性能對比:對稱加密位運算,性能較好
    2. 對稱加密:同一個密鑰進行加解密
    3. 非對稱加密:公鑰加密私鑰解密哑芹,私鑰加密公鑰解密,可用于身份認證(SSH)
  3. 證書管理流程


    image.png
  4. 證書的類型

    • 域名驗證(Domain validated,DV)證書
    • 組織驗證(Organization validated,OV)證書
    • 擴展驗證(extended validated,EV)證書
  5. 證書鏈

    ├── 根證書(操作系統(tǒng)更新捕透,平均一年一次聪姿,大比分)
    │   ├── 二級證書
    │   │   └── 主證書
  1. TLS通訊過程
    • TLS通訊過程的4個目的
      1. 驗證身份
      2. 達成安全套件共識
      3. 傳遞秘密鑰
      4. 加密通訊
    • TLS通訊過程(交換密鑰、加密數(shù)據(jù))
      1. Client Hello:支持的加密算法
        
      2. Server Hello:支持的加密算法列表,以及傾向于使用的加密算法套件,Nginx選擇最喜歡的加密套件發(fā)送給客戶端
        
      3. Server Certificates:發(fā)送公鑰證書(證書鏈)給客戶端
        
      4. Server Hello Done:如有類似橢圓曲線算法參數(shù)再次發(fā)送給客戶端
        
      5. ClientKey exchange Message:根據(jù)橢圓曲線參數(shù)生成私鑰并把公鑰發(fā)送給服務器
        
      6. Key Generation:各種生成的密鑰是相同的
        
      7. CipherSpec Exchange
        
      8. Finished
        
    • Nginx綜合性能
      1. 小文件傳輸主要考慮非對稱加密算法,優(yōu)化橢圓曲線算法強度
      2. 大文件傳輸主要考慮對稱加密算法
  2. 使用let's encrypt搭建https服務
    • 在nginx.conf配置server_name(與生成密鑰息息相關)
    • 安裝let's encrypt自動化腳本:
      $ yum install python2-certbot-nginx
    • 自動配置https:
      $ certbot --nginx --nginx-server-root=${ngx_root}/nginx/conf/ -d ${domain}
    • let's encrypt自動化腳本執(zhí)行流程
      1. 申請一個證書
      2. 等待驗證
      3. 部署證書到nginx.conf文件中
      4. 選擇是否將http站點重定向到https站點上

--nginx-server-root:指定nginx.conf 所在的目錄 -d:指定需要申請證書的域名 依賴模塊:http_ssl_module 依賴類庫:open-ssl 如果遇到 python-urllib3.noarch 安裝失敗 使用 sudo pip uninstall urllib3 卸載 urllib3 再使用 sudo yum install python-urllib3 安裝即可

OpenResty安裝實戰(zhàn)

OpenResty目錄結(jié)構(gòu)
  • build:編譯時生成的中間目標文件
  • bundle:nginx源代碼乙嘀、nginx模塊(C模塊咳燕、lua模塊)
  • configure:OpenResty編譯腳本
  • patches
  • util
OpenResty Lua 配置
在nginx.conf文件中使用Lua代碼
  • 在openresty http-lua 模塊中提供了幾個lua指令
    • content_by_lua 在http請求內(nèi)容生成階段用lua代碼來處理
    • ngx.say("xxxx"):生成http響應(body部分)
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市乒躺,隨后出現(xiàn)的幾起案子招盲,更是在濱河造成了極大的恐慌,老刑警劉巖嘉冒,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件曹货,死亡現(xiàn)場離奇詭異咆繁,居然都是意外死亡,警方通過查閱死者的電腦和手機顶籽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門玩般,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人礼饱,你說我怎么就攤上這事坏为。” “怎么了镊绪?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵匀伏,是天一觀的道長。 經(jīng)常有香客問我蝴韭,道長够颠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任榄鉴,我火速辦了婚禮履磨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘庆尘。我一直安慰自己剃诅,他們只是感情好,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布驶忌。 她就那樣靜靜地躺著综苔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪位岔。 梳的紋絲不亂的頭發(fā)上如筛,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天,我揣著相機與錄音抒抬,去河邊找鬼杨刨。 笑死,一個胖子當著我的面吹牛擦剑,可吹牛的內(nèi)容都是我干的妖胀。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼惠勒,長吁一口氣:“原來是場噩夢啊……” “哼赚抡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起纠屋,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤涂臣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赁遗,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡署辉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了岩四。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哭尝。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖剖煌,靈堂內(nèi)的尸體忽然破棺而出材鹦,到底是詐尸還是另有隱情,我是刑警寧澤耕姊,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布桶唐,位于F島的核電站,受9級特大地震影響箩做,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜妥畏,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一邦邦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧醉蚁,春花似錦燃辖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至滥玷,卻和暖如春氏身,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惑畴。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工蛋欣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人如贷。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓陷虎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親杠袱。 傳聞我的和親對象是個殘疾皇子尚猿,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容