nginx用作反向代理,可以缓存代理的内容,配置如下:
proxy_temp_path /data/nginx_cache_tmp/;
proxy_buffer_size 8k;
proxy_buffering on;
proxy_buffers 8 8k;
proxy_cache cache0;
proxy_cache_key “$host$uri$is_args$args”;
proxy_cache_valid 1s;
nginx本身不提供缓存到内存的功能,不过可以通过使用技巧来做,就是利用/dev/shm – 虚拟内存。
首先确认/dev/shm是否被mount了,df命令可以看到一行:
tmpfs 8215004 16 8214988 1% /dev/shm,这台linux是16G内存,所以一半就是8G
使用上说,跟普通磁盘无区别,先创建目录:
mkdir /dev/shm/nginx_cache_tmp;
再mount到一个硬盘目录,由于不是块设置,需要用bind参数:
mount –bind /dev/shm/nginx_cache_tmp /data/nginx_cache_tmp;
再mount看一下,会有下面几行:
/dev/shm/nginx_cache on /data/nginx_cache type none (rw,bind)
/dev/shm/nginx_cache_tmp on /data/nginx_cache_tmp type none (rw,bind)
相当于实现了将代理内容缓存到内存,提高了响应速度。
1 proxy_cache
语法:proxy_cache zone_name;
默认值:None
使用字段:http, server, location
设置一个缓存区域的名称,一个相同的区域可以在不同的地方使用。
在0.7.48后,缓存遵循后端的”Expires”, “Cache-Control: no-cache”, “Cache-Control: max-age=XXX”以及其他等。然而,目前nginx会忽略一些缓存控制指令,如:”private”和”no-store”,同样,nginx在缓存过程中不会处理”Vary”头,为了确保一些私有数据不被所有的用户看到,后端必须设置 “no-cache”或者”max-age=0″头,或者proxy_cache_key包含用户指定的数据如$http_cookie_xxx,在proxy_cache_key中使用一部分cookie的值可以防止缓存私有数据,所以可以分别指定location以便分开私有数据和公有数据。
缓存指令依赖代理缓冲区(buffers),如果proxy_buffers设置为off,缓存不会生效。
2 proxy_cache_key
语法:proxy_cache_key line;
默认值:$scheme$proxy_host$request_uri;
使用字段:http, server, location
指令指定了包含在缓存中的缓存关键字。
proxy_cache_key "$scheme$host$request_uri";
3 proxy_cache_path
语法:proxy_cache_path path [levels=number] keys_zone=zone_name:zone_size [inactive=time] [max_size=size];
默认值:None
使用字段:http
指令指定缓存的路径和一些其他参数,缓存的数据存储在文件中。缓存的文件名和key为代理URL的MD5 码。levels参数指定缓存的子目录数,例如:
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;
文件名类似于:
/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c
所有活动的key和元数据存储在共享的内存区域中,这个区域用keys_zone参数指定,如果在inactive参数指定的时间内缓存的数据没有被请求则被删除,默认inactive为10分钟。
cache manager进程控制磁盘的缓存大小,在max_size参数中定义,超过其大小后最少使用数据将被删除。
区域的大小按照缓存页面数的比例进行设置,一个页面(文件)的元数据大小按照操作系统来定,FreeBSD/i386下为64字节,FreeBSD/amd64下为128字节,当区域满了以后key将按照LRU(最近最少使用算法)进行处理。
proxy_cache_path和proxy_temp_path应该使用在相同的文件系统上。
4 proxy_cache_methods
语法:proxy_cache_methods [GET HEAD POST];
默认值:proxy_cache_methods GET HEAD;
使用字段:http, server, location
GET/HEAD用来装饰语句,即你无法禁用GET/HEAD即使你只使用下列语句设置:
proxy_cache_methods POST;
5 proxy_cache_min_uses
语法:proxy_cache_min_uses the_number;
默认值:proxy_cache_min_uses 1;
使用字段:http, server, location
多少次的查询后应答将被缓存,默认1。
6 proxy_cache_valid
语法:proxy_cache_valid reply_code [reply_code ...] time;
默认值:None
使用字段:http, server, location
为不同的应答设置不同的缓存时间,例如:
proxy_cache_valid 404 1m;
proxy_cache_valid 5m;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;
7 proxy_cache_use_stale
为了防止缓存失效(在多个线程同时更新本地缓存时),你可以指定’updating’参数,它将保证只有一个线程去更新缓存,并且在这个线程更新缓存的过程中其他的线程只会响应当前缓存中的过期版本。
代码及configure配置:
在ngx_http_proxy_module.c里面定义了每个指令的钩子(即callback),它们在读取配置文件时会被调用。在configure的时候只需要把“HTTP_CACHE”设置为YES(可以找到auto/options里面HTTP_CACHE那行)。“proxy_cache_purge”指令需要下载nginx add-ons里面的“Cache Purge”模块,并在configure的时候用"--add-module="来加载代码。
配置文件例子:
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"';
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
tcp_nodelay on;
proxy_temp_path /data/proxy_temp_path;
proxy_cache_path /data/proxy_cache_path levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
upstream haha {
server 127.0.0.1:8001 weight=2;
server 10.10.10.57 weight=1;
}
server {
listen 80;
server_name www.;
location ~ \.html$ {
proxy_pass http://127.0.0.1:8002;
}
location / {
proxy_cache cache_one;
proxy_cache_valid 200 304 12h;
proxy_cache_valid 301 302 1m;
proxy_cache_valid any 1m;
proxy_cache_key $host$uri$is_args$args;
proxy_pass http://haha;
}
location ~ /purge(/.*)
{
allow 127.0.0.1;
allow 10.10.10.67;
deny all;
proxy_cache_purge cache_one $host$1$is_args$args;
}
}
一、Nginx 反向代理
1、 安装条件:
Nginx: http://sysoev.ru/nginx/nginx-0.6.32.tar.gz
SSL: http://www.openssl.org/source/openssl-0.9.8g.tar.gz
Pcre: ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.7.tar.gz
Zlib: http://www.zlib.net/zlib-1.2.3.tar.gz
2、 安装:
Ssl安装:
[root@RedhatAS4U4-Oracle oracle]# cd openssl-0.9.8g
[root@RedhatAS4U4-Oracle openssl-0.9.8g]#./config --prefix=/usr/local/openssl/
[root@RedhatAS4U4-Oracle openssl-0.9.8g]# make
[root@RedhatAS4U4-Oracle openssl-0.9.8g]# make install
Pcre 安装:
[root@RedhatAS4U4-Oracle oracle]# cd pcre-7.7
[root@RedhatAS4U4-Oracle pcre-7.7]# ./configure --prefix=/usr/local/pcre
[root@RedhatAS4U4-Oracle pcre-7.7]# make
[root@RedhatAS4U4-Oracle pcre-7.7]# make install
Make 时报错:
libtool: ignoring unknown tag CXX
libtool: unrecognized option `-DHAVE_CONFIG_H'
Try `libtool --help' for more information.
make[1]: *** [pcrecpp.lo] Error 1
make[1]: Leaving directory `/home/beijing/pcre-7.7'
make: *** [all] Error 2
原因:
pcre-7.7 configuration summary:
Install prefix .................. : /usr/local/pcre
C preprocessor .................. : gcc -E
C compiler ...................... : gcc
C++ preprocessor ................ :
C++ compiler .................... :
Linker .......................... : /usr/bin/ld
C preprocessor flags ............ :
C compiler flags ................ : -O2
C++ compiler flags .............. :
Linker flags .................... :
Extra libraries ................. :
没有装GCC C++包:
gcc-c++-3.4.6-8.i386.rpm libstdc++-devel-3.4.6-8.i386.rpm
Zlib 安装:
[root@RedhatAS4U4-Oracle oracle]# cd zlib-1.2.3
[root@RedhatAS4U4-Oracle zlib-1.2.3]#
[root@RedhatAS4U4-Oracle zlib-1.2.3]# make
[root@RedhatAS4U4-Oracle zlib-1.2.3]# make install
Nginx 安装:
[root@RedhatAS4U4-Oracle oracle]# cd nginx-0.6.32
[root@RedhatAS4U4-Oracle nginx-0.6.32]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-pcre=/root/pcre-7.7 --with-zlib=/root/zlib-1.2.3 --with-http_stub_status_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-openssl=/root/openssl-0.9.8g
[root@RedhatAS4U4-Oracle nginx-0.6.32]# make
[root@RedhatAS4U4-Oracle nginx-0.6.32]# make install
3、配置:
[root@RedhatAS4U4-Oracle oracle]# cat /usr/local/nginx/conf/nginx.conf
user nobody nobody;
worker_processes 30;
error_log logs/error.log notice;
pidlogs/nginx.pid;
events {
use epoll;
worker_connections 40960;
}
http {
include 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"';
keepalive_timeout 150;
server_names_hash_bucket_size 64;
upstream cache {
ip_hash;
server 10.167.26.166:8080; //varnish server 1
server 10.167.26.3;
}
server {
listen 10.167.26.5:80;
server_name cacti.;
access_log logs/cacti.wizardial.com.access.log main;
location / {
proxy_pass http://cache;
proxy_redirecthttp://cacti./ /;
proxy_set_headerHost $host;
proxy_set_headerX-Real-IP $remote_addr;
proxy_set_headerX-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_headerX-Is-EDU 0;
client_max_body_size 50m;
client_body_buffer_size 256k;
proxy_connect_timeout 10;
proxy_send_timeout 15;
proxy_read_timeout 15;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
server {
listen 10.167.26.5:81;
server_name nginxstatus. 10.167.26.5;
location /NginxStatus {
stub_status on;
access_log off;
allow 210.22.7.147;
allow 127.0.0.1;
deny all;
}
}
}
以上配置为nginx 做反向代理,监听10.167.26.5:80的IP,接收cacti.wizardial.com 的域名请求,转发到后端varnish缓存服务器。
4、 优化:
修改open files数
显示open files数
[root@RedhatAS4U4-Oracle oracle]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
pending signals (-i) 1024
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
……
修改open files数
优化Linux内核参数
[root@RedhatAS4U4-Oracle oracle]# vi /etc/sysctl.conf
在末尾增加以下内容:
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 5000 65000
使配置立即生效:
不停止Nginx服务的情况下平滑变更Nginx配置
二、Varnish 缓存
Varnish优点:
1、Varnish采用了“Visual Page Cache”技术,在内存的利用上,Varnish比Squid具有优势,它避免了Squid频繁在内存、磁盘中交换文件,性能要比Squid高。
2、Varnish的稳定性非常好
3、通过Varnish管理端口,可以使用正则表达式快速、批量地清除部分缓存,这一点是Squid不能具备的。
Varnish网站缓存加速器安装:
1、创建www用户和组,以及Varnish缓存文件存放目录(/var/InfiNET/cache):
[root@RedhatAS4U4-Oracle oracle]# /usr/sbin/useradd -u 48 -g www www
[root@RedhatAS4U4-Oracle oracle]# mkdir -p /var/InfiNET/cache
[root@RedhatAS4U4-Oracle oracle]# chmod +w /var/InfiNET/cache
[root@RedhatAS4U4-Oracle oracle]# chown -R www:www /var/InfiNET/cache
2、创建Varnish日志目录(/var/logs/):
[root@RedhatAS4U4-Oracle oracle]# chmod +w /usr/local/varnish/logs
[root@RedhatAS4U4-Oracle oracle]# chown -R www:www /usr/local/varnish/logs
3、编译安装varnish:
下载:
http://sourceforge.net/project/showfiles.php?group_id=155816&package_id=173643&release_id=563022
[root@RedhatAS4U4-Oracle oracle]# wget http://blog.s135.com/soft/linux/varnish/varnish-1.1.2.tar.gz
[root@RedhatAS4U4-Oracle oracle]# tar zxvf varnish-1.1.2.tar.gz
[root@RedhatAS4U4-Oracle oracle]# cd varnish-1.1.2
[root@RedhatAS4U4-Oracle oracle]# ./configure --prefix=/usr/local/varnish
[root@RedhatAS4U4-Oracle oracle]# make && make install
./configure -enable-debugging-symbols -enable-developer-warnings -enable-dependency-tracking --prefix=/usr/local/varnish
注意,我在进行make步骤时,出现如下错误:
"varnishhist.c:35:20: error: curses.h: No such file or directory"
造成该问题的原因是因为系统中少了ncurses-devel包
4、创建Varnish配置文件:
[root@RedhatAS4U4-Oracle oracle]# vi /usr/local/varnish/vcl.conf
backend myblogserver {
set backend.host = "10.167.26.3";
set backend.port = "80";
}
acl purge {
"localhost";
"127.0.0.1";
"10.167.0.0"/16;
"210.22.7.147"/32;
}
sub vcl_recv {
if (req.request == "PURGE") {
if (!client.ip ~ purge) {
error 405 "Not allowed.";
}
lookup;
}
if (req.http.host ~ "^cacti.chinarenservice.com") {
set req.backend = mymonitorserver;
if (req.request != "GET" && req.request != "HEAD") {
pipe;
}
else {
lookup;
}
}
else {
error 404 "Zhang Yan Cache Server";
lookup;
}
}
sub vcl_hit {
if (req.request == "PURGE") {
set obj.ttl = 0s;
error 200 "Purged.";
}
}
sub vcl_miss {
if (req.request == "PURGE") {
error 404 "Not in cache.";
}
}
sub vcl_fetch {
if (req.request == "GET" && req.url ~ "\.(txt|js|gif|jpg||jpeg|tom|swf|css)$") {
set obj.ttl = 3600s;
}
else {
set obj.ttl = 30d;
}
}
注释:
(1)、Varnish通过反向代理请求后端IP为10.167.26.3,端口为80的apache服务器;
(2)、Varnish允许localhost、127.0.0.1、10.167.0.***源IP通过PURGE方法清除缓存;
(3)、Varnish对域名为cacti.chinarenservice.com的请求进行处理,非cacti.chinarenservice.com域名的请求则返回“freeke Cache Server”;
(4)、Varnish对HTTP协议中的GET、HEAD请求进行缓存,对POST请求透过,让其直接访问后端Web服务器。之所以这样配置,是因为POST请求一般是发送数据给服务器的,需要服务器接收、处理,所以不缓存;
(5)、Varnish对以.txt和.js等结尾的URL缓存时间设置1小时,对其他的URL缓存时间设置为30天。
5、启动Varnish
[root@RedhatAS4U4-Oracle oracle]# /usr/local/varnish/sbin/varnishd -n /var/InfiNET/cache -f /usr/local/varnish/vcl.conf -a 0.0.0.0:80 -s file,/var/InfiNET/cache/varnish_cache.data,1G -g www -u www -w 30000,51200,10 -T 127.0.0.1:3500 -p client_http11=on
6、启动varnishncsa用来将Varnish访问日志写入日志文件:
7、配置开机自动启动Varnish
[root@RedhatAS4U4-Oracle oracle]# vi /etc/rc.local
/usr/local/varnish/sbin/varnishd -n /var/InfiNET/cache -f /usr/local/varnish/vcl.conf -a 0.0.0.0:80 -s file,/var/InfiNET/cache/varnish_cache.data,1G -g www -u www -w 30000,51200,10 -T 127.0.0.1:3500 -p client_http11=on
/usr/local/varnish/bin/varnishncsa -n /var/InfiNET/cache -w /usr/local/varnish/logs/varnish.log &
FAQ:
1、配置 泛域名 的主机
很多二级域名,比如 xx. ,一个一个加好麻烦。squid 或者nginx 都支持 . 的
if (req.http.host ~ "^www.") {
改成
if (req.http.host ~ ".") {
2、附varnish多站点配置
backend www {
set backend.host = "www.";
set backend.port = "80";
}
backend blog {
set backend.host = "blog.";
set backend.port = "80";
}
backend image {
set backend.host = "image.";
set backend.port = "80";
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?$") {
set req.http.host = "www.";
set req.backend = www;
} elsif (req.http.host ~ "^blog.$") {
set req.backend = blog;
} elsif (req.http.host ~ "^image.$") {
set req.backend = image;
} else {
error 404 "Unknown host";
}
您可能感兴趣的文章:
Nginx负载均衡与反向代理的例子(图文)
Nginx Proxy 代理配置图片缓存的实例参考
nginx正向代理配置简单一例
nginx反向代理配置简单示例
学习Nginx反向代理实现简单负载均衡(图文)
nginx缓存html静态文件 解析php及反向代理IIS的配置
nginx中配置proxy正向代理
Nginx实现简单的反向代理
nginx创建反向代理和虚拟主机的例子
nginx的反向代理配置与优化
nginx反向代理与负载均衡
Nginx 反向代理的小例子
nginx反向代理与缓存详解
nginx反向代理配置一例
Nginx反向代理Nginx
nginx反向代理配置和优化
Nginx Proxy代理和图片缓存配置
nginx配置反向代理的简单示例