Nginx配置

1.nginx下載地址

2.nginx目錄介紹

  • 目錄結構以下:
  • 介紹
    • conf
      • 主要是配置文件的目錄,如nginx.conf,mime.types文件
    • html
      • nginx自帶的一些頁面,如404
    • logs
      • 一些log日誌,pid文件,error錯誤日誌
    • temp
      • 臨時文件目錄
    • nginx.exe
      • nginx其中文件,能夠將其配置到path路徑裏面

3.將nginx配置成windows服務

  • nginx自己能夠經過dos指令進行啓動,中止,從新加載,爲了方即可以將nginx.exe註冊爲windows服務,能夠在windows服務上看到此服務
  • 註冊步棸以下:
    • 下載小程序Windows Service Wrapper程序,下載地址以下:http://pan.baidu.com/s/1kTihzk7
    • 將下載好的windows Servic Wrapper程序重命名爲nginx-service.exe,能夠重命名也能夠不重命名。
    • 將重命名好的nginx-service.exe拷貝到nginx根目錄下(個人nginx目錄是:C:\nginx-1.10.2)。
    • 而後在nginx根目錄下建立一個xml配置文件,xml文件名必須與剛剛下載的windows service wrapper名字必須同樣,我這裏配置的nginx-service.xml,xml內容以下:
    • <?xml version="1.0" encoding="UTF-8" ?>
      <service>
      <id>nginx</id>
      <name>Nginx Service</name>
      <description>High Performance Nginx Service</description>
      <executable>C:\nginx-1.10.2\nginx.exe</executable>
      <logpath>C:\nginx-1.10.2\</logpath>
      <logmode>roll</logmode>
      <depend></depend>
      <startargument>-p C:\nginx-1.10.2</startargument>
      <stopargument>-p C:\nginx-1.10.2 -s stop</stopargument>
      </service>

       

    • 其中name配置是要如今在windows服務裏面的名字,description是描述,其餘的路徑配置nginx根路徑。

4.nginx經常使用指令

  • 啓動
    start nginx;//windows
    nginx;//linux

     

  • 中止
    nginx -s stop;
    nginx -s quit;

     

    •  stop表示當即中止nginx,不保存相關信息
    • quit表示正常退出nginx,並保存相關信息
  • 從新啓動
    nginx -s reload;

     

  • 檢測配置文件是否正確
    nginx -t;

     

5.nginx配置

  •   定義nginx運行的用戶和用戶組,默認是nobody,windows下默認不用配置
    user nobody;

     

  • nginx工做進程數,建議設置爲CPU的總核數或者設置自動配置 auto
    worker_processes 1;

     

  •  定義全局錯誤日誌文件,分別是:debug、info、notice、warn、error、crit、alert、emerg,從左到右級別依次增大,設置級別的時候會輸出自己級別以及比本身級別大的日誌,也就是說當設置爲debug時會輸出全部的日誌
    error_log logs/error.log info;

     

  • 指定進行id儲存文件的位置,該文件記錄了當前nginx主jinc進程的ID號
    pid logs/nginx.pid;

     

  • 指定nginx進程打開的最多文件描述數目,理論上最多打開文件數(Linux系統能夠用,ulimit -n查看)與nginx進程數相除,可是nginx分配請求並不均勻,因此建議與ulimit -n的值保持一致,windows能夠不作配置
    worker_rlimit_nofile 65535;
     
  •  工做模式以及鏈接數上限
    • select:標準方式,若是當前平臺沒有其餘有效的方式,則會默認編譯,你可使用--with-select_module和--with-select_module編譯參數來啓用或禁止該模塊。
    • poll:標準方式,若是當前平臺沒有其餘有效的方式,則會默認編譯,你可使用--with-select_module和--with-select_module編譯參數來啓用或禁止該模塊。
    • kqueue:高效方式,適用於FreeBSD 4.1+,OpenBSD 2.9+,NetBSD 2.0和MacOS X。運行於多處理器的MacOS X使用kqueue可能引發某些問題。
    • epool:linux系統首選,高效方式,適用於Linux 2.6+,在某些平臺,如SuSE8.2,他們有一些關聯包使2.4版本內核就可以支持epoll。
    • rtsig :可執行的實時信號,運行於Linux 2.2.19+。默認狀況下系統總體沒法有超過1024個POSIX實時(隊列的)信號,顯然這對於高負載服務器是不夠用的,所以能夠經過內核參數/proc/sys/kernel/rtsig-max增長這個隊列大小,然而,Linux 2.6.6-mm2之後,這個參數再也不可用,而且每一個處理器都是一個單獨的信號隊列,其大小經過RLIMIT_SIGPENDING指定,當隊列溢出時,nginx將丟棄它們而且使用poll方式處理鏈接直到他們恢復正常。
    • /dev/poll : 高效方式,適用於Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+和Tru64 UNIX 5.1A+。
    • eventport : 高效方式,適用於Solaris 10
    • worker_connections:事件模塊指令,用於定義nginx每一個進程的最大鏈接數,默認1024.最大客戶端鏈接由worker_processes和worker_connections決定,即max_clients = worker_processes*worker_connections,在做爲反向代理時變爲:max_clients = worker_processes*worker_connections/4。進程的最大鏈接數受Linux系統進程的最大打開文件數限制,在執行操做系統命令"ulimit -n 65536" 後worker_connections的設置才能生效。
  • events {
       #use epoll;
       worker_connections 1024;
    }

     

  •  http模塊
    #user  nobody;
    worker_processes  1;
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    #pid        logs/nginx.pid;
    events {
        worker_connections  1024;
    }
    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;
        
        #配置tomcat的IP地址和訪問端口
        upstream gw {
            server 192.168.37.136:8080 weight=1;    
        }
        server {
            listen       80;
            server_name  localhost;
    
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    
            location / {
                root   html;
                index  index.html index.htm;
            }
            #Nginx代理配置
            location /lywh {
                proxy_pass http://gw/lywh;
            }
            location /sapi {
                proxy_pass http://gw/shopappapi;
            }
            location /cas{
                proxy_pass http://gw/cas-server-webapp-4.0.0/login;
            }
            location /doc{
                proxy_pass http://gw/docs;
            }
            #定義全局404頁面
            #error_page  404              html/404.html;
    
            #定義50x錯誤頁面
            error_page   500 502 503 504  html/50x.html;
            location = /50x.html {
                root   html;
            }
        }
    
    
        # another virtual host using mix of IP-, name-, and port-based configuration
        #
        #server {
        #    listen       8000;
        #    listen       somename:8080;
        #    server_name  somename  alias  another.alias;
    
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    
    
        # HTTPS server
        #
        #server {
        #    listen       443 ssl;
        #    server_name  localhost;
    
        #    ssl_certificate      cert.pem;
        #    ssl_certificate_key  cert.key;
    
        #    ssl_session_cache    shared:SSL:1m;
        #    ssl_session_timeout  5m;
    
        #    ssl_ciphers  HIGH:!aNULL:!MD5;
        #    ssl_prefer_server_ciphers  on;
    
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    
    }

     

  • http模塊相關屬性
    http{
        include      conf/mime.types;
    	default_type  application/octet-stream;
    	log_format main '$remote_addr - $remote_user [$time_local] ''"$request" $status $bytes_sent ''"$http_referer" "$http_user_agent" ''"$gzip_ratio"';
    	log_format download '$remote_addr - $remote_user [$time_local] ''"$request" $status $bytes_sent ''"$http_referer" "$http_user_agent" ''"$http_range" "$sent_http_content_range"';
    	client_max_body_size  20m;
    	client_header_buffer_size    32K;
    	large_client_header_buffers  4 32k;
    	Sendfile  on;
    	tcp_nopush     on;
    	tcp_nodelay    on;
    	keepalive_timeout 60;
    	client_header_timeout  10;
    	client_body_timeout    10;
    	send_timeout          10;
    }

     

    • include
      • 主要是爲了方便管理nginx配置文件,從一個文件引入到兩一個配置文件
    • default_type
      • 屬於http核心模塊指令,這裏設定的默認類型是二進制流,也就是當文件類型未定義時使用這種方式,例如:在沒有配置PHP環境時,Nginx是不予解析的,此時,用瀏覽器訪問PHP文件就出出現下載窗口。
    • log_format main $remote_addr
      • 這裏是定義nginx日誌輸出的格式,main是該日誌格式的名字,能夠對不一樣的日誌文件定義不一樣的日誌輸出更是,其中像$host,$remote_addr都是nginx的內嵌對象,下面會有詳細解釋。
    • client_max_body_size
      • 用來設置容許客戶端請求的最大的單個文件字節數
    • client_header_buffer_size
      • 用來指定來自客戶端請求頭的headerbuffer大小,對於大多數請求,1k的緩衝區大小已經足夠,若是自定義了消息頭或者有更大的Cookie,能夠增長緩衝區的大小,這裏設置爲32k
    • large_client_header_buffers
      • 用來指定客戶端請求中較大的消息頭的緩存最大數量和大小,「4」爲數量,「128k」爲大小,最大緩存量爲4個128k
    • sendfile
      • 參數用於開啓高效文件傳輸模式,將tcp_nopush和tcp_nodelay兩個指令設置爲on用於防止網絡阻塞
    • keepalive_timeout
      • 設置客戶端鏈接保持活動的超時時間,在超過這個時間以後,服務器會關閉該鏈接。
    • client_header_timeout
      • 設置客戶端請求頭讀取超時時間,若是超過這個時間,客戶端尚未發送任何數據,Nginx將返回「Resuest time out(408)」錯誤。
    • client_body_timeout
      • 設置客戶端請求主體讀取超時時間,若是超過這個時間,客戶端尚未發送任何數據,Nginx將返回「Request time out(408)」錯誤,默認值是60。
    • send_timeout
      • 指定響應客戶端的超時時間,這個超時僅限於兩個鏈接活動之間的時間,若是超過這個時間,客戶端沒有任何反應,Nginx將會關閉連接。

 

 

6.nginx配置反向代理和負載均衡

  • 反向代理(ngx_http_proxy_module模塊)
    #user  nobody;
    worker_processes  1;
    
    error_log  logs/error.log;
    error_log  logs/error.log  notice;
    error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
    	
    	log_format  main  'IP地址:$remote_addr,主機名:$server_name,協議:$request,狀態:$status';
    	
    	access_log  logs/access.log  main;
    		
        server {
            listen       80;
            server_name  jay.tohours.com;
    		
    		location /a/b{
    			alias  C:/nginx-test/;
    			index index3.txt;
    		}
    		
    		location /a{
    			alias  C:/nginx-test/;
    			index index1.txt;
    		}
    		
    		location /b{
    			alias C:/nginx-test/;
    			index index2.txt;
    		}
    	
    		location /{
    			root html;
    			index index.html;
    		}
    	
    		location /fhc {
    			proxy_pass        http://127.0.0.1:11080;
    			 proxy_redirect     off;
    			 proxy_set_header   Host				$host;
    			 proxy_set_header   X-Real-IP        $remote_addr;
    			 proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    			 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
    			 proxy_max_temp_file_size 0;
    			 proxy_connect_timeout      1800;
    			 proxy_send_timeout         1800;
    			 proxy_read_timeout         1800;
    			 proxy_buffer_size          16k;
    			 proxy_buffers              4 32k;
    			 proxy_busy_buffers_size    64k;
    			 proxy_temp_file_write_size 64k;
    			 client_max_body_size 100m;
    		}
        }
    
    }

     

  • 反向代理模塊(ngx_http_proxy_module模塊)字段備註 
  • 字段以下:
    • proxy_buffer_size
    • proxy_buffering
    • proxy_buffers
    • proxy_busy_buffers_size
    • proxy_cache
    • proxy_cache_bypass
    • proxy_cache_key
    • proxy_cache_lock
    • proxy_cache_lock_timeout
    • proxy_cache_min_uses
    • proxy_cache_path
    • proxy_cache_use_stale
    • proxy_cache_valid
    • proxy_connect_timeout
    • proxy_cookie_domain
    • proxy_cookie_path
    • proxy_hide_header
    • proxy_http_version
    • proxy_ignore_client_abort
    • proxy_ignore_headers
    • proxy_intercept_errors
    • proxy_max_temp_file_size
    • proxy_next_upstream
    • proxy_no_cache
    • proxy_pass
    • proxy_pass_header
    • proxy_read_timeout
    • proxy_redirect
    • proxy_send_timeout
    • proxy_set_header
    • proxy_ssl_session_reuse
    • proxy_store
    • proxy_store_access
    • proxy_temp_file_write_size
    • proxy_temp_path
  • 經常使用參數配置
    • proxy_buffer_size
      語法:proxy_buffer_size size;
      默認值:proxy_buffer_size 4k|8k;
      上下文:http,server,location
      設置緩衝區的大小的size,nginx從被代理的服務器讀取響應時,使用該緩衝區保存響應的開始部分,
      這部分一般包含着一個小小的響應頭。該緩衝區大小默認等於proxy_buffers指令設置的一塊緩衝區
      的大小,但它也能夠被設置得更小。

       

    •  proxy_buffering
      語法:proxy_buffering on|off;
      默認值:proxy_buffering on;
      上下文:http,server,location
      代理的時候,開啓或者關閉緩衝後端服務器的響應。
      
      當開啓緩衝時,nginx儘量快的從被代理的服務器接收響應,再將它存入proxy_buffer_size和proxy_buffers指令設置的緩衝
      區中。若是響應沒法整個歸入內存,那麼其中一部分將存入磁盤上的臨時文件,proxy_max_temp_file_size和proxy_temp_file_write_size
      指令能夠控制臨時文件的寫入。
      
      當關閉緩衝時,收到響應後,nginx當即將其同步傳給客戶端。nginx不會嘗試從被代理的服務器讀取整個請求,而是將proxy_buffer_size
      指令設定的大小做爲一次讀取的最大長度。
      
      響應頭「X-Accel-Buffering」傳遞「yes」或「no」能夠動態的開啓或者關閉代理的緩衝功能,這個功能能夠經過proxy_ignore_headers指令關閉。

       

    •  proxy_buffers
      語法:proxy_buffers number size
      默認值:proxy_buffers 8 4k|8k;
      上下文:http,server,location
      
      爲每一個鏈接設置緩衝區的數量爲number,每塊緩衝區的大小爲size,這些緩衝區用於保存從被代理的服務器讀取的響應。
      每塊緩衝區默認等於一個內存頁的大小,這個值是4k仍是8k,取決於平臺。

       

    • proxy_busy_buffers_size
      語法:proxy_busy_buffers_size size;
      默認值:proxy_busy_buffers_size 8k|16k;
      上下文:http,server,location
      
      當開啓緩衝響應的功能之後,在沒有讀取到所有響應的狀況下,寫緩衝到達必定大小時,nginx必定會向客戶端發送響應,直到
      緩衝小於此值。這條指令用來設置此值。同時,剩餘的緩衝區能夠用於接收響應,若是須要,一部份內容將緩衝到臨時文件。該大小
      默認是proxy_buffer_size和proxy_buffers指令設置單塊緩衝大小的兩倍。
       
    •  proxy_cache
      語法:proxy_cache zone|off;
      默認值:proxy_cache off;
      上下文:http,server,location;
      
      指定用於頁面緩存的共享,同一塊共享內存能夠在多個地方使用,off參數能夠屏蔽從上層配置繼承的緩存功能。

       

    •  proxy_cache_bypass
      語法:proxy_cache_bypass string ...;
      默認值:——
      上下文:http,server,location
      
      定義nginx不從緩存取響應的條件,若是至少一個字符串條件非空並且非「0」,nginx就不會從緩存中去取響應。
      
      proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;
      proxy_cache_bypass $http_pragma $http_authorization;
      
      本指令能夠與proxy_no_cache一塊兒使用。

       

    • proxy_cache_key
      語法:proxy_cache_key String;
      默認值:proxy_cache_key $scheme $proxy_host $request_uri;
      上下文:http,server,location
      
      定義如何生成緩存的鍵,好比:
      proxy_cache_key "$host$request_uri$cookie_user";
      這條指令的默認值相似於下面的字符串:
      proxy_cache_key $scheme$proxy_host$uri$is_args$args;
       
    • proxy_cache_lock
      語法:proxy_cache_lock on|off;
      默認值:proxy_cache_lock off;
      上下文:http,server,location;
      
      該指令出如今版本1.1.12,開啓此功能時,對於一樣的請求,同時只容許一個請求發日後端,並根據proxy_cache_key指令的設置
      在緩存中植入一個新條目,其餘請求相同條目的請求將一直等待,直到緩存中出現相應的內容,或者鎖在proxy_cache_lock_timeout
      指令設置的超時後被釋放。
       
    •  proxy_cache_lock_timeout
      語法:proxy_cache_lock_timeout time;
      默認值:proxy_cache_lock_timeout 5s;
      上下文:http,server,location;
      
      該指令出如今1.1.12版本,爲proxy_cache_lock指令設置鎖的超時。

       

    • proxy_cache_min_uses
      語法:proxy_cache_min_uses number;
      默認值:proxy_cache_min_uses 1;
      上下文:http,server,location;
      
      設置響應被緩存的最小請求次數。
       
    • proxy_cache_path
      語法:proxy_cache_path path[levels=levels]keys_zone=name:size[inactive=time][max_size=size][loader_files=number][loader_sleep=time][loader_threshold=time];
      默認值:——
      上下文:http;
      
      設置緩存的路徑和其餘參數,緩存數據是保存在文件中的,緩存的鍵和文件名都是在代理URL上執行MD5的結果。levels參數定義了
      緩存的層次結構,好比,下面配置:
      
      proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;
      
      緩存中文件名看起來是這樣的:
      
      /data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c
      
      被緩存的響應首先寫入一個臨時文件,而後進行重命名,從0.8.9版本開始,臨時文件和緩存能夠放在不一樣的文件系統,但請注意,這將
      致使文件在這兩個文件系統中進行拷貝,而不是廉價的重命名操做。所以,針對任何路徑,都建議將緩存和proxy_temp_path指令設置
      的臨時文件目錄放在同一文件系統。
      
      此外,全部活動的鍵和緩存數據相關的信息都被存放在共享內存中,共享內存經過keys_zone參數的name和size來定義,被緩存的數據
      若是在inactive參數指定的時間內未被訪問,就會被從緩存中移除,不論它是不是剛產生的,inactive的默認值是10分鐘。
      
      特殊進程「cache manager」監控緩存的條目數量,若是超過max_size參數設置的最大值,使用LRU算法移除緩存數據。
      
      nginx新啓動後不久,特殊進程「cacha loader」就被啓動,該進程將文件系統上保存的過去緩存的數據的相關信息從新加載到共享內存。
      加載過程分屢次迭代完成,每次迭代,進程只加載很少於loader_files參數指定的文件數量(默認值爲100)。此外,每次迭代過程的
      持續時間不能超過loader_threshold參數的值(默認200毫秒),每次迭代之間,nginx的暫停時間由loader_sleep參數指定(默認50毫秒)。
       
    • proxy_cache_use_stale
      語法:proxy_cache_use_stale error|timeout|invalid_header|updating|http_500|http_502|http_503|http_504|http_404|off ...;
      默認值:proxy_cache_use_stale off;
      上下文:http,server,location;
      
      若是後端服務器出現狀況,nginx是可使用過時的響應緩存的,這條指令就是定義何種條件下容許開啓此機制,這條指令的參數與
      proxy_next_upstream指令的參數相同。
      
      此外,updating參數容許nginx在正在更新緩存的狀況下使用過時的緩存做爲響應,這樣作可使更新緩存數據時,訪問源服務器的次數
      更少。在植入新的緩存條目時,若是想使訪問源服務器的次數最少,可使用proxy_cache_lock指令。

       

    •  proxy_cache_valid
      語法:proxy_cache_valid[code ...]time;
      默認值:——
      上下文:http,server,location;
      
      爲不一樣的響應狀態碼設置不一樣的緩存時間,好比下面指令:
      
      proxy_cache_valid 200 302 10m;
      proxy_cache_valid 404 1m;
      
      設置狀態碼爲200和302的響應的緩存時間爲10分鐘,狀態碼爲404的響應的緩存時間爲1分鐘。
      
      若是僅僅指定了time,以下面指令:
      
      proxy_cache_valid 5m;
      
      那麼只有狀態碼爲200,300和302的響應會被緩存。
      
      若是使用any參數,那麼就能夠緩存任何響應:
      
      proxy_cache_valid 200 302 10m;
      proxy_cache_valid 301 1h;
      proxy_cache_valid any 1m;
      
      緩存參數也能夠直接在響應頭中設定,這種方式的優先級高於使用這條指令設置緩存時間,「X-Accel-Expires」響應頭能夠以秒爲
      單位設置響應的緩存時間,若是值爲0,表示禁止緩存響應,若是值以@開始,表示自1970年1月1日以來的秒數,響應一直會被緩存到
      這個絕對時間點,若是不含「X-Accel-Expires」響應頭,緩存參數仍可能被「Expires」或者「Cache-Control」響應頭設置,若是
      響應頭含有「Set-Cookie」,響應將不能被緩存,這些頭的處理過程可使用指令proxy_ignore_headers忽略。

       

    •  proxy_connect_timeout
      語法:proxy_connect_timeout time;
      默認值:proxy_connect_timeout 60s;
      上下文:http,server,location;
      
      設置與後端服務器創建鏈接的超時時間,應該注意這個超時通常不可能大於75秒。

       

    • proxy_cookie_domain
      語法:
      proxy_cookie_domain off;
      proxy_cookie_domain domain replacement;
      默認值:
      proxy_cookie_domain off;
      上下文:http,server,location;
      
      這個指令出如今版本1.1.15,設置「Set-Cookie」響應頭的domain屬性的替換文本,假設後端服務器返回的「Set-Cookie」響應頭
      含有屬性「domain=localhost」,那麼指令,
      
      proxy_cookie_domain localhost example.org;
      將這個屬性改寫成:「domain=example.org」
      
      domain和replacement配置字符串,以及domain屬性中起始的點將被忽略,匹配過程大小寫不敏感。
      domain和replacement配置字符串中能夠包含變量:
      
      proxy_cookie_domain www.$host $host;
      這條指令一樣可使用正則表達式,這時,domain應以「~」標誌開始,且可使用命名匹配和位置匹配組,而replacement能夠引用
      這些匹配組:
      
      proxy_cookie_domain ~\.(?P<sl_domain>[-0-9a-z]+\.[a-z]+)$ $sl_domain;
      能夠同時定義多條proxy_cookie_domain指令:
      
      proxy_cookie_domain localhost example.org;
      proxy_cookie_domain ~\.([a-z]+\.[a-z]+)$ $1;
      off參數能夠取消當前配置級別的全部的proxy_cookie_domain指令。
      
      proxy_cookie_domain off;
      proxy_cookie_domain localhost example.org;
      proxy_cookie_domain www.example.org example.org;
       
    • proxy_cookie_path
      語法:
      proxy_cookie_path off;
      proxy_cookie_path replacement;
      默認值:
      proxy_cookie_path off;
      上下文:http,server,location;
      
      這個指令出如今版本1.1.15,設置「Set-Cookie」響應頭中的path屬性的替換文本,假設後端服務器返回的「Set-Cookie」響應頭
      含有屬性「path=/two/some/uri/」,那麼指令:
      
      proxy_cookie_path /two/ /;
      將這個屬性改寫爲 「path=/some/uri/」
      
      path和replacement配置字符串能夠包含變量:
      
      proxy_cookie_path $uri /some$uri;
      這條指令一樣可使用正則表達式。若是使用大小寫敏感的匹配,path應以「~」標誌開始,若是使用大小寫不敏感的匹配,path應以「~*」標誌開始。path可使用命名匹配組和位置匹配組,replacement能夠引用這些匹配組:
      
      proxy_cookie_path ~*^/user/([^/]+) /u/$1;
      能夠同時定義多條proxy_cookie_path指令:
      
      proxy_cookie_path /one/ /;
      proxy_cookie_path / /two/;
      off參數能夠取消當前配置級別的全部proxy_cookie_path指令:
      
      proxy_cookie_path off;
      proxy_cookie_path /two/ /;
      proxy_cookie_path ~*^/user/([^/]+) /u/$1;

       

    •  proxy_hide_header
      語法:proxy_hide_header field;
      默認值:——
      上下文:http,server,location;
      
      nginx默認不會將「Date」、「Server」、「X-Pad」,和「X-Accel-…」響應頭髮送給客戶端。
      proxy_hide_header指令則能夠設置額外的響應頭,這些響應頭也不會發送給客戶端。
      相反的,若是但願容許傳遞某些響應頭給客戶端,可使用proxy_pass_header指令。

       

    • proxy_http_version
      語法:proxy_http_version 1.0|1.1;
      默認值:proxy_http_version 1.0;
      上下文:http,server,location;
      
      這個指令出如今版本 1.1.4.
      設置代理使用的HTTP協議版本。默認使用的版本是1.0,而1.1版本則推薦在使用keepalive鏈接時一塊兒使用。
       
    • proxy_ignore_client_abort
      語法:proxy_ignore_client_abort on|off;
      默認值:proxy_ignore_client_abort off;
      上下文:http,server,location;
      
      決定當客戶端在響應傳輸完成前就關閉鏈接時,nginx是否應關閉後端鏈接。
       
    • proxy_ignore_headers
      語法:proxy_ignore_headers field;
      默認值:——
      上下文:http,server,location;
      
      不處理後端服務器返回的指定響應頭。下面的響應頭能夠被設置: 「X-Accel-Redirect」,「X-Accel-Expires」,
      「X-Accel-Limit-Rate」 (1.1.6),「X-Accel-Buffering」 (1.1.6), 「X-Accel-Charset」 (1.1.6),
      「Expires」,「Cache-Control」,和「Set-Cookie」 (0.8.44)。
      
      若是不被取消,這些頭部的處理可能產生下面結果:
      
      「X-Accel-Expires」,「Expires」,「Cache-Control」,和「Set-Cookie」 設置響應緩存的參數;
      「X-Accel-Redirect」執行到指定URI的內部跳轉;
      「X-Accel-Limit-Rate」設置響應到客戶端的傳輸速率限制;
      「X-Accel-Buffering」啓動或者關閉響應緩衝;
      「X-Accel-Charset」設置響應所需的字符集。
       
    •  proxy_interceptor_errors
      語法:
      proxy_intercept_errors on|off;
      默認值: 
      proxy_intercept_errors off;
      上下文: http, server, location;
      
      當後端服務器的響應狀態碼大於等於400時,決定是否直接將響應發送給客戶端,亦或將響應轉發給nginx由error_page指令來處理。

       

    • proxy_max_temp_file_size
      語法: 
      proxy_max_temp_file_size size;
      默認值: 
      proxy_max_temp_file_size 1024m;
      上下文: http, server, location;
      
      打開響應緩衝之後,若是整個響應不能存放在proxy_buffer_size和proxy_buffers指令設置的緩衝區內,
      部分響應能夠存放在臨時文件中。 這條指令能夠設置臨時文件的最大容量。而每次寫入臨時文件的數據量則
      由proxy_temp_file_write_size指令定義。
      
      將此值設置爲0將禁止響應寫入臨時文件。
       
    •  proxy_next_upstream
      語法: proxy_next_upstream error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off …;
      默認值: 
      proxy_next_upstream error timeout;
      上下文: http, server, location
      指定在何種狀況下一個失敗的請求應該被髮送到下一臺後端服務器:
      
      error
      和後端服務器創建鏈接時,或者向後端服務器發送請求時,或者從後端服務器接收響應頭時,出現錯誤;
      timeout
      和後端服務器創建鏈接時,或者向後端服務器發送請求時,或者從後端服務器接收響應頭時,出現超時;
      invalid_header
      後端服務器返回空響應或者非法響應頭;
      http_500
      後端服務器返回的響應狀態碼爲500;
      http_502
      後端服務器返回的響應狀態碼爲502;
      http_503
      後端服務器返回的響應狀態碼爲503;
      http_504
      後端服務器返回的響應狀態碼爲504;
      http_404
      後端服務器返回的響應狀態碼爲404;
      off
      中止將請求發送給下一臺後端服務器。
      須要理解一點的是,只有在沒有向客戶端發送任何數據之前,將請求轉給下一臺後端服務器纔是可行的。也就是說,若是在
      傳輸響應到客戶端時出現錯誤或者超時,這類錯誤是不可能恢復的。

       

    •  proxy_no_cache
      語法: proxy_no_cache string …;
      默認值: —
      上下文: http, server, location;
      
      定義nginx不將響應寫入緩存的條件。若是至少一個字符串條件非空並且非「0」,nginx就不將響應存入緩存:
      
      proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;
      proxy_no_cache $http_pragma $http_authorization;
      這條指令能夠和proxy_cache_bypass指令一塊兒使用。

       

    •  proxy_pass
      語法: proxy_pass URL;
      默認值: —
      上下文: location, if in location, limit_except;
      
      設置後端服務器的協議和地址,還能夠設置可選的URI以定義本地路徑和後端服務器的映射關係。 
      這條指令能夠設置的協議是「http」或者「https」,而地址既可使用域名或者IP地址加端口(可選)的形式來定義:
      
      proxy_pass http://localhost:8000/uri/;
      又可使用UNIX域套接字路徑來定義。該路徑接在「unix」字符串後面,兩端由冒號所包圍,好比:
      
      proxy_pass http://unix:/tmp/backend.socket:/uri/;
      若是解析一個域名獲得多個地址,全部的地址都會以輪轉的方式被使用。固然,也可使用服務器組來定義地址。
      
      請求URI按下面規則傳送給後端服務器:
      
      若是proxy_pass使用了URI,當傳送請求到後端服務器時,規範化之後的請求路徑與配置中的路徑的匹配部分將被替換
      爲指令中定義的URI:
      
      location /name/ {
          proxy_pass http://127.0.0.1/remote/;
      }
      
      若是proxy_pass沒有使用URI,傳送到後端服務器的請求URI通常客戶端發起的原始URI,若是nginx改變了
      請求URI,則傳送的URI是nginx改變之後完整的規範化URI:
      
      location /some/path/ {
           proxy_pass http://127.0.0.1;
      }
      
      在1.1.12版之前,若是proxy_pass沒有使用URI,某些狀況下,nginx改變URI之後,會錯誤地將原始
      URI而不是改變之後的URI發送到後端服務器。
      某些狀況下,沒法肯定請求URI中應該被替換的部分:
      
      使用正則表達式定義路徑。
      這種狀況下,指令不該該使用URI。
      
      在須要代理的路徑中,使用rewrite指令改變了URI,但仍使用相同配置處理請求(break):
      
      location /name/ {
          rewrite /name/([^/]+) /users?name=$1 break;
          proxy_pass http://127.0.0.1;
      }
      
      這種狀況下,本指令設置的URI會被忽略,改變後的URI將被髮送給後端服務器。
      
      後端服務器的地址,端口和URI中均可以使用變量:
      
      proxy_pass http://$host$uri;
      甚至像這樣:
      
      proxy_pass $request;
      這種狀況下,後端服務器的地址將會在定義的服務器組中查找。若是查找不到,nginx使用resolver來查找該地址。

       

    • proxy_pass_header
      語法: proxy_pass_header field;
      默認值: —
      上下文: http, server, location;
      
      容許傳送被屏蔽的後端服務器響應頭到客戶端。
       
    • proxy_read_timeout
      語法: 
      proxy_read_timeout time;
      默認值: 
      proxy_read_timeout 60s;
      上下文: http, server, location;
      
      定義從後端服務器讀取響應的超時。此超時是指相鄰兩次讀操做之間的最長時間間隔,而不是
      整個響應傳輸完成的最長時間。若是後端服務器在超時時間段內沒有傳輸任何數據,鏈接將被關閉。
       
    • proxy_redirect
      語法: proxy_redirect default;
      proxy_redirect off;
      proxy_redirect redirect replacement;
      
      默認值: 
      proxy_redirect default;
      
      上下文: http, server, location
      設置後端服務器「Location」響應頭和「Refresh」響應頭的替換文本。 假設後端服務器返回的響應頭是
       「Location: http://localhost:8000/two/some/uri/」,那麼指令
      
      proxy_redirect http://localhost:8000/two/ http://frontend/one/;
      將把字符串改寫爲 「Location: http://frontend/one/some/uri/」。
      
      replacement字符串能夠省略服務器名:
      
      proxy_redirect http://localhost:8000/two/ /;
      此時將使用代理服務器的主域名和端口號來替換。若是端口是80,能夠不加。
      
      用default參數指定的默認替換使用了location和proxy_pass指令的參數。所以,下面兩例配置等價:
      
      location /one/ {
      proxy_pass http://upstream:port/two/;
      proxy_redirect default;
      location /one/ {
      proxy_pass http://upstream:port/two/;
      proxy_redirect http://upstream:port/two/ /one/;
      並且由於一樣的緣由,proxy_pass指令使用變量時,不容許本指令使用default參數。
      
      replacement字符串能夠包含變量:
      
      proxy_redirect http://localhost:8000/ http://$host:$server_port/;
      而redirect字符串從1.1.11版本開始也能夠包含變量:
      
      proxy_redirect http://$proxy_host:8000/ /;
      同時,從1.1.11版本開始,指令支持正則表達式。使用正則表達式的話,若是是大小寫敏感的匹配,
      redirect以「~」做爲開始,若是是大小寫不敏感的匹配,redirect以「~*」做爲開始。並且redirect的
      正則表達式中能夠包含命名匹配組和位置匹配組,而在replacement中能夠引用這些匹配組的值:
      
      proxy_redirect ~^(http://[^:]+):\d+(/.+)$ $1$2;
      proxy_redirect ~*/user/([^/]+)/(.+)$ http://$1.example.com/$2;
      除此之外,能夠同時定義多個proxy_redirect指令:
      
      proxy_redirect default;
      proxy_redirect http://localhost:8000/ /;
      proxy_redirect http://www.example.com/ /;
      另外,off參數可使全部相同配置級別的proxy_redirect指令無效:
      
      proxy_redirect off;
      proxy_redirect default;
      proxy_redirect http://localhost:8000/ /;
      proxy_redirect http://www.example.com/ /;
      最後,使用這條指令也能夠爲地址爲相對地址的重定向添加域名:
      
      proxy_redirect / /;
       
    •  proxy_send_timeout
      語法: proxy_send_timeout time;
      默認值: 
      proxy_send_timeout 60s;
      上下文: http, server, location
      定義向後端服務器傳輸請求的超時。此超時是指相鄰兩次寫操做之間的最長時間間隔,而不是整個請求傳輸完成的最長時間。
      若是後端服務器在超時時間段內沒有接收到任何數據,鏈接將被關閉。

       

    •  proxy_set_header
      語法: proxy_set_header field value;
      默認值: 
      proxy_set_header Host $proxy_host;
      proxy_set_header Connection close;
      
      上下文: http, server, location
      
      容許從新定義或者添加發日後端服務器的請求頭。value能夠包含文本、變量或者它們的組合。 
      當且僅當當前配置級別中沒有定義proxy_set_header指令時,會從上面的級別繼承配置。 默認狀況下,
      只有兩個請求頭會被從新定義:
      
      proxy_set_header Host $proxy_host;
      proxy_set_header Connection close;
      若是不想改變請求頭「Host」的值,能夠這樣來設置:
      
      proxy_set_header Host $http_host;
      可是,若是客戶端請求頭中沒有攜帶這個頭部,那麼傳遞到後端服務器的請求也不含這個頭部。 
      這種狀況下,更好的方式是使用$host變量——它的值在請求包含「Host」請求頭時爲「Host」字段的值,
      在請求未攜帶「Host」請求頭時爲虛擬主機的主域名:
      
      proxy_set_header Host $host;
      此外,服務器名能夠和後端服務器的端口一塊兒傳送:
      
      proxy_set_header Host $host:$proxy_port;
      若是某個請求頭的值爲空,那麼這個請求頭將不會傳送給後端服務器:
      
      proxy_set_header Accept-Encoding 「」;

       

    • proxy_ssl_session_reuse 
      語法: proxy_ssl_session_reuse on | off;
      默認值: 
      proxy_ssl_session_reuse on;
      上下文: http, server, location
      決定是否重用與後端服務器的SSL會話。若是日誌中出現「SSL3_GET_FINISHED:digest check failed」錯誤,
      請嘗試關閉會話重用。

       

    •  proxy_store
      語法: proxy_store on | off | string;
      默認值: 
      proxy_store off;
      上下文: http, server, location;
      
      開啓將文件保存到磁盤上的功能。若是設置爲on,nginx將文件保存在alias指令或root指令設置的路徑中。
      若是設置爲off,nginx將關閉文件保存的功能。此外,保存的文件名也可使用含變量的string參數來指定:
      
      proxy_store /data/www$original_uri;
      保存文件的修改時間根據接收到的「Last-Modified」響應頭來設置。響應都是先寫到臨時文件,而後進行重命名來生成的。
      從0.8.9版本開始,臨時文件和持久化存儲能夠放在不一樣的文件系統,可是須要注意這時文件執行的是在兩個文件系統間拷貝操做,
      而不是廉價的重命名操做。所以建議保存文件的路徑和proxy_temp_path指令設置的臨時文件的路徑在同一個文件系統中。
      
      這條指令能夠用於建立靜態無更改文件的本地拷貝,好比:
      
      location /images/ {
      root /data/www;
      open_file_cache_errors off;
      error_page 404 = /fetch$uri;
      }
      
      location /fetch/ {
      internal;
      
      proxy_pass http://backend/;
      proxy_store on;
      proxy_store_access user:rw group:rw all:r;
      proxy_temp_path /data/temp;
      
      alias /data/www/;
      }
      或者像這樣:
      
      location /images/ {
      root /data/www;
      error_page 404 = @fetch;
      }
      
      location @fetch {
      internal;
      
      proxy_pass http://backend;
      proxy_store on;
      proxy_store_access user:rw group:rw all:r;
      proxy_temp_path /data/temp;
      
      root /data/www;
      }
      語法: proxy_store_access users:permissions …;
      默認值: 
      proxy_store_access user:rw;
      上下文: http, server, location
      設置新建立的文件和目錄的訪問權限,好比:
      
      proxy_store_access user:rw group:rw all:r;
      若是指定了任何group或者all的訪問權限,那麼能夠略去user的訪問權限:
      
      proxy_store_access group:rw all:r;

       

    • proxy_temp_file_write_size
      語法: proxy_temp_file_write_size size;
      默認值: 
      proxy_temp_file_write_size 8k|16k;
      上下文: http, server, location
      在開啓緩衝後端服務器響應到臨時文件的功能後,設置nginx每次寫數據到臨時文件的size(大小)限制。 
      size的默認值是proxy_buffer_size指令和proxy_buffers指令定義的每塊緩衝區大小的兩倍, 
      而臨時文件最大容量由proxy_max_temp_file_size指令設置。
       
    • proxy_temp_path
      語法: proxy_temp_path path [level1 [level2 [level3]]];
      默認值: 
      proxy_temp_path proxy_temp;
      上下文: http, server, location
      定義從後端服務器接收的臨時文件的存放路徑,能夠爲臨時文件路徑定義至多三層子目錄的目錄樹。 好比,下面配置
      
      proxy_temp_path /spool/nginx/proxy_temp 1 2;
      那麼臨時文件的路徑看起來會是這樣:
      
      /spool/nginx/proxy_temp/7/45/00000123457
       
  • 負載均衡
    • 如下是在本身的windows7上作的實驗,開啓了三個tomcat,配置了兩個負載均衡,訪問了兩個不一樣的contextpath,nginx配置以下:
    • 配置負載均衡要在http節點配置,upstream模塊,在server中location中皮遏制proxy模塊:
    • #user  nobody;
      worker_processes  1;
      
      error_log  logs/error.log;
      error_log  logs/error.log  notice;
      error_log  logs/error.log  info;
      
      #pid        logs/nginx.pid;
      
      
      events {
          worker_connections  1024;
      }
      
      
      http {
          include       mime.types;
          default_type  application/octet-stream;
          sendfile        on;
          keepalive_timeout  65;
      	
      	log_format  main  'IP地址:$remote_addr,主機名:$server_name,協議:$request,狀態:$status';
      	
      	access_log  logs/access.log  main;
      	
      	upstream aaa { 
      		server 127.0.0.1:82 weight=1;
      		server 127.0.0.1:11080 weight=1;
      	}
      	upstream bbb { 
      		server 127.0.0.1:12080 weight=1;
      	}
      	
          server {
              listen       80;
              server_name  jay.tohours.com;
      		
      		location /a/b{
      			alias  C:/nginx-test/;
      			index index3.txt;
      		}
      		
      		location /a{
      			alias  C:/nginx-test/;
      			index index1.txt;
      		}
      		
      		location /b{
      			alias C:/nginx-test/;
      			index index2.txt;
      		}
      		
      		
      		location /{
      			root html;
      			index index.html;
      		}
      		
      		
      		location /tookeen{
      			 proxy_pass        http://aaa;
      			 proxy_redirect     off;
      			 proxy_set_header   Host				$host;
      			 proxy_set_header   X-Real-IP        $remote_addr;
      			 proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
      			 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
      			 proxy_max_temp_file_size 0;
      			 proxy_connect_timeout      1800;
      			 proxy_send_timeout         1800;
      			 proxy_read_timeout         1800;
      			 proxy_buffer_size          16k;
      			 proxy_buffers              4 32k;
      			 proxy_busy_buffers_size    64k;
      			 proxy_temp_file_write_size 64k;
      			 client_max_body_size 100m;
      		}
      
      		location /masterplanner{
      			 proxy_pass        http://bbb;
      			 proxy_redirect     off;
      			 proxy_set_header   Host				$host;
      			 proxy_set_header   X-Real-IP        $remote_addr;
      			 proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
      			 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
      			 proxy_max_temp_file_size 0;
      			 proxy_connect_timeout      1800;
      			 proxy_send_timeout         1800;
      			 proxy_read_timeout         1800;
      			 proxy_buffer_size          16k;
      			 proxy_buffers              4 32k;
      			 proxy_busy_buffers_size    64k;
      			 proxy_temp_file_write_size 64k;
      			 client_max_body_size 100m;
      		}
      		
      		location /fhc {
      			proxy_pass        http://127.0.0.1:11080;
      			 proxy_redirect     off;
      			 proxy_set_header   Host				$host;
      			 proxy_set_header   X-Real-IP        $remote_addr;
      			 proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
      			 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
      			 proxy_max_temp_file_size 0;
      			 proxy_connect_timeout      1800;
      			 proxy_send_timeout         1800;
      			 proxy_read_timeout         1800;
      			 proxy_buffer_size          16k;
      			 proxy_buffers              4 32k;
      			 proxy_busy_buffers_size    64k;
      			 proxy_temp_file_write_size 64k;
      			 client_max_body_size 100m;
      		}
          }
      
      
      
      }
        
    • tomcat的端口分別是82,11080,12080 
  •           
    • 其中aaa負載均衡的權重分別設置的50%,表示每一個tomcat被訪問的概率都是50%
    •  weight越高表示配置的權重越大,也jius就是被訪問的概率越大
    • 項目訪問地址分別是:其中jay.tohours.com是修改的本地hosts文件,指向的localhost也就是127.0.0.1
      • http://jay.tohours.com/tookeen/plan/customerIndex.action
      • http://jay.tohours.com/masterplanner/plan/customerIndex.action
    • 訪問狀況
      • 正常訪問

8.upstream模塊配置策略

 

  • upsteam是要放在http模塊中的,不要配置在server模塊中
  • upstream配置方式以下:
    • weight(權重,也就是shag上面配置的方式)
      • 指定輪詢概率,weight和訪問比率成正比,用於後端服務器性能不均的狀況,以下:
      • 其中11080端口的權重是82端口的兩倍
      • upstream aaa{
             server 127.0.0.1:82 weight=1;
             server 127.0.0.1:11080 weight=2;
        }

         

    • ip_hash(訪問ip)
      • 每一個請求按訪問ip的hash結果分配,這樣每一個訪客固定訪問一個後端服務器,能夠解決session的問題
        upstream aaa{
             ip_hash;
             server 127.0.0.1:82;
             server 127.0.0.1:11080;
        }
         
    • fair(第三方)
      • 按後端服務器的響應時間來分配請求,響應時間短的優先分配,與weight分配策略相似。
        upstream aaa{
             server 127.0.0.1:82;
             server 127.0.0.1:11080;
             fair;
        }
         
    • url_hash(第三方)
      • 按着訪問url的hash結果來分配請求,使每一個url定向到同一個後端服務器,後端服務器爲緩存時比較有效。
        upstream aaa{
            server 127.0.0.1:82;
            server 127.0.0.1:11080;
            hash $request_uri;
            hash_method crc32;
        }
         
      • 注:在upstream中加入hash語句,server語句中不能寫入weight等其餘參數信息,hash_method是使用的hash算法。 
  •  upstream狀態值
    • down
      • 表示當前的server暫時不參與負載
    • weight
      • 默認爲1,weight越大,權重越大,輪詢的概率也越大
    • max_fails
      • 容許請求失敗的次數,默認是1,當超過最大次數時。返回proxy_next_upstream模塊定義的錯誤
    • fail_timeout
      • max_fails次失敗後,暫停的時間
    • backup:其餘全部的非backup機器down或者忙的時候,請求backup機器,因此這臺機器壓力會最輕。
    • upstream bbb{
            ip_hash;
            server 10.0.0.11:9090 down;
            server 10.0.0.11:8080 weight=2;
            server 10.0.0.11:6060;
            server 10.0.0.11:7070 backup;
      }
相關文章
相關標籤/搜索