為什么要做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指令負責反向代理緩存后端服務器的靜態內容,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 /usr/local/nginx/proxy_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,來迎接着激動人心的時刻吧。我已經迫不及待了。如果文章哪里有問題或者你遇到了什么麻煩,可以留言讓我知道。
當我們瀏覽http://localhost:10000/222.jpg時,在代理端就把圖片緩存了,不用到代理終端去緩存了,可以節省資源。緩存的內容放在你設置的proxy_cache_path路徑下面,看下圖
nginx proxy_cache
第一層目錄只有一個字符,是由levels=1:2設置,總共二層目錄,子目錄名字由二個字符組成。突然發現,我在我的系統里面,配置過varnish,squid,apache和mod_cache,nginx和proxy_cache,他們都是可以對文件進行緩存,不知道他們哪一個對文件的緩存效果最好呢?有空比較一下,對了這4種緩存,這個博客里面都有的,有興趣的朋友,可以看一下