代爲辦理 --> 代理
正向代理: --> 上網 | 路由器替代
反向代理: -->
正向與反向代理的區別:php
區別在於形式上服務的 "對象" 不同
正向代理代理的對象是客戶端,爲客戶端服務
反向代理代理的對象是服務端,爲服務端服務html
反向代理模式 | Nginx反向代理模塊 |
---|---|
http、websocket、https | ngx_http_proxy_module |
fastcgi | ngx_http_fastcgi_module |
uwsgi | ngx_http_uwsgi_module |
grpc | ngx_http_v2_module |
1.Nginx代理配置語法 Syntax: proxy_pass URL; Default: — Context: location, if in location, limit_except
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劫持
擴展知識:
服務器默認有65535個端口,一般系統服務須要佔用部分端口:1~10000
配置一臺主機做爲nginx代理服務,最多支持5w的tcp鏈接,由於端口數受限
配置一臺後端的應用服務,最多能支持2w-3w左右的tcp鏈接,由於當一個請求過來
nginx代理經過隨機端口--請求-->nginx應用服務--經過-->隨機端口--請求-->php動態程序--經過-->隨機端口-->mysqlmysql
四層負載均衡: 轉發 改寫數據包 源IP 源端口 目標IP 目標端口 真實的目標IP 目標端口 七層負載均衡: 代理 代爲辦理
七層負載均衡效率沒有四負載均衡高。 四層負載均衡沒有七層負載均衡支持的功能多,好比 url匹配 設置頭部信息 負載均衡是基於代理實現的一種形式
[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; } }
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存儲
方式一:強與弱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
輪詢 按時間順序逐一分配到不一樣的後端服務器(默認)
機器的配置一致 (web集羣 硬件環境 一致)算法
weight 加權輪詢,weight值越大,分配到的訪問概率越高
機器硬件不一致的狀況下使用 (硬件 pc機)sql
[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
狀態 | 概述 |
---|---|
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; } }
粘性session是指Ngnix每次都將同一用戶的全部請求轉發至同一臺服務器上,及Nginx的 IP_hash。
即每次session發生變化時,建立或者修改,就廣播給集羣中的服務器,使全部的服務器上的session相同。
將session存儲至數據庫中,像操做數據同樣操做session。
緩存session至內存數據庫中,使用redis ( 內存-->刷到磁盤 ),memcached (內存數據庫)。
第一步:在 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是否一致
ECS 雲主機 ===> 服務器 ( Linux 操做系統 安裝 Nginx PHP )
SLB 產品 ===> 開源技術 ( Tengine LVS ) 手動配置負載均衡沒什麼區別
1) 購買雲主機 ( 按量 ---> 釋放 )
2) 配置雲主機環境 Nginx +PHP
3) 購買SLB負載均衡 ( 按量 ---> 釋放 )
4) 集成 SLB+ECS
5) DNS解析