说明:可能我们都知道squid,squid是一个很流行的web页面缓存软件,接下来我们用nginx的proxy_cache模块实现类似squid的页面缓存功能。
1.搭建一台负载均衡服务器,同时这台服务器也做为proxy_cache缓存服务器ip为192.168.241.205搭建三台web服务器ip地址分别为192.168.241.10,192.168.241.11,192.168.241.12,当这四台服务器正常运转时,192.168.241.205接收到请求后会去192.168.241.10,192.168.241.11,192.168.241.12轮询取网页资源,并用proxy_cache模块在本地保存成缓存文件,当此资源再次被请求时负载均衡器就会从本地缓存中读取资源文件返回给客服端浏览器。
2.在负载均衡服务器上新建两个文件夹保存缓存文件和临时文件(这两个文件夹必须在同一磁盘分区)
mkdir -p /data0/proxy_cache_path
mkdir -p /data0/proxy_temp_path
3.下载nginx源码文件、pcre源码包、ngx_cache_purge缓存模块源码包,编译并安装
yum -y install gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel
wget https://ftp.pcre.org/pub/pcre/pcre-8.45.tar.gz
wget https://nginx.org/download/nginx-1.17.1.tar.gz
wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
安装pcre包
ulimit -SHn 65535
tar zxvf pcre-8.45.tar.gz
cd pcre-8.45/
./configure
make
make install
解压ngx_cache_purge模块源码包到/home/ngx_cache_purge
tar zxvf ngx_cache_purge-2.3.tar.gz
安装并编译nginx
tar zxvf nginx-1.17.1.tar.gz
cd nginx-1.17.1/
./configure --user=root --add-module=/home/ngx_cache_purge-2.3 --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --with-pcre-jit --with-http_ssl_module --with-http_v2_module --with-http_sub_module --with-stream --with-stream_ssl_module
make && make install
注意安装编译nginx时加入了--add-module=/home/ngx_cache_purge-2.3
安装完后开始配置负载均衡nginx的nginx.conf,配置如下:
#user nobody;
worker_processes 1;
error_log /home/logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
use epoll;
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
#临时文件保存路径
proxy_temp_path /data0/proxy_temp_path;
#设置web缓存区名称cache_one,内存缓存大小200MB,自动清除超过一天没有被访问的缓存数据,硬盘缓存空间大小为10GB
proxy_cache_path /data0/proxy_cache_path levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=10g;
#负载均衡转发器配置
upstream my_server_pool {
server 192.168.241.10:80 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.241.11:80 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.241.12:80 weight=1 max_fails=2 fail_timeout=30s;
}
server {
listen 80;
server_name localhost;
#清除缓存访问,例如要清除http://192.168.241.205/1.jpg的缓存就可以访问http://192.168.241.205/purge/1.jpg
location ~ /purge(/.*) {
#设置只有指定的ip地址和网段才能清除url缓存。
allow 192.168.241.205;
allow 192.168.241.0/24;
deny all;
proxy_cache_purge cache_one $host$1$is_args$args;
}
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
add_header Nginx-Cache "$upstream_cache_status";
proxy_pass http://my_server_pool;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
{
#使用web缓存区cache_one,该缓存区名是上文设置过的
proxy_cache cache_one;
#为每个状态码设置缓存时间,m是分钟h是小时d是天
proxy_cache_valid 200 304 1m;
proxy_cache_valid 301 302 1m;
proxy_cache_valid any 1m;
#设置web缓存的key值nginx根据key值md5哈希存储缓存,这里根据域名、url、参数组合成key
proxy_cache_key $host$uri$is_args$args;
#反向代理访问负载均衡中的源资源
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
#添加缓存转台头信息,以便我们观察
add_header Nginx-Cache "$upstream_cache_status";
proxy_pass http://my_server_pool;
}
access_log off;
}
}
其他web服务器配置文件主要内容请查看我前面的文章,https://blog.csdn.net/u014415344/article/details/117465622?spm=1001.2014.3001.5501
搭建好后在各个web服务器的根目录新建一套web页面,能访问到页面即可。
测试搭建成果:
第一次访问:
表明没用被proxy_cache缓存。
再次访问:
表明已经被proxy_cache缓存,我们这个时候就是读取的负载均衡器的本地缓存资源
清除缓存:
表明清除缓存成功。
下面是搭建这个环境遇到的问题:
location ~ /purge(/.*) 配置项要放到location / 和location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$的上面,要不然访问映射不到。
在每个上游web服务器都写一套相同名称的页面,要不然就会轮询时有时报404,因为找不到其他服务器的图片或css文件。
mkdir -p /data0/proxy_cache_path,mkdir -p /data0/proxy_temp_path要有访问权限,不然清除缓存时会报403.
location ~ /purge(/.*) 配置中允许的ip和网段要配置对,不然会报404,因为其他的ip不允许清除缓存。
每次清除缓存后,再去清除会报404,因为缓存已经被清除了。