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檢視負載
感謝網路,感謝搜尋,感謝富有分享精神的人。