CDN
CDN的全称是Content Delivery Network,称为内容发布网络。
CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容发布、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
CDN的关键技术有内容存储和分发技术。
Varnish
Varnish作用是访问web速度的web加速器,被安装在web服务器之前,从而缓存web服务器的应用程序和数据,最后相应客户的请求。 功能与Squid服务器相似,都可以用来做HTTP缓存。与Squid不同之处在于,Squid是从硬盘读取缓存的数据,而Varnish把数据存放在内存中,直接从读取内存,避免了频繁在内存、磁盘中交换文件,所以Varnish要相对更高效,但也有缺点,内存中的缓存在服务器重启后会丢失。
安装Varnish
配置阿里云epel镜像源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum makecache
yum install varnish -y
配置后端服务
vim /etc/varnish/default.vcl
16 backend default {
17 .host = "127.0.0.1";
18 .port = "80";
19 }
修改参数限制
修改/etc/security/limits.conf 在最后添加:
配置varnish
更改端口/etc/varnish/varnish.params
添加cache命中信息
配置访问acl
vim /etc/varnish/default.vcl
16 backend web1 {
17 .host = "172.25.254.102";
18 .port = "80";
19 }
20
21 backend web2 {
22 .host = "172.25.254.103";
23 .port = "80";
24 }
25 sub vcl_recv {
26 if (req.http.host ~ "^(www.)?westos.org") {
27 set req.http.host = "www.westos.org";
28 set req.backend_hint = web1;
29 #return(pass);
30 }
31 elseif (req.http.host ~ "^bbs.westos.org") {
32 set req.backend_hint = web2;
33 #return(pass);
34 }
35 else {
36 return(synth(404,"Not in cache"));
37 }
38 }
重启varnish
负载均衡和健康检查
vim /etc/varnish/default.vcl
13 vcl 4.0;
14 import directors;
15 # Default backend definition. Set this to point to your content server.
16
17 backend web1 {
18 .host = "172.25.254.102";
19 .port = "80";
20 }
21
22 backend web2 {
23 .host = "172.25.254.103";
24 .port = "80";
25 }
26 sub vcl_init {
27 new web_cluster = directors.round_robin();
28 web_cluster.add_backend(web1);
29 web_cluster.add_backend(web2);
30 }
31 sub vcl_recv {
32 if (req.http.host ~ "^(www.)?westos.org") {
33 set req.http.host = "www.westos.org";
34 set req.backend_hint = web_cluster.backend();
35 return(pass);
36 }
37 elseif (req.http.host ~ "^bbs.westos.org") {
38 set req.backend_hint = web2;
39 #return(pass);
40 }
41 else {
42 return(synth(404,"Not in cache"));
43 }
当关掉server3 nginx时
加入健康检查
17 probe backend_healthcheck {
18 .url = "/test.html";
19 .window = 3;
20 .threshold = 2;
21 .interval = 3s;
22 }
23 backend web1 {
24 .host = "172.25.254.102";
25 .port = "80";
26 .probe = backend_healthcheck;
27 }
28
29 backend web2 {
30 .host = "172.25.254.103";
31 .port = "80";
32 .probe = backend_healthcheck;
33 }
一开始关掉server3 nginx 后面开启nginx之后加入 cluster
透过代理解析源IP
在具有CDN加proxy代理的情况下 后端服务器不能获得client IP
环境 :client -> CDN -> server2 proxy -> server3
server3 不能获得client IP
在server3 加入/usr/local/lnmp/nginx/conf/nginx.conf
确保nginx编译时拥有–with-http_realip_module
效果