常用軟體和服務(nginx、lvs、keepalived、iptables)
一、高可用web框架
- 1.1nginx
- 1.1.1nginx簡介
Nginx是一個自由、開源、高效能及輕量級的HTTP伺服器及反轉代理伺服器。Nginx以其高效能、穩定、功能豐富、配置簡單及佔用系統資源少而著稱。
Nginx 超越 Apache 的高效能和穩定性,使得國內使用 Nginx 作為 Web 伺服器的網站也越來越多.
- 1.1.2基礎功能
反向代理加速,簡單的負載均衡和容錯;
- 1.1.3優勢
1、Nginx專為效能優化而開發,效能是其最重要的考量, 實現上非常注重效率 。有報告表明能支援高達 50,000 個併發連線數。
2、Nginx具有很高的穩定性。其它HTTP伺服器,當遇到訪問的峰值,或者有人惡意發起慢速連線時,也很可能會導致伺服器實體記憶體耗盡頻繁交換,失去響應,只能重啟伺服器。
例如當前apache一旦上到200個以上程序,web響應速度就明顯非常緩慢了。而Nginx採取了分階段資源分配技術,使得它的CPU與記憶體佔用率非常低。
3、nginx官方表示保持10,000個沒有活動的連線,它只佔2.5M記憶體,就穩定性而言, nginx比其他代理伺服器更勝一籌。
4、Nginx支援熱部署。它的啟動特別容易, 並且幾乎可以做到7*24不間斷執行,即使執行數個月也不需要重新啟動。你還能夠在不間斷服務的情況下,對軟體版本進行進行升級。
5、Nginx採用C進行編寫, 不論是系統資源開銷還是CPU使用效率都高很多。
- 1.1.4安裝
見下文
- 1.2keepalived
- 1.2.1簡介
Keepalived的作用是檢測web伺服器的狀態,如果有一臺web伺服器宕機,或工作出現故障,Keepalived將檢測到,並將有故障的web伺服器從系統中剔除,當web伺服器工作正常後Keepalived自動將web伺服器加入到伺服器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的web伺服器。
主要用作RealServer的健康狀態檢查以及LoadBalance主機和BackUP主機之間failover的實現。
- 1.3lvs
- 1.3.1LVS是什麼
1)LVS的英文全稱是Linux Virtual Server,即Linux虛擬伺服器。
2)它是我們國家的章文嵩博士的一個開源專案。
- 1.3.2LVS能幹什麼
- LVS主要用於多伺服器的負載均衡。
- 它工作在網路層,可以實現高效能,高可用的伺服器叢集技術。
- 它可把許多低效能的伺服器組合在一起形成一個超級伺服器。
- 它配置非常簡單,且有多種負載均衡的方法。
- 它穩定可靠,即使在叢集的伺服器中某臺伺服器無法正常工作,也不影響整體效果。
- 可擴充套件性也非常好。
- 1.3.3nginx和lvs作對比的結果:
1、nginx工作在網路的應用層,主要做反向代理;lvs工作在網路層,主要做負載均衡。nginx也同樣能承受很高負載且穩定,但負載度和穩定度不及lvs。
2、nginx對網路的依賴較小,lvs就比較依賴於網路環境。
3、在使用上,一般最前端所採取的策略應是lvs。 nginx可作為lvs節點機器使用。
- 1.3.4負載均衡機制
前面我們說了LVS是工作在網路層。相對於其它負載均衡的解決辦法,它的效率是非常高的。LVS的通過控制IP來實現負載均衡。IPVS是其具體的實現模組。IPVS的主要作用:安裝在Director Server上面,在Director Server虛擬一個對外訪問的IP(VIP)。使用者訪問VIP,到達Director Server,Director Server根據一定的規則選擇一個Real Server,處理完成後然後返回給客戶端資料。這些步驟產生了一些具體的問題,比如如何選擇具體的Real Server,Real Server如果返回給客戶端資料等等。IPVS為此有三種機制:
- 1)VS/NAT(Virtual Server via Network Address Translation),即網路地址翻轉技術實現虛擬伺服器。
當請求來到時,Diretor server上處理的程式將資料報文中的目標地址(即虛擬IP地址)改成具體的某臺Real Server,埠也改成Real Server的埠,然後把報文發給Real Server。Real Server處理完資料後,需要返回給Diretor Server,然後Diretor server將資料包中的源地址和源埠改成VIP的地址和埠,最後把資料傳送出去。由此可以看出,使用者的請求和返回都要經過Diretor Server,如果資料過多,Diretor Server肯定會不堪重負。
- 2)VS/TUN(Virtual Server via IP Tunneling),即IP隧道技術實現虛擬伺服器。
IP隧道(IP tunneling)是將一個IP報文封裝在另一個IP報文的技術,這可以使得目標為一個IP地址的資料報文能被封裝和轉發到另一個IP地址。IP隧道技術亦稱為IP封裝技術(IP encapsulation)。它跟VS/NAT基本一樣,但是Real server是直接返回資料給客戶端,不需要經過Diretor server,這大大降低了Diretor server的壓力。
- 3)VS/DR(Virtual Server via Direct Routing),即用直接路由技術實現虛擬伺服器。
跟前面兩種方式,它的報文轉發方法有所不同,VS/DR通過改寫請求報文的MAC地址,將請求傳送到Real Server,而Real Server將響應直接返回給客戶,免去了VS/TUN中的IP隧道開銷。這種方式是三種負載排程機制中效能最高最好的,但是必須要求Director Server與Real Server都有一塊網絡卡連在同一物理網段上。
- 二、nginx和keepalived教程、lvs安裝
- 2.1Nginx相關概念
- 反向代理
反向代理(Reverse Proxy)方式是指以代理伺服器來接受internet上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給internet上請求連線的客戶端,此時代理伺服器對外就表現為一個伺服器。
- 負載均衡
負載均衡,英文名稱為Load Balance,是指建立在現有網路結構之上,並提供了一種廉價有效透明的方法擴充套件網路裝置和伺服器的頻寬、增加吞吐量、加強網路資料處理能力、提高網路的靈活性和可用性。其原理就是資料流量分攤到多個伺服器上執行,減輕每臺伺服器的壓力,多臺伺服器共同完成工作任務,從而提高了資料的吞吐量。
- 2.2Nginx的安裝
- 下載nginx
- 上傳並解壓nginx
tar -zxvf nginx-1.8.1.tar.gz -C /usr/local/src
- 編譯nginx
#進入到nginx原始碼目錄
cd /usr/local/src/nginx-1.8.1
#檢查安裝環境,並指定將來要安裝的路徑
./configure --prefix=/usr/local/nginx
#缺包報錯 ./configure: error: C compiler cc is not found
#使用YUM安裝缺少的包
yum -y install gcc pcre-devel openssl openssl-devel
#編譯安裝
make && make install
安裝完後測試是否正常:
/usr/loca/nginx/sbin/nginx
檢視埠是否有ngnix程序監聽
netstat -ntlp | grep 80
- 2.3配置nginx
- 2.3.1配置反向代理
- a修改nginx配置檔案
server { listen 80; server_name nginx-01.itcast.cn; #nginx所在伺服器的主機名 #反向代理的配置 location / { #攔截所有請求 root html; proxy_pass http://192.168.0.21:8080; #這裡是代理走向的目標伺服器:tomcat } } |
- b啟動tomcat-01上的tomcat
- c啟動nginx-01上的nginx
./nginx
重啟:
kill -HUP `cat /usr/local/nginx/logs/nginx.pid `
參考網址:http://www.cnblogs.com/jianxie/p/3990377.html
- 2.3.2動靜分離
#動態資源 index.jsp
location ~ .*\.(jsp|do|action)$ {
proxy_pass http://tomcat-01.itcast.cn:8080; } |
#靜態資源
location ~ .*\.(html|js|css|gif|jpg|jpeg|png)$ { expires 3d; } |
- 2.3.3負載均衡
在http這個節下面配置一個叫upstream的,後面的名字可以隨意取,但是要和location下的proxy_pass http://後的保持一致。
http { 是在http裡面的, 已有http, 不是在server裡,在server外面 upstream tomcats { server shizhan02:8080 weight=1;#weight表示多少個 server shizhan03:8080 weight=1; server shizhan04:8080 weight=1; } #解除安裝server裡 location ~ .*\.(jsp|do|action) { proxy_pass http://tomcats; #tomcats是後面的tomcat伺服器組的邏輯組號 } } |
- 2.4利用keepalived實現高可靠(HA)
- 2.4.1高可靠概念
HA(High Available), 高可用性叢集,是保證業務連續性的有效解決方案,一般有兩個或兩個以上的節點,且分為活動節點及備用節點。
- 2.4.2高可靠軟體keepalived
keepalive是一款可以實現高可靠的軟體,通常部署在2臺伺服器上,分為一主一備。Keepalived可以對本機上的程序進行檢測,一旦Master檢測出某個程序出現問題,將自己切換成Backup狀態,然後通知另外一個節點切換成Master狀態。
- 2.4.3keepalived安裝
下載keepalived官網:http://keepalived.org
將keepalived解壓到/usr/local/src目錄下
tar -zxvf keepalived-1.2.19.tar.gz -C /usr/local/src
進入到/usr/local/src/keepalived-1.2.19目錄
cd /usr/local/src/keepalived-1.2.19
開始configure
./configure --prefix=/usr/local/keepalived
#編譯並安裝
make && make install
- 2.4.4將keepalived新增到系統服務中
拷貝執行檔案
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
將init.d檔案拷貝到etc下,加入開機啟動項
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/keepalived
將keepalived檔案拷貝到etc下
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
建立keepalived資料夾
mkdir -p /etc/keepalived
將keepalived配置檔案拷貝到etc下
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
新增可執行許可權
chmod +x /etc/init.d/keepalived
##以上所有命令一次性執行:
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/keepalived cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ mkdir -p /etc/keepalived cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf chmod +x /etc/init.d/keepalived chkconfig --add keepalived chkconfig keepalived on |
新增keepalived到開機啟動
chkconfig --add keepalived
chkconfig keepalived on
- 2.4.5配置keepalived虛擬IP
修改配置檔案: /etc/keepalived/keepalived.conf
#MASTER節點
global_defs { } vrrp_instance VI_1 { state MASTER #指定A節點為主節點 備用節點上設定為BACKUP即可 interface eth0 #繫結虛擬IP的網路介面 virtual_router_id 51 #VRRP組名,兩個節點的設定必須一樣,以指明各個節點屬於同一VRRP組 priority 100 #主節點的優先順序(1-254之間),備用節點必須比主節點優先順序低 advert_int 1 #組播資訊傳送間隔,兩個節點設定必須一樣 authentication { #設定驗證資訊,兩個節點必須一致 auth_type PASS auth_pass 1111 } virtual_ipaddress { #指定虛擬IP, 兩個節點設定必須一樣 192.168.33.60/24 #如果兩個nginx的ip分別是192.168.33.61,,...62,則此處的虛擬ip跟它倆同一個網段即可 } } |
#BACKUP節點
global_defs { } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.33.60/24 } } |
#分別啟動兩臺機器上的keepalived
service keepalived start
測試:
殺掉master上的keepalived程序,你會發現,在slave機器上的eth0網絡卡多了一個ip地址
檢視ip地址的命令: ip addr
- 2.4.6配置keepalived心跳檢查
原理:
Keepalived並不跟nginx耦合,它倆完全不是一家人
但是keepalived提供一個機制:讓使用者自定義一個shell指令碼去檢測使用者自己的程式,返回狀態給keepalived就可以了
#MASTER節點
global_defs { }
vrrp_script chk_health { script "[[ `ps -ef | grep nginx | grep -v grep | wc -l` -ge 2 ]] && exit 0 || exit 1" interval 1 #每隔1秒執行上述的指令碼,去檢查使用者的程式ngnix weight -2 }
vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 1 priority 100 advert_int 2 authentication { auth_type PASS auth_pass 1111 }
track_script { chk_health }
virtual_ipaddress { 10.0.0.10/24 }
notify_master "/usr/local/keepalived/sbin/notify.sh master" notify_backup "/usr/local/keepalived/sbin/notify.sh backup" notify_fault "/usr/local/keepalived/sbin/notify.sh fault" } |
#新增切換通知指令碼
vi /usr/local/keepalived/sbin/notify.sh
#!/bin/bash
case "$1" in master) /usr/local/nginx/sbin/nginx exit 0 ;; backup) /usr/local/nginx/sbin/nginx -s stop /usr/local/nginx/sbin/nginx exit 0 ;; fault) /usr/local/nginx/sbin/nginx -s stop exit 0 ;; *) echo 'Usage: notify.sh {master|backup|fault}' exit 1 ;; esac |
#新增執行許可權
chmod +x /usr/local/keepalived/sbin/notify.sh
global_defs { }
vrrp_script chk_health { script "[[ `ps -ef | grep nginx | grep -v grep | wc -l` -ge 2 ]] && exit 0 || exit 1" interval 1 weight -2 }
vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 1 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 }
track_script { chk_health }
virtual_ipaddress { 10.0.0.10/24 }
notify_master "/usr/local/keepalived/sbin/notify.sh master" notify_backup "/usr/local/keepalived/sbin/notify.sh backup" notify_fault "/usr/local/keepalived/sbin/notify.sh fault" } |
#在第二臺機器上新增notify.sh指令碼
#分別在兩臺機器上啟動keepalived
service keepalived start
chkconfig keepalived on
- 2.5lvs安裝
- 2.5.1安裝lvs應用模組
1、安裝依賴包:
yum -y install ipvs*
2、驗證本機ip_vs模組是否載入
[[email protected] lvs]# grep -i 'ip_vs' /boot/config-2.6.32-431.el6.x86_64
CONFIG_IP_VS=m
CONFIG_IP_VS_IPV6=y
# CONFIG_IP_VS_DEBUG is not set
CONFIG_IP_VS_TAB_BITS=12
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m
CONFIG_IP_VS_FTP=m
CONFIG_IP_VS_PE_SIP=m
- 2.5.2安裝lvs
- a)編寫lvs drsrever指令碼:
- a.1)修改functions許可權:
(functions這個指令碼是給/etc/init.d裡邊的檔案使用的(可理解為全域性檔案)。)
chmod 755 /etc/rc.d/init.d/functions
- a.2)建立lvs資料夾
cd /usr/local
mkdir –m 755 lvs
cd /lvs
- a.3)編寫指令碼
vi lvs_dr.sh
#!/bin/bash #description:start lvs server echo "1" >/proc/sys/net/ipv4/ip_forward #開啟ip轉發 WEB1=192.168.56.200 #真實的webip WEB2=192.168.56.201 #真實的webip VIP1=192.168.56.80 #虛擬lvs的ip /etc/rc.d/init.d/functions #初始化function case "$1" in #第一個引數 start) #第一個引數是start echo "start LVS of directorServer" #列印 /sbin/ifconfig eth0:0 $VIP1 broadcast $VIP1 netmask 255.255.255.255 up #設定虛擬網路 /sbin/ipvsadm –C #清除核心虛擬伺服器表中的所有記錄,清除lvs設定 /sbin/ipvsadm -A -t $VIP1:8080 -s rr #設定rr模式,輪詢模式 /sbin/ipvsadm -a -t $VIP1:8080 -r $WEB1:8080 –g #輪詢的機器,-g採用DR模式 /sbin/ipvsadm -a -t $VIP1:8080 -r $WEB2:8080 –g /sbin/ipvsadm #啟動lvs ;; stop) #如果第一個引數是stop echo "close LVS directorserver" #列印 echo "0" >/proc/sys/net/ipv4/ip_forward #關閉ip轉發 /sbin/ipvsadm –C #清除核心虛擬伺服器表中的所有記錄 /sbin/ipvsadm –Z #虛擬服務表計數器清零(清空當前的連線數量等) ;; *) #如果第一個引數是其他任何值 echo "usage:$0 {start|stop}" #列印:提示輸入start或者stop exit 1 #退出 esac #迴圈結束 |
- a.4)執行指令碼
chmod 755 lvs_dr.sh
./lvs-dr.sh start
- a.5)檢視:
ipvsadm –ln
看到上面資訊說明ipvsadm啟動成功。
- b)編寫lvs realserver指令碼
- b.1)在web1 和web2機器上修改functions許可權:
(functions這個指令碼是給/etc/init.d裡邊的檔案使用的(可理解為全域性檔案)。)
chmod 755 /etc/rc.d/init.d/functions
- b.2)在分別在web1 和web2伺服器上建立lvs資料夾:
cd /usr/local
mkdir –m 755 lvs
cd lvs
rz –y
- b.3)編寫監本
vi lvs-rs.sh
#!/bin/sh VIP1=192.168.56.80 #虛擬ip /etc/rc.d/init.d/functions #初始化function case "$1" in #第一個引數 start) #如果第一個引數是start echo "start LVS of realserver" #列印 /sbin/ifconfig lo:0 $VIP1 broadcast $VIP1 netmask 255.255.255.255 up #設定虛擬網路 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore #定義接收到ARP請求時的響應級別 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 ;; stop) #如果第一個引數是stop /sbin/ifconfig lo:0 down #停止網絡卡 echo "close lvs dirctorserver" #列印 echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore #定義接收到ARP請求時的響應級別 echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce #定義將自己的地址向外通告時的級別 echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce ;; *) echo "usage:$0{start|stop}" exit 1 esac |
- b.4)啟動在web1 和web2機器上lvs:
chmod 755 lvs-rs.sh
./lvs-rs.sh start
- 2.5.4設定dr機器上設定連線超時值(秒)
ipvsadm --set 1 1 1
- 2.5.5關閉
./lvs-rs.sh stop
./lvs-dr.sh stop
三、iptables教程
- 3.1iptables防火牆簡介
Iptables也叫netfilter是Linux下自帶的一款免費且優秀的基於包過濾的防火牆工具,它的功能十分強大,使用非常靈活,可以對流入、流出、流經伺服器的資料包進行精細的控制。iptables是Linux2.4及2.6核心中整合的模組。
- 3.2Iptables服務相關命令
- 1)檢視iptables狀態
service iptables status
- 2)開啟/關閉iptables
service iptables start
service iptables stop
- 3)檢視iptables是否開機啟動
chkconfig iptables --list
- 4)設定iptables開機啟動/不啟動
chkconfig iptables on
chkconfig iptables off
- 3.3iptables原理簡介
- iptables的結構
在iptables中有四張表,分別是filter、nat、mangle和raw每一個表中都包含了各自不同的鏈,最常用的是filter表。
- filter表:
filter是iptables預設使用的表,負責對流入、流出本機的資料包進行過濾,該表中定義了3個鏈:
INPOUT 負責過濾所有目標地址是本機地址的資料包,就是過濾進入主機的資料包。
FORWARD 負責轉發流經本機但不進入本機的資料包,起到轉發的作用。
OUTPUT 負責處理所有源地址是本機地址的資料包,就是處理從主機發出去的資料包。
3.4iptables練習
#檢視幫助
iptables -h
man iptables
列出iptables規則
iptables -L -n
列出iptables規則並顯示規則編號
iptables -L -n --line-numbers
列出iptables nat表規則(預設是filter表)
iptables -L -n -t nat
清除預設規則(注意預設是filter表,如果對nat表操作要加-t nat)
#清楚所有規則
iptables -F
#重啟iptables發現規則依然存在,因為沒有儲存
service iptables restart
#儲存配置
service iptables save
#禁止ssh登陸(若果伺服器在機房,一定要小心)
iptables -A INPUT -p tcp --dport 22 -j DROP
#刪除規則
iptables -D INPUT -p tcp --dport 22 -j DROP
-A, --append chain 追加到規則的最後一條
-D, --delete chain [rulenum] Delete rule rulenum (1 = first) from chain
-I, --insert chain [rulenum] Insert in chain as rulenum (default 1=first) 新增到規則的第一條
-p, --proto proto protocol: by number or name, eg. 'tcp',常用協議有tcp、udp、icmp、all
-j, --jump target 常見的行為有ACCEPT、DROP和REJECT三種,但一般不用REJECT,會帶來安全隱患
注意:INPUT和DROP這樣的關鍵字需要大寫
#禁止192.168.33.0網段從eth0網絡卡接入
iptables -A INPUT -p tcp -i eth0 -s 192.168.33.0 -j DROP
iptables -A INPUT -p tcp --dport 22 -i eth0 -s 192.168.33.61 -j ACCEPT
#禁止ip地址非192.168.10.10的所有型別資料接入
iptables -A INPUT ! -s 192.168.10.10 -j DROP
#禁止ip地址非192.168.10.10的ping請求
iptables -I INPUT -p icmp --icmp-type 8 -s 192.168.50.100 -j DROP
#擴充套件匹配:1.隱式擴充套件 2.顯示擴充套件
#隱式擴充套件
-p tcp
--sport PORT 源埠
--dport PORT 目標埠
#顯示擴充套件:使用額外的匹配規則
-m EXTENSTION --SUB-OPT
-p tcp --dport 22 與 -p tcp -m tcp --dport 22功能相同
state:狀態擴充套件,介面ip_contrack追蹤會話狀態
NEW:新的連線請求
ESTABLISHED:已建立的連線請求
INVALID:非法連線
RELATED:相關聯的連線
#匹配埠範圍
iptables -I INPUT -p tcp --dport 22:80 -j DROP
#匹配多個埠
iptables -I INPUT -p tcp -m multiport --dport 22,80,3306 -j ACCEPT
#不允許源埠為80的資料流出
iptables -I OUTPUT -p tcp --sport 80 -j DROP