Nginx-架構篇
一、Nginx常見問題
1. 相同server_name多個虛擬機器主機優先順序訪問
# 三個設定檔:# testserver1:server_name testserver1 www.rona1do.top;root /opt/app/code1;# testserver2:server_name testserver2 www.rona1do.top;root /opt/app/code2;# testserver3:server_name testserver3 www.rona1do.top;root /opt/app/code3;
配置上述相同server_name的三個虛擬機器主機,會先訪問testserver1,訪問的優先順序是按照伺服器的讀取順序,即檔案名稱的排序。
2. location匹配優先順序
=:進行一般字元精確匹配,也就是完全符合
^~:表示一般字元匹配,使用首碼匹配
~ ~ :表示執行一個正則匹配(加不區分大小寫)
上述優先順序自上而下優先順序降低,前兩個匹配是精確匹配,匹配到以後就不再往下找,正則匹配匹配到相應的字串也會繼續往下尋找是否有更精確的匹配。
3. Nginx的try_files的使用
按順序檢查檔案是否存在
# 先檢查對應的url地址下的檔案存不存在,如果不存在找/index.php,類似於重新導向location / { try_file $uri /index.php;}
4. Nginx的alias和root區別
location /request_path/image/ { root /local_path/image/;}# 請求:http://www.rona1do.top/request_path/image/cat.png# 查詢: /local_path/image/request_path_image/cat.png
location /request_path/image/ { alias /local_path/image/;}# 請求:http://www.rona1do.top/request_path/image/cat.png# 查詢: /local_path/image/cat.png
5. 用什麼樣的方法傳遞使用者的真實IP地址
通用解決辦法: 可以跟第一級代理協商,設定頭資訊x_real_ip記錄使用者的ip
set x_real_ip=$remote_addr
6. Nginx中常見錯誤碼
二、Nginx效能最佳化
1. 效能最佳化考慮點
2. ab介面壓力測試工具
安裝
使用
3. 系統與Nginx效能最佳化
檔案控制代碼
設定方式
- 系統全域性修改、使用者局部性修改、進程局部性修改
系統全域性修改 和 使用者局部性修改:
設定檔:
/etc/security/limits.conf
# root:root使用者root soft nofile 65535# hard 強制限制、soft 超過會發送提醒(郵件等),不限制root hard nofile 65535# *:所有使用者* soft nofile 65535* hard nofile 65535
進程局部性修改
設定檔:
/etc/nginx/nginx.conf
# 針對nginx進程進行設定worker_rlimit_nofile 35535;
4. CPU的親和
CPU親和:將進程/線程與cpu綁定,最直觀的好處就是提高了cpu cache的命中率,從而減少記憶體訪問損耗,提高程式的速度。
# /etc/nginx/nginx.conf# nginx建議數量跟cpu核心數保持一致worker_processes 2;# 配置cpu親和worker_cpu_affinity 0000000000000001 0000000000000010# 與上一行等價,自動對應(Nginx1.9版本以上)worker_cpu_affinity auto
查看Nginx的cpu綁定情況:
ps -eo pid,args,psr | grep [n]ginx
5. Nginx通用配置最佳化
# nginx服務使用nginx使用者(最好不要使用root使用者)user nginx;# cpu親和(最好跟核心數保持一致)worker_processes 2;worker_cpu_affinity auto;# error的記錄層級設定為warnerror_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;# 檔案控制代碼對於進程間的限制(建議1w以上)worker_rlimit_nofile 35535;# 事件磁碟機events { use epoll; # 限制每一個worker_processes進程可以處理多少個串連 worker_connections 10240;}http { include /etc/nginx/mime.types; default_type application/octet-stream; #字元集(服務端響應發送的報文字元集) charset utf-8; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; # 靜態資源的處理 sendfile on; #tcp_nopush on; keepalive_timeout 65; # gzip壓縮(對於IE6或以下版本對於gzip壓縮支援不是很好) gzip on; # IE6或以下不進行壓縮(相容) gzip_disable "MSIE [1-6]\."; gzip_http_version 1.1; include /etc/nginx/conf.d/*.conf;}
三、Nginx安全
1. 常見的惡意行為
爬蟲行為和惡意抓取、資源盜用
基礎防盜鏈功能,不讓惡意使用者能輕易的爬取網站對外資料
secure_link_module,對資料安全性提高加密驗證和實效性,適合如核心重要資料
acces_module,對後台、部分使用者服務的資料提供IP防控
2. 常見的攻擊手段
3. 檔案上傳漏洞
利用一些可以上傳的介面將惡意代碼植入到伺服器中,再通過url去訪問以執行代碼
# 檔案上傳漏洞解決辦法location ^~ /upload { root /opt/app/images; if ($request_file ~* (.*)\.php){ return 403; }}
4. SQL注入
利用未過濾/未審核使用者輸入的攻擊方法,讓應用運行本不應該啟動並執行SQL代碼
使用waf步驟:
git clone https://github.com/loveshell/ngx_lua_waf.git
cd ngx_lua_waf
mv ngx_lua_waf /etc/nginx/waf
vim /etc/nginx/waf/conf.lua
,修改RulePath為對應路徑(/etc/nginx/waf/wafconf)
vim /etc/nginx/waf/wafconf/post
,加入一行,\sor\s+
,放sql注入的正則
整合waf:
# /etc/nginx/nginx.conflua_package_path "/etc/nginx/waf/?.lua";lua_shared_dict limit 10m;init_by_lua_file /etc/nginx/waf/init.lua;access_by_lua_file /etc/nginx/waf/waf.lua
reload Nginx
5. 複雜的訪問攻擊中CC攻擊
四、Nginx總結
定義Nginx在服務體系中的角色
設計評估
配置注意事項
合理配置
瞭解原理(HTTP、作業系統...)
關注日誌