为了让所有地区用户(不分国别)都能够很快的访问香港云服务器搭建的网站,所以可以考虑使用CDN加速,即缓存服务器。例如,我在湖北有一台缓存服务器,第一次向香港服务器请求数据时(一般是静态数据),就会将所有数据缓存在湖北服务器上,这样,当湖北的用户访问香港网站时速度也会有一个很大的提升。那么,如何利用nginx去部署一台缓存服务器?
目标:开启缓存,并成功缓存一个网站。
1.先创建一个www用户用以管理nginx,为什么需要创建用户?因为nginx是对用户的,对外服务,只给予必要的最小权限。
useradd -r www -s /sbin/nologin
查看是否创建成功
tail -f /etc/passwd
=>www:x:1001:1001::/home/www:/sbin/nologin
关于-s(shell),manual中的解释如下,创建/sbin/nologin的意义在于这个用户将无法使用bash或其他shell来登陆系统!
-s, --shell SHELL
The name of the user's login shell. The default is to leave this field blank, which causes the system to select the default login shell specified by the SHELL variable in /etc/default/useradd, or an empty string by default.
2.下载ngx_cache_purge模块,官方对其的解释是“它增加了从FastCGI、proxy、SCGI和uWSGI缓存中清除内容的功能”,tar将其解压。源址如下:
https://github.com/FRiCKLE/ngx_cache_purge
http://labs.frickle.com/nginx_ngx_cache_purge/
3.配置编译安装nginx,基本都可以在./configure --help中查看,其中--add-module加入的是我解压ngx_cache_purge所存放的目录。
./configure --prefix=/usr/local/nginx --user=www --group=www --add-module=../ngx_cache_purge-2.3 --with-http_stub_status_module
当然如果gcc或者HTTP rewrite所需的PCRE等未安装的话会报error错误,centos下使用yum安装一下即可。
但是当我准备使用make -j4编译时,dan疼了,这是一台在vultr上购置的韩国centos 8 Linux服务器,居然没有make,再使用yum安装下
-bash: make: command not found
>>yum install make
# In Ubuntu and Debian
# sudo apt-get install make
4.修改nginx目录所属用户及组别,这样www用户来管理nginx就不会存在权限上的问题。chown,change owner,-R参数,operate on files and directories recursively,递归的修改子文件。如果不加-R参数,则子目录不会被同步更改。
chown www:www nginx/ -R
5.这个时候就可以修改nginx.conf配置文件,将其管理者进行修改了
# 将配置文件的注释都去掉
# sed -e '/#/d' -e '/^$/d' nginx.conf.bak > nginx.conf
user www;
6.Nginx缓存部署,其实就是用nginx反向代理+缓存机制来实现的,数据的存储形式为{key:value}形式。首先我们需要在http段中配置缓存路径,
#临时目录需要手动创建!!!
#并将cache目录赋予www =>chown www:www /cache -R
proxy_temp_path /cache/proxy_temp_dir;
proxy_cache_path /cache/proxy_dir levels=1:2 keys_zone=zhangxiaofei:100m inactive=7d max_size=50g;
proxy_cache_min_uses 1;
- proxy_temp_path,临时缓存路径
- proxy_cache_path,缓存文件路径
- levels=1:2,设置缓存文件目录层次;levels=1:2 表示两级目录,第一个文件夹一个字母(或数字),第二个文件夹两个字母(或数字),最多三级
- keys_zone=zhangxiaofei:100m,设置缓存名字zhangxiaofei,和共享内存大小100m,共享内存用于存放缓存的key和metadata,方便nginx快速的判断请求是否命中缓存,1m可以存储8000个key。
- inactive=7d,在7天内没人访问则缓存被删除
- max_size=50g,最大缓存空间,如果缓存空间用满,默认覆盖掉缓存时间最长的资源,如果不指定,默认用光所有磁盘。
- proxy_cache_min_uses,设置响应被缓存的最小请求次数。默认为1,当客户端发送相同请求达到规定次数后,nginx才对响应数据进行缓存;指请求至少被发送了多少次以上时才缓存,可以防止低频请求被缓存。
- proxy_cache_path和proxy_temp_path,最好设置在同一文件分区下,缓存内容是先写在 temp_path,临时文件和缓存可以放在不同的文件系统,将导致文件在这两个文件系统中进行拷贝,而不是廉价的重命名操作,具体的差异可以看下这两篇文章介绍。
配置完缓存相关,开始在server段中的location配置反向代理,配置如下:
location / {
#root html;
#index index.html index.htm;
proxy_pass http://domain.com;
# keys_zone的名字
proxy_cache zhangxiaofei;
#200,304才缓存,30分钟
proxy_cache_valid 200 304 30m;
# 其它1分钟
proxy_cache_valid any 1m;
# proxy_cache_valid 404 1m;
# key根据完整的url生成,通过唯一key来进行hash存取
proxy_cache_key $host$uri$is_args$args;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
7.测试。配置文件更改之后,启动nginx,访问本台服务器公网IP:141.164.50.226(下文称为服务器A)成功访问到代理网站domain.com;(下文称为服务器B),如下图
如何判断缓存服务器部署成功呢?,通过两台机器的nginx日志来判断,如果A服务器有日志访问记录,但是B却没有,则证明缓存成功。使用第三台机器(IP为112.126.88.219)对A服务器进行访问(我提前在B服务器html目录下面存放了一张名为cc.png的图片)
#Fetch the headers only!
curl -I http://141.164.50.226/cc.png
A服务器日志如下:
B服务器日志如下:
这是第一次请求,出现这样的结果是正确的,第二次访问相同链接,如果没有意外,我的推论是A服务器继续出现访问日志,但是B服务器将不会再出现该条访问日志,因为之前对200状态码缓存的是30分钟!
再次测试如下,下图1为A服务器,下图2为B服务器,NICE!正是我想要的结果:
而对于其它页面(如404)设置的缓存为1分钟,测试如下,照例,下图1为A服务器,图2为B服务器,首先第一次请求,AB皆生成了一条日志,这是正常的,然后过了一分钟,我再去访问,AB均再次生成了一条日志,而马上我又请求了一次页面,这次B服务器没有再生成访问日志,说明走的缓存
8.url刷新。应用场景,当你需要清除某几个图片及其缓存,而又不想要一次性删除全部缓存时。ngx_cache_purge模块就可以上场了。缓存的key大致是下面这个东西,所以我们自己去找出来删除掉完全不现实
在nginx.conf配置如下代码,重启!这个代码尽量复制吧,要不少个斜杠多个斜杠把人排查的要吐了,实在不行看下官方git公布的样例:
location ~/purge(/.*){
allow 127.0.0.1;
# 我自己的公网IP
allow 109.36.1.108;
proxy_cache_purge zhangxiaofei $host$1$is_args$args;
}
首先再次访问该图片,发现仍然走的缓存:
curl -I http://141.164.50.226/cc.png
公网访问如下路径,删除缓存,提示如下页面,成功删除
http://141.164.50.226/purge/cc.png
因为我是测试服务器,缓存文件只有一个,所以也可以看下缓存目录,可以发现文件已经被删除
备注:在实际测试过程中,我发现当成功删除缓存时,再次访问相同页面,B服务器还是偶尔没有打印nginx日志,我用的是谷歌浏览器,这个时候可以尝试使用CTRL+SHIFT+R强制刷新,因为有可能是本地缓存的原因。
搭建镜像服务器
目的:为了解决大文件的缓存(例如我们常见的豆瓣镜像下载服务器等)。nginx配置文件如下:
location / {
root html;
#以列表方式列出
autoindex on;
#开启镜像服务
proxy_store on;
#缓存文件的权限
proxy_store_access user:rw group:rw all:r;
#设置临时目录,需先创建
proxy_temp_path /usr/loacl/nginx/html/temp;
#判断什么时候去取源
if ( !-e $request_filename ){
#原网站
proxy_pass http://domain.com;
}
# 必须配置一个不存在目录才可以展现列表,还没查清原因
index not;
}
A服务器访问如下141.164.50.226/cc.zip(提前在domain.com下准备了压缩包)路径,开始下载到本地
等下载完成之后,刷新该目录,发现多了镜像服务器多了一个cc.zip文件夹,如下图,即用户下次下载该文件直接在镜像服务器下载就可以了,不用再请求源服务器。
而设置的proxy_temp_path是用于存放正在下载但是未完成下载的文件,当文件下载完成之后,这个目录就会被清空掉。
https://www.cnblogs.com/redirect/p/10066766.html
https://www.xiebruce.top/688.html