实现WEB上线并实现负载均衡+域名解析
项目介绍
在linux平台上模拟企业级的应用部署环境,创建FTP,DNS,WEB,Mail等服务器,实现WEB服务器的负载均衡,整体架构的分析以及搭建的详细过程。
(1)DNS服务器用来给用户提供域名与IP的解析功能,使用户能够直接经过域名来访问服务器。
(2)Mail服务器用来实现邮件的收发等功能。
(3)Web服务器来提供网站服务,网站的服务器独立,存储用SAN来搭建,更好的控制了数据的维护、备份等功能。
(4)Web的负载均衡用lvs来实现,使两台服务器能够同时对外提供服务,减小了服务器的压力,也能够防止其中一台出现故障的时候致使的web服务不可用问题。
(5)FTP给用户提供文件的下载,以及上传等功能,使用户能够匿名登陆、上传、下载,也能够充当服务器的yum源。
php
项目流程图
项目实际操做
记得要关掉防火墙和SELINUXhtml
FTP协议
FTP协议的定义:
FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,用户可使用FTP客户端经过FTP协议访问位于FTP服务器上的资源。在开发网站的时候,一般利用FTP协议把网页或程序传到Web服务器上。此外,因为FTP传输效率很是高,在网络上传输大的文件时,通常也采用该协议。
默认状况下FTP协议使用TCP端口中的 20和21这两个端口,其中20用于传输数据,21用于传输控制信息。可是,是否使用20做为传输数据的端口与FTP使用的传输模式有关,若是采用主动模式,那么数据传输端口就是20;若是采用被动模式,则具体最终使用哪一个端口要服务器端和客户端协商决定。
java
FTP的主要特征:
1.控制链接是创建在客户协议解释器和服务器协议解释器之间用于交换命令与应答的通讯链路。
mysql
2.数据链接是传输数据的全双工链接。传输数据能够发生在服务器数据传输过程DTP和客户DTP之间,也能够发生在两个服务器的DTP之间。linux
链接模式 | 简介 |
---|---|
控制链接 | 控制链接为ftp交互最主要的链接。从客户端登陆到ftp服务器开始,到登出服务器的整个生命周期里面是始终存在的一条链接。规律来看,服务器和客户端都是一应一答的消息模式,这是单纯的控制。直到链接被断开,ftp客户端和ftp服务器的交互结束。 |
数据链接 | ftp数据链接有多种模式,其中最多见的模式有两种,一种是主动模式,另一种是被动模式。 |
主动模式 | 在控制链接须要发送数据的时候,ftp客户端会告诉ftp服务器将数据发送到地址和端口信息,以后而后ftp服务器会用自身的20端口将数据发送到ftp客户端,发送完成后,此条数据链接销毁,控制链接会响应一条发送完成的消息给ftp客户端。 |
被动模式 | 上图抓包就是采用了被动模式来发送数据的,从抓包看,ftp客户端发送给ftp服务器一条pasv的信令,ftp服务器响应了227,后面跟随着ip和端口信息,ftp客户端解析这些信息,并链接到指定的ip和端口,接收或者发送数据,进行相应的业务处理。 |
断点续传功能
简单说下断点续传功能,断点续传功能其实就是在发送的过程当中,记录下发送的进度,当出现包括网络中断等发送出错的状况下,断开链接。等下次网络好的状况下,继续发送剩余文件的过程。
对于ftp的断点续传上传的功能实现,FTP协议中提供了一条APPE的控制命令用来追加文件,咱们所实现的断点续传的命令就是围绕着这个命令进行的。
nginx
- 在正常上传的过程当中,记录下已经发送的文件的长度
- 当网络发送异常时,记录当前发送文件长度,并关闭当前ftp链接,结束ftp的发送过程
- 当网络正常后,从新开始创建ftp的链接,此时由上传文件改成APPE命令,并在数据链接上发送剩余的数据到ftp服务器。
先安装FTP
注意这里要建立一个普通用户并设置密码,一般来说咱们root用户是个运维人员操做的,防止程序员和访客误操做!!程序员
yum -y install vsftpd systemctl start vsftpd vim /etc/vsftpd/vsftpd.conf anon_mkdir_write_enable=YES #容许匿名登入者有新增目录的权限(33行修改) anon_other_write_enable=YES #容许匿名登入者更多于上传或者创建目录以外的权限(34行修改) max_clients=100 #最大用户在线数量(130行,也就是最后一行) max_per_ip=2 #每ip最大线程(131行,也就是最后一行) anon_max_rate=30000 #匿名用户最大传输速度(132行,也就是最后一行) local_max_rate=50000 #本地用户最大传输速度(133行,也就是最后一行) chmod -R 777 /var/ftp/pub/ #受权 systemctl restart vsftpd
docker介绍
1.docker定义:
Docker 是一个开源的应用容器引擎,让开发者能够打包他们的应用以及依赖包到一个可移植的镜像中,而后发布到任何流行的 Linux或Windows 机器上,也能够实现虚拟化。容器是彻底使用沙箱机制,相互之间不会有任何接口。
2.docker运行模式:
docker仅须要自身的应用和依赖库,直接运行在宿主主机上,不须要宿主主机提供虚拟的物理资源。且更加的轻量,一个小的镜像仅须要小几百MB。中间Docker引擎是否有点像java的虚拟机,docker镜像也支持跨平台,同一个镜像直接能够在Linux、Windows、mac宿主主机上运行。
3.docker优点:
主机资源利用率高(直接运行在宿主机内核,不须要硬件虚拟化)
启动时间快(docker秒级比虚拟机快太多,虚拟机自身加载操做系统)
运行环境一致性(将应用同依赖环境打包成一个镜像,避免多处部署不一致)
部署简单(做为开发人员,学一个新东西就要去搭一个环境,而官方提供了不少镜像能够直接使用,很是方便)
4.docker网络模式:
web
网络模式 | 简介 |
---|---|
Host | 至关于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。众所周知,Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其余的Network Namespace隔离。一个Docker容器通常会分配一个独立的Network Namespace。但若是启动容器的时候使用host模式,那么这个容器将不会得到一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出本身的网卡,配置本身的IP等,而是使用宿主机的IP和端口 |
Bridge | 在理解了host模式后,这个模式也就好理解了。这个模式指定新建立的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新建立的容器不会建立本身的网卡,配置本身的IP,而是和一个指定的容器共享IP、端口范围等。一样,两个容器除了网络方面,其余的如文件系统、进程列表等仍是隔离的。两个容器的进程能够经过lo网卡设备通讯。 |
None | 该模式将容器放置在它本身的网络栈中,可是并不进行任何配置。实际上,该模式关闭了容器的网络功能,在如下两种状况下是有用的:容器并不须要网络(例如只须要写磁盘卷的批处理任务)。overlay在docker1.7代码进行了重构,单独把网络部分独立出来编写,因此在docker1.8新加入的一个overlay网络模式。Docker对于网络访问的控制也是在逐渐完善的。 |
Container | 至关于Vmware中的Nat模式,容器使用独立network Namespace,并链接到docker0虚拟网卡(默认模式)。经过docker0网桥以及Iptables nat表配置与宿主机通讯;bridge模式是Docker默认的网络设置,此模式会为每个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器链接到一个虚拟网桥上。 |
自定义网络 | 略 |
安装docker-ce构建lnmp
这里我使用的是离线安装,也能够导入阿里或清华的docker源。sql
tar xzf docker-19.03.9.tgz cp docker/* /usr/bin/ cp docker.service /etc/systemd/system systemctl start docker systemctl stop firewalld #为防止遗漏,这里在关一遍 setenforce 0 #为防止遗漏,这里在关一遍 cp daemon.json /etc/docker systemctl restart docker mkdir /lnmp #建立咱们更好的整理 ls nginx.conf #这是咱们以前源码安装时提取的配置文件 vim Dockerfile #构建镜像 FROM centos:7 ADD nginx-1.12.2.tar.gz /root/ RUN yum -y install gcc pcre-devel zlib-devel make php php-mysql php-fpm php-gd \ && cd /root/nginx-1.12.2 \ && ./configure \ && make \ && make install \ && yum clean all \ && echo "<?php phpinfo();?>" > /usr/local/nginx/html/index.php COPY start_lnmp.sh /usr/local/sbin/ COPY nginx.conf /usr/local/nginx/conf/nginx.conf CMD ["start_lnmp.sh"] vim start_lnmp.sh #开启的配置文件 #!/bin/bash /usr/local/nginx/sbin/nginx exec php-fpm -F chmod +x start_lnmp.sh #给文件受权 docker build -t lnmp:1.1 ./ #构建镜像 docker imgaes #查看是否构建镜像 docker run --name lnmp -d -p 80:80 -v /opt/html:/usr/local/nginx/html lnmp:1.1 #开启并建立lnmp容器 ls mysql5.7_utf8.tar.gz #上传的以前构建好的mysql镜像 tar xzf mysql5.7_utf8.tar.gz #这一步必须解压,才能上传 docker load -i mysql5.7_utf8.tar #上传镜像 docker images #查看镜像 docker run --name mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123 -e MYSQL_DATABASE=lnmp -e MYSQL_USER=zrj -e MYSQL_PASSWORD=123 mysql:5.7 #开启并建立mysql容器 docker ps #查看容器 cd /opt/html/ #这是咱们挂在的路径 ls /opt/html/Discuz_X3.4_SC_UTF8【20191201】.zip #上传的论坛 yum -y install unzip unzip Discuz_X3.4_SC_UTF8【20191201】.zip(210服务器) ls /opt/html/tinyshopV2.5_data.zip #上床的电商 unzip tinyshopV2.5_data.zip(211服务器) chmod -R 777 /opt/html/upload/ #受权
咱们代码布置好后进行测试。
docker
LVS负载均衡
LVS的定义:
负载均衡集群是 Load Balance 集群。是一种将网络上的访问流量分布于各个节点,以下降服务器压力,更好的向客户端提供服务的一种方式。经常使用开源负载均衡软件有Nginx、LVS、Haproxy(ngnix和haproxy是七层负载均衡,LVS是四层负载均衡);商业的硬件负载均衡设备F五、Netscale。
四层就是基于IP和端口的负载均衡,七层就是基于URL等应用信息的负载均衡。因此简单的说四层负载均衡就是经过IP和端口接收请求再分发至真实的服务器,七层是经过URL或主机名接收请求,而后分发至真实的服务器。
建立一个vip实现负载均衡
lvs实现原理:
(1)首先,客户端向调度器(Director Server)发起一个请求,调度器将这个请求发送至内核
(2)PREROUTING链首先会接收到用户请求,判断目标IP肯定是本机IP,将数据包发往INPUT链。
(3)当请求达到INPUT链上,调度器判断报文中的目标端口来肯定这个访问是否是要访问集群服务(由于还有可能只是ssh想单纯的远程登陆主机这个主机),若是是访问的集群服务,那么就会强制修改这个包的目标IP
(4)POSTROUTING连接收数据包后发现目标IP地址恰好是本身的后端服务器,那么此时经过选路,将数据包最终发送给后端的服务器
lvs负载均衡DR模式 部署
#DR模式(服务器那台机器) yum -y install ipvsadm ifconfig ens33:0 192.168.182.100 broadcast 192.168.182.100 netmask 255.255.255.255 up route add -host 192.168.182.100 dev ens33:0 ipvsadm -C ipvsadm -A -t 192.168.182.100:80 -s rr ipvsadm -a -t 192.168.182.100:80 -r 192.168.182.210:80 -g ipvsadm -a -t 192.168.182.100:80 -r 192.168.182.211:80 -g
#RS模式(web那台机器) ifconfig lo:0 192.168.182.100 broadcast 192.168.182.100 netmask 255.255.255.255 up route add -host 192.168.182.100 dev lo:0 systemctl stop firewalld setenforce 0 echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce sysctl -p
DNS域名解析
域名解析的定义:
域名解析是把域名指向网站空间IP,让人们经过注册的域名能够方便地访问到网站的一种服务。IP地址是网络上标识站点的数字地址,为了方便记忆,采用域名来代替IP地址标识站点地址。域名解析就是域名到IP地址的转换过程。域名的解析工做由DNS服务器完成。
域名解析也叫域名指向、服务器设置、域名配置以及反向IP登记等等。说得简单点就是将好记的域名解析成IP,服务由DNS服务器完成,是把域名解析到一个IP地址,而后在此IP地址的主机上将一个子目录与域名绑定。
域名到IP地址的解析过程的要点以下:
- 当某一个应用须要把主机名解析为IP地址时,该应用进程就调用解析程序,并称为DNS的一个客户,把待解析的域名放在DNS请求报文中,以UDP用户数据报方式发给本地域名服务器。
- 本地域名服务器在查找域名后,把对应的IP地址放在回答报文中返回。应用程序得到目的主机的IP地址后便可进行通讯。
- 若本地域名服务器不能回答该请求,则此域名服务器就暂时称为DNS的另外一个客户,并向其余域名服务器发出查询请求。
DNS域名解析 实操
这里我解析的是VIP因此ip是192.168.182.100
yum -y install bind bind-chroot bind-utils vim /etc/named.conf listen-on port 53 { any; };(13行,ip修改成any) llow-query { any; };(21行,ip修改成any) vim /etc/named.rfc1912.zones zone "wg.com" IN { type master; file "wg.com.zone"; allow-update { none; }; }; cp -p /var/named/named.localhost /var/named/wg.com.zone vim wg.com.zone $TTL 1D @ IN SOA @ admin.wg.com. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS @ A 127.0.0.1 AAAA ::1 www IN A 192.168.182.100 vim /etc/resolv.conf nameserver 192.168.182.100(第2行) systemctl restart named nslookup www.wg.com(测试工具) dig www.wg.com(测试工具)
注意:这里咱们实际上是实现DNS解析为何是不出界面,缘由是咱们在内网搭建的,用本身的虚拟机浏览器(CentOS7)访问是没有问题,可是用真实机器(Windows)访问是访问不到的,这块其实没有问题的不要疑问本身!!!。
Mail邮件报警
vim /etc/mail.rc set from=**本身QQ号**@qq.com(最后一行本身添加的) set smtp=smtp.qq.com set smtp-auth-user=**本身QQ号** set smtp-auth-password=uyrvrioansrxdhhc(这是邮箱密码) set smtp-auth=login #这里我用到的是VIP掉的状况下咱们进行报警 vim mail.sh #!/bin/bash a=`ifconfig | grep -w "ens33:0" | awk '{print $2}' | wc -l` if [ $a -ne 0 ];then echo "你的lvs正常,vip没有掉" else echo "你的VIP发生故障,请及时处理,检查本身的LVS负载均衡。" | mail -s "警告" **本身QQ号**@qq.com fi