12.Nginx代理與負載均衡

1.什麼是代理?

代爲辦理     -->  代理

2.Nginx正向代理、反向代理

正向代理: --> 上網 | 路由器替代
反向代理: -->
正向與反向代理的區別:php

區別在於形式上服務的 "對象" 不同
正向代理代理的對象是客戶端,爲客戶端服務
反向代理代理的對象是服務端,爲服務端服務html

3.Nginx代理支持哪些協議、經常使用的是哪些?

反向代理模式 Nginx反向代理模塊
http、websocket、https ngx_http_proxy_module
fastcgi ngx_http_fastcgi_module
uwsgi ngx_http_uwsgi_module
grpc ngx_http_v2_module

4.Nginx反向代理語法

1.Nginx代理配置語法

Syntax: proxy_pass URL;
Default:    —
Context:    location, if in location, limit_except

5.Nginx反向代理示例

1.若是後端監聽80端口,會不會出現問題?
2.後端主機獲取的客戶端IP是不是真實的?
3.代理向後端請求時,走的http1.0協議?

代理配置node

1.後端web01服務器配置:
[root@web01 conf.d]# vim web.cheng.com.conf
server {
        listen 80;
        server_name web.cheng.com;

        location / {
        root /html;
        index index.html;
        }
}
[root@web01 conf.d]# mkdir /html
[root@web01 conf.d]# echo "web01....." > /html/index.html
[root@web01 conf.d]# nginx -t
[root@web01 conf.d]# systemctl restart nginx
host劫持


2.環境準備:
[root@web01 conf.d]# scp /etc/yum.repos.d/* root@172.16.1.5:/etc/yum.repos.d/
[root@lb01 ~]# yum install nginx -y
[root@lb01 conf.d]# cat proxy_web.cheng.com.conf 
server {
    listen 80;
    server_name web.cheng.com;

    location / {
        proxy_pass http://10.0.0.7:80;
        proxy_http_version 1.1;
        proxy_set_header Host $http_host;        //設置host頭信息
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    //proxy將真實的ip攜帶給變量X-Forwarded-For
    }
}
host劫持

6.Nginx反向代理參數

擴展知識:
服務器默認有65535個端口,一般系統服務須要佔用部分端口:1~10000
配置一臺主機做爲nginx代理服務,最多支持5w的tcp鏈接,由於端口數受限
配置一臺後端的應用服務,最多能支持2w-3w左右的tcp鏈接,由於當一個請求過來
nginx代理經過隨機端口--請求-->nginx應用服務--經過-->隨機端口--請求-->php動態程序--經過-->隨機端口-->mysqlmysql

1.什麼是負載均衡?

2.爲何須要使用負載均衡?

3.負載均衡實現的場景?四層負載均衡

四層負載均衡:   轉發   改寫數據包   源IP  源端口  目標IP  目標端口  真實的目標IP 目標端口
七層負載均衡:   代理   代爲辦理

4.七層負載均衡與四層負載均衡區別?

七層負載均衡效率沒有四負載均衡高。
四層負載均衡沒有七層負載均衡支持的功能多,好比  url匹配  設置頭部信息

負載均衡是基於代理實現的一種形式

5.七層負載均衡配置示例?

[root@web01 conf.d]# scp web.cheng.com.conf root@172.16.1.8:/etc/nginx/conf.d/

[root@web02 conf.d]# mkdir /html
[root@web02 conf.d]# echo "web02...." > /html/index.html
[root@web02 conf.d]# nginx -t
[root@web02 conf.d]# systemctl restart nginx

[root@web01 conf.d]# curl -H Host:web.cheng.com http://172.16.1.7
web01.....
[root@web01 conf.d]# curl -H Host:web.cheng.com http://172.16.1.8
web02....

[root@lb01 conf.d]# cat /etc/nginx/proxy_params 
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;

proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;

負載均衡配置:
[root@lb01 conf.d]# cat proxy_web.cheng.com.conf 
upstream web{
    server 172.16.1.7:80;
    server 172.16.1.8:80;
    }

server {
    listen 80;
    server_name web.cheng.com;
    
    location / {
    proxy_pass http://web;     //web指的是虛擬資源池的名字
    include proxy_params;
    }

}
#後端web配置 (爲了區分,將兩臺web的站點配置的不同,以便測試效果)
[root@web01 conf.d]# cat web.cheng.com.conf 
server {
    listen 80;
    server_name web.cheng.com;

    location / {
    root /html;
    index index.html;
    }

}

6.七層負載均衡整合集羣架構示例

Wordpress   知乎   --------->整合集羣架構實戰
1.配置wordpress
    [root@lb01 conf.d]# cat proxy_word.cheng.com.conf 
upstream word {
    server 172.16.1.7:80;
    server 172.16.1.8:80;
}

server {
    listen 80;
    server_name word.cheng.com;

    location / {
    proxy_pass http://word;
    include proxy_params;
    }
}
2.配置知乎
[root@lb01 conf.d]# cat proxy_zh.cheng.com.conf 
upstream zh {
    server 172.16.1.7:80;
    server 172.16.1.8:80;
}

server {
    listen 80;
    server_name zh.cheng.com;

    location / {
    proxy_pass http://zh;
    include proxy_params;
    }
}
3.檢測並重啓Nginx服務
[root@lb01 conf.d]# nginx -t
[root@lb01 conf.d]# systemctl restart nginx

4.將域名解析至負載均衡10.0.0.5這臺服務器
5.經過瀏覽器分別訪問Wordpress和知乎網站
PS1:若數據庫鏈接錯誤,檢查數據庫服務器是否啓動,其次檢查數據庫服務是否開啓
PS2:若網站中圖片不顯示,則檢查NFS存儲服務器是否啓動,其次檢查是否將圖片等數據掛載至NFS存儲

7.七層負載均衡調度算法、後端狀態

1.負載均衡如何分配流量?

方式一:強與弱nginx

強與弱場景實戰演示:
    [root@lb01 conf.d]# cat proxy_web.cheng.com.conf 
upstream web{
    server 172.16.1.7 weight=5;
    server 172.16.1.8 weight=1;
    }

server {
    listen 80;
    server_name web.cheng.com;
    
    location / {
    proxy_pass http://web;
    include proxy_params;
    }
 }
 [root@lb01 conf.d]# nginx -t
 [root@lb01 conf.d]# systemctl restart nginx
 經過瀏覽器檢驗效果

方式二:平均web

調度算法---------------概述redis

  1. 輪詢 按時間順序逐一分配到不一樣的後端服務器(默認)
    機器的配置一致 (web集羣 硬件環境 一致)算法

  2. weight 加權輪詢,weight值越大,分配到的訪問概率越高
    機器硬件不一致的狀況下使用 (硬件 pc機)sql

  3. ip_hash 每一個請求按訪問IP的hash結果分配,這樣來自同一IP的固定訪問一個後端服務器
    解決問題: 能解決會話保持的問題
    帶來新的問題: 會形成後端負載不均衡
    ip_hash場景演示:
[root@lb01 conf.d]# cat proxy_web.cheng.com.conf 
upstream web{
    ip_hash;
    server 172.16.1.7;
    server 172.16.1.8;
    }

server {
    listen 80;
    server_name web.cheng.com;
    
    location / {
    proxy_pass http://web;
    include proxy_params;
    }

}
[root@lb01 conf.d]# systemctl restart nginx
  1. url_hash 按照訪問URL的hash結果來分配請求,是每一個URL定向到同一個後端服務器
    least_conn 最少連接數,那個機器連接數少 就分發

7.七層負載均衡後端狀態

狀態 概述
down 當前的server暫時不參與負載均衡
backup 預留的備份服務器
max_fails 容許請求失敗的次數
fail_timeout 通過max_fails失敗後, 服務暫停時間
max_conns 限制最大的接收鏈接數
a   max_fails=2 fail_timeout=10s    運維
b   max_fails=2 fail_timeout=10s    運維
c   backup;     開發  運維
d   down;       離職

企業案例:使用nginx負載均衡時,如何將後端請求超時的服務器流量平滑的切換到另外一臺上。若是後臺服務鏈接超時,Nginx是自己是有機制的,若是出現一個節點down掉的時候,Nginx會更據你具體負載均衡的設置,將請求轉移到其餘的節點上,可是,若是後臺服務鏈接沒有down掉,可是返回錯誤異常碼瞭如:50四、50二、500,應該如何處理。
能夠在負載均衡添加以下配置proxy_next_upstream http_500 | http_502 | http_503 | http_504 |http_404;意思是,當其中一臺返回錯誤碼404,500...等錯誤時,能夠分配到下一臺服務器程序繼續處理,提升平臺訪問成功率。數據庫

nginx自己是有剔除機制,  指的是 後端的nginx沒有正常工做
    proxy_next_upstream nginx是正常工做,只不事後端的php或者其餘程序出現問題  502

server {
    listen 80;
    server_name xuliangwei.com;

    location / {
        proxy_pass http://node;
        proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
    }
}

8.七層負載均衡實現Redis會話共享? redis

一、粘性session

粘性session是指Ngnix每次都將同一用戶的全部請求轉發至同一臺服務器上,及Nginx的 IP_hash。

二、session複製

即每次session發生變化時,建立或者修改,就廣播給集羣中的服務器,使全部的服務器上的session相同。

三、session持久化 ( 慢 )

將session存儲至數據庫中,像操做數據同樣操做session。

四、session共享

緩存session至內存數據庫中,使用redis ( 內存-->刷到磁盤 ),memcached (內存數據庫)。

5.session場景實踐:將PHP程序Session存儲至Redis內存數據庫實現Session共享

第一步:在 172.16.1.8  和  172.16.1.7 安裝 phpmyadmin     
        分別進行測試-->測試登陸

    #1.安裝phpmyadmin(web01和web02上都裝)
    [root@web01 conf.d]# cd /code
    [root@web01 code]# wget https://files.phpmyadmin.net/phpMyAdmin/4.8.4/phpMyAdmin-4.8.4-all-languages.zip
    [root@web01 code]# unzip phpMyAdmin-4.8.4-all-languages.zip

    #2.配置phpmyadmin鏈接遠程的數據庫
    [root@web01 code]# cd phpMyAdmin-4.8.4-all-languages/
    [root@web01 phpMyAdmin-4.8.4-all-languages]# cp config.sample.inc.php config.inc.php
    [root@web01 phpMyAdmin-4.8.4-all-languages]# vim config.inc.php
    /* Server parameters */
    $cfg['Servers'][$i]['host'] = '172.16.1.51';      ----->31行
    
    #3.配置Nginx
    [root@web01 conf.d]# cat php.cheng.com.conf
server {
    listen 80;
    server_name php.cheng.com;
    root /code/phpmyadmin;
    client_max_body_size 100m;

    location / {
    index index.php;
    }

    location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }

}

[root@web01 conf.d]# nginx -t
[root@web01 conf.d]# systemctl restart nginx
4.Host解析

5.修改權限
[root@web01 ~]# chown -R www.www /var/lib/php/

6.
[root@web01 ~]# scp /etc/nginx/conf.d/php.cheng.com.conf root@172.16.1.8:/etc/nginx/conf.d/

7.
[root@web01 ~]# scp -rp /code/phpMyAdmin-4.9.0.1-all-languages root@172.16.1.8:/code/
8.
[root@web02 code]# ln -s /code/phpMyAdmin-4.9.0.1-all-languages/ /code/phpmyadmin
9.修改權限
[root@web02 code]# chown -R www.www /var/lib/php/
10.作10.0.0.8域名解析

第二步:接入負載均衡  ---> 代理至後端2臺主機  
1.配置
[root@lb01 conf.d]# cat proxy_php.cheng.com.conf
upstream php {
    server 172.16.1.7;
    server 172.16.1.8;
}

server {
    listen 80;
    server_name php.cheng.com;
    
    location / {
    proxy_pass http://php;
    proxy_set_header Host $http_host;}  
}

2.Host解析

3.發現沒法正常登錄
    1.解決方法:  
在負載均衡上配置  ip_hash 會話保持   (  形成用戶僅訪問後端的某一臺主機  )
[root@lb01 conf.d]# cat proxy_php.cheng.com.conf
upstream php {
    ip_hash;
    server 172.16.1.7;
    server 172.16.1.8;
}

server {
    listen 80;
    server_name php.cheng.com;
    
    location / {
    proxy_pass http://php;
    proxy_set_header Host $http_host;}  
}

--------------------------------------------------------------------------
4.既但願可以實現流量的均攤,又但願會話的問題得以保持, 因此引入了redis

1)準備一臺Redis服務器,安裝redis
    [root@redis ~]# yum install redis -y

2)配置redis
    [root@redis ~]# vim /etc/redis.conf +61
    bind 127.0.0.1 172.16.1.52
3)啓動redis
    [root@redis ~]# systemctl start redis
    [root@redis ~]# systemctl enable redis

4) 改造php, session寫本地修改成寫入redis中  (全部的web上都須要配置)
    前提:  已經安裝過了redis的模塊---> php71w-pecl-redis
[root@web01 ~]# cat /etc/php-zts.d/redis.ini 
; Enable redis extension module
extension = redis.so

; phpredis can be used to store PHP sessions. 
; To do this, uncomment and configure below
;session.save_handler = redis
;session.save_path = "tcp://host1:6379?weight=1, tcp://host2:6379?weight=2&timeout=2.5, tcp://host3:6379?weight=2"

    1.修改php存儲session至redis中
    [root@web01 ~]# vim /etc/php.ini
    session.save_handler = redis
    session.save_path = "tcp://172.16.1.51:6379?weight=1"

    2.修改php-fpm 註釋默認存儲session的位置
    [root@web01 ~]# vim /etc/php-fpm.d/www.conf
    ;php_value[session.save_handler] = files          ;表明註釋
    ;php_value[session.save_path]    = /var/lib/php/session

    3.將修改後的配置文件,推送至172.16.1.8
    [root@web01 ~]# scp /etc/php.ini root@172.16.1.8:/etc/  
    [root@web01 ~]# scp /etc/php-fpm.d/www.conf  root@172.16.1.8:/etc/php-fpm.d/www.conf
    
    4.重啓172.16.1.7 172.16.1.8兩臺服務器的php-fpm
    [root@web01 ~]# systemctl restart php-fpm.service
    [root@web02 conf.d]# systemctl restart php-fpm
5.去掉負載均衡服務器中的hash
[root@lb01 conf.d]# cat proxy_php.cheng.com.conf 
upstream php {
    server 172.16.1.7;
    server 172.16.1.8;
}

server {
    listen 80;
    server_name php.cheng.com;
    
    location / {
    proxy_pass http://php;
    proxy_set_header Host $http_host;}  
}

5) 測試效果
1.瀏覽器登陸測試 (ok)
在這裏插入圖片描述
2.查看redis的sessionID和 瀏覽器cookie中提交的sessionID是否一致
在這裏插入圖片描述
在這裏插入圖片描述

9.SLB負載均衡 + ECS 雲主機

ECS 雲主機 ===> 服務器 ( Linux 操做系統 安裝 Nginx PHP )
SLB 產品 ===> 開源技術 ( Tengine LVS ) 手動配置負載均衡沒什麼區別

1) 購買雲主機 ( 按量 ---> 釋放 )
第一步
第二步
第三步
第四步
第五步
第六步
在這裏插入圖片描述
2) 配置雲主機環境 Nginx +PHP
3) 購買SLB負載均衡 ( 按量 ---> 釋放 )
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
4) 集成 SLB+ECS
5) DNS解析

相關文章
相關標籤/搜索