1. 程式人生 > >Nginx從入門到實踐(四)

Nginx從入門到實踐(四)

Nginx常見問題和排錯經驗,實踐應用場景中的方法處理Nginx安全,常見的應用層安全隱患,複雜訪問控制,Nignx的sql防注入安全策略,Nginx的整體配置,搭建合理Nginx中介軟體架構配置步驟、策略Nginx效能優化:架構優化,作業系統優化、Nginx優化等...

常見問題

多個server_name中虛擬主機讀取的優先順序

當多個配置檔案中server_name相同,埠也相同時,Nginx讀取配置檔案的時候是按照檔名順序進行讀取的,優先讀取第一個檔名下的配置.
server1.confserver2.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_size

502 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

Nginx版本更新和本身漏洞

靜態資源服務的功能設計

Nginx作為代理服務的需求

需求設計評估