web服務器 之nginx的實現

1目標
掌握nginx+tomcat反向代理的使用方法。
掌握nginx作爲負載均衡器的使用方法。
掌握nginx實現web緩存方法。

2nginx介紹
2.1什麼是nginx
Nginx是一款高性能的http 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器。官方測試nginx能夠支支撐5萬併發鏈接,並且cpu、內存等資源消耗卻非常低,運行非常穩定。

3nginx安裝
3.1下載

進入http://nginx.org/en/download.html 下載nginx1.8.0版本(當前最新穩定版本)。
這裏寫圖片描述
這裏寫圖片描述
3.2安裝
3.2.1nginx安裝環境
nginx是C語言開發,建議在linux上運行,本教程使用Centos6.5作爲安裝環境。
gcc
安裝nginx需要先將官網下載的源碼進行編譯,編譯依賴gcc環境,如果沒有gcc環境,需要安裝gcc:yum install gcc-c++
PCRE
PCRE(Perl Compatible Regular Expressions)是一個Perl庫,包括 perl 兼容的正則表達式庫。nginx的http模塊使用pcre來解析正則表達式,所以需要在linux上安裝pcre庫。
yum install -y pcre pcre-devel
注:pcre-devel是使用pcre開發的一個二次開發庫。nginx也需要此庫。
zlib
zlib庫提供了很多種壓縮和解壓縮的方式,nginx使用zlib對http包的內容進行gzip,所以需要在linux上安裝zlib庫。
yum install -y zlib zlib-devel
openssl
OpenSSL 是一個強大的安全套接字層密碼庫,囊括主要的密碼算法、常用的密鑰和證書封裝管理功能及SSL協議,並提供豐富的應用程序供測試或其它目的使用。
nginx不僅支持http協議,還支持https(即在ssl協議上傳輸http),所以需要在linux安裝openssl庫。
yum install -y openssl openssl-devel
3.2.2編譯安裝
將nginx-1.8.0.tar.gz拷貝至linux服務器。

解壓:
tar -zxvf nginx-1.8.0.tar.gz
cd nginx-1.8.0

1、configure
./configure –help查詢詳細參數(參考本教程附錄部分:nginx編譯參數)

參數設置如下:
./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

注意:上邊將臨時文件目錄指定爲/var/temp/nginx,需要在/var下創建temp及nginx目錄

2、編譯安裝
make
make install

安裝成功查看安裝目錄 :

這裏寫圖片描述

3.3啓動nginx
cd /usr/local/nginx/sbin/
./nginx

查詢nginx進程:
這裏寫圖片描述

15098是nginx主進程的進程id,15099是nginx工作進程的進程id

注意:執行./nginx啓動nginx,這裏可以-c指定加載的nginx配置文件,如下:
./nginx -c /usr/local/nginx/conf/nginx.conf
如果不指定-c,nginx在啓動時默認加載conf/nginx.conf文件,此文件的地址也可以在編譯安裝nginx時指定./configure的參數(–conf-path= 指向配置文件(nginx.conf))

3.4停止nginx
方式1,快速停止:
cd /usr/local/nginx/sbin
./nginx -s stop
此方式相當於先查出nginx進程id再使用kill命令強制殺掉進程。

方式2,完整停止(建議使用):
cd /usr/local/nginx/sbin
./nginx -s quit
此方式停止步驟是待nginx進程處理任務完畢進行停止。

3.5重啓nginx
方式1,先停止再啓動(建議使用):
對nginx進行重啓相當於先停止nginx再啓動nginx,即先執行停止命令再執行啓動命令。
如下:
./nginx -s quit
./nginx

方式2,重新加載配置文件:
當nginx的配置文件nginx.conf修改後,要想讓配置生效需要重啓nginx,使用-s reload不用先停止nginx再啓動nginx即可將配置信息在nginx中生效,如下:
./nginx -s reload

3.6安裝測試
nginx安裝成功,啓動nginx,即可訪問虛擬機上的nginx:
這裏寫圖片描述

到這說明nginx基本上安裝成功。

4Nginx的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;
    }
}

6nginx反向代理
6.1什麼是反向代理
通常的代理服務器,只用於代理內部網絡對Internet的連接請求,客戶機必須指定代理服務器,並將本來要直接發送到Web服務器上的http請求發送到代理服務器中由代理服務器向Internet上的web服務器發起請求,最終達到客戶機上網的目的。
而反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然後將請求轉發給內部網絡上的服務器,並將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現爲一個反向代理服務器。

如下圖:

6.2nginx+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.3nginx反向代理配置
根據上邊的需求在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.2nginx實現負載均衡
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服務器受理。

8nginx負載均衡高可用
8.1什麼是負載均衡高可用
nginx作爲負載均衡器,所有請求都到了nginx,可見nginx處於非常重點的位置,如果nginx服務器宕機後端web服務將無法提供服務,影響嚴重。
爲了屏蔽負載均衡服務器的宕機,需要建立一個備份機。主服務器和備份機上都運行高可用(High Availability)監控程序,通過傳送諸如“I am alive”這樣的信息來監控對方的運行狀況。當備份機不能在一定的時間內收到這樣的信息時,它就接管主服務器的服務IP並繼續提供負載均衡服務;當備份管理器又從主管理器收到“I am alive”這樣的信息時,它就釋放服務IP地址,這樣的主服務器就開始再次提供負載均衡服務。

8.2keepalived+nginx實現主備
8.2.1什麼是keepalived
keepalived是集羣管理中保證集羣高可用的一個服務軟件,用來防止單點故障。
Keepalived的作用是檢測web服務器的狀態,如果有一臺web服務器死機,或工作出現故障,Keepalived將檢測到,並將有故障的web服務器從系統中剔除,當web服務器工作正常後Keepalived自動將web服務器加入到服務器羣中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的web服務器。

8.2.2keepalived工作原理
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協議的。

詳細參考:Keepalived權威指南中文.pdf

8.2.3keepalived+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到的對象,一行一個
[email protected]
}
notification_email_from [email protected] #指定發件人
#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到的對象,一行一個
[email protected]
}
notification_email_from [email protected] #指定發件人
#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.2nginx進程檢測腳本
在主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到的對象,一行一個
[email protected]
}
notification_email_from [email protected] #指定發件人
#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。

9nginx實現web緩存
9.1什麼是nginx的web緩存
http的request和response過程即客戶端發起一個url請求到web服務器,web服務器向客戶端響應,如果讓客戶端先請求給一個緩存服務器由緩存服務器中間轉發請求至web服務器,web服務器向客戶端響應也是通過緩存服務器給客戶端響應這個就是nginx的代理功能,nginx不僅有代理功能還有緩存功能,它可以將web服務器響應的信息緩存至內存或磁盤中,當用戶再次發起相同的url時nginx就不用請求緩存服務器而直接從緩存中取出響應給客戶端,從而大大提高請求響應的效率。如下圖:

這裏寫圖片描述

9.2proxy_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.2nginx添加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的訪問日誌
這裏寫圖片描述
因爲在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.1nginx編譯參數
–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 ,則modernbrowsermodernbrowservalueold 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日誌

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章