Nginx從入門到實踐(四)
Nginx常見問題和排錯經驗,實踐應用場景中的方法處理Nginx安全,常見的應用層安全隱患,複雜訪問控制,Nignx的sql防注入安全策略,Nginx的整體配置,搭建合理Nginx中介軟體架構配置步驟、策略Nginx效能優化:架構優化,作業系統優化、Nginx優化等...
常見問題
多個server_name中虛擬主機讀取的優先順序
當多個配置檔案中server_name
相同,埠也相同時,Nginx讀取配置檔案的時候是按照檔名順序進行讀取的,優先讀取第一個檔名下的配置.
如server1.conf
,server2.conf
,那優先載入的配置是server1.conf
下面的配置.
啟動時會丟擲警告
多個location匹配的優先順序
=:進行普通字元精確匹配,也就是完全匹配(高優先順序)
^~:表示普通字元匹配,使用字首匹配(高優先順序)
~ ~*:表示執行一個正則匹配()
https://segmentfault.com/a/1190000002797606
try_files使用
按順序檢查檔案是否存在
location / {
try_files $uri $uri/ /index.html
}
$uri
這個是nginx的一個變數,存放著使用者訪問的地址,
比如:http://www.xxx.com/index.html
, 那麼$uri
就是/index.html
$uri/
代表訪問的是一個目錄,比如:http://www.xxx.com/hello/test/
$uri/
就是 /hello/test/
完整的解釋就是:try_files
去嘗試到網站目錄讀取使用者訪問的檔案,如果第一個變數存在,就直接返回;
不存在繼續讀取第二個變數,如果存在,直接返回;不存在直接跳轉到第三個引數上。
比如使用者訪問這個網地址:http://www.xxx.com/test.html
try_files
首先會判斷他是檔案,還是一個目錄,結果發現他是檔案,與第一個引數 $uri
變數匹配。
然後去到網站目錄下去查詢test.html
檔案是否存在,如果存在直接讀取返回。如果不存在直接跳轉到第三個引數,而第三個引數是一個location
alias和root的使用區別
location /request_path/image/ { root /loca_path/image/; }
一個請求http://XXX.XXX.XXX.XXX/request_path/iamge/cat.png
,則實際的資源路徑為/local_path/image/request_path/image/cat.png
,實際是root+請求路徑
。
location /request_path/image/ {
alias /loca_path/image/;
}
一個請求http://XXX.XXX.XXX.XXX/request_path/iamge/cat.png
,則實際的資源路徑為/loca_path/image/cat.png
,沒有請求的那個路徑。
如何獲取使用者真實的ip資訊
使用remote_addr
使用X-Forwarded-For
使用X-Real-IP
(自定義)
常見錯誤碼
413 Request Entity Too Large
修改使用者上傳檔案限制 client_max_body_size502 bad gateway
後端伺服器無響應504 Gateway Time-out
後端服務執行超時403 訪問被拒絕
404 資源未找到
400 請求引數錯誤
效能優化
ab壓測工具
http://httpd.apache.org/docs/current/programs/ab.html
系統與Nginx效能優化
- 網路
- 系統
- 服務
- 程式
- 資料庫,底層服務
檔案控制代碼設定
- 檔案控制代碼, Linux一切皆檔案,檔案控制代碼可以理解為就是一個索引
- 檔案控制代碼會隨著我們程序的呼叫頻繁增加
- 系統預設對檔案控制代碼有限制,不能讓一個程序無限的呼叫
- 需要限制每個程序和每個服務使用多大的檔案控制代碼
- 檔案控制代碼是必須要調整的優化引數
- 設定方式
- 系統全域性性修改
- 使用者區域性性修改(vim /etc/security/limits.conf)
- 程序區域性性修改
(vim /etc/nginx/nginx.conf
)加入如下內容:
worker_rlimit_nofile 35535;
CPU親和配置
CPU親和, 減少程序之間不斷頻繁遷移, 減少效能損耗
將Nginx worker程序綁到不同的核心上
//啟動多少worker程序, 官方建議和cpu核心一致, 第一種繫結組合方式
#worker_processes 24;
#worker_cpu_affinity 000000000001 000000000010 000000000100 000000001000 000000010000 000000100000 000001000000 000010000000 000100000000 001000000000 010000000000 10000000000;
//第二種方式
#worker_processes 2;
#worker_cpu_affinity 101010101010 010101010101;
//最佳方式繫結方式
worker_processes auto;
worker_cpu_affinity auto;
檢視nginx worker程序繫結至對應cpu
ps -eo pid,args,psr|grep [n]ginx
Nginx通用配置優化
user nginx;
worker_processes auto; #使用的工作執行緒數
worker_put_affinity auto; # CPU親和配置
# worker_cpu_affinity 01 10;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
# 調整至1w以上,負荷較高建議2-3w以上
worker_rlimit_nofile 35535; #檔案控制代碼設定
events {
use epoll; # 使用epoll模型,提高併發效能
worker_connections 10240; # 每一個worker可以處理的連線數
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
#Charset
charset uft-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; # 靜態伺服器推薦開啟
#tcp_nodelay on;
keepalive_timeout 65;
gzip on;
gzip_disable "MSIE [1-6]\."; # IE6以前不支援Gzip的壓縮,關閉
gzip_http_version 1.1;
include /etc/nginx/conf.d/*.conf;
}
Nginx安全
常見的惡意行為
爬蟲行為和惡意抓取,資源盜用
預防方法:
基礎防盜鏈功能
secure_link_module-資料加密
access_module-對後臺提供IP防護
攻擊手段之暴力破解
密碼撞庫
預防方法:
提高密碼複雜度
access_module-對後臺提供IP防護
預警機制(結合lua)
檔案上傳漏洞
利用可以上傳檔案的介面將惡意程式碼植入到伺服器中,再通過url去訪問以執行程式碼
SQL注入
Nginx+LUA防火牆功能
https://github.com/loveshell/ngx_lua_waf