ngnix 反向代理

1       課程目標css

掌握nginx+tomcat反向代理的使用方法。html

掌握nginx做爲負載均衡器的使用方法。linux

掌握nginx實現web緩存方法。nginx

 

2       nginx介紹

2.1    什麼是nginx

         Nginx是一款高性能的http 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器。官方測試nginx可以支支撐5萬併發連接,而且cpu、內存等資源消耗卻很是低,運行很是穩定。c++

        

3       nginx安裝

3.1    下載

 

進入http://nginx.org/en/download.html 下載nginx1.8.0版本(當前最新穩定版本)。web

 

 

 

 

3.2    安裝

3.2.1  nginx安裝環境

         nginx是C語言開發,建議在linux上運行,本教程使用Centos6.5做爲安裝環境。正則表達式

n  gcc算法

         安裝nginx須要先將官網下載的源碼進行編譯,編譯依賴gcc環境,若是沒有gcc環境,須要安裝gcc:yum install gcc-c++apache

n  PCRE後端

         PCRE(Perl Compatible Regular Expressions)是一個Perl庫,包括 perl 兼容的正則表達式庫。nginx的http模塊使用pcre來解析正則表達式,因此須要在linux上安裝pcre庫。

yum install -y pcre pcre-devel

注:pcre-devel是使用pcre開發的一個二次開發庫。nginx也須要此庫。

n  zlib

         zlib庫提供了不少種壓縮和解壓縮的方式,nginx使用zlib對http包的內容進行gzip,因此須要在linux上安裝zlib庫。

yum install -y zlib zlib-devel

 

n  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

 

一、  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目錄

 

 

二、  編譯安裝

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基本上安裝成功。

 

4       Nginx的rpm軟件包安裝

4.1    安裝包在位置

D:\講課內容--\新巴巴運動網\nginx高併發解決\nginx安裝包

 

4.2    此種安裝方式不用安裝gcc等編譯工具

4.3    安裝命令以下

rpm –ivh nginx

5       配置虛擬主機

5.1    什麼是虛擬主機

         虛擬主機是一種特殊的軟硬件技術,它能夠將網絡上的每一臺計算機分紅多個虛擬主機,每一個虛擬主機能夠獨立對外提供www服務,這樣就能夠實現一臺主機對外提供多個web服務,每一個虛擬主機之間是獨立的,互不影響的。

 

以下圖:

 

 

 

經過nginx能夠實現虛擬主機的配置,nginx支持三種類型的虛擬主機配置,一、基於ip的虛擬主機, 二、基於域名的虛擬主機 三、基於端口的虛擬主機

 

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協議的。

 

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

 

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.五、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緩存過程以下:

 

一、客戶端第一次請求url,好比請求ccc.test.com/index.html

二、nginx計算url的哈希值

         md5(url)

         即:MD5('ccc.test.com/index.html'),獲得b5ac8d82f6ef789fe7081ef4a43f9230

三、建立緩存目錄,寫入緩存數據

若是緩存目錄的規則設置爲 levels=1:2,建立目錄以下:

取出b5ac8d82f6ef789fe7081ef4a43f9230的最後一位0做爲目錄名建立目錄,再取出0前邊的兩位23做爲目錄名在0目錄下邊建立目錄,即一級目錄爲0,二級目錄名爲23,最後將代理得到的http響應數據存儲在緩存數據文件中,緩存文件命名爲b5ac8d82f6ef789fe7081ef4a43f9230寫入0/23目錄下。

 

四、客戶端再次請求相同的url,對url進行哈希獲得緩存數據文件的地址,若是找到緩存數據則直接返回給客戶端再也不請求web服務器。

 

 

9.3    需求

一、對靜態文件進行緩存:html,js,css,png,gif,jpg,jpeg,bmp,swf。

二、對符合url規則的請求進行緩存。

三、針對某個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)$ {  

         #若是後端的服務器返回50二、50四、執行超時等錯誤,自動將請求轉發到 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日誌

相關文章
相關標籤/搜索