關於Nginx的架構

來源:互聯網
上載者:User

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區別

  • 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
  • alias

location /request_path/image/ {    alias /local_path/image/;}# 請求:http://www.rona1do.top/request_path/image/cat.png# 查詢: /local_path/image/cat.png

5. 用什麼樣的方法傳遞使用者的真實IP地址

  • 在有代理的情況下,remote_addr擷取的是代理的ip,不是使用者的ip

  • x-forwarded-for容易被篡改

通用解決辦法: 可以跟第一級代理協商,設定頭資訊x_real_ip記錄使用者的ip
set x_real_ip=$remote_addr

6. Nginx中常見錯誤碼

  • 413:request entity too large

    • 使用者上傳檔案限制:client_max_body_size

  • 502:bad gateway

    • 後端服務無響應

  • 504:gateway time-out

    • 後端服務逾時

二、Nginx效能最佳化

1. 效能最佳化考慮點

  • 當前系統結構瓶頸

    • 觀察指標(top查看狀態、日誌等)、壓力測試

  • 瞭解業務模式

    • 介面業務類型,系統層次化結構

  • 效能與安全

    • 配置防火牆太過於注重安全,會降低效能

2. ab介面壓力測試工具

  1. 安裝

    • yum install httpd-tools

  2. 使用

    • ab -n 2000 -c 2 http://127.0.0.1/

    • -n:總的請求數

    • -c:並發數

    • -k:是否開啟長串連

3. 系統與Nginx效能最佳化

  1. 檔案控制代碼

    • LinuxUnix一起皆檔案,檔案控制代碼就是一個索引

  2. 設定方式

    - 系統全域性修改、使用者局部性修改、進程局部性修改
系統全域性修改 和 使用者局部性修改:
設定檔: /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的命中率,從而減少記憶體訪問損耗,提高程式的速度。
  • 物理CPU數量:cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l

  • CPU核心:cat /proc/cpuinfo | grep "cpu cores" | uniq

  • 核心和進程使用率:先按top,再按1

# /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. 常見的攻擊手段

  • 後台密碼撞庫,通過猜測密碼字典不斷對後台系統嘗試性登入,擷取後台登入密碼

    • 後台登入密碼複雜度

    • access_module,對後台提供IP防控

    • 預警機制(一個IP在一段時間內重複不斷請求等)

3. 檔案上傳漏洞

利用一些可以上傳的介面將惡意代碼植入到伺服器中,再通過url去訪問以執行代碼
  • 例:http://www.rona1do.top/upload...(Nginx將1.jpg作為php代碼執行)

# 檔案上傳漏洞解決辦法location ^~ /upload {    root /opt/app/images;    if ($request_file ~* (.*)\.php){        return 403;    }}

4. SQL注入

利用未過濾/未審核使用者輸入的攻擊方法,讓應用運行本不應該啟動並執行SQL代碼
  • Nginx+LUA配置WAF防火牆防止SQL注入

  • ngx_lua_waf 下載地址

使用waf步驟:

  1. git clone https://github.com/loveshell/ngx_lua_waf.git

  2. cd ngx_lua_waf

  3. mv ngx_lua_waf /etc/nginx/waf

  4. vim /etc/nginx/waf/conf.lua,修改RulePath為對應路徑(/etc/nginx/waf/wafconf)

  5. vim /etc/nginx/waf/wafconf/post,加入一行,\sor\s+,放sql注入的正則

  6. 整合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
  1. reload Nginx

5. 複雜的訪問攻擊中CC攻擊

  • waf/conf.lua設定檔中開啟防cc攻擊配置項

    • CCDeny="on"

    • CCrate="100/60" #每60秒100次請求

四、Nginx總結

  1. 定義Nginx在服務體系中的角色

    • 靜態資源服務

    • 代理服務

    • 動靜分離

  2. 設計評估

    • LVS、keepalive、syslog、Fastcgi

    • 使用者權限、日誌目錄存放

    • CPU、記憶體、硬碟

    • 硬體

    • 系統

    • 關聯服務

  3. 配置注意事項

    • 合理配置

    • 瞭解原理(HTTP、作業系統...)

    • 關注日誌

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.