web性能優化——代理(nginx)

来源:http://www.cnblogs.com/ansn001/archive/2016/07/25/5704207.html
-Advertisement-
Play Games

簡介 一個很好的原則是調優時每次只個性一個配置。如果對配置的個性不能提高性能的話,改回預設值 優化必須要通過性能測試。不能意淫,需要前後對比,真實說明問題。 場景 1. 優化nginx。 2. 確保每次請求控制一定資源。 3. 減少訪問web容器 解決方案 nginx優化 全局優化 日誌 日誌是要讀 ...


簡介

一個很好的原則是調優時每次只個性一個配置。如果對配置的個性不能提高性能的話,改回預設值
優化必須要通過性能測試。不能意淫,需要前後對比,真實說明問題。

場景

  1. 優化nginx。
  2. 確保每次請求控制一定資源。
  3. 減少訪問web容器

解決方案

nginx優化

全局優化

# nginx進程數,建議按照cpu數目來指定,一般為它的倍數。
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
# 這個指令是指當一個nginx進程打開的最多文件描述符數目,理論值應該是最多打開文件數(ulimit -n)與nginx進程數相除,但是nginx分配請求並不是那麼均勻,所以最好與ulimit -n的值保持一致
worker_rlimit_nofile 65535;
events {
    # 使用epoll的I/O模型。
    use epoll;
    # 每個進程允許的最多連接數,理論上每台nginx伺服器的最大連接數為worker_processes*worker_connections
    worker_connections  50000;
}

#sendfile 指令指定 nginx 是否調用 sendfile 函數(zero copy 方式)來輸出文件,對於普通應用,
#必須設為 on,如果用來進行下載等應用磁碟IO重負載應用,可設置為 off,以平衡磁碟與網路I/O處理速度,降低系統的uptime.
sendfile        on; 

#連接超時時間,單位時間是秒
keepalive_timeout  180;

#FastCGI相關參數是為了改善網站的性能:減少資源占用,提高訪問速度。下麵參數看字面意思都能理解。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;

#防止網路阻塞
tcp_nopush      on; 
tcp_nodelay        on; 
#開啟gzip壓縮
gzip  on; 
gzip_min_length 512;
gzip_buffers 4 16k;
gzip_http_version 1.0;   #壓縮版本(預設1.1,前端如果是squid2.5請使用1.0)
gzip_comp_level 5;
#壓縮類型,預設就已經包含text/html,所以下麵就不用再寫了,寫上去也不會有問題,但是會有一個warn。
gzip_types text/plain application/json application/x-javascript text/css application/xml;
gzip_vary on; 
gzip_disable "MSIE [1-6]\.";



# 這個是指多長時間檢查一次緩存的有效信息。
open_file_cache_valid 30s;
# open_file_cache指令中的inactive參數時間內文件的最少使用次數,如果超過這個數字,文件描述符一直是在緩存中打開的,如上例,如果有一個文件在inactive時間內一次沒被使用,它將被移除。
open_file_cache_min_uses 1;
# 客戶端請求頭部的緩衝區大小,這個可以根據你的系統分頁大小來設置,一般一個請求的頭部大小不會超過1k,不過由於一般系統分頁都要大於1k,所以這裡設置為分頁大小。分頁大小可以用命令getconf PAGESIZE取得
open_file_cache max=102400 inactive=20s;

日誌

日誌是要讀寫文件的,I/O消耗特別嚴重。日誌是否開啟可以根據自己具體的架構需求。
建議的是如下:

  1. 靜態資源不記錄。

    # 靜態資源通過nginx來管理
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css|ico)$ {
    # 關閉日誌
    access_log off;
    include deny/agent.conf;
    if (-f $request_filename) {
        expires 1d;
        break;
    }
    }
  2. 動態資源要記,但是需要添加緩存。

    access_log  logs/access.log  main buffer=12k;

限制資源使用

這個其實和安全非常相似。本質是限制資源使用,這樣就能讓有限的資源為更多人提供服務。
所以可以參見:web安全——代理(nginx)

減少訪問web容器

一般web容器的性能都是比較差了,所以儘量阻止訪問web容器。

動靜分離

一般的web容器的長鏈接性能都比較弱,而nginx在這方面又特別優秀。

# 動態的服務
server {
        server_name  sso.xxx.com;
        #監聽
        listen       80; 
        location / { 
            #反向代理到指定的服務
            proxy_pass http://xxx-server;
            #定義伺服器的預設網站根目錄位置
            root    /; 
            proxy_set_header Host $host;
            #後端的Web伺服器可以通過X-Forwarded-For獲取用戶真實IP
            proxy_set_header  X-Real-IP  $remote_addr;
            proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
            client_max_body_size  100m;
        }
}
# 靜態的服務
server {
        server_name  static.xxx.com;
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css|ico)$ {
        # 文件根目錄,這個目錄根據文件的位置變更即可。
        root /home/static;
        if (-f $request_filename) {
           expires 1d;
           break;
        }
}
}

緩存化

把一些熱點的數據放在緩存伺服器,這樣能提升性能。
srcache_nginx+redis構建緩存系統。在web應用中通過設置http的緩存特性(最好是基於註釋或者配置,對開發者儘量是透明的,不要增加業務複雜度),來判斷是否需要緩存。

#設置key,根據功能變數名稱和uri
set $key $host$request_uri;
#來一個md5,要不然key太長。而且key特別長的時候,貌似在srache_store的時候執行不了
set_md5 $md5key $key;
#調用HttpSRCacheModule的srcache_fetch 在http進入時,執行該方法,如果取到值,則不執行代理(即不執行tomcat),直接返回
srcache_fetch GET /redis2_get $md5key;
#如果沒有設置緩存時間,則預設時間為這個
srcache_default_expire 3600s;
#調用HttpSRCacheModule的srcache_store在執行代理(即執行tomcat)後,執行該方法,而且必需為“cache-control” 不等於"no-cahce"才執行。
#srcache_expire的取值優先順序
#1、如果有cache-control;max-age=N,則取N
#2、如果沒有,有expire,則取expire
#3、如果都沒有取srcache_default_expire
srcache_store PUT /redis2_set key=$md5key&expire=$srcache_expire;

靜態化

把基本沒有變化的請求轉為靜態文件資源。直接通過文件提供服務。
實現思路見下麵的參考資料。
不過可能會有個問題,需要註意並且以後去解決

# 問題
平常訪問是沒有問題,但在高併發下,你想死的心都有。打開文件不對,一看是前面還沒寫完,另外一個用戶就訪問了,又寫,導致文件格式不對。
# 建議思路
如果最終還是要寫html,還是通過程式去實現。例如:新聞類更新時,由編輯人員點擊發佈,此時可能就寫了一個靜態的html,而不是由用戶去訪問出發寫html,避免高併發會出現的問題 

需要進一步思考的地方:
緩存化靜態化使用的場景。以及在nginx使用靜態化是否合適。

驗證方法

  1. pagespeed.webkaka.com。驗證是否開啟gzip。
  2. ab|webbench,來測試介面。

參考資料

  1. srcache_nginx+redis構建緩存系統
  2. nginx - 性能優化,突破十萬併發
  3. 通過Nginx架設靈活的網站靜態化方案

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • learn python3   這是我初學Python時寫的一套Python基礎示常式序.主要基於廖雪峰老師的Python3教程和<<深入理解Python>>. 感謝! 下麵是這些示常式序的目錄總結:  Chapter1:容器/集合/C ...
  • @(MyBatis)[Cache] MyBatis源碼分析——Cache構建以及應用 SqlSession使用緩存流程 如果開啟了二級緩存,而Executor會使用CachingExecutor來裝飾,添加緩存功能,該CachingExecutor會從MappedStatement中獲取對應的Cac ...
  • 當我們享受著jdk帶來的便利時同樣承受它帶來的不幸惡果。通過分析Hashtable就知道,synchronized是針對整張Hash表的,即每次鎖住整張表讓線程獨占,安全的背後是巨大的浪費,而現在的解決方案 ConcurrentHashMap。 ConcurrentHashMap和Hashtable ...
  • 正好需要,在網上找了好久,記錄一下 ...
  • 一、概念 1、定義 反應堆模式是一種對象行為類的設計模式,對同步事件分揀和派發。它是處理併發I/O比較常見的一種模式,用於同步I/O。 其中心思想是將所有要處理的I/O事件註冊到一個中心I/O多路復用器上,同時主線程阻塞在多路復用器上;一旦有I/O事件到來或者是準備就緒,多路復用器返回並將相應的I/ ...
  • 畢業到轉行以來有一年時間了,成為一名程式猿也有大半年了,之前在新浪上隨便寫寫簡單的學習過程,感覺不夠像那麼回事,現在接觸前端也有一段時間了,也做過幾個項目,認識到可以拓展的實在太多了,希望從這裡起步,踏踏實實,記錄好點點滴滴。 HHL Gulp使用步驟: 1 安裝node(npm),全局安裝,我使用 ...
  • 一、概述 工廠方法模式定義了一個創建對象的介面,但由子類決定要實例化的類是哪一個。工廠方法讓類把實例化推遲到子類。 二、解決問題 通常我們需要一個對象的時候,會想到使用new來創建對象 Tea tea = new MilkTea(); //使用了介面,代碼更有彈性,體現設計原則“對介面編程,而不是對 ...
  • 第一步:在tomcat啟動的時候 1、在tomcat啟動的時候,首先會載入struts2的核心過濾器StrutsPrepareAndExecuteFilter 我們打開源代碼,進入核心過濾器 在核心過濾器裡面有init()方法,用於在啟動tomcat的時候初始化struts2用的 首先我們去看一下如 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...