Nginx


Nginx榮獲2012年度雲計算開發獎,全球第二大Web服務器;開源、高性能、高併發、簡單配置,解決了C10k問題。

但在穩定性方面交老道的Apache稍差一點。

Apache穩定、開源、跨平臺,配置稍微複雜,存在C10k問題。

一、Nginx特性:

1、基本功能:

(1)、靜態資源的web服務,能自動緩存打開的文件描述符。

(2)、反向代理服務器,負載均衡、緩存。

(3)、支持FastCGI協議,因此能夠實現LNMP(Linux Nginx Mysql Php)。

(4)、高度模塊化,但非DSO機制。支持多種過濾器(如gzip),SSI和圖像大小調整等。

(5)、支持SSL.

2、擴展功能:

(1)、基於名稱和IP做虛擬主機。

(2)、支持keepalive

(3)、支持平滑配置文件更新或程序版本升級。

(4)、定製訪問日誌,以及日誌緩存以提高性能。

(5)、支持url rewrite

(6)、支持路徑別名。

(7)、支持基於IP以及用戶的認證。

(8)、支持速率限制,併發數限制等。

二、Nginx基本架構:

1、一個master,生成一個或者多個worker,一般而言worker數要小於物理cpu數量。

2、事件驅動,kqueue,epoll

3、支持非阻塞如mmap,AIO

4、支持sendfile,sendfile64

三、Nginx模塊類別:

1、核心模塊

2、標準http模塊

3、可選的http模塊

4、郵件模塊

5、第三方擴展模塊

四、Nginx的安裝以及配置:

1、編譯安裝:

安裝前確保Development Tools和Server Platform Development,

如未安裝請執行#yum -y groupinstall "Development Tools" "Server Platform Development"


(1)、#yum -y install pcre-devel 爲了解決依賴關係要裝。

(2)、首先添加用戶nginx,實現以此用戶運行nginx服務進程。

       #groupadd -r nginx

       #useradd -r -g nginx nginx

(3)、#tar xf nginx1.4.7.tar gz

    #cd nginx1.4.7

    # ./configure --prefix=/usr 

  --sbin-path=/usr/sbin/nginx 

  --conf-path=/etc/nginx/nginx.conf 

  --error-log-path=/var/log/nginx/error.log 

  --http-log-path=/var/log/nginx/access.log 

  --pid-path=/var/run/nginx/nginx.pid 

  --lock-path=/var/lock/nginx.lock 

  --user=nginx  

  --group=nginx 

  --with-http_ssl_module 

  --with-http_flv_module 

  --with-http_stub_status_module 

  --with-http_gzip_static_module 

  --with-client-body-temp-path=/var/tmp/nginx/client

  --with-proxy-temp-path=/var/tmp/nginx/proxy

  --with-fastcgi-temp-path=/var/tmp/nginx/fcgi

  --with-uwsgi-temp-path=/var/tmp/nginx/uwsgi

  --with-scgi-temp-path=/var/tmp/nginx/scgi

  --with-pcre


   #make && make install


然後啓動#/usr/sbin/nginx  ,並執行#ss -tnl 看下80端口。


(4)、開機啓動加腳本:


#vi /etc/rc.d/initd./nginx 內容如下:

#!/bin/sh

#

# nginx - this script starts and stops the nginx daemon

#

# chkconfig:   - 85 15 

# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \

#               proxy and IMAP/POP3 proxy server

# processname: nginx

# config:      /etc/nginx/nginx.conf

# config:      /etc/sysconfig/nginx

# pidfile:     /var/run/nginx.pid

 

# Source function library.

. /etc/rc.d/init.d/functions

 

# Source networking configuration.

. /etc/sysconfig/network

 

# Check that networking is up.

[ "$NETWORKING" = "no" ] && exit 0

 

nginx="/usr/sbin/nginx"

prog=$(basename $nginx)

 

NGINX_CONF_FILE="/etc/nginx/nginx.conf"

 

[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

 

lockfile=/var/lock/subsys/nginx

 

make_dirs() {

   # make required directories

   user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`

   options=`$nginx -V 2>&1 | grep 'configure arguments:'`

   for opt in $options; do

       if [ `echo $opt | grep '.*-temp-path'` ]; then

           value=`echo $opt | cut -d "=" -f 2`

           if [ ! -d "$value" ]; then

               # echo "creating" $value

               mkdir -p $value && chown -R $user $value

           fi

       fi

   done

}

 

start() {

    [ -x $nginx ] || exit 5

    [ -f $NGINX_CONF_FILE ] || exit 6

    make_dirs

    echo -n $"Starting $prog: "

    daemon $nginx -c $NGINX_CONF_FILE

    retval=$?

    echo

    [ $retval -eq 0 ] && touch $lockfile

    return $retval

}

 

stop() {

    echo -n $"Stopping $prog: "

    killproc $prog -QUIT

    retval=$?

    echo

    [ $retval -eq 0 ] && rm -f $lockfile

    return $retval

}

 

restart() {

    configtest || return $?

    stop

    sleep 1

    start

}

 

reload() {

    configtest || return $?

    echo -n $"Reloading $prog: "

    killproc $nginx -HUP

    RETVAL=$?

    echo

}

 

force_reload() {

    restart

}

 

configtest() {

  $nginx -t -c $NGINX_CONF_FILE

}

 

rh_status() {

    status $prog

}

 

rh_status_q() {

    rh_status >/dev/null 2>&1

}

 

case "$1" in

    start)

        rh_status_q && exit 0

        $1

        ;;

    stop)

        rh_status_q || exit 0

        $1

        ;;

    restart|configtest)

        $1

        ;;

    reload)

        rh_status_q || exit 7

        $1

        ;;

    force-reload)

        force_reload

        ;;

    status)

        rh_status

        ;;

    condrestart|try-restart)

        rh_status_q || exit 0

            ;;

    *)

        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"

        exit 2

esac


而後爲此腳本賦予執行權限:

# chmod +x /etc/rc.d/init.d/nginx


添加至服務管理列表,並讓其開機自動啓動:

# chkconfig --add nginx

# chkconfig nginx on


而後就可以啓動服務並測試了:

# service nginx start


2、nginx配置 /etc/nginx/nginx.conf

注意:配置參數需要以分號結尾,否則就語法錯誤,語法格式:參數名 值1 [值2...];

分爲兩段:核心段和http段,重要參數如下:

參數配置請參考http://nginx.org/en/docs/http/ngx_http_core_module.html

(1)、核心配置段{


A、正常運行必備的配置:

a、user username [groupname];  

 指定運行worker進程的用戶和組

b、pid /path/to/pidfile_name;  

 指定nginx的pid文件

c、worker_rlimit_nofile #;  

 指定一個worker進程所能夠打開的最大文件句柄數

d、worker_rlimit_sigpending #;  

 指定每個用戶能夠發往worker進程的信號的數量


B、優化性能相關的配置:

a、worker_processes #;  

 worker進程的個數,通常其值爲CPU的物理核心數減1,即1個留給系統內核用。

b、worker_cpu_affinity cpumask ...; 

如共6個cpu,啓動四個cpu,則配置爲

             worker_processes 4;  

             worker_cpu_affinity 00000001 00000010 00000100 00001000; 

c、worker_priority nice; 

  worker進程的優先級, nice的值爲[-20,19],nice越小優先級越高。

d、ssl_engine device; 

  在存在ssl硬件加速器的服務器上,指定所使用的ssl硬件加速設備。

e、timer_resolution T; 

 每次內核事件調用返回時,都會調用系統的gettimeofday()來更新nginx緩存時鐘,timer_relolution用於定義每隔多久更新一次緩存時鐘;X86_64系統上,調用gettimeofday()代價較小,可以忽略此項;X86_32系統上代價較大。


C、事件相關的配置:

a、accept_mutex [on|off]; 

  是否打開nginx負載均衡鎖;此鎖能夠讓多個worker輪流地與客戶端建立連接;即實現worker間負載均衡。

wKioL1WBOcnC3osLAAB9CECmfrE393.jpg

b、lock_file /path/to/lock_file; 

  lock文件;如果accept_mutex爲off,那麼lock_file 失效。

c、accept_mutex_delay #ms; 

  accept鎖模式中,一個worker進程爲取得accept鎖的等待時長。默認爲 500ms。如果某worker進程在每次師徒取得鎖時失敗,至少要等待#ms才能再次請求鎖。

d、multi_accept{on|off}; 

  是否允許一次性地響應多個用戶請求;默認爲off,默認一個一個請求被響應處理。

e、use [epoll|rtsig|select|poll]; 

  定義使用的事件模型,建議讓nginx自動選擇,在linux一般選擇epoll;

f、worker_connections #; 

  每個worker能夠併發響應的最大請求數;


D、用於調試、定位問題:只在調試nginx時使用。

a、daemon [on|off]; 

  是否讓nginx運行於後臺;默認爲on,調試時爲off,使得所有信息輸出到控制檯,方便查看信息。

b、master_process [on|off]; 

  是否讓master管理多個worker運行,默認爲on;調試時爲off,以方便追蹤問題。

c、error_log /path/to/error_log level;   

    錯誤日誌文件以及級別,默認爲error級別;調試時可以使用debug級別,

    但要求在編譯時必須使用--with_debug啓動debug功能。

}


(2)http配置段{

    說明:Nginx必須使用虛擬主機配置站點;

         每個虛擬主機使用一個server{}段配置;

         非虛擬主機的配置或者公共配置,需要配置在server{}外。

         具體格式如下:

directive value;

...

server{

  listen 80;

  server_name localhost;

  location{

        }

}

server{


}

...


A、重要配置詳情:

a、server{}:

  定義一個虛擬主機,支持基於主機名或者IP的虛擬主機。

b、listen:

  listen address[:port]

  listen port

  default_server:定義此server爲http中默認的server;如果所有的server中沒有任何一

              個listen使用此參數,那麼第一個server爲默認server。

  rcvbuf=SIZE:接收緩衝大小;

  sndbuf=SIZE:發送緩衝大小;

  ssl:https server


c、server_name相關:

  • server_name NAME...;可以跟多個主機名;當nginx收到一個請求時,會取出其首部的server的值,而後跟衆server_name進行比較。

  • server_name_hash_bucket_size 32|64|128;爲了實現快速查找主機名,nginx使用hash表保存主機名;


d、location相關:

  根據用戶請求的URI,匹配指定的各location,匹配到時將被location來處理。

  location定義在server或者location中,location可以出現多次,但不能放在http上下文中。

  • location [ =|~|~*|^~ ]  uri { ... } 

  • location @name {...}

        =:精確匹配

        ~:正則表達式模式匹配,匹配時區分字符大小寫。

        ~*:正則表達式模式匹配,匹配時忽略字符大小寫。

        ^~:uri前半部分匹配,不檢查正則表達式。

wKioL1WDgaKieJZUAAFq0XSpLLE346.jpg

e、文件路徑定義:

  • root path:設置web資源路徑,用於指定請求的根文件目錄,通常定義在location中。

      如:location / {

        root /www/html;

        index index.html index.htm

        }

        location ^~ /images/ {

        root /web;

        }

       http://www.a.org/images/b.html

       b.html放置用於/web/images/下

  • alias path:用於配置路徑別名,只能用於location中。

      如:location / {

        root /www/html;

        index index.html index.htm

        }

        location ^~ /images/ {

        alias /web;

        }

        http://www.a.org/images/b.html

        b.html放置用於/web/下

        注意:root path和alias path配置時,b.html的放置路徑。


  • index file...:定義默認頁,自左而右匹配。

       如:location / {

        root /www/html;

        index index.html index.htm

        }

  • error_page code ...[=[reponse]] uri;當對於某個請求返回錯誤是,如果匹配上了error_page指令中設定的code,則重定向指定的頁面。如error_page 404 /404.html,error_page可以定義在server或者location中。

      如:location / {

           root /www/html;

           index index.html index.htm

           error_page 404 /404.html

        }

  • try_files path1 [path2] uri;錯誤重定向。

       如:location /tryfile {

           root /www/html;

           index index.html index.htm

           try_files $uri /tryfile.html

        }


f、網絡連接相關的配置:

  • keepalive_timeout time;設置保持連接的超時時長,默認爲75s中。

wKioL1WDu7zACLQYAAEriDXE9Ls645.jpg

  • keepalive_request n;在一次長連接上允許承載的最大請求數;

    wKioL1WDvGDBxbMpAADw1VW_pvo688.jpg

  • keepalive_disable [msie6|safari|none];對指定的瀏覽器禁止使用長連接。

    wKioL1WDvQGi1dC7AAGj4SUEtCE429.jpg

  • tcp_nodelay {on|off} ;對keepalive連接是否使用tcp_nodelay選項。

  wKioL1WDvMPCj9gJAACx1B-tZmk446.jpg

  • client_header_timeout time;讀取http請求首部的超時時長。

  • send_timeout time;發送響應的超時時長。

g、對客戶端請求的限制:

  • limit_except method...{...};排除請求方法。

wKioL1WDvieSdzpXAAGIvtEp4QY713.jpg  Please note that this will limit access to all methods except GET and HEAD.


  • client_max_body_size SIZE;http請求的包體的最大值,常用於限定客戶所能請求的最大包體;

 根據請求首部中的Content-length來檢測,以免無用的傳輸。如:上傳附件的限制。

  • limit_rate speed;限制客戶端每秒傳輸的字節數,默認爲0,表示沒有限制。

    wKiom1WDvSLwxZ99AAJd6YhFLoA391.jpg

  • limit_rate_after time;nginx向客戶發送響應報文時,如果時長超出此處制定的時長,則後續的發送過程開始限速;如:下載網站需要限速,web站點一般就不需要限速了 哈哈...

    wKiom1WDvZrSNgjrAADziSw-_TE937.jpg

h、文件操作的優化:

  • sendfile {on|off};是否啓用sendfile功能。

  • aio {on|off};是否啓用aio功能。

  • open_file_cache max=N [inactive=time]|off;

    是否打開文件緩存功能:

     max:緩存條目的最大值,當滿了以後將根據LRU算法進行置換。

     inactive:某緩存條目在指定時長內沒被訪問時,將自動被刪除,默認爲60s。

 緩存的信息包括:

   文件句柄、文件大小和上次修改時間。

   已經打開的目錄結構。

   沒有找到或者沒有訪問權限的信息。

  • open_file_cache_errors on|off;是否緩存文件找不到或者沒有權限訪問等相關信息。

  • open_file_cache_valid time;多長時間檢查一次緩存中的條目是否超出非活動時長,默認60s

  • open_file_cache_min_use #;在inactive指定的時長內被訪問超出此處指定的次數,纔不會被刪除

i、對客戶端請求的特殊處理:

  • ignore_invalid_heads on|off;是否忽略不合法的http首部;on爲默認,忽略不合法的http首部;off意味着請求首部中出現不合規的首部拒絕響應。

  • log_not_found on|off;是否將文件找不到的信息記錄到錯誤日誌中。

  • resolver address;指定nginx使用的dns服務器地址。

  • resover_timeout time;指定DNS解析超時時長,默認30s;

  • server_tokens on|off;是否在錯誤頁面中顯示nginx的版本號。

j、內存以及磁盤資源分配:

  • client_body_in_file_only on | clean | off;

    http的包體是否存儲磁盤文件中;非off表示存儲,默認爲off

    on|clean:clean請求結束後包體文件會被刪除,on請求結束後包體文件不會被刪除。

  • client_body_in_single_buffer on | off;

http的包體是否存儲在內存buffer中,默認爲off。

client_body_buffer_size size;nginx接收http包體的內存緩衝區大小,和client_body_in_single_buffer配合使用。client_body_temp_path dir_path [level1 [level2 [level3]]];定義http包體存放的臨時目錄,可以多級目錄;和client_body_in_file_only配合使用。client_header_buffer_size size;正常情況下接收用戶請求的http報文header部分時分配的buffer大小,默認爲1k。large_client_header_buffers number size;定義存儲超大http請求首部的內存buffer大小以及個數。connection_pool_size size;nginx對於每個建立成功的tcp練級誒都會預先分配一個內存池,此處即用於設定此內存池的初始大小,默認爲256。

}



3、重要的內置變量:

$uri :當前請求的uri,不帶參數;

$host:http請求報文中的host首部,不過請求中沒有host,則以處理此請求的虛擬主機的主機名替代。

$request_uri:當前請求的uri,帶完整參數;

$hostname:nginx服務器運行在的主機的主機名;

$remote_addr:客戶端IP

$remote_port:客戶端port

$remote_user:使用用戶認證時,客戶端用戶輸入的用戶名;

$request_method:請求方法

$server_addr:服務器地址

$server_name:服務器名稱

$server_port:服務器端口

$server_protocol:服務器想客戶端發送響應時的協議,如http/1.1,http/1.0


五、配置使用Nginx:

1、Nginx虛擬主機的使用:

例如:配置兩個虛擬主機:www.a.com和www.b.org


則需要在nginx.conf中配置兩個server,具體配置如下:


server{

  listen 80;

  server_name www.a.com;


  location /{

   root /www/a.com;

   index index.html index.htm index.php index.jsp;

  }


  error_page 500 502 503 504 /50x.html;

  location =/50x.html{

       root html;

  }

}


server{

   listen 80 default_server;

   server_name www.b.org;

   root /www/b.org;

}



2、基於IP的訪問控制:

access{

   allow

   deny

}

或者在server中直接寫

allow

deny


例如僅允許 172.16.0.0/16這個網段訪問,配置如下:

allow 172.16.0.0/16

deny all


3、基於用戶做訪問控制:


location /admin/ {

root /www/b.org;

auth_basic "admin_area";

auth_basic_user_file /etc/nginx/.htpasswd;

}


4、autoindex模塊:站點未配置主頁時,將站點的所有頁面以列表形式顯示輸出。

            通常不打開,非常危險,只有建立下載站點時纔打開。

location /download/ {

   root /www/b.org;

   autoindex on;

}


5、圖片防盜鏈:

(1)、定義防盜鏈的步驟:

A、定義合規的引用:

 valid_referers none|blocked|server_names|string ...;

B、拒絕不合規的引用:

 if($invalid_referer){

   rewrite ^/.*$ http://www.b.org/403.html 或者 return 404

 } 


(2)、例如:

location ~* \.(jpg|png|gif|jpeg)$ {

  root /www/b.org;

  valid_referers none blocked www.b.org *.b.org ~\.google\. ~\.baidu\.;

  if($invalid_referer){

   rewrite ^/.*$ http://www.b.org/403.html 或者 return 404

  } 

}

注意:~\.google\.允許google的爬蟲


6、URL rewrite相關:

URL rewrite使用場景如京東早期的網址爲www.360buy.com,現在網址www.jd.com,那麼訪問www.360buy.com必須自動跳轉到www.jd.com;還有服務器升級,文件路徑變更,也需要重定向;以及將url跳轉等等;


(1)、rewrite regex replacement [flag];


A、flag的值:

  • last:一旦被當前規則匹配並重寫後立即停止檢查後續的其他rewrite的規則,而重寫後的規則會重新發起請求。

  • break:一旦被當前規則匹配並重寫後立即停止檢查後續的其他rewrite的規則,而重寫後的規則不會重新發起請求。

  • redirect:返回302臨時重定向。

  • permanent:返回301永久重定向。

B、注意:如果出現死循環,nginx最多循環10次,超出之後會返回500錯誤。

  一般將rewrite寫在location中時都使用break,或者將rewrite寫在if上下文中。

如:

location / {

  root /www/b.org;

  rewrite ^/images/(.*)$ /imgs/$1 break;

}

(2)、rewrite_log on|off :

    是否把重寫過程記錄在錯誤日誌中;默認爲off。一般爲off,繁忙的服務器一定爲off。

(3)、return code:

     用於結束rewrite規則,並且爲客戶返回狀態碼,可以使用的狀態碼有204 400 402-406,500-504等。

 如:if($invalid_referer){

   rewrite ^/.*$ return 404

 } 

7、gzip 壓縮:

nginx將響應報文發送至客戶端之前可以啓用壓縮功能,這樣能夠有效節約帶寬,並提高響應至客戶端的速度。通常編譯nginx時默認會附帶gzip壓縮的功能,因此可以直接啓用之。


http {

    gzip on;

    gzip_http_version 1.0;

    gzip_comp_level 2;

    gzip_types text/plain text/css text/xml text/javascript 

      application/x-javascript application/xml application/xml+ress application/javascript application/json;

    gzip_disable msie6;

}

六、Nginx反向代理及負載均衡:Nginx比LVS好用,並易於配置。


1、正向代理:

  幫一個網絡內的多個客戶端訪問公網的服務叫正向代理,正向代理簡言之就是代表客戶端。

2、反向代理:

  幫助服務器接收請求的服務叫反向代理,反向代理簡言之就是代表服務器端。

3、nginx的兩種常用用途:

(1)、靜態內容的web服務器。

(2)、反向代理,處理併發連接處理能力很強,因爲nginx是先緩存請求,然後一併發到後端服務器。

4、Nginx的proxy模塊:Nginx通過proxy模塊實現反向代理功能。

(1)、Nginx通過proxy模塊實現反向代理功能。

   Nginx在作爲web反向代理服務器時,nginx負責接收客戶請求,並能夠根據URI、客戶端參數或者其    他的處理邏輯將用戶請求調度至上游服務器上。nginx在實現反向代理功能時的最重要的指令爲      proxy_pass,它能夠將location定義的某URI代理至指定的上游

   服務器(組)上。如下面的示例中,location的/uri將被替換爲上游服務器上的/newuri.

   location /uri {

    proxy_pass http://www.b.org:8080/newuri;

   }

   不過,這種處理機制中有兩個例外。

   第一個例外是,如果location的URI是通過模式匹配定義的,其URI將直接被傳遞到上游服務器,而    不能爲其指定轉換的另一個URI。例如:/bbs將被代理爲http://www.b.org:8080/bbs

   ,即newuri就不要寫了。

   location ~^/bbs {

    proxy_pass http://www.b.org:8080;

   }

   第二個例外是,如果location中使用的是URL重定向,那麼nginx將使用重定向後的URI處理請求,    而不再考慮上游服務器上第一的URI。如下例,傳遞給上游服務器的URI爲/index.php?page=      <match>,而不是/index

   location / {

    rewrite /(.*)$ /index.php?page=$1 break;

    proxy_pass http://www.b.org:8080/index;

   }

(2)、proxy模塊指令:

   proxy模塊可配置的指令參數非常多,它們分別用於定義proxy模塊工作時的諸多屬性,如連接超時    時長、代理時使用http協議版本等。

  • proxy_connect_timeout:nginx將一個請求發送至上游服務器(upstream server)之前等待的最大時長。默認60s

  • proxy_cookie_domain ;

    將upstream server通過set-cookie首部設定爲domain屬性修改爲指定的值,其值可以爲一個字符、串、正則表達式的模式或一個引用變量。

  • proxy_cookie_path ;將upstream server通過set_cookie首部設定的path屬性修改爲指定的值,其值可以爲一個字符串、、正則表達式的模式或一個引用變量。

  • proxy_hide_header ;設定發送給客戶端的報文中需要隱藏的首部。


  • proxy_pass ;指定將請求代理至upstream server的url路徑。


  • proxy_set_header ;將發送至upstream server的報文的某首部進行重寫。


  • proxy_redirect ;重寫location並刷新從upstream server收到的報文首部。


  • proxy_send_timeout;在連接斷開之前兩次發送至upstream server的寫操作的最大間隔時長。

      

  • proxy_read_timeout;在連接斷開之前兩次發送至upstream server接收讀操作的最大間隔時長。


5、Upstream 模塊實現負載均衡。

http://nginx.org/en/docs/http/ngx_http_upstream_module.html

(1)、upstream name {

      server address [parameters];

    },只能放在http段中,各server只能直接使用IP或者主機名,不要加協議。

  • 示例如下:

   http{

     .....

    upstream webservers {

       server 172.16.1.8 weight=1 max_fails=2 fail_timeout=5;

      server 172.16.1.18  weight=2  max_fails=2 fail_timeout=5;

       server 127.0.0.1:8080 backup;

    }

     

    ......

     server {

      listen 80;

     server_name www.b.org;

      location / {

        proxy_pass http://webservers;

       proxy_set_header X_Real_IP $remote_addr; 

      }

    }


    server {

     listen 8080;

   server_name 127.0.0.1;

   root /www/backup;

 

  }

     ......

    }

  • server address [parameters];的parameters如下:

    weight=#;設置權重

    max_fails=#;最大失敗嘗試次數,默認爲1

   fail_timeout=#;失敗嘗試超時時長,默認爲10s。

  • backup:當轉發失敗,轉發至本機。

  • health_check:健康狀態監測。

    health_check [interval=time] [fails=number] [passes=number] [uri=uri] [match=name];

    定義在location中。

    interval:多長時間監測一次

    fails:嘗試失敗次數,如果超過此次數,則認爲失敗。

    passes:重新上線次數。

  uri:監測是uri.

   match:自定義狀態監測。

wKiom1WI-JvQhE6yAAB_ZmhBJ5E078.jpg

  • ip_hash;用在upstream中,實際上就是源地址hash,實現session綁定。


    wKiom1WI-frBd57_AABrSFHtwe4386.jpg

(2)、緩存區、緩存:提高反向代理的性能。

  • 緩存區設定:

    nginx在默認情況下在將其響應給客戶端之前會儘可能接收來自於upstream服務器的響應報文,它會將這些響應報文暫存於本機並儘量一次性地響應給客戶端,然而在來自於客戶端的請求或來自upstream服務器的響應過多時,nginx會試圖將之存儲於本地磁盤中,這將大大降低nginx的性能。因此在有着更多可用內存的場景中,應該將用於暫存這些報文的緩衝區調大至一個合理值。

    proxy_buffer_size size:設定用於暫存來自於upstream服務器的第一個響應報文的緩衝區大小。

    proxy_buffering on|off:啓用緩衝upstream服務器的響應報文,否則,如果proxy_max_temp_file_size指令的值爲0,來自upstream服務器的響應報文在接收到的那一刻

    將同步發送至客戶端;一般情況下,啓用proxy_buffering並將proxy_max_temp_file_size設定爲0能夠啓用緩存響應報文的功能,並能夠避免將其緩存至磁盤中。

    proxy_buffers 8 4k|8k:用於緩存來自upstream服務器的響應報文的緩衝區大小。8爲8個緩衝區個數,4k|8k爲緩衝區大小。

  • 緩存:

    nginx作爲反向代理時,能夠將來自upstream的響應緩存至本地(一般緩存到磁盤),並在後續的客戶端請求同樣內容時直接從本地構造響應報文。

    proxy_cache zone|off:定義一個用於緩存的共享內存區域,其可被多個地方調用;緩存將遵從upstream服務器的響應報文首部中關於緩存的設定,如"Expires"、"Cache-Control:no-cache"、"Cache-control:max-age=XXX" 、"private"和"no-store"等,但nginx在緩存時不會考慮響應報文的"Vary"首部。爲了確保私有信息不被緩存,所有關於用戶的私有信息可以在upstream上通過"no-cache" or "max-age=0"來實現,也可在nginx設定proxy_cache_key必須包含用戶特有數據如$cookie_xxx的方式實現,單最後這種方式在公共緩存上使用可能會有風險。因此,在響應報文中含有以下首部或者指定標誌的報文將不會被緩存。

    Set-Cookie

    Cache-Control containing "no-cache","no-store","private",or a "max-age" with a non-numeric or 0 value

    Expires with a time in the past

    X-Accel-Expires:0


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