1. 程式人生 > >Nginx作為web前端快取和反向代理

Nginx作為web前端快取和反向代理

Nginx簡介

                   Nginx是一個高效能的HTTP伺服器和反向代理伺服器,也是IMAP/POP3/SMTP 代理伺服器。

                  作為HTTP伺服器的基礎功能:   1)處理靜態檔案,索引檔案以及自動索引

                                                                           2)反向代理加速(無快取),簡單的負載均衡和容錯

                                                                           3)FastCGI,簡單的負載均衡和容錯

                                                                           4)模組化的結構

                                                                           5)SSL 和 TLS SNI 支援

                   主要結構和擴充套件:   1)一個主程序和多個工作程序,工作程序運行於非特權使用者

                                                     2)kqueue (FreeBSD4.1+), epoll (Linux 2.6+), rt signals (Linux 2.2.19+), /dev/poll (Solaris 711/99+), select, 以及poll 支援

                                                     3)kqueue支援的不同功能包括 EV_CLEAR, EV_DISABLE (臨時禁止事件), NOTE_LOWAT,EV_EOF, 有效資料的數目,錯誤程式碼

                                                     4)sendfile (FreeBSD 3.1+),sendfile (Linux 2.2+), sendfile64 (Linux 2.4.21+), 和 sendfilev (Solaris 8 7/01+) 支援

                                                     5)輸入過濾(FreeBSD 4.1+) 以及 TCP_DEFER_ACCEPT (Linux 2.4+) 支援

                                                     6)10,000 非活動的 HTTP keep-alive 連線僅需要 2.5M 記憶體

                                                     7)最小化的資料拷貝操作

                    選擇nginx的理由:   1) 處理高連線併發效果很好。官方測試可以處理 50,000 個併發連線數(主要採用了epool和kqueue網路I/O模型)

                                                        2) 記憶體消耗少

                                                        3) 可作為負載均衡伺服器

                                                        4) 配置簡單,穩定性較高

                    反向代理(reverse proxy)以代理伺服器來接受internet上的連線請求,將請求轉發內部網路上的伺服器,並將伺服器上的結果返回給internet上請求連線的客戶端,代理伺服器表現得就像一個伺服器。

                    普通的代理伺服器不支援外部網路對內部網路的訪問。當一個代理伺服器(沒有真實的資料)能夠代理外部網路訪問內部,成為反向代理服務。

配置安裝

                            安裝環境:     ubuntu-12.04

                            預先安裝一些模組需要的第三方庫:        

                                                                                          apt-get install openssl

                                                                                          apt-get install libssl0.9.8

                                                                                          apt-get install libssl-dev

                                                                                          apt-get install libpcre3 libpcre3-dev

                                                                                          (gzip->zlib庫   rewrite->pcre庫  ssl->openssl庫)

                            安裝:tar zxvf nginx-1.0.2.tar.gz

                                       cd nginx-1.0.2

                                       ./configure--user=www --group=www --prefix=/usr/local/nginx --add-module=../ngx_cache_purge-1.2(第三方模組需要預先下載解壓,用來除去指定的url快取) --with-http_stub_status_module --with-http_ssl_module 

                                        make

                                        make install(在root許可權下)

配置檔案(代理tomcat伺服器):

user www  www;//nginx的使用者組和group組

worker_processes 2;#程序數,一般為cpu的2倍

error_log  /usr/local/nginx/logs/nginx_jsp_error.logcrit;#錯誤日誌檔案

pid  /usr/local/nginx/logs/nginx.pid;

worker_rlimit_nofile 65535;#開啟檔案上限

events {

   use epoll;

   worker_connections 65535;#每個程序處理最大連線數

}

http {

   include mime.types;

   default_type application/octet-stream;# 瀏覽器請求的檔案媒體型別

   charset UTF_8;

   server_names_hash_bucket_size 128;# 指定伺服器名稱雜湊表的桶大小。預設值根據CPU快取

   client_header_buffer_size     32k;#設定客戶端請求的header頭緩衝區大小。(大多數1KB夠了)

   large_client_header_buffers   432k;# 設定客戶端請求的Header頭緩衝區大小,預設4KB

   client_max_body_size          10m;#允許接收客戶端請求內容的最大值,即客戶端請求Header頭資訊中設定的Content-Length最大值

   sendfile    on;

   tcp_nopush  on;

   keepalive_timeout    65;

   tcp_nodelay on;# 允許或禁止使用套接字選項TCP_NODELAY,僅適用keep-alive

   client_body_buffer_size     512k;# 客戶端請求內容的緩衝區大小(預設網頁大小的2倍) 請求內容大於緩衝區,整個請求內容或部分請求內容被寫入臨時檔案

   proxy_connect_timeout       600;#與後端伺服器連線超時時間

   proxy_read_timeout          600;# 後端被代理伺服器讀取應答內容的超時時間

   proxy_send_timeout          600;# 代理伺服器轉發請求的超時時間

   proxy_buffer_size           16k;# 從被代理伺服器獲取第一部分應答資訊的緩衝區大小,儲存使用者的頭資訊供nginx進行規則處理

   proxy_buffers               4 64k;#設定從被代理伺服器讀取應答資訊的緩衝區數目和大小

   proxy_busy_buffers_size     128k;#系統忙的時候可以申請更大緩衝區,一般*2

   proxy_temp_file_write_size  128k;#寫入proxy_temp_path臨時目錄資料大小。防止一個工作程序阻塞太久

   gzip on;#壓縮

   gzip_min_length 1k;

   gzip_buffers    4 16k;

   gzip_http_version 1.1;

   gzip_comp_level2;

   gzip_proxied     expired no-cache no-store private auth;

   gzip_types       text/plainapplication/x-javascript text/css application/xml;

   gzip_vary        on;

   proxy_temp_path /data0/proxy_temp_path;# 指定一個本地目錄緩衝較大代理請求

   proxy_cache_path /data0/proxy_cache_path levels=1:2keys_zone=cache_one:200m inactive=1d max_size=3g;# 設定快取檔案存放位置

   upstream tomcat_server {#代理tomcat伺服器

            server 127.0.0.1:8080;

    }

   server {

         listen 80;

         server_name  localhost;

         index  index.html index.htmindex.jsp default.jsp index.do default.do;

         root  /data0/www;//網頁存放目錄

         if (-d $request_filename) {

              rewrite ^/(.*)([^/])$http://$host/$1$2/ permanent;

         }

         location  ~  ^/NginxStatus/ {//監測連線處理

                stub_status on;

                access_log  off;#不寫入日誌

         }

          location  ~  .*\.(jsp|jspx|do)?$ {#轉發動態指令碼到後端伺服器

                 proxy_set_header Host $host;

                 proxy_set_headerX-Forwarded-For $remote_addr;

                 proxy_passhttp://tomcat_server;

          }

          location  ~  .*\.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {//本地快取

                 proxy_cache cache_one;

                 proxy_cache_valid 300 304 12h;#不同HTTP狀態碼快取存不同時間

                 proxy_cache_valid 301 302 1m;

                 proxy_cache_valid any 1m;

                 proxy_cache_key$host$uri$is_args$args;#設定web快取key值

                 proxy_set_header Host $host;

                 proxy_set_headerX-Forwarded-For $remote_addr;

                 proxy_passhttp://tomcat_server;

           }

           location  ~  /purge(/.*){#清除url快取

                 allow 127.0.0.1;

                 allow  192.168.0.0/16;

                 deny all;

                 proxy_cache_purge cache_one;

           }

           location  ~  .*\.(gif|jpg|jpeg|png|bmp|swf)$ { #設定expires時間

                 expires 30d;

           }

           location  ~  .*\.(js|css)?$ {

                 expires 1h;

           }

           log_format  access '$remote_addr -$remote_user [$time_local] "$request" '

                             '$status$body_bytes_sent "$http_referer" '

                              '"$http_user_agent" "$http_x_forwarded_for" ';

           access_log  /data0 /www/access.logaccess;

    }

}

測試

         /usr/local/nginx/sbin/nginx–t /usr/local/nginx/conf/nginx.conf  (配置檔案測試)

         /usr/local/nginx/sbin/nginx-c /usr/local/nginx/conf/nginx.conf  (啟動nginx)

         /usr/local/nginx/sbin/nginx-s reload                        (重新啟動)

         kill-QUIT 主程序號   (終止nginx) 

         kill-HUP 主程序號  (平滑啟動,重新載入配置檔案)

1)      使用webbench -c 200 -t 30s http://localhost /examples/jsp/   //...壓力測試

        

2)      在瀏覽器輸入localhost/ NginxStatus/   檢視連線情況

        

   active connections– 所有開啟的連線,包括連線到後端伺服器的。
   server accepts handled requests – nginx已經接受並處理13109個連線,12953個請求reading – 正在讀取的請求頭。
   writing – 正在讀取的請求主體,正在處理的請求或者正在寫入的應答。
   waiting – keepalive連線數,等於active - (reading + writing)。       

3)      使用netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}'過濾後的連線數        

4)      使用top檢視負載

         感謝網路,感謝搜尋,感謝富有分享精神的人。