1. 程式人生 > >Nginx緩存加速

Nginx緩存加速

tcp 再次 vim mage log vpd linux下 實現 cati

一、Nginx緩存概述
  • 提供與Squid類似的緩存,把URL以及相關信息當成key,用MD5編碼哈希後,把數據文件保存在硬盤上,並且只能為指定的URL或者狀態碼設置過期時間,並不支持類似 squid的purge命令來手動清除指定緩存頁面,但是可以通過第三方的ngx_cache_purge來清除指定的URL緩存
  • Nginx的緩存加速功能是由proxy_cache(用於反向代理和靜態緩存)和fastcgi_cache(PHP動態緩存)兩個功能模塊完成

1.proxy_cache原理

技術分享圖片

2.Nginx緩存特點

  • 緩存穩定,運行速度與Squid相差無幾(因為都使用硬盤緩存)
  • 對多核CPU的利用率比其他的開源軟件好
  • 支持高並發請求數,能同時承受更多的訪問請求

3.Nginx緩存、Varnish、Squid對比

  • Squid:應用較早,支持傳統、透明、反向等功能的一款應用軟件,設置較復雜,一般配合CDN
  • Varnish:新興軟件,設計簡單,使用內存緩存數據(快)
  • Nginx緩存:需通過調用模塊實現緩存功能,基於硬盤緩存數據

二、案例:Nginx緩存加速


技術分享圖片

主機 系統 IP 網卡 軟件
Nginx Centos 6.7 64Bit 192.168.1.10 vmnet1 nginx nginx_cache_purge
Web(Apache) Centos 6.7 64Bit 192.168.1.100 vmnet1 httpd

Nginx

1.環境準備

vim /etc/sysconfig/network-scripts/ifcfg-eth0
        DEVICE=eth0                             //網卡名稱
        TYPE=Ethernet                           //網卡類型為以太網
        ONBOOT=yes                          //開機自啟該網卡
        NM_CONTROLLED=no                        //關閉NetworkManager
        BOOTPROTO=static                        //網卡設置為靜態方式
        IPADDR=192.168.1.10                     //IP地址配置
        NETMASK=255.255.255.0                   //子網掩碼配置
/etc/init.d/network restart

2.安裝Nginx

yum -y install pcre pcre-devel          //安裝依賴包
tar -zxvf ngx_cache_purge-2.0.tar.gz -C /usr/src/
//解壓nginx模塊(用於支持Nginx緩存)
tar -zxvf nginx-1.6.0.tar.gz -C /usr/src/   //解壓Nginx軟件源碼到/usr/src/目錄
cd /usr/src/nginx-1.6.0/                //進入Nginx解壓目錄
useradd -M -s /sbin/nologin nginx       //新建Nginx運行用戶
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-pcre --add-module=/usr/src/ngx_cache_purge-2.0/

選項
--prefix=/usr/local/nginx:指定Nginx安裝目錄為/usr/local/nginx
--user=nginx:指定Nginx運行用戶為nginx
--group=nginx:指定Nginx運行組為nginx
--with-http_stub_status_module:開啟狀態統計(一個簡單的頁面,顯示訪問量等)
--with-pcre:啟用pcre庫支持
--add-module=/usr/src/ngx_cache_purge-2.0/:指定需額外加載模塊的目錄位置

make && make install                            //編譯並安裝
echo "PATH=$PATH:/usr/local/nginx/sbin">>/etc/profile
//將Nginx命令路徑加入PATH變量,這時在任意位置都可使用Nginx相關命令
source /etc/profile                         //立即生效該PATH變量

3.配置Nginx

vim /usr/local/nginx/conf/nginx.conf            //編輯Nginx主配置文件
        user  nginx nginx;
                //指定Nginx運行用戶和組
        worker_processes 1;
                //啟動進程數(根據物理CPU個數設置)
        error_log  logs/error.log  crit;
                //定義錯誤日誌,記錄級別為crit(關鍵事件)
        pid        logs/nginx.pid;
                //指定PID文件(存儲程序進程號)位置
                worker_rlimit_nofile 65535;
                //打開文件的最大句柄數
        events {
            use epoll;
                        //使用epoll網絡I/O模型,優化Nginx
            worker_connections  65535;
                        //每個工作進程允許最大的同時連接數,該值與最大句柄書保持一致
        }
        http {
            include       mime.types;
                        //額外加載該文件
            default_type  application/octet-stream; 
                        //默認響應為文件流
            charset utf-8;  
                        //定義網站默認采用字符集
            sendfile        on;
                        //打開系統函數sendfile(),提高性能
            tcp_nopush     on;
                        //sendfile開啟後才生效,調用tcp_cork方法
            keepalive_timeout  65;
                        //會話保持時間,指定時間內客戶端無訪問請求,斷開連接,需連接時重新請求
            client_body_buffer_size 512k;
                        //配置body緩沖區大小(當用戶上傳內容超出緩沖區(內存)大小,會使用"client_body_tmp_path"選項臨時將文件部分或全部寫入到臨時文件中做處理;默認為系統頁兩倍大小"getconf PAGESIZE"查看頁大小;"client_max_body_size"設置上次文件最大值)
            proxy_connect_timeout 5;
                        //後端服務器連接的超時時間(發起握手等候響應超時時間),不能超過75秒
            proxy_read_timeout 60;
                        //連接成功後,等候後端服務器響應時間,決定了nginx會等待多長時間來獲得請求的響應(也可以說是後端服務器處理請求的時間)
            proxy_send_timeout 5;
                        //後端服務器數據回傳時間,在規定時間之內後端服務器必須傳完所有的數據,如果超時後,upstream沒有收到新的數據,nginx會關閉連接
                        proxy_buffer_size 16k;  
                        //從後端服務器響應頭緩存區大小
                        proxy_buffers 4 64k;
                        //設置代理響應緩沖區的數量和大小
            proxy_busy_buffers_size 128k;
                        //proxy_buffers和proxy_buffer_size的一部分。nginx會在沒有完全讀完後端響應的時候就開始向客戶端傳送數據,所以它會劃出一部分緩沖區來專門向客戶端傳送數據(這部分的大小是由proxy_busy_buffers_size來控制的,建議為proxy_buffers中單個緩沖區大小的2倍),然後它將繼續從後端取數據,緩沖區滿了之後就寫到磁盤的臨時文件中
            proxy_temp_file_write_size 128k;
                        //代理服務器的響應過大時Nginx一次性寫入臨時文件的數據量,默認是proxy_buffer_size和proxy_buffers中設置的緩沖區大小的2倍,Linux下一般是8k
            proxy_temp_path /var/cache/nginx/cache_temp;
                        //當後端服務器的響應過大不能存儲到配置的緩沖區域時,Nginx存儲臨時文件硬盤路徑,目錄自動新建
            proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
                        //定義緩存存儲目錄,目錄下生成兩級子目錄,由 levels=1:2設置,第一層目錄只有一個字符,第二層目錄名字由二個字符組成,區域鍵值名稱為cache_one(名字隨意),在內存中緩存的空間大小為200MB,1天內沒有被訪問的緩存將自動清除(cache manager進程),最大硬盤空間緩存30GB
註:proxy_temp_path 與 proxy_cache_path 指定的路徑必須在同一分區
            upstream backend_server {
                        //定義後端服務器節點,名稱任意
server 192.168.1.100:80 weight=1 max_fails=2 fail_timeout=30s;
            }
            server {
                listen       80;
                                //定義服務器監聽端口
                server_name  192.168.1.10;
                                //定義服務器名及監聽IP
                index  index.html index.htm;
                                //Nginx首頁支持頁面
                location / {
                                //匹配客戶端所有請求,執行如下操作
                    proxy_next_upstream http_502 http_504 error timeout invalid_header;
                                        //當後端服務器返回502、504、錯誤等狀態碼,自動跳轉到upstream負載均衡池中的另一臺服務器,實現故障轉義
                    proxy_cache cache_one;
                                        //當前網頁數據緩存到上述定義位置
                    proxy_cache_valid 200 304 12h;
                                        //針對200、304狀態碼緩存12小時
                    proxy_cache_key $host$uri$is_args$args;
                                        //定義緩存Key值的格式,Nginx將Key值HASH後再存儲到指定的二級緩存目錄(如果"levels=1"定義的是一級目錄,那麽就存儲到一級緩存目錄)中;上述Key值存儲格式為(請求主機、請求的URL、如果$args設置為?,否則為空、GET請求中的參數)
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
                    proxy_pass http://backend_server;
                                        //指定跳轉服務器池,名字要與upstream設定的相同,訪問當前服務器自動轉發請求給後端服務器
                                        expires 1d;
                                        //指定客戶端瀏覽器緩存數據時間
                }
                location ~ /purge(/.*) {
                                //匹配所有以/purge/開頭的頁面請求,都將執行如下操作
                    allow 127.0.0.1;
                                        //允許本地訪問該地址
                    allow 192.168.1.0/24;
                                        //允許指定2.0網段訪問
                    deny all;
                                        //其余網段全部拒絕訪問該地址
                    proxy_cache_purge cache_one $host$1$is_args$args;
                                        //清除緩存(cache_one為之前定義的區域鍵值,$1即為位置變量(不要替換為$url,那將清除整個緩存),後面為請求參數,即清除指定緩存Key)
                }
                location ~ .*\.(php|jsp|cgi)?$ {
                                //匹配所有以.php、.jsp、.cgi結尾的頁面請求,都將執行如下操作
                    proxy_set_header Host $host;
                    proxy_set_header X-Forwarded-For $remote_addr;
                    proxy_pass http://backend_server;
                                        //所有為.php、.jsp、.cgi結尾的請求都將轉發給後端服務器,不緩存內容(因此動態頁面不需緩存,內容會隨時發生改動)
                }
                                //余下配置文件自帶內容可全部刪除,使用dG刪除
            }
        }
mkdir /var/cache/nginx                  //創建Nginx臨時和緩存存儲目錄
nginx -t                                    //檢測Nginx配置文件是否有誤

註:在運行"nginx -t"命令後,當文件確認無誤後,會自動在指定目錄下自動新建臨時、緩存目錄

ulimit -SHn 65535                   //設置系統句柄數,註意單次生效
nginx                               //運行Nginx服務,結束使用"pkill nginx"
netstat -utpln | grep 80                //查看80端口是否開啟

Web(Apache)

vim /etc/sysconfig/network-scripts/ifcfg-eth0
        DEVICE=eth0                             //網卡名稱
        TYPE=Ethernet                           //網卡類型為以太網
        ONBOOT=yes                          //開機自啟該網卡
        NM_CONTROLLED=no                        //關閉NetworkManager
        BOOTPROTO=static                        //網卡設置為靜態方式
        IPADDR=192.168.1.100                    //IP地址配置
        NETMASK=255.255.255.0                   //子網掩碼配置
/etc/init.d/network restart
yum -y install httpd                    //安裝apache服務
echo "This is Web1">/var/www/html/index.html
//給第一臺Web服務器編寫測試頁面
/etc/init.d/httpd start && chkconfig --level 35 httpd on
//啟動httpd服務並設置為開機自啟

測試

緩存測試

IE --> http://192.168.1.10(Nginx服務器IP)
技術分享圖片

ls -R /var/cache/nginx/proxy_cache/ 
//(在Nginx緩存服務器)遞歸查看目錄下內容,可以看見,剛才訪問的頁面已經緩存下來,並存儲在../c/43/目錄下

技術分享圖片
清除緩存

IE --> http://192.168.1.10/purge/ //手動清除頁面緩存
技術分享圖片

ls -R /var/cache/nginx/proxy_cache/
//(在Nginx緩存服務器)再次驗證查看緩存目錄,之前緩存的頁面文件被清除

技術分享圖片

Nginx緩存加速