初識Nginx性能安全優化

搜狗測試2019-06-26 02:33:22

前言

最近小編的項目上線了官方網站,同大部分Web服務網站相同,小編項目的Web站採用了LNMP(Linux、Nginx、Mysql、PHP)架構。其中Nginx的作用是將靜態資源進行解析返回給用户;動態資源通過FastCGI接口發送給PHP引擎服務,PHP進行讀庫解析,並最終把Nginx服務把獲取的數據返給用户。

因為此Web站主要作用是協助運營同學推廣產品,所以除了最基本的網站頁面測試,Web頁面的性能、合理的服務器資源分配同時也是比較重要的需求。一方面,我們可以通過優化瀏覽器渲染、HTML文件格式、文本資源壓縮等方式提升頁面性能;一方面可以考慮優化Nginx的配置來增強其傳輸及併發支持能力。

方案一:配置Nginx gzip壓縮提升性能

Nginx gzip壓縮模塊提供了壓縮文件內容的功能,用户請求的內容在發送到客户端之前,Nginx服務器會根據一些具體的策略實施壓縮,以節約網站出口帶寬,同時加快數據傳輸效率,來提升用户訪問體驗。

Nginx gzip壓縮特點

  • 提升網站用户體驗:發送給用户的內容小了,用户訪問單位大小的頁面就加快了,用户體驗也就隨之提升。

  • 節約網站帶寬成本:數據是壓縮傳輸的,因此節省了網站的帶寬流量成本,不過壓縮時會稍微消耗一些CPU資源,這個一般可以忽略。

參數配置

對應的參數配置解釋如下:

gzip on;

開啟gzip壓縮功能。


gzip_min_length lk;

設置允許壓縮的頁面最小字節數,頁面字節數從 essay-header頭的 Content-Length中獲取。默認值是0,表示不管頁面多大都進行壓縮。建議設置成大於1K,

如果小於1K可能會越壓越大。


gzip_buffers 4 16k;

壓縮緩衝區大小。表示申請4個單位為16K的內存作為壓縮結果流緩存,默認值是申請與原始數據大小相同的內存空間來存儲gzip壓縮結果。


gzip_http_version 1.1;

壓縮版本(默認1.1,前端為 squid2.5時使用1.0),用於設置識別HTTP協議版本,默認是1.1,目前大部分瀏覽器已經支持G2IP解壓,使用默認即可。


gzip_comp_level 2;

壓縮比率。用來指定gzip壓縮比,1壓縮比最小,處理速度最快;9壓縮比最大,傳輸速度快,但處理最慢,也比較消耗CPU資源。


gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml applicat ion/xml+rss;

用來指定壓縮的類型,除了“ text/html” 之外,還允許對指定的MIME類型進行gzipping響應。特殊值“*”匹配任何MIME類型(0.8.29)。

text/html始終壓縮具有“ ”類型的響應。


gzip_vary on;

vary essay-header支持。該選項可以讓前端的緩存服務器緩存經過gzip壓縮的頁面,例如用Squid緩存經過 Nginx壓縮的數據。

實際參數優化配置如下:

gzip on;

gzip_min_length 1k;

gzip_buffers 4 32k;

gzip_comp_level 5;

gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss;

gzip_vary on;

方案二:開啟高效文件傳輸模式

Nginx其實是存在高效模式的,如同顯卡和CPU我們可以通過超頻來榨乾它們的性能,我們也可以開啟一些隱藏模式來提升Nginx的工作效率。

sendfile 參數用於開啟文件的高效傳輸模式。同時將tcp_nopush和tcp_nodelay兩個指令設置為on,可防止網絡及磁盤IO阻塞,實際提高性能。

sendfile on ;

tcp_nopush on;

tcp_nodelay on;

tcp_nopush 參數用於激活 Linux 上的 TCP_CORK socket 選項,此選項僅僅當開啟 sendfile 時才生效,tcp_nopush 參數可以允許把 http response essay-header 和文件的開始部分放在一個文件裏發佈,以減少網絡報文段的數量

方案三:控制Nginx併發連接數量

我們可以通過限制每個key值的連接數,尤其是控制單個IP可連接數。此方法在服務器下載,限制每次訪問下載目錄的連接數尤其有效。對應配置為nginx_http_limit_conn_module

實際配置文件如下:

[[email protected] conf]# cat nginx.conf

worker_processes 4;

events {

worker_connections 20480;

}

http {

include mime.types;

server_tokens on;

sendfile on;

keepalive_timeout 65;

default_type application/octet-stream;

limit_conn_zone $binary_remove_addr zone=addr:10m; # 添加limit_conn_zone參數

server {

listen 80;

servername www.sogou.com;

location / {

root html;

index index.html index.htm;

limit_conn addr 1; # 設置單IP連接數為1

}

}

}

在客户端使用ab測試工具進行測試:

ab -c 2 -n 10 http://127.0.0.1/

模擬併發連接2,訪問服務器10次,可看到狀態碼200和503間隔是1:1 説明nginx已經做了併發連接的限制,對超時連接做出了503響應。

結束語

在保障基本功能的同時優化前後端性能具有重要意義;產品的基礎是用户體驗,如果脱離了快速、高效的用户體驗,設計再為漂亮的界面也毫無意義。所以當我們在做需求的時候,除了基本的“測試保障”,同時也需要了解架構實現細節,優化安全與效率性,切實測出一個可用、平穩、高效的線上產品。

歡迎添加我們的搜狗測試微信號,與我們一起聊聊測試。


https://hk.wxwenku.com/d/201004016