1. 程式人生 > >lvs,nginx反向代理,虛擬主機

lvs,nginx反向代理,虛擬主機

就是 未使用 ngx eal ges 客戶 緩存 lin glob

LVS NAT

拓撲

     client
       |
       |
       LVS
       |
       |
-------------------
|        |        |
RS1      RS2      RS3

地址規劃如下

機器名稱 ip配置 ip配置 備註信息
LVS 192.168.2.23 192.168.11.11 2塊網卡
RS1 192.168.11.12
RS2 192.168.11.13

檢查內核支持支持lvs

[root@lvs ~]# grep -i vs /boot/config-3.10.0-229.el7.x86_64 有IP_VS段說明支持

安裝ipvsadm工具

yum install -y ipvsadm

ipvsadm語法

ipvsadm :
  管理集群服務
    添加:-A -t|u|f service-address [-s scheduler]
      -t:TCP協議
      -u:UDP協議
      -f:FWM,防火墻標記
    修改:-E
    刪除:-D -t|u|f service-address
    
    # ipvsadm -A -t 192.168.2.23:80 -s rr
  管理集群服務中的RS
    添加:-a -t|u|f service-address -r server-address [-g|i|m] [-w weight]
    -t|u|f service-address:事先定義好的某集群服務
    -r server-address:某RS的地址,在NAT模型中,可使用IP:PORT實現映射
    [-g|i|m]:LVS類型
      -g:DR模型
      -i:TUN模型
      -m:NAT模型
    [-w weight]:定義服務器權重
    修改:-e
    刪除:-d -t|u|f service-address -r server-address
    
    # ipvsadm -a -t 192.168.2.23:80 -r 192.168.11.11 -m
    # ipvsadm -a -t 192.168.2.23:80 -r 192.168.11.13 -m
    
    查看:-L|l
      -n:數字格式顯示主機地址和端口
      --stats:統計數據
      --rate:速率
      --timeout:顯示tcp、tcpfin和udp的會話超時時長
      -c:顯示當前的ipvs連接狀況
      
刪除所有集群服務  

        -C:清空ipvs規則
    保存規則  
      -S  
      # ipvsadm -S > /ath/to/somfefile
    載入此前的規則:  
      -R
      # ipvsadm -R < /path/from/somefile
      

RS服務器上安裝nginx

創建LVS

[root@lvs ~]# ipvsadm -A -t 192.168.2.23:80 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.2.23:80 -r 192.168.11.12 -m
[root@lvs ~]# ipvsadm -a -t 192.168.2.23:80 -r 192.168.11.13 -m

打開ip轉發機制

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

sysctl -p 使配置文件生效

測試結果

root@node2:~# curl http://192.168.2.23/index.html
rs1
root@node2:~# curl http://192.168.2.23/index.html
rs2
root@node2:~# curl http://192.168.2.23/index.html
rs1
root@node2:~# curl http://192.168.2.23/index.html
rs2
root@node2:~# curl http://192.168.2.23/index.html
rs1
root@node2:~# curl http://192.168.2.23/index.html
rs2
root@node2:~# curl http://192.168.2.23/index.html
rs1
root@node2:~# curl http://192.168.2.23/index.html
rs2

      

LVS DR

LVS各模式的路由方式及區別:

NAT模式:客戶端-->分發路由器-->Real Server-->分發路由器-->客戶機
DR模式:客戶端-->分發路由器--Real Server-->客戶機
TUN模式:客戶機-->分發路由器--Real Server-->客戶機

實驗拓撲

     client
       |
       |
      Router
       |
       |
------------------------------------
|                 |                   |
RS1               LVS                RS3
Rip:192.168.2.72  Rip:192.168.2.23  Rip:192.168.2.104
Vip:192.168.2.200  Vip:192.168.2.200  Vip:192.168.2.200  

配置LVS

ip addr add 192.168.2.200/32 dev eno16777736:1


ipvsadm -A -t 192.168.2.200:80 -s rr
ipvsadm -a -t 192.168.2.200:80 -r 192.168.2.72 -g
ipvsadm -a -t 192.168.2.200:80 -r 192.168.2.104:80 -g

arp_ignore與arp_announce參數

arp響應限制arp_ignore

arp_ignore參數的作用是控制系統在收到外部的ARP請求, 是否要回返ARP響應。

  • 0 - 默認值:響應任意網卡上接收到的對本機IP地址的ARP請求(包括回環地址),而不管該目的IP是否在接收網卡上
  • 1 - 只響應目的IP地址為接收網卡上的本地地址的ARP請求
  • 2 - 只響應目的IP地址為接收網卡上的本地地址的ARP請求,並且ARP請求的源IP必須和接收網卡同網段
  • 3 - 如果ARP請求數據包所請求的IP地址對應的本地地址作用域(scope)為主機(host),則不回應ARP響應數據包,如果作用域為全局(global)或鏈路(link),則回應ARP響應數據包。
  • 4 - 7 保留未使用
  • 8 - 不回應所有的ARP查詢

    arp響應限制arp_announce

    arp_announce的任務是控制系統在對外發送ARP請求時,如何選擇ARP請求數據包的源IP地址。(比如系統準備通過網卡發送一個數據包a,這時數據包a的源IP和目的IP一般是知道的,而根據目的IP查詢路由表,發送網卡也是確定的,故源MAC地址也是知道的,這時就差確定目的MAC地址了。而想要獲取目的IP對應的目的MAC地址,就需要發送ARP請求。ARP請求的目的IP自然就是想要獲取其MAC地址的IP,而ARP請求的源IP是什麽呢?可能第一反應會以為肯定是數據包a的源IP地址,但是這個也不是一般的,ARP請求的源IP是可以選擇的,控制這個地址如何選擇就是arp_announce的作用)
  • 0 - 默認允許使用任何網卡上的IP地址作為ARP請求的源IP,通常就是使用數據包a的源IP
  • 1 - 盡量避免使用不屬於該發送網卡子網的本地地址作為發送ARP請求的源地址
  • 2 - IP數據包的源IP地址,選擇該發送網卡上最合適的本地地址作為ARP請求的源IP地址

    配置Real Server

ip addr add 192.168.2.200/32 dev lo:1

echo 1 > /proc/sys/net/ipv4/conf/eno16777736/arp_ignore 
echo 2 > /proc/sys/net/ipv4/conf/eno16777736/arp_announce

測試結果

root@node2:~# curl http://192.168.2.200/index.html
rs1
root@node2:~# curl http://192.168.2.200/index.html
rs2
root@node2:~# curl http://192.168.2.200/index.html
rs1
root@node2:~# curl http://192.168.2.200/index.html
rs2
root@node2:~# curl http://192.168.2.200/index.html
rs1
root@node2:~# curl http://192.168.2.200/index.html
rs2

Nginx反向代理

什麽是代理服務器

代理服務器,客戶機在發送請求時,不會直接發送給目的主機,而是先發送給代理服務器,代理服務器接受客戶請求之後,再向主機發出,並接收目的主機返回的數據,存放在代理服務器的磁盤中,再發送給客戶機。

為什麽要使用代理服務器

  • 提高訪問速度
    由於目標主機返回的數據會放在代理服務器的磁盤中,因此下一次客戶再訪問相同的站點數據時,會直接從代理服務器的磁盤中讀取,起到了緩存的作用,尤其對於熱門站點能明顯提高請求速度
  • 防火墻作用
    由於所有的客戶機請求都必須通過代理服務器訪問遠程站點,因此可在代理服務器上設限,過濾某些不安全信息
  • 通過代理服務器訪問不能訪問的目標站點
    互聯網上有施工開發的代理服務器,客戶機在訪問受限時,可通過不受限的代理服務器訪問目標站點

    反向代理VS正向代理

  • 正向代理
    架設在客戶機與目標主機之間,只用於代理內部網絡對Internet的連接請求,客戶機必須指定代理服務器,並將本來要直接發送到Web服務器上的http請求發送到代理服務器中。
  • 反向代理
    架設在服務器前端,通過緩沖經常被請求的而面來緩解服務器的工作量,將客戶請求轉發給內部網絡上的目標服務器;並將服務器上得到的結果返回給Internet上請求連接的客戶端,此時代理服務器與目標主機一起對外表現為一個服務器
  • 反向代理有哪些主要應用
    現在許多大型web網站都用到反向代理。除了可以防止網網對內網服務器的惡意攻擊、緩存以減少服務器的壓力和訪問安全控制之外,還可以進行負載均衡,將用戶請求分配給多個服務器。

    配置Nginx為反向代理服務器

    新建配置文件/etc/nginx/conf.d/proxy.conf

upstream websrvs {
        server 192.168.2.72:80;
        server 192.168.2.104:80;
}

server {
        listen 80 default_server;
        server_name  _;
        location / {
                proxy_pass http://websrvs;
                index index.html ;
        }
}

測試結果

root@node2:~# curl http://192.168.2.23/index.html
rs2
root@node2:~# curl http://192.168.2.23/index.html
rs1
root@node2:~# curl http://192.168.2.23/index.html
rs2
root@node2:~# curl http://192.168.2.23/index.html
rs1
root@node2:~# curl http://192.168.2.23/index.html
rs2
root@node2:~# curl http://192.168.2.23/index.html
rs2
root@node2:~# curl http://192.168.2.23/index.html
rs1
root@node2:~# curl http://192.168.2.23/index.html
rs2
root@node2:~# curl http://192.168.2.23/index.html
rs1
root@node2:~# curl http://192.168.2.23/index.html
rs2
root@node2:~# curl http://192.168.2.23/index.html

Nginx虛擬主機

基於IP的虛擬主機

如果一臺服務器有多個IP,可以使用基於IP的虛擬主機配置,將不同的服務綁定在不同的IP上。

在服務器上配置3個IP地址

[root@lvs conf.d]# ip addr add 192.168.2.151/24 dev eno16777736:2
[root@lvs conf.d]# ip addr add 192.168.2.152/24 dev eno16777736:3
[root@lvs conf.d]# ip addr add 192.168.2.154/24 dev eno16777736:4

建立虛擬主機存放網頁的根目錄,將創建首頁文件index.html

[root@lvs conf.d]# mkdir -pv /data/www/15{1..3}
mkdir: 已創建目錄 "/data"
mkdir: 已創建目錄 "/data/www"
mkdir: 已創建目錄 "/data/www/151"
mkdir: 已創建目錄 "/data/www/152"
mkdir: 已創建目錄 "/data/www/153"
[root@lvs conf.d]# echo server151 > /data/www/151/index.html
[root@lvs conf.d]# echo server152 > /data/www/152/index.html
[root@lvs conf.d]# echo server153 > /data/www/153/index.html

編輯虛擬主機配置文件

/etc/nginx/conf.d/test.conf

server {
        listen 192.168.2.151:80;
        server_name www.test.com;

        location / {
                root /data/www/151;
                index index.html;
        }
}
server {
        listen 192.168.2.152:80;
        server_name www.test.com;

        location / {
                root /data/www/152;
                index index.html;
        }
}
server {
        listen 192.168.2.153:80;
        server_name www.test.com;

        location / {
                root /data/www/153;
                index index.html;
        }
}

測試結果

root@node2:~# curl http://192.168.2.153/index.html
server153
root@node2:~# curl http://192.168.2.152/index.html
server152
root@node2:~# curl http://192.168.2.151/index.html
server151

基於端口的虛擬主機

如果一臺服務器只有一個IP或需要通過不同的端口訪問不同的虛擬主機,可以使用基於端口的虛擬主機配置

創建虛擬主機存放網頁的目錄,並創建首頁文件index.html

[root@lvs conf.d]# mkdir /data/www/{7..9}081
[root@lvs conf.d]# echo "port 7081" > /data/www/7081/index.html
[root@lvs conf.d]# echo "port 8081" > /data/www/8081/index.html
[root@lvs conf.d]# echo "port 9081" > /data/www/9081/index.html

編輯虛擬主機配置文件

/etc/nginx/conf.d/port.conf

server {
        listen 192.168.2.155:7081;
        server_name www.port.com;

        location / {
                root /data/www/7081;
                index index.html;
        }
}
server {
        listen 192.168.2.155:8081;
        server_name www.port.com;

        location / {
                root /data/www/8081;
                index index.html;
        }
}
server {
        listen 192.168.2.155:9081;
        server_name www.port.com;

        location / {
                root /data/www/9081;
                index index.html;
        }
}

測試結果:

root@node2:~# curl http://192.168.2.155:7081/index.html
port 7081
root@node2:~# curl http://192.168.2.155:8081/index.html
port 8081
root@node2:~# curl http://192.168.2.155:9081/index.html
port 9081

基於域名的虛擬主機

使用基於域名的虛擬主機是比較流行的方式,可以在同一個IP上配置多個域名,並且都通過80端口訪問

建立虛擬主機存放網頁的目錄,並創建首面文件index.html

[root@lvs conf.d]# mkdir /data/www/www.oa.com
[root@lvs conf.d]# mkdir /data/www/www.bbs.com
[root@lvs conf.d]# mkdir /data/www/www.test.com
[root@lvs conf.d]# echo www.oa.com > /data/www/www.oa.com/index.html
[root@lvs conf.d]# echo www.bbs.com > /data/www/www.bbs.com/index.html
[root@lvs conf.d]# echo www.test.com > /data/www/www.test.com/index.html

建立虛擬主機配置文件

/etc/nginx/conf.d/vhost.conf

server {
        listen 192.168.2.155:80;
        server_name www.oa.com;
        location / {
                root /data/www/www.oa.com;
                index index.html;
        }

}
server {
        listen 192.168.2.155:80;
        server_name www.bbs.com;
        location / {
                root /data/www/www.bbs.com;
                index index.html;
        }

}
server {
        listen 192.168.2.155:80;
        server_name www.test.com;
        location / {
                root /data/www/www.test.com;
                index index.html;
        }

}

測試結果

root@node2:~# curl http://www.oa.com/index.html
www.oa.com
root@node2:~# curl http://www.bbs.com/index.html
www.bbs.com
root@node2:~# curl http://www.test.com/index.html
www.test.com

參考文檔:
https://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_linux_021_lvsnat.html
https://www.cnblogs.com/knowledgesea/p/6407018.html#undefined
https://www.cnblogs.com/lipengxiang2009/p/7451050.html
https://blog.csdn.net/Daybreak1209/article/details/51549031
https://blog.csdn.net/liupeifeng3514/article/details/79006998
https://blog.csdn.net/liupeifeng3514/article/details/79007035
https://blog.csdn.net/liupeifeng3514/article/details/79007051

lvs,nginx反向代理,虛擬主機