實現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