Nginx緩存加速
阿新 • • 發佈:2018-08-25
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緩存加速