nginx代理與負載均衡

1.什麼是代理php

代理就是代爲辦理html

2.nginx正向代理,反向代理node

(1)正向代理:是一個位於客戶端和目標服務器之間的服務器(代理服務器),爲了從目標服務器取得內容,客戶端向代理服務器發送一個請求並指定目標,而後代理服務器向目標服務器轉交請求並將得到的內容返回給客戶端。這種代理其實在生活中是比較常見的。nginx

(2)反向代理:是指以代理服務器來接受internet上的鏈接請求,而後將請求轉發給內部網絡上的服務器,並將從服務器上獲得的結果返回給internet上請求鏈接的客戶端,此時代理服務器對外就表現爲一個反向代理服務器。web

 

(3)正向代理與反向代理的區別redis

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

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反向代理語法vim

 proxy_pass後端

語法:proxy_pass URL;

配置塊:location、if

此配置項將當前請求反向代理到URL參數指定的服務器上,URL能夠是主機名或IP地址加端口的形式,例如:

proxy_pass http://localhost:8000/uri/; 

也能夠是UNIX句柄:

proxy_pass http://unix:/path/to/backend.socket:/uri/; 

還能夠如上節負載均衡中所示,直接使用upstream塊,例如:

複製代碼
upstream backend {  
  …  
}  
 
server {  
  location / {  
    proxy_pass  http://backend;  
  }  
} 
複製代碼

用戶能夠把HTTP轉換成更安全的HTTPS,例如:

proxy_pass https://192.168.0.1; 

默認狀況下反向代理是不會轉發請求中的Host頭部的。若是須要轉發,那麼必須加上配置:

proxy_set_header Host $host; 

 

5.Nginx反向代理示例

代理配置

裝nginx源
vim /etc/yum.repos.d/nginx.repo
安裝nginx
cd /etc/nginx/conf.d
[root@lb01 conf.d]# cat proxy_web.oldxu.com.conf server { listen
80; server_name web.oldxu.com; location / { proxy_pass http://10.0.0.7:80; proxy_http_version 1.1; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
nignx -t
systemctl restart nginx
劫持
10.0.0.5 web.oldxu.com

 

後端web配置

 
 
cd /etc/nginx/conf.d/
vim web.oldxu.com.conf

[root@web01 conf.d]# cat web.oldxu.com.conf server { listen
80; server_name web.oldxu.com; location / { root /html; index index.html; } }
mkdir /html
echo"web01...."> /html/index.html
nginx -t
ssystemctl restart nginx
劫持
10.0.0.7 web.oldxu.com
瀏覽器訪問
 

1.什麼是負載均衡

將任務分攤到多個操做單元上進行執行

2.負載均衡實現的場景

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

 

 3.七層負載均衡與四層負載均衡區別

七層負載均衡效率沒有四負載均衡高。

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


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

4.七層負載均衡配置示例

 1 [root@lb01 conf.d]# cat proxy_web.oldxu.com.conf 
 2 upstream web {
 3     server 172.16.1.7:80;
 4     server 172.16.1.8:80;
 5 }
 6 
 7 server {
 8     listen 80;
 9     server_name web.oldxu.com;
10 
11     location / {
12         proxy_pass http://web;
13         include proxy_params;
14     }
15 }
16 
17 
18 [root@lb01 conf.d]# cat /etc/nginx/proxy_params 
19 proxy_http_version 1.1;
20 proxy_set_header Host $http_host;
21 proxy_set_header X-Real-IP $remote_addr;
22 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
23 
24 proxy_connect_timeout 30;
25 proxy_send_timeout 60;
26 proxy_read_timeout 60;
27 
28 proxy_buffering on;
29 proxy_buffer_size 32k;
30 proxy_buffers 4 128k;

 

 

 

#後端web配置 (爲了區分,將兩臺web的站點配置的不同,以便測試效果)

 1 [root@web01 conf.d]# cat web.oldxu.com.conf 
 2 server {
 3     listen 80;
 4     server_name web.oldxu.com;
 5 
 6     location / {
 7         root /html;
 8         index index.html;
 9     }
10 }

 

 5.七層負載均衡調度算法

調度算法 概述
輪詢

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

weight

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

ip_hash

每一個請求按訪問IP的hash結果分配,這樣來自同一IP的固定訪問一個後端服務器
解決問題: 能解決會話保持的問題
帶來新的問題: 會形成後端負載不均衡

url_hash 按照訪問URL的hash結果來分配請求,是每一個URL定向到同一個後端服務器
least_conn 最少連接數,那個機器連接數少   就分發

 

 

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

狀態 概述
down 當前的server暫時不參與負載均衡
backup 預留的備份服務器
max_fails 容許請求失敗的次數
fail_timeout 通過max_fails失敗後, 服務暫停時間
max_conns 限制最大的接收鏈接數

 

 

 

 

 

 8.企業案例:使用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;
    }
}

 

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

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

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

(3)session持久化 ( 慢 )
將session存儲至數據庫中,像操做數據同樣操做session。

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

 

思路:
--------------------------------------------------------------------------
1.在 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';

--------------------------------------------------------------------------
2.接入負載均衡 ---> 代理至後端2臺主機

[root@lb01 conf.d]# cat proxy_php.oldxu.com.conf
upstream php {
server 172.16.1.7;
server 172.16.1.8;
}

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

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

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

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

1)安裝redis
[root@db01 ~]# yum install redis -y
2)配置redis
[root@db01 ~]# sed -i '/^bind/c bind 127.0.0.1 172.16.1.51' /etc/redis.conf
3)啓動redis
[root@db01 ~]# systemctl enable redis
[root@db01 ~]# systemctl start redis


4) 改造php, session寫本地修改成寫入redis中 (全部的web上都須要配置)
前提: 已經安裝過了redis的模塊---> php71w-pecl-redis

1.修改php存儲session至redis中
[root@db01 ~]# 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@web02 conf.d]# systemctl restart php-fpm

5) 測試效果
1.瀏覽器登陸測試 (ok)

2.查看redis的sessionID和 瀏覽器cookie中提交的sessionID是否一致
[root@db01 ~]# redis-cli
127.0.0.1:6379> keys *
1) "PHPREDIS_SESSION:38ecc8696c70a7252d943e7cb9b20f70"

--------------------------------------------------------------------------
10.SLB負載均衡 + ECS 雲主機 ( 120 塊錢 --> 按量付費 )

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

1) 購買雲主機 ( 按量 ---> 釋放 ) 2) 配置雲主機環境 Nginx +PHP 2) 購買SLB負載均衡 ( 按量 ---> 釋放 ) 3) 集成 SLB+ECS 4) DNS解析

相關文章
相關標籤/搜索