為什麼要做web cache,我想大家最主要的是解決流量的壓力。隨著網站流量的提升,如果只是單台機器既處理靜態檔案,又處理動態指令碼,顯然效率很難上升,不能處理日益上漲的流量壓力。與此同時某些網站的頁面內容並不是經常變化,因此我們可以分兩層架構來組織網站。前端web緩衝+後端web伺服器
前端web緩衝有多重方式實現,原理就是隊請求結果頁面靜態化並設定一個逾時期限,快取頁面面到期後,新請求到達時重新到後端web伺服器擷取內容更新;沒有nginx前比較流行的方法是squid,但squid不能充分利用處理器的多核特性,越來越多的網站選用nginx來做前端的web緩衝。
要想使用nginx的緩衝功能要保證nginx添加了proxy模組。我們可以使用-V選項(大寫的V,小寫v是看版本號碼的)來查看nginx的編譯參數。我使用的是預設的參數編譯的,如下所示:
root@SNDA-172-17-12-117:/usr/local/nginx# ./nginx -V
nginx version: nginx/1.2.3
built by gcc 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1)
TLS SNI support enabled
configure arguments: --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.21 --with-zlib=/usr/local/src/zlib-1.2.7
nginx的所有模組必須在編譯的時候添加,不能再啟動並執行時候動態載入,預設的編譯選項下包含的模組,如果你不是顯示的用參數關閉它。
nginx預設安裝的模組如下
| 模組名稱 |
描述 |
版本 |
如何禁用 |
| Core |
Control ports, locations, error pages, aliases, and other essentials. |
|
--without-http |
| Access |
Allow/deny based on IP address. |
|
--without-http_access_module |
| Auth Basic |
Basic HTTP authentication. |
|
--without-http_auth_basic_module |
| Auto Index |
Generates automatic directory listings. |
|
--without-http_autoindex_module |
| Browser |
Interpret "User-Agent" string. |
0.4.3 |
--without-http_browser_module |
| Charset |
Recode web pages. |
|
--without-http_charset_module |
| Empty GIF |
Serve a 1x1 image from memory. |
0.3.10 |
--without-http_empty_gif_module |
| FastCGI |
FastCGI Support. |
|
--without-http_fastcgi_module |
| Geo |
Set config variables using key/value pairs of IP addresses. |
0.1.17 |
--without-http_geo_module |
| Gzip |
Gzip responses. |
|
--without-http_gzip_module |
| Headers |
Set arbitrary HTTP response headers. |
|
| Index |
Controls which files are to be used as index. |
|
| Limit Requests |
Limit frequency of connections from a client. |
0.7.20 |
--without-http_limit_req_module |
| Limit Zone |
Limit simultaneous connections from a client. Deprecated in 1.1.8, use Limit Conn Instead. |
0.5.6 |
--without-http_limit_zone_module |
| Limit Conn |
Limit concurrent connections based on a variable. |
|
--without-http_limit_conn_module |
| Log |
Customize access logs. |
|
| Map |
Set config variables using arbitrary key/value pairs. |
0.3.16 |
--without-http_map_module |
| Memcached |
Memcached support. |
|
--without-http_memcached_module |
| Proxy |
Proxy to upstream servers. |
|
--without-http_proxy_module |
| Referer |
Filter requests based on Referer header. |
|
--without-http_referer_module |
| Rewrite |
Request rewriting using regular expressions. |
|
--without-http_rewrite_module |
| SCGI |
SCGI protocol support. |
0.8.42 |
--without-http_scgi_module |
| Split Clients |
Splits clients based on some conditions |
0.8.37 |
--without-http_split_clients_module |
| SSI |
Server-side includes. |
|
--without-http_ssi_module |
| Upstream |
For load-balancing. |
|
--without-http_upstream_ip_hash_module (ip_hash directive only) |
| User ID |
Issue identifying cookies. |
|
--without-http_userid_module |
| uWSGI |
uWSGI protocol support. |
0.8.40 |
--without-http_uwsgi_module |
| X-Accel |
X-Sendfile-like module. |
|
proxy模組中常用的指令時proxy_pass和proxy_cache.
nginx的web緩衝功能的主要是由proxy_cache、fastcgi_cache指令集和相關指令集完成,proxy_cache指令負責反向 Proxy緩衝後端伺服器的靜態內容,fastcgi_cache主要用來處理FastCGI動態進程緩衝(這裡我不是很清楚這兩個指令的區別,好像功能上都差不多,尤其後面這句話的意思,是我翻譯過來的)。
確認proxy模組安裝好後,下面對nginx的設定檔進行設定,重點部分如標紅字型所示。
這是我的nginx.conf設定檔。
user www-data;
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" "$host"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#Compression Settings
gzip on;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_proxied any;
gzip_min_length 1100;
gzip_buffers 16 8k;
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
# Some version of IE 6 don't handle compression well on some mime-types,
# so just disable for them
gzip_disable "MSIE [1-6].(?!.*SV1)";
# Set a vary header so downstream proxies don't send cached gzipped
# content to IE6
gzip_vary on;
#end gzip
#cache begin
proxy_buffering on;
proxy_cache_valid any 10m;
proxy_cache_path /data/cache levels=1:2 keys_zone=my-cache:8m max_size=1000m inactive=600m;
proxy_temp_path /data/temp;
proxy_buffer_size 4k;
proxy_buffers 100 8k;
#cache end
## Basic reverse proxy server ##
## Apache (vm02) backend for www.example.com ##
upstream apachephp {
server www.quancha.cn:8080; #Apache1
}
## Start www.quancha.cn ##
server {
listen 80;
server_name *.quancha.cn;
access_log logs/quancha.access.log main;
error_log logs/quancha.error.log;
root html;
index index.html index.htm index.php;
## send request back to apache1 ##
location / {
proxy_pass http://apachephp;
proxy_cache my-cache;
proxy_cache_valid 200;
#Proxy Settings
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 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
##End Proxy Settings
}
}
## End www.quancha.cn ##
}
設定檔中以proxy_開頭的指令我們大都可以字面意思得到理解。請務必注意一點proxy_cache_path和proxy_temp_path設定的目錄需要在同一分區,因為它們之間是永久連結的關係。
最後啟動nginx,來迎接著激動人心的時刻吧。我已經迫不及待了。如果文章哪裡有問題或者你遇到了什麼麻煩,可以留言讓我知道。