4?Nginx的rpm軟件包安裝
4.1?安裝包在位置
D:\講課內容--\新巴巴運動網\nginx高并發解決\nginx安裝包
4.2?此種安裝方式不用安裝gcc等編譯工具
4.3?安裝命令如下
rpm –ivh nginx
?
5?配置虛擬主機
5.1?什么是虛擬主機
虛擬主機是一種特殊的軟硬件技術,它可以將網絡上的每一臺計算機分成多個虛擬主機,每個虛擬主機可以獨立對外提供www服務,這樣就可以實現一臺主機對外提供多個web服務,每個虛擬主機之間是獨立的,互不影響的。
如下圖:
?
?
通過nginx可以實現虛擬主機的配置,nginx支持三種類型的虛擬主機配置,1、基于ip的虛擬主機, 2、基于域名的虛擬主機 3、基于端口的虛擬主機
?
5.2?基于域名的虛擬主機配置
5.2.1?需求
兩個域名指向同一臺服務器,用戶訪問不同的域名顯示不同的網頁內容。
兩個域名是aaa.test.com和bbb.test.com
一臺服務器還使用虛擬機192.168.101.3代替
?
5.2.2?創建工程目錄
創建/usr/local/aaa_html,此目錄為aaa.test.com域名訪問的目錄
創建/usr/local/bbb_html,此目錄為bbb.test.com域名訪問的目錄
目錄中的內容使用nginx自帶的html文件,將/usr/local/nginx/html中的內容拷貝分別拷貝到上邊兩個目錄中,并且將aaa_html目錄中的index.html內容改為:“Welcome to aaa nginx!”
將bbb_html目錄中的index.html內容改為“Welcome to bbb?nginx!”
?
5.2.3?虛擬主機配置
修改/usr/local/nginx/conf/nginx.conf文件,添加兩個虛擬主機,如下:
#配置虛擬主機aaa.test.com?
server {
#監聽的ip和端口,配置本機ip和端口
????????listen 192.168.101.3:80; ?
#虛擬主機名稱是aaa.test.com,請求域名aaa.test.com的url將由此server配置解析
????????server_name aaa.test.com; ?
#所有的請求都以/開始,所有的請求都可以匹配此location
????????location / {
#使用root指令指定虛擬主機目錄即網頁存放目錄
#比如訪問http://ip/test.html將找到/usr/local/aaa_html/test.html
#比如訪問http://ip/item/test.html將找到/usr/local/aaa_html/item/test.html
????????????????root /usr/local/aaa_html;
????#指定歡迎頁面,按從左到右順序查找
????????????????index index.html index.htm;
????????}
????}
?
#配置虛擬主機bbb.test.com
????server {
????????listen 192.168.101.3:80;
????????server_name bbb.test.com;
????????location / {
????????????????root /usr/local/bbb_html;
????????????????index index.html index.htm;
????????}
????}
?
6?nginx反向代理
6.1?什么是反向代理
通常的代理服務器,只用于代理內部網絡對Internet的連接請求,客戶機必須指定代理服務器,并將本來要直接發送到Web服務器上的http請求發送到代理服務器中由代理服務器向Internet上的web服務器發起請求,最終達到客戶機上網的目的。
而反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然后將請求轉發給內部網絡上的服務器,并將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現為一個反向代理服務器。
?
如下圖:
?
6.2?nginx+tomcat反向代理
6.2.1?需求
兩個tomcat服務通過nginx反向代理,本例子使用三臺虛擬機進行測試,
nginx服務器:192.168.101.3
tomcat1服務器:192.168.101.5
tomcat2服務器:192.168.101.6
如下圖:
?
?
?
6.2.2?啟動tomcat
tomcat使用apache-tomcat-7.0.57版本,在192.168.101.5和192.168.101.6虛擬機上啟動tomcat。
?
6.2.3?nginx反向代理配置
根據上邊的需求在nginx.conf文件中配置反向代理,如下:
?
#配置一個代理即tomcat1服務器
upstream tomcat_server1 {
????????????server 192.168.101.5:8080;
????????}
#配置一個代理即tomcat2服務器
????upstream tomcat_server2 {
????????????server 192.168.101.6:8080;
????????}
?
#配置一個虛擬主機
????server {
????????listen 80;
????????server_name aaa.test.com;
????????location / {
#域名aaa.test.com的請求全部轉發到tomcat_server1即tomcat1服務上
????????????????proxy_pass http://tomcat_server1;
#歡迎頁面,按照從左到右的順序查找頁面
????????????????index index.jsp index.html index.htm;
????????}
?
????}
?
????server {
????????listen 80;
????????server_name bbb.test.com;
?
????????location / {
?#域名bbb.test.com的請求全部轉發到tomcat_server2即tomcat2服務上
??????????????????proxy_pass http://tomcat_server2;
??????????????????index index.jsp index.html index.htm;
????????}
????}
?
6.2.4?測試
分別修改兩個tomcat下的webapps/ROOT/index.jsp的內容,使用tomcat1和tomcat2兩個服務首頁顯示不同的內容,如下:
tomcat1下的index.jsp修改后:
tomcat2下的index.jsp修改后:
?
分別訪問aaa.test.com、bbb.test.com測試反向代理。
請求訪問aaa.test.com通過nginx代理訪問tomcat1,請求訪問bbb.test.com通過nginx代理訪問tomcat2。
7?負載均衡
7.1?什么是負載均衡
負載均衡 建立在現有網絡結構之上,它提供了一種廉價有效透明的方法擴展網絡設備和服務器的帶寬、增加吞吐量、加強網絡數據處理能力、提高網絡的靈活性和可用性。
負載均衡,英文名稱為Load Balance,其意思就是分攤到多個操作單元上進行執行,例如Web服務器、FTP服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工作任務。
?
7.2?nginx實現負載均衡
7.2.1?需求
nginx作為負載均衡服務器,用戶請求先到達nginx,再由nginx根據負載配置將請求轉發至 tomcat服務器。
nginx負載均衡服務器:192.168.101.3
tomcat1服務器:192.168.101.5
tomcat2服務器:192.168.101.6
?
7.2.2?配置
根據上邊的需求在nginx.conf文件中配置負載均衡,如下:
?
upstream tomcat_server_pool{
????????server 192.168.101.5:8080 weight=10;
????????server 192.168.101.6:8080 weight=10;
????????}
?
????server {
????????listen 80;
????????server_name aaa.test.com;
????????location / {
?????????????????proxy_pass http://tomcat_server_pool;
?????????????????index index.jsp index.html index.htm;
????????}
????}
?
7.2.3?測試
請求aaa.test.com,通過nginx負載均衡,將請求轉發到tomcat服務器。
通過觀察tomcat的訪問日志或tomcat訪問頁面即可知道當前請求由哪個tomcat服務器受理。
?
8?nginx負載均衡高可用
8.1?什么是負載均衡高可用
nginx作為負載均衡器,所有請求都到了nginx,可見nginx處于非常重點的位置,如果nginx服務器宕機后端web服務將無法提供服務,影響嚴重。
為了屏蔽負載均衡服務器的宕機,需要建立一個備份機。主服務器和備份機上都運行高可用(High Availability)監控程序,通過傳送諸如“I am alive”這樣的信息來監控對方的運行狀況。當備份機不能在一定的時間內收到這樣的信息時,它就接管主服務器的服務IP并繼續提供負載均衡服務;當備份管理器又從主管理器收到“I am alive”這樣的信息時,它就釋放服務IP地址,這樣的主服務器就開始再次提供負載均衡服務。
?
8.2?keepalived+nginx實現主備
8.2.1?什么是keepalived
keepalived是集群管理中保證集群高可用的一個服務軟件,用來防止單點故障。
? Keepalived的作用是檢測web服務器的狀態,如果有一臺web服務器死機,或工作出現故障,Keepalived將檢測到,并將有故障的web服務器從系統中剔除,當web服務器工作正常后Keepalived自動將web服務器加入到服務器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的web服務器。
?
8.2.2?keepalived工作原理
keepalived是以VRRP協議為實現基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗余協議。
虛擬路由冗余協議,可以認為是實現路由器高可用的協議,即將N臺提供相同功能的路由器組成一個路由器組,這個組里面有一個master和多個backup,master上面有一個對外提供服務的vip(該路由器所在局域網內其他機器的默認路由為該vip),master會發組播,當backup收不到VRRP包時就認為master宕掉了,這時就需要根據VRRP的優先級來選舉一個backup當master。這樣的話就可以保證路由器的高可用了。
keepalived主要有三個模塊,分別是core、check和VRRP。core模塊為keepalived的核心,負責主進程的啟動、維護以及全局配置文件的加載和解析。check負責健康檢查,包括常見的各種檢查方式。VRRP模塊是來實現VRRP協議的。
?
8.2.3?keepalived+nginx實現主備過程
8.2.3.1?初始狀態
8.2.3.2?主機宕機
8.2.3.3?主機恢復
8.2.4?高可用環境
兩臺nginx,一主一備:192.168.101.3和192.168.101.4
兩臺tomcat服務器:192.168.101.5、192.168.101.6
?
8.2.5?安裝keepalived
?
分別在主備nginx上安裝keepalived
D:\講課內容--\新巴巴運動網\nginx高并發解決\高可用\keepalived\安裝包
安裝命令:
查看openssl的版本:要求必須是openssl-1.0.1e以上才行、如果版本已經符合、不用再安裝openssl
?(非必須)Rpm –Uvh openssl-1.0.1e-30.el6.8.i686.rpm
安裝keepalived軟件
?rpm –ivh keepalived-1.2.13-5.el6_6.i686.rpm
?
8.2.6?配置keepalived
8.2.6.1?主nginx
修改主nginx下/etc/keepalived/keepalived.conf文件
?
! Configuration File for keepalived
?
#全局配置
global_defs {
???notification_email { ?#指定keepalived在發生切換時需要發送email到的對象,一行一個
?????XXX@XXX.com
???}
???notification_email_from XXX@XXX.com ?#指定發件人
???#smtp_server XXX.smtp.com ????????????????????????????#指定smtp服務器地址
???#smtp_connect_timeout 30 ??????????????????????????????#指定smtp連接超時時間
???router_id LVS_DEVEL ???????????????????????????????????#運行keepalived機器的一個標識
}
?
vrrp_instance VI_1 {
????state MASTER ??????????#標示狀態為MASTER 備份機為BACKUP
????interface eth0 ????????#設置實例綁定的網卡
????virtual_router_id 51 ??#同一實例下virtual_router_id必須相同
????priority 100 ??????????#MASTER權重要高于BACKUP 比如BACKUP為99 ?
????advert_int 1 ??????????#MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒
????authentication { ??????#設置認證
????????auth_type PASS ????#主從服務器驗證方式
????????auth_pass 8888
????}
????virtual_ipaddress { ???#設置vip
????????192.168.101.100 ??????#可以多個虛擬IP,換行即可
????}
}
?
8.2.6.2?備nginx
修改備nginx下/etc/keepalived/keepalived.conf文件
配置備nginx時需要注意:需要修改state為BACKUP , priority比MASTER低,virtual_router_id和master的值一致
?
! Configuration File for keepalived
?
#全局配置
global_defs {
???notification_email { ?#指定keepalived在發生切換時需要發送email到的對象,一行一個
????XXX@XXX.com
???}
???notification_email_from XXX@XXX.com?? ? ?#指定發件人
???#smtp_server XXX.smtp.com ???????????????????????????? #指定smtp服務器地址
???#smtp_connect_timeout 30 ??????????????????????????????#指定smtp連接超時時間
???router_id LVS_DEVEL ???????????????????????????????????#運行keepalived機器的一個標識
}
?
vrrp_instance VI_1 {
????state BACKUP ??????????#標示狀態為MASTER 備份機為BACKUP
????interface eth0 ????????#設置實例綁定的網卡
????virtual_router_id?51 ??#同一實例下virtual_router_id必須相同
????priority 99 ???????????#MASTER權重要高于BACKUP 比如BACKUP為99 ?
????advert_int 1 ??????????#MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒
????authentication { ??????#設置認證
????????auth_type PASS ????#主從服務器驗證方式
????????auth_pass 8888
????}
????virtual_ipaddress { ???#設置vip
????????192.168.101.100 ??????#可以多個虛擬IP,換行即可
????}
}
?
8.2.7?測試
主備nginx都啟動keepalived及nginx。
service keepalived start
./nginx
?
8.2.7.1?初始狀態
查看主nginx的eth0設置:
vip綁定在主nginx的eth0上。?
查看備nginx的eth0設置:
vip沒有綁定在備nginx的eth0上。?
訪問ccc.test.com,可以訪問。
?
8.2.7.2?主機宕機
將主nginx的keepalived停止或將主nginx關機(相當于模擬宕機),查看主nginx的eth0:
eth0沒有綁定vip
?
注意這里模擬的是停止 keepalived進程沒有模擬宕機,所以還要將nginx進程也停止表示主nginx服務無法提供。
?
查看備nginx的eth0:
vip已經漂移到備nginx。
訪問ccc.test.com,可以訪問。
?
8.2.7.3?主機恢復
將主nginx的keepalived和nginx都啟動。
查看主nginx的eth0:
?
查看備nginx的eth0:
vip漂移到主nginx。?
查看備nginx的eth0:
eth0沒有綁定vip
訪問:ccc.test.com,正常訪問。
注意:主nginx恢復時一定要將nginx也啟動(通常nginx啟動要加在開機啟動中),否則即使vip漂移到主nginx也無法訪問。
?
8.2.8?解決nginx進程和keepalived不同時存在問題
8.2.8.1?問題描述
keepalived是通過檢測keepalived進程是否存在判斷服務器是否宕機,如果keepalived進程在但是nginx進程不在了那么keepalived是不會做主備切換,所以我們需要寫個腳本來監控nginx進程是否存在,如果nginx不存在就將keepalived進程殺掉。
?
8.2.8.2?nginx進程檢測腳本
在主nginx上需要編寫nginx進程檢測腳本(check_nginx.sh),判斷nginx進程是否存在,如果nginx不存在就將keepalived進程殺掉,check_nginx.sh內容如下:
#!/bin/bash
# 如果進程中沒有nginx則將keepalived進程kill掉
A=`ps -C nginx --no-header |wc -l` ?????## 查看是否有 nginx進程 把值賦給變量A
if [ $A -eq 0 ];then ???????????????????## 如果沒有進程值得為 零
???????service keepalived stop ?????????## 則結束 keepalived 進程
fi
?
將check_nginx.sh拷貝至/etc/keepalived下,
腳本測試:
將nginx停止,將keepalived啟動,執行腳本:sh /etc/keepalived/check_nginx.sh
從執行可以看出自動將keepalived進程kill掉了。
?
8.2.8.3?修改keepalived.conf
修改主nginx的keepalived.conf,添加腳本定義檢測:
注意下邊紅色標識地方:
?
#全局配置
global_defs {
???notification_email { ?#指定keepalived在發生切換時需要發送email到的對象,一行一個
?????XXX@XXX.com
???}
???notification_email_from miaoruntu@itcast.cn ?#指定發件人
???#smtp_server XXX.smtp.com ????????????????????????????#指定smtp服務器地址
???#smtp_connect_timeout 30 ??????????????????????????????#指定smtp連接超時時間
???router_id LVS_DEVEL ???????????????????????????????????#運行keepalived機器的一個標識
}
vrrp_script check_nginx {
????script "/etc/keepalived/check_nginx.sh" ????????##監控腳本
????interval 2 ?????????????????????????????????????##時間間隔,2秒
????weight 2 ???????????????????????????????????????##權重
}
vrrp_instance VI_1 {
????state MASTER ??????????#標示狀態為MASTER 備份機為BACKUP
????interface eth0 ????????#設置實例綁定的網卡
????virtual_router_id 51 ??#同一實例下virtual_router_id必須相同
????priority 100 ??????????#MASTER權重要高于BACKUP 比如BACKUP為99
????advert_int 1 ??????????#MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒
????authentication { ??????#設置認證
????????auth_type PASS ????#主從服務器驗證方式
????????auth_pass 8888
????}
???track_script {
????????check_nginx ???????#監控腳本
???}
????virtual_ipaddress { ???#設置vip
????????192.168.101.100 ??????#可以多個虛擬IP,換行即可
????}
?
}
?
修改后重啟keepalived
?
8.2.8.4?測試
回到負載均衡高可用的初始狀態,保證主、備上的keepalived、nginx全部啟動。
停止主nginx服務
觀察keepalived日志:
tail -f /var/log/keepalived.log
查看keepalived進程已經不存在。
查看eth0已經沒有綁定vip。
?
9?nginx實現web緩存
9.1?什么是nginx的web緩存
http的request和response過程即客戶端發起一個url請求到web服務器,web服務器向客戶端響應,如果讓客戶端先請求給一個緩存服務器由緩存服務器中間轉發請求至web服務器,web服務器向客戶端響應也是通過緩存服務器給客戶端響應這個就是nginx的代理功能,nginx不僅有代理功能還有緩存功能,它可以將web服務器響應的信息緩存至內存或磁盤中,當用戶再次發起相同的url時nginx就不用請求緩存服務器而直接從緩存中取出響應給客戶端,從而大大提高請求響應的效率。如下圖:
9.2?proxy_cache緩存過程
proxy_cache是nginx內置的一個緩存模塊,它用于反向代理時對后端web服務的內容進行緩存。這里需要注意proxy_cache只在使用反向代理proxy_pass時進行緩存。
?
proxy_cache緩存過程如下:
1、客戶端第一次請求url,比如請求ccc.test.com/index.html
2、nginx計算url的哈希值?
md5(url)
即:MD5('ccc.test.com/index.html'),得到b5ac8d82f6ef789fe7081ef4a43f9230
3、創建緩存目錄,寫入緩存數據
如果緩存目錄的規則設置為 levels=1:2,創建目錄如下:
取出b5ac8d82f6ef789fe7081ef4a43f9230的最后一位0作為目錄名創建目錄,再取出0前邊的兩位23作為目錄名在0目錄下邊創建目錄,即一級目錄為0,二級目錄名為23,最后將代理獲得的http響應數據存儲在緩存數據文件中,緩存文件命名為b5ac8d82f6ef789fe7081ef4a43f9230寫入0/23目錄下。
4、客戶端再次請求相同的url,對url進行哈希得到緩存數據文件的地址,如果找到緩存數據則直接返回給客戶端不再請求web服務器。
?
9.3?需求
1、對靜態文件進行緩存:html,js,css,png,gif,jpg,jpeg,bmp,swf。
2、對符合url規則的請求進行緩存。
3、針對某個url進行清除緩存。
?
9.4?安裝ngx_cache_purge
ngx_cache_purge是第三方開發的一個nginx模塊,不包含在 Nginx 的源碼發布版,它的作用是清理nginx緩存,對FastCGI、proxy、SCGI 和uWSGI緩存進行清除。
9.4.1?解壓ngx_cache_purge
將ngx_cache_purge-2.3.tar.gz拷貝至/usr/local/下,
tar -zxvf ngx_cache_purge-2.3.tar.gz
?
9.4.2?nginx添加ngx_cache_purge模塊
解壓nginx-1.8.0至/usr/local/
cd /usr/local/
tar -zxvf nginx-1.8.0.tar.gz
進入nginx-1.8.0目錄
cd nginx-1.8.0
下邊的配置參數注意最后一行添加add-module=/usr/local/ngx_cache_purge-2.3
?
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \
--add-module=/usr/local/ngx_cache_purge-2.3
?
編譯、安裝
make
make install
?
9.5?緩存配置
http {
????include ??????mime.types;
????default_type ?application/octet-stream;
?
????#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 ?logs/access.log ?main;
?
????sendfile ???????on;
????#tcp_nopush ????on;
?
????#keepalive_timeout ?0;
????keepalive_timeout ?65;
?
????#gzip ?on;
???
????upstream tomcat_server_pool{
server 192.168.101.5:8080 weight=10;
server 192.168.101.6:8080 weight=10;
}
#proxy_temp_path代理臨時目錄
proxy_temp_path /var/temp/nginx/proxy;
#proxy_cache_path代理緩存目錄,和proxy_temp_path必須在同一個分區
#/var/temp/nginx/proxy_cache_dir緩存目錄
#levels指定該緩存空間有兩層hash目錄,第一層目錄名是1個字母或數字長度,第二層目錄名為2個字母或數字長度
#keys_zone=cache_one:50m緩存區名稱為cache_one,在內存中的空間是50M,inactive=1d表示1天清空一次緩存 ,max_size指定磁盤空間大小為500M
proxy_cache_path /var/temp/nginx/proxy_cache_dir levels=1:2 keys_zone=cache_one:50m inactive=1d max_size=500m;
????server {
listen 80;
server_name ccc.test.com;
?
#清空緩存配置,注意必須放在最上邊,當在請求的url前加/purge/時將此url的緩存清空
location ~ /purge(/.*)
????????{
????????????#安全設置,指定請求客戶端的IP或IP段才可以清除URL緩存,這里為了方便測試設置為all
????????????#allow ?????????127.0.0.1;
????????????allow ??????????all;
????#指定清空緩存的區域名稱cache_one(要和上邊proxy_cache_path緩存配置中指定的緩存區域名稱一致)
????#指定緩存的key規則$host$1$is_args$args,要和下邊設置緩存的key一致$host$uri$is_args$args
????#注意$host$1$is_args$args中的$1表示當前請求的uri,$host$1$is_args$args=$host$uri$is_args$args
????????????proxy_cache_purge cache_one $host$1$is_args$args;
????????}
#所有的location規則都不滿足走/,使用proxy_pass將請求轉發給tomcat
location /{
?????????????????proxy_pass http://tomcat_server_pool;
?????????????????index index.jsp index.html index.htm;
????????}
#請求url以/item/開頭的進行緩存,使用此location
location ~?/item(/.*){
#指定緩存區域名稱
proxy_cache cache_one;
#以域名、URI、參數組合成Web緩存的Key值,Nginx根據Key值哈希
proxy_cache_key $host$uri$is_args$args;
#請求頭中添加請求的主機名
proxy_set_header Host ?$host;
#請求頭中添加真實的客戶端ip,通過X-Forwarded-For可獲取
proxy_set_header X-Forwarded-For ?$remote_addr;
#代理訪問后端tomcat
#請求item從緩存中找,如果緩存中沒有則向tomcat請求
#$1表示取出正則表達式(/.*)所匹配的內容,使用$1的效果例如請求http://ccc.test.com/item/100010.html則請求tomcat服務器 http://ip:port/100010.html
#如果不使用$1則會將/item/...加在tomcat服務地址之后訪問,即http://ip:port/item/100010.html
????????proxy_pass http://tomcat_server_pool$1;
}
?
#請求url以.html、js、css、png、gif結尾和此location匹配成功
location ~ \.( html|js|css|png|gif|jpg|jpeg|bmp|swf)$ { ??
#如果后端的服務器返回502、504、執行超時等錯誤,自動將請求轉發到 upstream負載均衡池中的另一臺服務器,實現故障轉移。
???????proxy_next_upstream http_502 http_504 error timeout invalid_header;
???????proxy_cache cache_one;
???????#對不同的HTTP狀態碼設置不同的緩存時間
???????proxy_cache_valid 200 10m;
???????proxy_cache_valid 304 1m;
???????proxy_cache_valid 301 302 1h;
???????proxy_cache_valid any 1m;
??????#以域名、URI、參數組合成Web緩存的Key值,Nginx根據Key值哈希
??????proxy_cache_key $host$uri$is_args$args;
??????proxy_set_header Host ?$host;
??????proxy_set_header X-Forwarded-For ?$remote_addr;
??????#如果沒有緩存則通過proxy_pass轉向tomcat請求
??????proxy_pass http://tomcat_server_pool;
}
????}
?
9.6?測試
9.6.1?第一次請求
http://ccc.test.com/item/docs/
觀察后臺tomcat的訪問日志?
9.6.2?第二次請求
http://ccc.test.com/item/docs/
觀察后臺tomcat的訪問日志,沒有發現請求日志
?
9.6.3?清空緩存
在瀏覽器請求:http://ccc.test.com/purge/item/docs/
?
說明清除緩存成功,當再次刷新此地址則報404說明沒有找到要清除的緩存文件:
?
?
9.6.4?清除緩存后再次請求
請求:http://ccc.test.com/item/docs/
觀察后臺tomcat的訪問日志
根據預期基本正確又請求了/docs/,但是為什么沒有第一次請求日志中的:
因為在nginx.conf中配置了對靜態資源文件的緩存,所以/docs/images/asf-logo.gif也被緩存,剛才清除緩存只是清除了http://ccc.test.com/item/docs/的緩存沒有清除/docs/images/asf-logo.gif的緩存。
?
9.6.5?圖片緩存清除
下邊對/docs/images/asf-logo.gif的緩存清除:
請求http://ccc.test.com/purge/item/docs/images/asf-logo.gif
?
9.6.6?再次請求
請求:http://ccc.test.com/item/docs/
觀察后臺tomcat的訪問日志
思考下這次怎么沒有/docs/的請求日志??
?
10?附錄
10.1?nginx編譯參數
--prefix= 指向安裝目錄
--sbin-path 指向(執行)程序文件(nginx)
--conf-path= 指向配置文件(nginx.conf)
--error-log-path= 指向錯誤日志目錄
--pid-path= 指向pid文件(nginx.pid)
--lock-path= 指向lock文件(nginx.lock)(安裝文件鎖定,防止安裝文件被別人利用,或自己誤操作。)
--user= 指定程序運行時的非特權用戶
--group= 指定程序運行時的非特權用戶組
--builddir= 指向編譯目錄
--with-rtsig_module 啟用rtsig模塊支持(實時信號)
--with-select_module 啟用select模塊支持(一種輪詢模式,不推薦在高載環境下使用)禁用:--without-select_module
--with-poll_module 啟用poll模塊支持(功能與select相同,與select特性相同,為一種輪詢模式,不推薦在高載環境下使用)
--with-file-aio 啟用file aio支持(一種APL文件傳輸格式)
--with-ipv6 啟用ipv6支持
--with-http_ssl_module 啟用ngx_http_ssl_module支持(使支持https請求,需已安裝openssl)
--with-http_realip_module 啟用ngx_http_realip_module支持(這個模塊允許從請求標頭更改客戶端的IP地址值,默認為關)
--with-http_addition_module 啟用ngx_http_addition_module支持(作為一個輸出過濾器,支持不完全緩沖,分部分響應請求)
--with-http_xslt_module 啟用ngx_http_xslt_module支持(過濾轉換XML請求)
--with-http_image_filter_module 啟用ngx_http_image_filter_module支持(傳輸JPEG/GIF/PNG 圖片的一個過濾器)(默認為不啟用。gd庫要用到)
--with-http_geoip_module 啟用ngx_http_geoip_module支持(該模塊創建基于與MaxMind GeoIP二進制文件相配的客戶端IP地址的ngx_http_geoip_module變量)
--with-http_sub_module 啟用ngx_http_sub_module支持(允許用一些其他文本替換nginx響應中的一些文本)
--with-http_dav_module 啟用ngx_http_dav_module支持(增加PUT,DELETE,MKCOL:創建集合,COPY和MOVE方法)默認情況下為關閉,需編譯開啟
--with-http_flv_module 啟用ngx_http_flv_module支持(提供尋求內存使用基于時間的偏移量文件)
--with-http_gzip_static_module 啟用ngx_http_gzip_static_module支持(在線實時壓縮輸出數據流)
--with-http_random_index_module 啟用ngx_http_random_index_module支持(從目錄中隨機挑選一個目錄索引)
--with-http_secure_link_module 啟用ngx_http_secure_link_module支持(計算和檢查要求所需的安全鏈接網址)
--with-http_degradation_module ?啟用ngx_http_degradation_module支持(允許在內存不足的情況下返回204或444碼)
--with-http_stub_status_module 啟用ngx_http_stub_status_module支持(獲取nginx自上次啟動以來的工作狀態)
--without-http_charset_module 禁用ngx_http_charset_module支持(重新編碼web頁面,但只能是一個方向--服務器端到客戶端,并且只有一個字節的編碼可以被重新編碼)
--without-http_gzip_module 禁用ngx_http_gzip_module支持(該模塊同-with-http_gzip_static_module功能一樣)
--without-http_ssi_module 禁用ngx_http_ssi_module支持(該模塊提供了一個在輸入端處理處理服務器包含文件(SSI)的過濾器,目前支持SSI命令的列表是不完整的)
--without-http_userid_module 禁用ngx_http_userid_module支持(該模塊用來處理用來確定客戶端后續請求的cookies)
--without-http_access_module 禁用ngx_http_access_module支持(該模塊提供了一個簡單的基于主機的訪問控制。允許/拒絕基于ip地址)
--without-http_auth_basic_module禁用ngx_http_auth_basic_module(該模塊是可以使用用戶名和密碼基于http基本認證方法來保護你的站點或其部分內容)
--without-http_autoindex_module 禁用disable ngx_http_autoindex_module支持(該模塊用于自動生成目錄列表,只在ngx_http_index_module模塊未找到索引文件時發出請求。)
--without-http_geo_module 禁用ngx_http_geo_module支持(創建一些變量,其值依賴于客戶端的IP地址)
--without-http_map_module 禁用ngx_http_map_module支持(使用任意的鍵/值對設置配置變量)
--without-http_split_clients_module 禁用ngx_http_split_clients_module支持(該模塊用來基于某些條件劃分用戶。條件如:ip地址、報頭、cookies等等)
--without-http_referer_module 禁用disable ngx_http_referer_module支持(該模塊用來過濾請求,拒絕報頭中Referer值不正確的請求)
--without-http_rewrite_module 禁用ngx_http_rewrite_module支持(該模塊允許使用正則表達式改變URI,并且根據變量來轉向以及選擇配置。如果在server級別設置該選項,那么他們將在 location之前生效。如果在location還有更進一步的重寫規則,location部分的規則依然會被執行。如果這個URI重寫是因為location部分的規則造成的,那么 location部分會再次被執行作為新的URI。 這個循環會執行10次,然后Nginx會返回一個500錯誤。)
--without-http_proxy_module 禁用ngx_http_proxy_module支持(有關代理服務器)
--without-http_fastcgi_module 禁用ngx_http_fastcgi_module支持(該模塊允許Nginx 與FastCGI 進程交互,并通過傳遞參數來控制FastCGI 進程工作。 )FastCGI一個常駐型的公共網關接口。
--without-http_uwsgi_module 禁用ngx_http_uwsgi_module支持(該模塊用來醫用uwsgi協議,uWSGI服務器相關)
--without-http_scgi_module 禁用ngx_http_scgi_module支持(該模塊用來啟用SCGI協議支持,SCGI協議是CGI協議的替代。它是一種應用程序與HTTP服務接口標準。它有些像FastCGI但他的設計更容易實現。)
--without-http_memcached_module 禁用ngx_http_memcached_module支持(該模塊用來提供簡單的緩存,以提高系統效率)
-without-http_limit_zone_module 禁用ngx_http_limit_zone_module支持(該模塊可以針對條件,進行會話的并發連接數控制)
--without-http_limit_req_module 禁用ngx_http_limit_req_module支持(該模塊允許你對于一個地址進行請求數量的限制用一個給定的session或一個特定的事件)
--without-http_empty_gif_module 禁用ngx_http_empty_gif_module支持(該模塊在內存中常駐了一個1*1的透明GIF圖像,可以被非常快速的調用)
--without-http_browser_module 禁用ngx_http_browser_module支持(該模塊用來創建依賴于請求報頭的值。如果瀏覽器為modern ,則$modern_browser等于modern_browser_value指令分配的值;如果瀏覽器為old,則$ancient_browser等于 ancient_browser_value指令分配的值;如果瀏覽器為 MSIE中的任意版本,則 $msie等于1)
--without-http_upstream_ip_hash_module 禁用ngx_http_upstream_ip_hash_module支持(該模塊用于簡單的負載均衡)
--with-http_perl_module 啟用ngx_http_perl_module支持(該模塊使nginx可以直接使用perl或通過ssi調用perl)
--with-perl_modules_path= 設定perl模塊路徑
--with-perl= 設定perl庫文件路徑
--http-log-path= 設定access log路徑
--http-client-body-temp-path= 設定http客戶端請求臨時文件路徑
--http-proxy-temp-path= 設定http代理臨時文件路徑
--http-fastcgi-temp-path= 設定http fastcgi臨時文件路徑
--http-uwsgi-temp-path= 設定http uwsgi臨時文件路徑
--http-scgi-temp-path= 設定http scgi臨時文件路徑
-without-http 禁用http server功能
--without-http-cache 禁用http cache功能
--with-mail 啟用POP3/IMAP4/SMTP代理模塊支持
--with-mail_ssl_module 啟用ngx_mail_ssl_module支持
--without-mail_pop3_module 禁用pop3協議(POP3即郵局協議的第3個版本,它是規定個人計算機如何連接到互聯網上的郵件服務器進行收發郵件的協議。是因特網電子郵件的第一個離線協議標準,POP3協議允許用戶從服務器上把郵件存儲到本地主機上,同時根據客戶端的操作刪除或保存在郵件服務器上的郵件。POP3協議是TCP/IP協議族中的一員,主要用于支持使用客戶端遠程管理在服務器上的電子郵件)
--without-mail_imap_module 禁用imap協議(一種郵件獲取協議。它的主要作用是郵件客戶端可以通過這種協議從郵件服務器上獲取郵件的信息,下載郵件等。IMAP協議運行在TCP/IP協議之上,使用的端口是143。它與POP3協議的主要區別是用戶可以不用把所有的郵件全部下載,可以通過客戶端直接對服務器上的郵件進行操作。)
--without-mail_smtp_module 禁用smtp協議(SMTP即簡單郵件傳輸協議,它是一組用于由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。SMTP協議屬于TCP/IP協議族,它幫助每臺計算機在發送或中轉信件時找到下一個目的地。)
--with-google_perftools_module 啟用ngx_google_perftools_module支持(調試用,剖析程序性能瓶頸)
--with-cpp_test_module 啟用ngx_cpp_test_module支持
--add-module= 啟用外部模塊支持
--with-cc= 指向C編譯器路徑
--with-cpp= 指向C預處理路徑
--with-cc-opt= 設置C編譯器參數(PCRE庫,需要指定–with-cc-opt=”-I /usr/local/include”,如果使用select()函數則需要同時增加文件描述符數量,可以通過–with-cc- opt=”-D FD_SETSIZE=2048”指定。)
--with-ld-opt= 設置連接文件參數。(PCRE庫,需要指定–with-ld-opt=”-L /usr/local/lib”。)
--with-cpu-opt= 指定編譯的CPU,可用的值為: pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64
--without-pcre 禁用pcre庫
--with-pcre 啟用pcre庫
--with-pcre= 指向pcre庫文件目錄
--with-pcre-opt= 在編譯時為pcre庫設置附加參數
--with-md5= 指向md5庫文件目錄(消息摘要算法第五版,用以提供消息的完整性保護)
--with-md5-opt= 在編譯時為md5庫設置附加參數
--with-md5-asm 使用md5匯編源
--with-sha1= 指向sha1庫目錄(數字簽名算法,主要用于數字簽名)
--with-sha1-opt= 在編譯時為sha1庫設置附加參數
--with-sha1-asm 使用sha1匯編源
--with-zlib= 指向zlib庫目錄
--with-zlib-opt= 在編譯時為zlib設置附加參數
--with-zlib-asm= 為指定的CPU使用zlib匯編源進行優化,CPU類型為pentium, pentiumpro
--with-libatomic 為原子內存的更新操作的實現提供一個架構
--with-libatomic= 指向libatomic_ops安裝目錄
--with-openssl= 指向openssl安裝目錄
--with-openssl-opt 在編譯時為openssl設置附加參數
--with-debug 啟用debug日志