初識Nginx
Nginx 特點
- 高并發(fā)掂之,高性能
- epoll io 模型處理大并發(fā)請求
- 32核64G服務器能支持1000w請求連接客蹋,作為靜態(tài)資源服務器可以處理100wRPS
- 可擴展性好
- 模塊化設計良好
- 有豐富的第三方模塊(OpenResty/Tengine……)
- 高可靠性
- 持續(xù)不間斷運行多年不需要重啟
- 熱部署
- 可以在不停止服務的情況下完成升級
- BSD許可證
Nginx主要場景
- 靜態(tài)資源服務
- 通過本地文件系統(tǒng)提供服務
- 反向代理服務
- Nginx的強大性能
- 緩存
- 負載均衡
- API服務
- OpenResty
Nginx的組成部分
- 二進制可執(zhí)行文件:各個模塊源碼編譯出來的一個文件
- Nginx配置文件:控制Nginx的行為
- 訪問日志:記錄每一條Http請求
- 錯誤日志:定位問題
Nginx的選擇
- 開源版本Ngixn
- Nginx-Plus
- 優(yōu)點:整合第三方模塊,運營監(jiān)控,技術支持
- 缺點:不開源
- Tengine
- 優(yōu)點:經(jīng)歷嚴苛考驗,設計領先于開源Nginx
- 缺點:不能跟隨Nginx一同升級
- OpenResty
Nginx的目錄結(jié)構(gòu)
- auto
- cc:編譯相關的目錄
- lib
- OS:對于操作系統(tǒng)的判斷
- types
- CHANGES文件:版本特性、Bugfix、重構(gòu)
- conf
- config示例文件
- configure腳本:生成中間文件苍姜,編譯前的必備動作
- contrib:提供兩個poll腳本和vim工具
- vim工具使用(vim語法高亮提示)
$ cp -r contrib/vim/* ~/.vim/
- vim工具使用(vim語法高亮提示)
- html
- index.html:歡迎界面
- 50.html:錯誤頁面
- man:Linux 幫助文件
- src:Nginx源代碼
- objs:編譯目標文件
編譯Nginx
- 配置指令
$ ./configure ....
- 編譯生產(chǎn)的中間文件
- ngx_modules.cc:記錄有哪些模塊會被編譯
- 編譯:
$ make
(C語言編譯后的所有中間文件放在objs/src目錄下) - 編譯安裝:
$ make install
Nginx配置
-
配置語法
- 配置文件由指令和指令快構(gòu)成
- 每條指令以;結(jié)尾,指令間參數(shù)由空格分割
- 指令塊由{}大括號將多條指令組織在一起
- include指令組合多個配置文件以提升維護性
- 使用#符合添加注釋译蒂,提高可讀性
- 使用$符號使用變量
- 部分指令的參數(shù)支持正則表達式
-
配置參數(shù)
- 時間單位
- ms:毫秒
- d:天
- s:秒
- w:周
- m:分
- M:月
- h:小時
- y:年
- 空間單位
- :bytes
- k/K:kilobytes
- m/M:megabytes
- g/G:gigabytes
- 時間單位
-
http配置指令塊
- http
- server
- upstream
- location
Nginx命令行
Nginx基本命令
- -s 發(fā)送信號
- stop:立刻停止服務
- quit:優(yōu)雅的停止服務
- reload:重載配置文件
- reopen重新開始記錄日志
- -t/T 測試配置文件是否有語法錯誤
- -v/V 打印Nginx版本信息及編譯信息
- -c 使用指定配置文件
- -g 指定配置命令(在命令行覆蓋一些指令)
- -p 指定運行目錄(log/modules...)
Nginx熱部署
- 備份舊的二進制文件
$ cp nginx nginx.old
- 拷貝新版本的二進制文件至sbin目錄
$ cp -r /source/path/to/nginx /target/path/to/sbin/ -f
- 告訴Master進程進行熱部署做一次版本升級(新老的worker|master進程都在運行,老的worker進程已不在監(jiān)聽網(wǎng)絡端口,新的請求新的連接只會進入新的Ngixn進程中)
$ kill -USR2 $ngx_master_pid
- 向老的Nginx進程發(fā)出信號曼月,優(yōu)雅的關閉所有的worker進程(老的worker進程全部退出,老的Master進程依然存在,用于通過reload信號拉起worker進程,實現(xiàn)快速回滾)
$ kill -WINCH $ngx_master_pid
日志切割
- 備份日志文件
$ mv access.log 2018-xx-xx-access.log
- 重新開始記錄日志
$ /path/to/sbin/nginx -s relaod
Nginx應用
搭建靜態(tài)資源服務器
- root VS alias:root會將URL的路徑帶入文件系統(tǒng),通常使用alias
- 靜態(tài)資源可通過gzip進行壓縮
- 開啟gzip:gzip on
- 設置需要壓縮的文件的最小大小為一字節(jié):gzip_min_length 1
- 設置壓縮級別:gzip_comp_level: 2
- 設置需要壓縮的文件類型(后綴):gzip type text/plain application/x-javascript ...
- 顯示目錄結(jié)構(gòu):autoindex on
- 設置發(fā)送響應的速度為1K:set $limit_rate 1k
- 配置access日志
- log_formate:設置日志格式:log_formate main 'xxx-xxx'
- access_log:path/to/file main
- access_log在配置文件中的位置覺得記錄日志的范圍
搭建反向代理服務器
- 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;
}
- 設置緩存文件路徑: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)控
- access日志的作用
- 定位問題
- 用戶行為分析
- GoAccess的使用
$ goaccess access.log -o ../html/report.html --real-time-html --time-format='%H:%M:%S' --date-format='%d/%b/%Y' --log-format=COMBINED
- GoAccess使用websocket實時更新數(shù)據(jù)
網(wǎng)絡安全協(xié)議SSL
- TLS/SSL的發(fā)展歷程(Secure Socket Layer/Transport Layer Security)
- SSL3.0(1995)
- TLS1.0(1999)
- TLS1.1(2006)
- TLS1.2(2008)
- TLS1.3(2018)
- ISO/OSI模型
graph TD
A[表示層] --> B(握手)
A[表示層] --> C(記錄)
B --> E(交換秘鑰)
E --> F(警告)
F --> G(對稱加密應用數(shù)據(jù))
G --> H(應用層)
C --> H
-
TLS安全密碼套件組成
image.png- 密鑰交換:ECDHE(橢圓曲線加密算法)
- 身份驗證:RSA
- 對稱加密算法、強度柔昼、分組模式
- 算法:AEC(對稱加密算法)
- 強度:128
- 模式:GCM(提升多核CPU情況下加解密性能)
- 簽名HASH算法
-
對稱加密與非對稱加密
- 性能對比:對稱加密位運算,性能較好
- 對稱加密:同一個密鑰進行加解密
- 非對稱加密:公鑰加密私鑰解密哑芹,私鑰加密公鑰解密,可用于身份認證(SSH)
-
證書管理流程
image.png -
證書的類型
- 域名驗證(Domain validated,DV)證書
- 組織驗證(Organization validated,OV)證書
- 擴展驗證(extended validated,EV)證書
證書鏈
├── 根證書(操作系統(tǒng)更新捕透,平均一年一次聪姿,大比分)
│ ├── 二級證書
│ │ └── 主證書
- TLS通訊過程
- TLS通訊過程的4個目的
- 驗證身份
- 達成安全套件共識
- 傳遞秘密鑰
- 加密通訊
- TLS通訊過程(交換密鑰、加密數(shù)據(jù))
Client Hello:支持的加密算法
Server Hello:支持的加密算法列表,以及傾向于使用的加密算法套件,Nginx選擇最喜歡的加密套件發(fā)送給客戶端
Server Certificates:發(fā)送公鑰證書(證書鏈)給客戶端
Server Hello Done:如有類似橢圓曲線算法參數(shù)再次發(fā)送給客戶端
ClientKey exchange Message:根據(jù)橢圓曲線參數(shù)生成私鑰并把公鑰發(fā)送給服務器
Key Generation:各種生成的密鑰是相同的
CipherSpec Exchange
Finished
- Nginx綜合性能
- 小文件傳輸主要考慮非對稱加密算法,優(yōu)化橢圓曲線算法強度
- 大文件傳輸主要考慮對稱加密算法
- TLS通訊過程的4個目的
- 使用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í)行流程
- 申請一個證書
- 等待驗證
- 部署證書到nginx.conf文件中
- 選擇是否將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部分)