设为首页 收藏本站
查看: 704|回复: 0

[经验分享] centos6.4下DNS+squid+nginx+mysql搭建高可用web服务器

[复制链接]

尚未签到

发表于 2018-12-26 13:14:26 | 显示全部楼层 |阅读模式
  一.Squid是什么
  Squid是一种用来缓冲Internet数据的软件。它是这样实现其功能的,接受来自人们需要下载的目标(object)的请求并适当地处理这些请求。也就是说,如果一个人想下载一web页面,他请求Squid为他取得这个页面。Squid随之连接到远程服务器并向这个页面发出请求。然后,Squid显式地聚集数据到客户端机器,而且同时复制一份。当下一次有人需要同一页面时,Squid可以简单地从磁盘中读到它,那样数据迅即就会传输到客户机上。当前的Squid可以处理HTTP,FTP,GOPHER,SSL和WAIS等协议。但它不能处理如POP,NNTP,RealAudio以及其它类型的东西。
  squid各种代理的定义
  正向代理
  a.标准的代理缓冲服务器
    一个标准的代理缓冲服务被用于缓存静态的网页(例如:html文件和图片文件等)到本地网络上的一台主机上(即代理服务器)。当被缓存的页面被第二次访问的时候,浏览器将直接从本地代理服务器那里获取请求数据而不再向原web站点请求数据。这样就节省了宝贵的网络带宽,而且提高了访问速度。但是,要想实现这种方式,必须在每一个内部主机的浏览器上明确指明代理服务器的IP地址和端口号。客户端上网时,每次都把请求送给代理服务器处理,代理服务器根据请求确定是否连接到远程web服务器获取数据。如果在本地缓冲区有目标文件,则直接将文件传给用户即可。如果没有的话则先取回文件,先在本地保存一份缓冲,然后将文件发给客户端浏览器。
  b.透明代理缓冲服务器(常用在局域网网关上安装,配合防火墙reject使用)
    透明代理缓冲服务和标准代理服务器的功能完全相同。但是,代理操作对客户端的浏览器是透明的(即不需指明代理服务器的IP和端口)。透明代理服务器阻断网络通信,并且过滤出访问外部的HTTP(80端口)流量。如果客户端的请求在本地有缓冲则将缓冲的数据直接发给用户,如果在本地没有缓冲则向远程web服务器发出请求,其余操作和标准的代理服务器完全相同。对于Linux操作系统来说,透明代理使用Iptables或者Ipchains实现。因为不需要对浏览器作任何设置,所以,透明代理对于ISP(Internet服务器提供商)特别有用。
  反向代理
  a.反向代理缓冲服务器
    反向代理是和前两种代理完全不同的一种代理服务。使用它可以降低原始WEB服务器的负载。反向代理服务器承担了对原始WEB服务器的静态页面的请求,防止原始服务器过载。它位于本地WEB服务器和Internet之间,处理所有对WEB服务器的请求,组织了WEB服务器和Internet的直接通信。如果互联网用户请求的页面在代理服务器上有缓冲的话,代理服务器直接将缓冲内容发送给用户。如果没有缓冲则先向WEB服务器发出请求,取回数据,本地缓存后再发送给用户。这种方式通过降低了向WEB服务器的请求数从而降低了WEB服务器的负载。
  二.系统架构
  1.原理说明
  通过DNS的轮询技术,将来自客户端的请求分发给其中一台 Squid 反向代理服务器处理,如果这台 Squid 缓存了用户的请求资源,则将请求的资源直接返回给用户,否则 Squid 将此次请求根据配置的规则发送给邻居 Squid 和后台的 WEB 服务器处理,这样既减轻后台 WEB 服务器的负载,又提高整个网站的性能和安全性。
  


  

  2.主机分配:
  DNS服务器:  启用两张网卡,连接两个网段
  eth0:10.10.54.150
  eth1:172.16.54.254(作为172.16.54.0/24网段的网关)
  两台squid反向代理服务器
  squid1:172.16.54.150
  squid2:172.16.54.151
  两台web服务器(安装Discuz_X3.0_SC_UTF8.zip)
  web1:172.16.54.200
  web2:172.16.54.201
  三台mysql服务器(一主两从)
  master:172.16.54.203
  slave1:172.16.54.204
  slave2:172.16.54.205
  三:首先进行内存优化
  编辑sysctl.conf文件,添加以下内容
shell> vi /etc/sysctl.conf
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 65536 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 786432 1048576 1572864
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 1024 65000
#配置选项解释:
net.ipv4.tcp_rmem = 4096 87380 4194304:TCP读buffer,可参考的优化值: 32768 436600  873200
net.ipv4.tcp_wmem = 4096 65536 4194304:TCP写buffer,可参考的优化值: 8192 436600  873200
net.core.wmem_default:表示发送套接字缓冲区大小的缺省值(以字节为单位)
net.core.rmem_default:表示接收套接字缓冲区大小的缺省值(以字节为单位)
net.core.rmem_max :表示接收套接字缓冲区大小的最大值(以字节为单位)
net.core.wmem_max:表示发送套接字缓冲区大小的最大值(以字节为单位)
net.core.netdev_max_backlog =  262144:每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
net.core.somaxconn =  262144:web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。
net.ipv4.tcp_max_orphans = 3276800:系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。
net.ipv4.tcp_max_syn_backlog =  8192:表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_tw_buckets =  5000:表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。减少它的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。
net.ipv4.tcp_timestamps =  0:时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号,时间戳能够让内核接受这种“异常”的数据包,这里需要将其关掉。
net.ipv4.tcp_tw_recycle = 1:表示开启TCP连接中TIME-WAIT sockets的快速回收。
net.ipv4.tcp_tw_reuse = 1:表示开启重用,允许将TIME-WAIT sockets重新用于新的TCP连接。
net.ipv4.tcp_mem = 786432 1048576  1572864:同样有3个值,net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力;net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段;net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket。可根据物理内存大小进行调整,如果内存足够大的话,可适当往上调。建议94500000  915000000 927000000。
net.ipv4.tcp_fin_timeout =  30:表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
net.ipv4.tcp_keepalive_time =  1200:表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range = 1024  65000:表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
#使配置立即生效:
/sbin/sysctl -p  四.配置DNS服务器,实现轮询
  shell> yum install bindbind-utils
  shell> vim /etc/named.conf
  
#安装DNS服务器,并配置named.conf
shell> vim /etc/named.conf
options {
listen-on port 53 { any; };
allow-query     { any; };
recursion yes;
#rrset-order表明对bbs.centos.com域中的IN记录使用轮询
rrset-order {
class IN typeA name "bbs.centos.com"order cyclic;
};
};
zone "."IN {
typehint;
file"named.ca";
};
zone "centos.com"IN {
typemaster;
file"named.centos.com";
};
zone "54.16.172.in-addr.arpa"IN {
typemaster;
file"named.172.16.54";
};
#配置正解域
shell> vim /var/named/named.centos.com
$TTL 600
@                       IN SOA    centos.com. ftp. (
2011080404
3H
15M
1W
1D)
@                    IN NS     ceontos.com.
centos.com.             IN A      10.10.54.150
@                    IN MX 10  mail.ceontos.com.
mail.centos.com.        IN A      10.10.54.151
bbs.centos.com.         IN A      172.16.54.150
bbs.centos.com.         IN A      172.16.54.151
#重启
shell> /etc/init.d/named restart
#测试DNS轮询是否生效,通过两次ping
shell> ping bbs.centos.com
PING bbs.centos.com (172.16.54.151) 56(84) bytes of data.
64 bytes from 172.16.54.151: icmp_seq=1 ttl=64 time=0.441 ms
#再次ping
shell> ping bbs.centos.com
PING bbs.centos.com (172.16.54.150) 56(84) bytes of data.
64 bytes from 172.16.54.150: icmp_seq=1 ttl=64 time=0.019 ms
#上面可以看到两次ping的IP并不相同
注意:测试机的DNS服务器需要配置为10.10.54.150这台  

  

  五.配置两台squid服务器
  1.编译安装squid
  shell> yum installgcc wget perl gcc-c++ make
  shell> cd/tmp
  shell> wget http://www.squid-cache.org/Versions/v3/3.1/squid-3.1.19.tar.gz
  shell> tarxzf squid-3.1.19.tar.gz
  shell> cd squid-3.1.19
  shell> ./configure--prefix=/usr/local/squid--enable-gnuregex --disable-carp --enable-async-io=240 --with-pthreads --enable-storeio=ufs,aufs,diskd --disable-wccp --enable-icmp --enable-kill-parent-hack --enable-cachemgr-hostname=localhost --enable-default-err-language=Simplify_Chinese --with-maxfd=65535 --enable-poll --enable-linux-netfilter --enable-large-cache-files --disable-ident-lookups --enable-default-hostsfile=/etc/hosts--with-dl --with-large-files --enable-delay-pools --enable-snmp --disable-internal-dns --enable-underscore -enable-arp-acl
  shell> make&& makeinstall
  2.创建squid缓存目录,和日志目录
  shell> groupadd squid
  shell> useradd-g squid -s /sbin/nologinsquid
  shell> mkdir/squid/data -p
  shell> mkdir/squid/log
  shell> chown-R squid.squid /squid
  3.编辑squid配置文件,配置其为反向代理模式,负载两台web服务器
  
shell> vim /usr/local/squid/etc/squid.conf
#用户和用户组
cache_effective_user squid
cache_effective_group squid
#主机名
visible_hostname squid1.lij.com
#配置squid为反向代理模式
http_port 172.16.54.150:80 accel vhost vport
#配置squid2为其邻居,当 squid1 在其缓存中没有找到请求的资源时,通过 ICP查询去其邻居中取得缓存
icp_port 3130
cache_peer 172.16.54.151 sibling 80 3130
#配置squid1的两个父节点(web server),originserver参数指明是源服务器, round-robin参数指明squid通过轮询方式将请求分发到其中一台父节点; squid 同时会对这些父节点的健康状态进行检查,如果父节点 down 了,那么 squid 会从剩余的 origin 服务器中抓取数据
cache_peer 172.16.54.200 parent 80 0 originserver round-robin
cache_peer 172.16.54.201 parent 80 0 originserver round-robin
#下面是一些访问控制、日志和缓存目录的设置
cache_mem 128 MB
maximum_object_size_in_memory 4096 KB
maximum_object_size 10240 KB
cache_dir aufs /squid/data 4000 16 512
coredump_dir /squid/data
#日志路径
cache_access_log /squid/logs/access.log
cache_log /squid/logs/cache.log
cache_store_log /squid/logs/store.log
acl localnet src 10.10.54.0/24
http_access allow all
icp_access allow localnet
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  4.squid2上配置和squid1上配置完全一样,只需要修改相关IP,例如
  visible_hostname squid2.lij.com
  http_port 172.16.54.151:80 accel vhost vport
  icp_port 3130
  cache_peer 172.16.54.150 sibling 80 3130
  注意:两台squid上都要添加hosts记录
  shell> vim /etc/hosts
  172.16.54.200 squid1.lij.com
  172.16.54.201 squid2.lij.com
  六.安装三台mysql服务器,并配置为MHA高可用架构
  1.MHA介绍:MHA是由日本Mysql专家用Perl写的一套Mysql故障切换方案以保障数据库的高可用性,它的功能是能在0-30s之内实现主Mysql故障转移(failover),即一旦主服务器宕机,备份机即开始充当master提供服务,这就保证了我们的web服务器可以持续地运作
  2..MHA环境搭建过程参考我的另一篇文章:http://3974020.blog.运维网.com/3964020/1394246(这篇文章上使用的是四台服务器,一台manager,一台master,两台slave中有一台作为备用master),三台主机也可以实现MHA环境,只需要把其中一台slave主机兼做manager即可
  3.最后搭建的MHA结构
  主master:172.16.54.203
  slave1:172.16.54.204(备用master,主master当掉之后,slave1充当master继续提供服务)
  slave2:172.16.54.205(两个角色,一是作为slave2同步master数据,二是作为manager节点监控主master是否正常)
  七.配置web服务器,并安装论坛Discuz
  1.web服务器我们选择nginx,首先需要安装LNMP环境,这个略过,下面只给出nginx配置参数,关于nginx性能优化方面的一些参数没有给出
  2.shell> vim /usr/local/nginx/conf/nginx.conf
#用户,这个需要跟web根目录的用户相同
user  apache apache;
worker_processes  2;
error_log  logs/error.log;
pid        logs/nginx.pid;
events {
worker_connections  1024;
}
http {
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"';
access_log  logs/access.log;
sendfile        off;
keepalive_timeout  65;
#       gzip  on;
server {
listen       80;
server_name  bbs.centos.com;
#指定web根目录
root /var/www/bbs/upload;
charset utf-8;
index index.php index.html;
access_log  logs/bbs.access.log;
#配置php模块支持
location ~ \.php$ {
fastcgi_pass   unix:/var/run/php-fpm.sock;
fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
include        fastcgi_params;
include fastcgi.conf;
}
#nginx状态页,主要用于监控
location /server-status {
stub_status on;
allow all;
access_log off;
}
}  
  3.我们配置的web服务器根目录为/var/www/bbs/upload,首先切换到其上一层目录/var/www/bbs
  shell> cd /var/www/bbs
  shell> unzip Discuz_X3.0_SC_UTF8.zip
  shell> chown apache.apache -R /var/www/bbs
  4.浏览器访问http://172.16.54.200 进入Discuz安装程序,首先是错误检查,根据错误提示更改错误,一般都是相关目录权限的问题
  5.接下来是要制定Discuz存放数据库的位置,以及数据库读取所用账号,由于之前我们已经搭建起了MHA环境,所以这里数据库我们指定为后面的master主机(172.16.54.203),一旦master主机当掉,slave1(172.16.54.204)可以继续提供服务
  八.测试
  1.在测试机上修改DNS服务器地址为10.10.54.150,然后浏览器访问bbs.centos.com测试是否可以访问,然后进行下面步骤
  2.测试web服务器:理论上squid服务器会监视后端的web服务器,如果某一台服务器出现故障之后,squid就会把用户请求代理到另外一台服务器,测试中可以当掉一台web服务器
  3.测试mysql服务器:mysql的MHA架构可以实现故障转移,测试中可以当掉master主机,以查看是否成功切换到slave1上,以及论坛是否可以访问
  

  参考文章:
  http://www.centos.bz/2012/05/squid-reverse-proxy-deploy/
  http://rfyiamcool.blog.运维网.com/1030776/915092
  





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-656114-1-1.html 上篇帖子: LVS+Keepalived+Squid+Nginx高可用负载均衡缓存配置 下篇帖子: 《squid无故自残...》续缘篇之玩转日志!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表