搭建web服務器
一、實驗內容:
實驗要求:
1、完成一個簡單的web服務器,web服務器從mysql里讀取數據進行返回
2、Mysql需要有一個單獨的數據盤,每個mysql虛擬機的磁盤掛載方式需要都不一樣
3、公網ip配置在虛擬機上,三個web服務器用snat訪問公網
4、使用dnat把8080端口映射到公網去,訪問控制台的8080端口需要能夠訪問web server
5、web服務器和mysql服務器需要在不同的子網和vlan里,需要在宿主機上自建一個虛擬路由器
6、msyql和web server都需要使用keepalived和haproxy做負載均衡
7、對物理機做使用iptables做安全策略,只允許22和8080進來,並且禁ping
拓撲圖:
二、實驗思路
剛拿到任務的時候,自己其實是很懵逼的,對於實驗中要求實現的內容,絕大部分在之前的運維工作中並沒有接觸過;
任務分解:
完成一個簡單的web服務器,web服務器從mysql里讀取數據進行返回
分解:前后端分離,包含數據庫和web服務,需要確認使用什么方式實現前后端的聯通;
web主機和mysql主機均為3台,需要使用浮動IP來實現連接;
mysql需要有一個單獨的數據盤,每個mysql虛擬機的磁盤掛載方式需要都不一樣
分解:總共有三台mysql主機,需要使用三種不同的方式來實現掛載;
公網ip配置在虛擬機上,三個web服務器用snat訪問公網
分解:要做實驗就要安裝軟件,既然沒有內網yum源,那么所有6台實驗主機都需要能夠訪問公網,解決軟件包安裝的問題,通過配置iptables規則來實現;
使用dnat把8080端口映射到公網去,訪問控制台的8080端口需要能夠訪問web server
分解:實驗環境的網絡需要隔離,可以通過ip namespace來實現;需要配置兩次DNAT規則(宿主機默認ipns下一次、實驗環境ipns中一次),兩次銜接,實現外部網絡可以通過指定端口訪問web服務器
web服務器和mysql服務器需要在不同的子網和vlan里,需要在宿主機上自建一個虛擬路由器
分解:網絡規划已經做好,不同的vlan可以通過ovs設置tag來實現
msyql和web server都需要使用keepalived和haproxy做負載均衡
分解:web服務使用keepalive和haproxy實現負載均衡比較好實現;
mysql服務使用keepalive和haproxy實現負載均衡要怎樣實現?
對物理機做使用iptables做安全策略,只允許22和8080進來,並且禁ping
分解:iptables放行端口,初步想到兩種方式來實現(設置默認策略為DROP,為22和8080單獨添加規則;不更改默認策略,在放行22和8080端口后添加拒絕所有連接的規則)
iptables設置禁ping規則
完成思路:
實驗的最終結果是完成一個環境的搭建,包含有多台主機;分析實驗內容后發現這個大的任務其實可以被拆分成幾個板塊來完成,一個部分的實現與否對其他部分的影響並不大:
1、虛擬機的搭建和基礎環境配置;
2、網絡拓撲的實現和配置;
3、web集群搭建(http+keepalive+haproxy);
4、mysql集群搭建(galera+keepalive+haproxy);
5、iptables規則配置,實現DNAT、SNAT功能;
6、mysql和http前后端聯通配置;
7、iptables配置策略放行22、8080端口,禁ping;
三、實驗過程
說干就干,參照着完成思路開始:
1、虛擬機的搭建和基礎環境配置
要搭建環境,首先需要有可用的虛擬機環境才行;這里使用的是kvm創建出來的虛擬機,在進行自己的實驗前,有幾點需要注意:
a、查看宿主機相應分區的空間是否足夠,需要創建6台虛擬機,估算一下大致需要的空間,空間不足則需要進行擴容;
b、為這個實驗單獨創建一個項目目錄,存放此次實驗需要用到的所有文件;
c、在新創建的目錄下新建相應的目錄,用於存放虛擬機的各種文件:base存放基礎的qcow2文件,已經裝好系統、sys存放各台虛擬機的qcow2鏡像文件,也即各台虛擬機的實際保存位置、xmlfiles存放的是各台虛擬機創建時使用的xml文件
新建的項目目錄為/home/mission1/,在這目錄下包含三個目錄/home/mission1/{base,sys,xmlfiles}。
-
虛擬機鏡像文件
在/home/mission1/base/目錄下存放centos7_1503.qcow2,這個是已經安裝了CentOS7.1操作系統的磁盤文件;
虛擬機鏡像支持多種類型,包括有raw、qcow2、vmdk、vdi等:
a、raw:未作任何處理的鏡像格式,等同於用dd命令對磁盤做的復制;這種格式的優點是簡單,可以很容易的導出到其他硬件模擬器中去,如果自己的文件系統支持稀疏文件,如linux下的ext2/3、windows的ntfs,那只有寫入的字段會占用空間。
b、qcow2:qemu仿真器支持的鏡像格式,可以動態擴大,支持寫時復制;該格式是最萬能的格式,即使是在不支持稀疏文件的文件系統上,也可以獲得最小空間的鏡像文件,還包含AES加密、zlib壓縮、支持虛擬機快照等。
c、vdi:virtualbox和qemu仿真器支持的磁盤鏡像格式。
d、vmdk:許多hypervisor支持的磁盤鏡像格式。
創建鏡像文件的命令示例如下:
1 # qemu-img create -f qcow2 -o /home/mission1/sys/test.qcow2 10G
我們此處使用的是已經安裝了CentOS7.1操作系統的磁盤鏡像文件,少去安裝操作系統的步驟。
-
虛擬機xml配置文件
在/home/mission1/xmlfiles/目錄下存放有normal-node-define.xml,這個是虛擬機模板的配置文件。
每台安裝完成的虛擬機都有自己的xml文件,保存了這台虛擬機的配置信息,包含有domain名、cpu、內存、磁盤、網絡等;我們也可以通過修改模板xml文件來啟用一台新的VM。
-
虛擬機創建
通過kvm來創建VM有多種方式,以下列舉幾種常用的方式:
a、通過網絡鏡像安裝,支持vnc。
1 # virt-install --name test01 --ram 1024 --vcpus 1 -f /home/mission1/sys/test.qcow2 --os-type linux --os-variant rhel7 --network bridge=br-lwr --graphics vnc,listen=0.0.0.0 --location 'http://mirrors.163.com/centos/7.1.1503/os/x86_64/'
b、通過 iso 鏡像本地安裝,支持 vnc。
1 # virt-install --name test01 --ram 1024 --vcpus 1 -f /home/mission1/sys/test.qcow2 --os-type linux --os-variant rhel7 --network bridge=br-lwr --graphics vnc,listen=0.0.0.0 --cdrom /home/mission1/base/CentOS-7.1.1503.iso
c、編輯模板xml文件,直接通過模板文件生成新VM。
編輯xml文件<略>
1 # virsh define /home/mission1/xmlfile1/test1.xml
我們采用的是第三種方式,有現成的安裝了操作系統的qcow鏡像文件,直接復制編輯模板xml配置文件即可
1 # cp /home/mission1/xmlfiles/{normal-node-define.xml,test.xml} 2 3 # vim /home/mission1/xmlfiles/test.xml 4 5 <name>mark_vm_name</name> <--設置VM名字 6 7 <memory unit='KiB'>mark_vm_mem_in_kb</memory> <--設置VM內存大小 8 9 <currentMemory unit='KiB'>mark_vm_mem_in_kb</currentMemory> 10 <vcpu placement='static'>mark_vm_vcpu_count</vcpu> <--設置CPU個數 11 12 <disk type='file' device='disk'> 13 <driver name='qemu' type='qcow2'/> 14 <source file='mark_vm_sys_disk'/> <--填寫磁盤鏡像文件路徑 15 <backingStore/> 16 <target dev='vda' bus='virtio'/> 17 <alias name='virtio-disk0'/> 18 </disk> 19 20 <interface type='bridge'> 21 <!--需要設置虛擬機綁定的內網網橋--> 22 <source bridge='mark_cluster_bridge'/> <--設置VM網卡所屬bridge 23 <virtualport type='openvswitch'> 24 </virtualport> 25 <model type='virtio'/> 26 </interface>
編輯完成后,直接使用以下命令創建VM:
1 # virsh define /home/mission1/xmlfile1/test1.xml
開啟VM:
1 # virsh start domain-name
查看VM的vnc連接口:
1 # virsh vncdisplay domain-name
使用vnc客戶端連接,在VNC Server框中輸入:<宿主機IP>:<連接口>
通過vnc客戶端進入VM,完成基礎配置(配置IP地址、關閉selinux、關閉iptables、設置時間同步、配置主機名等);同樣的方式創建並配置其他5台虛擬機。
至此,VMs創建及配置完成。
2、網絡拓撲的實現和配置
對於網絡架構的實現,剛開始的切入點是直接從實驗任務中給出的圖考慮的;要完成實驗,有幾個前提是確認的:
a、要有自己對外的網橋,用openvswitch來實現(設置VM網卡所需bridge需要填寫);
b、實驗網絡需要與宿主機網絡隔離,使用ip namespace實現;
c、需要給各台實驗虛擬機網絡配置vlan,使用openvswitch實現;
d、實現虛擬機需要聯通外部網絡,用於軟件安裝和后期功能實現,需要配置路由和iptables規則;
實現過程中有過的疑惑和問題:
1)聯通ip namespace內部ip和外網,用什么方式實現?
2)網橋上新建的網卡類型,為什么要設置成type=internal?
3)為什么在ip namespace中給各台虛擬機連接的網口設置了vlan,不同vlan的IP地址還是能夠ping通?
4)對各個組件的功能的搭配存在困惑,仍然比較迷糊,veth pair是否能在這個場景下發揮作用?
問題先不說怎么解決的,先來解決現有的需求。
-
網橋創建
在宿主機上執行以下命令,創建一個自己的網橋:
1 # ovs-vsctl add-br br-lwr
查看生成的網橋,網橋創建成功:
1 # ovs-vsctl show 2 Bridge br-lwr 3 Port br-lwr 4 Interface br-lwr 5 type: internal
-
ip namspace創建
在宿主機上執行以下命令,創建一個自己的ip namespace:
1 # ip netns add lwr-ns
-
聯通ip namespace中網絡和公網
在網橋上新建兩個internal類型的網口
1 # ovs-vsctl add-port br-lwr web-nw tag=20 -- set Interface web-nw type=interval 2 # ovs-vsctl add-port br-lwr myql-nw tag=30 -- set Interface mysql-nw type=interval
將在網橋上新建的兩個網卡增加到新建的ip namespace中
1 # ip link set mysql-nw netns lwr-ns 2 # ip link set web-nw netns lwr-ns
為兩個新加入ip namespace中的網卡配置IP地址
1 # ip netns exec lwr-ns ip addr add 192.168.0.1/24 dev mysql-nw 2 # ip netns exec lwr-ns ip addr add 172.16.0.1/24 dev web-nw 3 # ip netns exec lwr-ns ip link set web-nw up 4 # ip netns exec lwr-ns ip link set mysql-nw up 5 # ip netns exec lwr-ns ip link set lo up
新增了ip namespace后,命名空間隔離了網絡,內部的主機無法聯通外網,需要再進行配置。
再br-lwr上新增一個網口,增加完成后加入到lwr-ns中去,在ip namespace中為該網口配置一個IP地址192.168.100.2

1 # ovs-vsctl add-port br-lwr con-wm -- set Interface con-wm type=internal 2 # ip link set con-wm netns lwr-ns 3 # ip netns exec lwr-ns ifconfig con-wm 192.168.100.2/24 4 # ip netns exec lwr-ns ip link set con-wm up
為br-lwr配置一個IP地址,用於聯通ip namespace和宿主機網絡
1 # ifconfig br-lwr 192.168.100.1 netmask 255.255.255.0 up
此時在ip namespace仍然無法ping通外網,需要在宿主機上配置一條iptables規則

1 # iptables -t nat -A POSTROUTING -s 192.168.100.0/24 ! -d 192.168.100.0/24 -j MASQUERADE
設置默認路由規則,用於ip namespace聯通外網

1 # ip netns exec lwr-ns ip route add default via 192.168.100.1
-
為各台虛擬機網絡配置vlan
在創建虛擬機的時候,xml文件中已經設定了網口是連接到哪個網橋上的;
當虛擬機創建成功后,相應的網橋上會有網口出現,數量對應這台虛擬xml文件中的配置數目;
設置vlan就是通過openvswitch對相應的網口打上tag,在進行這步操作前,我們需要先確認各台虛擬機網口的的名字,再對相應的網口打上tag

1 # virsh dumpxml <domain-name> | grep vnet 2 <target dev='vnet18'/> 3 # ovs-vsctl set port vnet18 tag=20
對其他五台虛擬機進行同樣的操作,配置前需要確認清楚各台虛擬機的vlan及網卡名
-
配置虛擬機聯通外網
虛擬機的網絡配置已在前面完成,接下來要安裝軟件,但此時仍無法聯通外網;我們需要在ip namespace中配置相應的iptables規則,使其能夠訪問外部網絡

1 # iptables -t nat -A POSTROUTING -s 192.168.200.0/24 ! -d 192.168.200.0/24 -j MASQUERADE 2 # iptables -t nat -A POSTROUTING -s 172.16.200.0/24 ! -d 172.16.200.0/24 -j MASQUERADE
執行上兩步的操作目的為配置轉發,來自192.168.200.0和172.16.200.0網段的請求通過SNAT聯通到ip namespace中;
進入ip namespace后,通過默認路由轉到宿主機,宿主機再通過SNAT將請求發送出去,聯通外部網絡。
至此,網絡配置基本完成。
3、web集群搭建(http+keepalive+haproxy)
web集群搭建相對簡單,采取的方式為http+keepalive+haproxy的方式實現,在三台IP地址為172.16.0.0網段的虛擬機安裝http、haproxy、keepalive

1 # yum install haproxy keepalived httpd 2 Loaded plugins: fastestmirror 3 Loading mirror speeds from cached hostfile 4 * base: mirrors.163.com 5 * epel: mirror01.idc.hinet.net 6 * extras: mirrors.163.com 7 * updates: centos.ustc.edu.cn 8 Package haproxy-1.5.18-7.el7.x86_64 already installed and latest version 9 Package keepalived-1.3.5-6.el7.x86_64 already installed and latest version 10 Package httpd-2.4.6-80.el7.centos.1.x86_64 already installed and latest version 11 Nothing to do
軟件安裝完成后,分別進行配置,以一台虛擬機為例,分別配置三個軟件:
a、配置keepalived服務,備份配置文件后,修改相應配置內容,啟用服務並設定開機自啟
主節點配置文件內容如下:(注意:在其他兩個web節點中需要將vrrp_instance ha1段state更改為BACKUP,priority值設置小於100)

1 global_defs { 2 notification_email { 3 root@localhost # 告警郵件接收地址 4 } 5 notification_email_from keepalived@localhost 6 smtp_server 127.0.0.1 # smtp服務器地址 7 smtp_connect_timeout 30 # 連接smtp服務器超時時間 8 router_id web01 # 每一個節點的router_id都是唯一的,不可以重復 9 vrrp_script haproxy{ 10 script "kiall -0 haproxy" 11 weight -25 12 } 13 } 14 vrrp_instance ha1 { 15 state MASTER # 角色為MASTER 16 interface eth0 # 指定haproxy檢查網絡的接口 17 virtual_router_id 51 # 虛擬路由的ID,在所有的keepalived節點必須保持一致 18 priority 100 # 優先級 19 advert_int 1 # 心跳檢查的時間間隔 20 authentication { 21 auth_type PASS # 指定keepalived節點之間的驗證方式為密碼驗證 22 auth_pass linux # keepalived節點的認證密碼 23 } 24 virtual_ipaddress { 25 172.16.0.5/24 dev eth0 # vip地址 26 } 27 track_script{ 28 haproxy # 調用haproxy檢查腳本 29 } 30 }
在修改配置文件前,先備份原配置文件;啟用服務並設置開機自啟:

1 # cp /etc/keepalived/keepalived.conf{,.bak20180708} 2 <!修改配置文件內容> 3 # systemctl start keepalived && systemctl enable keepalived
b、配置haproxy服務,備份配置文件后,修改相應配置內容,啟用服務並設置開機自啟
節點配置文件內容如下:

1 global # 全局配置 2 log 127.0.0.1 local3 info # 把發送到日志設備local3的info級別的日志記錄在本地 3 chroot /var/lib/haproxy # 綁定haproxy的工作路徑 4 pidfile /var/run/haproxy.pid # pid文件路徑 5 maxconn 4000 # 最大連接數 6 user haproxy # 運行進程的用戶 7 group haproxy # 運行進程的用戶組 8 daemon # 以后台方式運行 9 stats socket /var/lib/haproxy/stats # haproxy動態維護的套接字文件,下面會通過一個小實驗看這個玩意的作用 10 defaults # 除非有具體定義,否則default選項會加入到后面 選項,不適用的就不會被定義 11 mode http # 默認的模式 12 log global # 引用全局的日志配置 13 option httplog # 啟用日志記錄http請求,haproxy默認不記錄http請求日志 14 option dontlognull # 日志中不記錄健康檢查的連接 15 option http-server-close # 對於某些server端不支持http長連接的情況,利用這個參數可以使用客戶端到haproxy是長連接,而haproxy到server端是短連接 16 option forwardfor except 127.0.0.0/8 # 允許服務器記錄發起請求的真實客戶端的IP地址 17 option redispatch 18 retries 3 # 連接真實服務器的失敗重連次數,超過這個值后會將對應正式服務器標記為不可用 19 timeout http-request 10s # http請求超時時間 20 timeout queue 1m # 請求在隊列中的超時時間 21 timeout connect 10s # 連接超時 22 timeout client 1m # 客戶端連接超時 23 timeout server 1m # 服務端連接超時 24 timeout http-keep-alive 10s # http-keep-alive超時時間 25 timeout check 10s # 檢測超時時間 26 maxconn 3000 # 每個進程最大的連接數 27 frontend www # 定義前端 28 bind *:80 # 綁定客戶端訪問的是哪個IP的80端口 29 mode http # 指定模式為http 30 option httplog # 記錄http請求的日志 31 log global # 應用全局的日志配置 32 stats uri /haproxy?stats # haproxy自帶的監控頁面 33 default_backend web # 指定默認的后端 34 backend web # 定義后端 35 mode http # 模式為http 36 option redispatch 37 balance roundrobin # 負載均衡算法指定為輪詢 38 option httpchk GET /index.html # 檢測后端真實服務器的方法 39 server web01 172.16.0.2:8080 cookie web01 weight 1 check inter 2000 rise 2 fall 3 40 server web02 172.16.0.3:8080 cookie web02 weight 1 check inter 2000 rise 2 fall 3 41 server web03 172.16.0.4:8080 cookie web03 weight 1 check inter 2000 rise 2 fall 3
在修改配置文件前,先備份原配置文件;啟用服務並設置開機自啟:

1 # cp /etc/haproxy/haproxy.cfg{,.bak20180708} 2 <!更改配置文件內容> 3 # systemctl start haproxy && systemctl enable haproxy
c、配置httpd服務,需要更改監聽端口配置;結合后面需要連接數據庫,需要使用腳本連接數據庫,需要開放cgi-bin配置
更改配置文件前,備份原始配置文件;更改監聽端口,放開cgi-bin配置內容

1 # cp /etc/httpd/conf/httpd.conf{,.bak20180708} 2 <!更改配置文件內容> 3 # cat /etc/httpd/conf/httpd.conf | egrep -v '#|^$' 4 ... 5 Listen 8080 6 ... 7 <IfModule alias_module> 8 ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" 9 </IfModule> 10 LoadModule cgid_module modules/mod_cgid.so 11 <Directory "/var/www/cgi-bin"> 12 Options +ExecCGI 13 </Directory> 14 AddHandler cgi-script .cgi .py .sh 15 ... 16 ## 確保配置文件中包含以上內容
啟用服務並設置開機自啟:

1 # systemctl start httpd && systemctl enable httpd
至此,web集群配置基本完成。
4、mysql集群搭建(galera+keepalive+haproxy)
mysql集群配置最終確認方案為采用glaera集群+keepalived+haproxy:
software | mysql01(192.168.0.2) | mysql02(192.168.0.3) | mysql03(192.168.0.4) |
CentOS 7.1.1503 | mysql01 | mysql02 | mysql03 |
MariaDB Galera cluster | mysql01 | mysql02 | mysql03 |
Keepalived(192.168.64.100) | mysql01 | mysql02 | mysql03 |
haproxy | mysql01 | mysql02 | mysql03 |
a、配置galera集群
配置yum源
----------------------------------------------------------
待續...