1、 CDN概述
CDN,即内容分发网络,是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。通常情况下,CDN的关键技术主要有内容存储和分发技术。(引自?百度百科:CDN) CDN的搭建方式有很多种,并且所使用的软件也有很多种,在本文中以老牌的squid为例进行搭建和实验。
2、 本实验CDN拓扑
在本文中,旨在通过nginx+squid这样的方式搭建一个简易的CDN服务器,用于缓存源服务器上的内容,从而提高达到提高访问速度和流量分摊的目的,我们使用两台服务器进行实验,其中一台安装nginx充当源服务器,另一台则是安装nginx和squid充当CDN缓存服务器,相关拓扑如下:
3、 配置步骤
3.1、网站源服务器(操作系统为debian)
(1)安装nginx
apt install nginx -y
(2)修改nginx的初始页面,以便区分
echo 'This is test webpage!!!!' > /var/www/html/index.nginx-debian.html
(3)重启nginx
systemctl restart nginx
需要注意的是,debian默认的防火墙为iptables,因为该防火墙默认是没有规则的,因此不用专门关闭。
上述配置完成后,客户端输入网站源服务器的IP地址,可以看到访问是正常的如下图所示:
3.2、CDN服务器(操作系统为CentOS-Stream 9)
针对于CDN服务器,相应的部署步骤如下:
(1)关闭防火墙以及防火墙自启动,也可写入具体的安全策略至防火墙
systemctl disable firewalld
systemctl stop firewalld
(2)安装nginx和squid
yum install nginx -y
yum install squid -y
(3)输入命令“vim /etc/squid/squid.conf ”,修改该配置文件,增加如下图红框中所示的内容,以达到将squid缓存代理服务指向网站源服务器的IP地址和端口(192.168.80.135:80)之目的 (4)输入命令“vim /etc/nginx/nginx.conf ”,修改该配置文件,在server结构体下,增加如下图红框中所示的内容,以达到CDN上的nginx指向squid代理服务(默认监听端口是3128)之目的 (5)配置完成后,重启nginx和squid
systemctl restart nginx
systemctl restart squid
(6)输入以下命令修改SELinux安全上下文的布尔值,如果在CentOS上遗失此步骤,会出现因为SELinux的httpd_can_network_connect模块阻拦,而导致nginx和squid无法建立通信,缓存不到网站源服务器的资源,最终使得客户端访问CDN服务器时报“502 bad Gateway”错误,如下图 输入命令“setsebool -P httpd_can_network_connect 1 ”后,然后在客户端的浏览器上输入CDN服务器的IP地址192.168.80.136,发现可以成功访问到网站源服务器(192.168.80.135)上的页面,通过浏览器的开发者工具也可以看到访问过程中经过了squid,说明此时CDN服务器缓存成功
4、附:nginx和squid的配置文件
4.1、/etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
server {
listen 80;
location / {
proxy_pass http://127.0.0.1:3128;
}
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
4.2、/etc/squid/squid.conf
acl localnet src 0.0.0.1-0.255.255.255
acl localnet src 10.0.0.0/8
acl localnet src 100.64.0.0/10
acl localnet src 169.254.0.0/16
acl localnet src 172.16.0.0/12
acl localnet src 192.168.0.0/16
acl localnet src fc00::/7
acl localnet src fe80::/10
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 21
acl Safe_ports port 443
acl Safe_ports port 70
acl Safe_ports port 210
acl Safe_ports port 1025-65535
acl Safe_ports port 280
acl Safe_ports port 488
acl Safe_ports port 591
acl Safe_ports port 777
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
cache_peer 192.168.80.135 parent 80 0 originserver
cache_peer_access 192.168.80.135 allow all
http_access allow localnet
http_access allow localhost
http_port 3128 accel vhost vport
cache_dir ufs /var/spool/squid 100 16 256
coredump_dir /var/spool/squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
|