nginx+keepalived+lamp+redis實現高可負載均衡、動靜分離與session共享

前提說明php

企業中,隨着用戶的增加,數據量也幾乎成幾何增加,數據愈來愈大,隨之也就出現了各類應用的瓶頸問題。css

問題出現了,咱們就得想辦法解決,通常網站環境,均會使用LAMP或者LNMP,而咱們對於網站環境的優化,除了對源代碼進行優化、SQL慢查詢優化 、SQL建立索引等以外,咱們還能夠對環境架構進行優化與擴展。html

所以,咱們引入了 Nginx 對站點實現負載均衡和動靜分離,來加快訪問速度。前端

引入負載均衡技術後這裏就有這麼一個問題,若是咱們登陸了百度的一個帳號,如網頁的百度網盤,可是每次有可能請求的是不一樣的服務器,咱們知道每一個服務器都會有本身的會話session,因此會致使用戶每次刷新網頁又要從新登陸,這是很是糟糕的體驗,所以,根據以上問題,但願session能夠共享,這樣就能夠解決負載均衡中同一個域名不一樣服務器對應不一樣session的問題;使用redis使php將session保存到redis中, 這樣只要保證多臺業務服務器能訪問同一個redis服務器(羣集)就好了mysql

不說那麼多了,接下來就跟我來配置吧
linux

首先是架構環境介紹nginx

QK}}B0E_IWZ2_COSA7~V``N.png

環境ip.png

本實驗中:前端使用兩臺服務器配置nginx+keepalived實現高可用負載均衡和動靜分離;後端php動態服務器使用lap服務搭建,負責解析php動態資源;因爲虛擬機開不了太多,靜態服務器就使用nginx的基於端口的虛擬主機來實現;mysql和redis放在一臺服務器上來實現,現實要使用redis哨兵或集羣,mysql使用mha主從複製和讀寫分離架構來實現web

一、代理服務器:redis

        服務:nginx,配置upstream模塊實現負載均衡,配置location使用代理實現動靜資源分離
sql

二、動態服務器:

        服務:httpd+PHP,負載處理客戶端請求的php動態頁面解析

三、靜態服務器

        服務:nginx,負載處理客戶端請求的圖片、js、css、html等靜態資源


配置過程:

動態服務器配置

1、配置前的初始配置,配置好每臺主機的ip地址,關閉防火牆和selinux,配置hosts解析文件(各主機間通訊);這個步驟全部主機都操做,我這裏只操做一臺主機

[root@proxy-master /]# systemctl stop firewalld
[root@proxy-master /]# systemctl disable firewalld
[root@proxy-master /]# setenforce 0
[root@proxy-master /]# vim /etc/hosts
192.168.2.221   www.aa1.com
192.168.2.222   www.aa2.com
192.168.2.223   www.aa3.com
192.168.2.224   www.aa4.com
192.168.2.225   www.aa5.com
192.168.2.226   www.aa6.com

2、配置httpd+php服務器,實現動態請求的解析(兩臺lap主機都操做同樣,我這裏只操做一臺)

①安裝httpd和php須要的軟件包

[root@lap-A /]# yum install -y httpd php php-mbstring php-mysql php-gd php-devel

②配置httpd支持php解析添加index.php首頁支持,在配置文件中添加調用php5模塊的配置、

[root@lap-A /]# vim /etc/httpd/conf/httpd.conf 
<IfModule log_config_module>
    LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" proxylog    ##代理的請求日誌格式
    CustomLog "logs/access_log" proxylog        ##調用代理的日誌格式(顯示真實客戶端ip地址,默認日誌只顯示代理服務器ip)
</IfModule>
<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>
...略
    AddType application/x-httpd .php        ##此配置沒有,須要新添加
    LoadModule php5_module modules/libphp5.so    ##此配置沒有,須要新添加
...略

③建立info.php信息頁面,將httpd服務加入到開機自啓並啓動httpd服務

[root@lap-A /]# vim /var/www/html/info.php
<?php
phpinfo();
?>
[root@centos02 /]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
[root@lap-A /]# systemctl start httpd

④使用客戶端添加hosts解析,瀏覽器訪問http://www.aa3.com/info.php驗證httpd與php協同工做是否正常

AK~I([W)4D0)_NZ3}DHM(9K.png

⑤另外一臺動態服務器使用一樣的步驟安裝httpd+php服務,並測試是否工做正常



靜態服務器配置

正使用一臺服務器安裝nginx,基於不一樣端口的虛擬主機來實現模擬多臺靜態服務器

①使用yum安裝nginx服務程序,新建兩個虛擬主機,配置靜態資源網站根目錄,配置訪問日誌格式使用proxy格式(顯示真實的客戶端ip地址)

[root@static /]# yum install -y nginx                     ##經過yum安裝nginx服務程序
[root@static /]# vim /etc/nginx/conf.d/static1.conf       ##建立第一個虛擬主機
-----------------------------------------------------------------------------
server {
        listen 8080;
        server_name www.aa5.com;
        root /web/static1/;
        access_log /var/log/nginx/8080_access.log proxy;    ##調用自定義日誌格式proxy,用來顯示真實客戶端的ip地址
        location / {
                root /web/static1/;
                index index.html;
        }
}

[root@static /]# vim /etc/nginx/conf.d/static2.conf        ##建立第二個虛擬主機
--------------------------------------------------------------------
server {
        listen 8090;
        server_name www.aa5.com;
        root /web/static2/;
        access_log /var/log/nginx/8090_access.log proxy;
        location / {
                root /web/static2/;
                index index.html;
        }
}

②修改nginx主配置文件,在http字段中添加一個自定義proxy日誌配置(名稱要和前面調用的格式名稱一致)

[root@static /]# vim /etc/nginx/nginx.conf
-----------------------------------------------------------
http {
...略
    log_format  proxy  '$http_x_forwarded_for - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
...略
}

③建立虛擬主機網站根目錄,更改目錄的屬主與屬組並生成測試首頁

[root@static /]# mkdir -p /web/static{1,2}                    ##建立兩個虛擬主機根目錄
[root@static /]# chown -R nginx:nginx /web/static{1,2}        ##更改兩個虛擬主機目錄屬主屬組爲nginx
[root@static /]# for i in `seq 2`;do echo "<h1>This is static$i Server</h1>" > /web/static$i/index.html;done    ##生成兩個測試主頁文件
[root@static /]# cat /web/static1/index.html 
<h1>This is static1 Server</h1>
[root@static /]# cat /web/static2/index.html 
<h1>This is static2 Server</h1>

④檢查nginx配置文件語法是否正確,將nginx服務加入到開機自啓動並啓動服務,使用客戶端訪問不一樣端口驗證靜態服務器是否訪問正常

[root@static /]# nginx -t                                             ##測試nginx配置文件語法是否正確
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@static /]# systemctl enable nginx                                ##將nginx服務加入到開機自啓動
[root@static /]# systemctl start nginx                                 ##啓動nginx服務
[root@static /]# ss -ntl | egrep "8080|8090"                           ##查看8080和8090端口是否監聽

image.png

image.png



nginx代理服務器配置

Nginx-master配置:

①安裝nginx服務軟件,安裝keepalived軟件包

[root@Nginx-master /]# yum install -y nginx keepalived

②修改nginx主配置文件,設置負載均衡upstream的動態服務器組和靜態服務器組

[root@Nginx-master /]# vim /etc/nginx/nginx.conf
------------------------------------------------------------------
http{
....省略
    upstream static {
        server www.aa5.com:8080;
        server www.aa5.com:8090;
    }
    upstream dong {     
        server www.aa3.com;
        server www.aa4.com;
    }
....省略
}

③新建反代虛擬主機文件,添加反代負載均衡和動靜分離參數

[root@Nginx-master /]# vim /etc/nginx/conf.d/proxy.conf
---------------------------------------------------------------------------
server {
        listen 80;
        server_name www.aa1.com;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        location ~* \.(png|jpg|jpeg|html|htm|js|css|xml)$ {
                proxy_pass http://static;
        }
        
        location / {
                proxy_pass http://dong;
        }
}

④測試nginx配置文件語法是否正確,將nginx服務加入到開機自啓並啓動nginx服務

[root@Nginx-master /]# nginx -t 
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@Nginx-master /]# systemctl enable nginx
[root@Nginx-master /]# systemctl start nginx
[root@Nginx-master /]# netstat -anpt | grep nginx

⑤配置keepalived實現代理服務器的高可用性,防止單點故障發生

[root@Nginx-master /]# cd /etc/keepalived/
[root@Nginx-master /]# cd /etc/keepalived/
[root@Nginx-master keepalived]# vim keepalived.conf
---------------------------------------------------------
global_defs {                    ##全局配置項
   router_id LVS_DEVEL1          ##設備名稱表示
}

vrrp_instance VI_1 {            ##熱備實例名稱
    state MASTER                ##此熱備實例的狀態(MASTER|BACKUP)
    interface eth0             ##VIP要綁定的網卡名稱
    virtual_router_id 50        ##設置VRID,這裏很是重要,相同的VRID爲一個組,他將決定多播的MAC地址
    priority 100                ##設置本節點的優先級,優先級高的成爲master得到vip
    advert_int 1                ##節點健康檢查間隔時間
    authentication {            ##設置認證
        auth_type PASS          ##設置認證的方式(PASS|AH)
        auth_pass putianhui     ##認證的密碼
    }
    virtual_ipaddress {
        192.168.2.254 dev eth0 label eth0:1    ##設置vip地址,並添加一個網卡別名
    }
}

⑥將keepalived服務加入到開機自啓並啓動服務,經過ifconfig命令查看vip是否配置成功

[root@Nginx-master /]# systemctl enable keepalived
[root@Nginx-master /]# systemctl start keepalived

image.png

⑦修改客戶端的hosts文件,添加www.aa1.com域名對應代理服務器的vip地址

image.png

⑧在lap動態服務器建立分別建立php測試頁面,客戶端分別訪問代理服務器index.html和index.php驗證動靜分離效果

[root@lap-A /]# vim /var/www/html/index.php
<?php
echo "tis is dynamic server 2.223"
?>

[root@lap-B /]# vim /var/www/html/index.php 
<?php
echo "tis is dynamic server 2.224"
?>

客戶端訪問代理服務器index.php驗證效果(index.php文件在靜態服務器上面沒有)

image.png

image.png

客戶端訪問代理服務器index.html靜態頁面效果(index.html只有8080虛擬主機和8090虛擬主機上面有)

image.png


image.png

經過驗證能夠看到以.php結尾的動態請求被輪循調度到2.223和2.224這兩臺動態服務器,客戶端訪問請求以.html結尾的被輪循調度到靜態服務器的8080和8090不一樣虛擬主機上;負載均衡和動靜分離配置完成



Nginx-backup配置:

因爲backup服務器和master配置基本相同,只是個別配置項的參數不一樣,這裏就只列出各配置文件的詳細配置信息

nginx主配置文件添加內容

[root@Nginx-backup /]# vim /etc/nginx/nginx.conf
------------------------------------------------------------------
http{
....省略
    upstream static {
        server www.aa5.com:8080;
        server www.aa5.com:8090;
    }
    upstream dong {     
        server www.aa3.com;
        server www.aa4.com;
    }
....省略
}

nginx虛擬主機配置文件添加內容

[root@Nginx-backup /]# vim /etc/nginx/conf.d/proxy.conf
--------------------------------------------------------------------
server {
        listen 80;
        server_name www.aa1.com;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        location ~* \.(png|jpg|jpeg|html|htm|js|css|xml)$ {
                proxy_pass http://static;
        }

        location / {
                proxy_pass http://dong;
        }
}

[root@Nginx-backup /]# systemctl enable nginx
[root@Nginx-backup /]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@Nginx-backup /]# systemctl start nginx

keepalived配置文件內容

[root@Nginx-backup /]# vim /etc/keepalived/keepalived.conf 
-----------------------------------------------------------------
global_defs {
   router_id LVS_DEVEL2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 50
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass putianhui
    }
    virtual_ipaddress {
        192.168.2.254 dev eth0 label eth0:1
    }
}


數據庫服務器配置:

①使用yum安裝mariadb服務,將其加入到開機自啓然並啓動服務

[root@database /]# yum install -y mariadb mariadb-server
[root@database /]# systemctl enable mariadb
[root@database /]# systemctl start mariadb

②建立ceshi數據庫,並新建用戶授予ceshi數據庫全部權限

[root@database /]# mysql
MariaDB [(none)]> create database ceshi;
MariaDB [(none)]> grant all on ceshi.* to 'ceshi'@'%' identified by 'putianhui';
MariaDB [(none)]> flush privileges;


安裝redis服務配置session會話

①下載redis安裝包到本地目錄,解壓並編譯安裝(注意須要安裝gcc編譯器),執行初始化安裝

[root@database /]# wget  
[root@database /]# tar xzvf redis-5.0.5.tar.gz 
[root@database /]# cd redis-5.0.5/
[root@database redis-5.0.5]# make && make install
[root@database redis-5.0.5]# ./utils/install_server.sh 
Welcome to the redis service installer
This script will help you easily set up a running redis server

Please select the redis port for this instance: [6379]             ##輸入要監聽的端口(默認是6379)
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf]     ##指定配置文件路徑
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log]     ##指定日誌存放路徑
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]     ##指定數據持久化存放目錄
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server]         ##指定服務可執行文件存放路徑
Selected config:
Port           : 6379
Config file    : /etc/redis/6379.conf
Log file       : /var/log/redis_6379.log
Data dir       : /var/lib/redis/6379
Executable     : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!

②修改redis主配置文件,將監聽的地址改成0.0.0.0全部

[root@database /]# vim /etc/redis/6379.conf 
-----------------------------------------------------
bind 0.0.0.0

③啓動redis服務,查看端口監聽

[root@database /]# /etc/init.d/redis_6379 start 
[root@database /]# netstat -anpt | grep redis 
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      11718/redis-server


安裝php-redis擴展插件(在httpd+php動態服務器上面安裝)

配置php動態服務器修改session緩存設置(默認session存在在php本地磁盤文件中)

①下載php-redis擴展插件包到httpd+php動態服務器本地目錄

[root@lap-A /]# wget https://pecl.php.net/get/redis-4.3.0.tgz

②安裝php-redis,首先解壓軟件包,切換到解壓後目錄,使用phpize(由php軟件包提供,若是沒有請安裝php)工具生成configure文件,編譯並編譯安裝(安裝完成模塊在

/usr/lib64/php/modules目錄下),(配置報錯請安裝gcc和php-devel)

[root@lap-A /]# tar xzvf redis-4.3.0.tgz 
[root@lap-A /]# cd redis-4.3.0/
[root@lap-A redis-4.3.0]# phpize 
Configuring for:
PHP Api Version:         20100412
Zend Module Api No:      20100525
Zend Extension Api No:   220100525
[root@lap-A redis-4.3.0]# ./configure --with-php-config=/usr/bin/php-config
[root@lap-A redis-4.3.0]#  make && make install
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
Installing shared extensions:     /usr/lib64/php/modules/

③修改httpd和php的配置信息,使其支持redis模塊,並指定session到redis服務的地址

[root@lap-A /]# vim /etc/php.ini 
--------------------------------添加和修改如下內容--------------------------------
extension_dir="/usr/lib64/php/modules/"        ##默認沒有在適當位置添加
extension=redis.so                             ##默認沒有在適當位置添加
session.save_handler = redis                   ##默認有,查找修改成redis
session.save_path = "tcp://192.168.2.226:6379"   ##默認有,查找修改成redis服務器地址和端口號

[root@lap-A /]# vim /etc/httpd/conf.d/php.conf 
-----------------------------在最後兩行修改成如下內容-------------------------------
php_value session.save_handler "redis"
php_value session.save_path    "tcp://192.168.2.226:6379"

④重啓httpd服務,單獨訪問主機的info.php頁面查看redis模塊是否加載成功,session會話保存地址是否配置成功

[root@lap-A /]# systemctl restart httpd

image.png

image.png

⑤上傳phpMyAdmin源碼包到動態服務器根目錄,解壓後將網站源碼複製到httpd網站根目錄,修改網站源碼開啓自定義數據庫服務器登陸

[root@lap-A /]# unzip phpMyAdmin-4.0.4-all-languages.zip 
[root@lap-A /]# cp -rf phpMyAdmin-4.0.4-all-languages/* /var/www/html/
[root@lap-A /]# vim /var/www/html/libraries/config.default.php 
---------------------------------------------------------------
$cfg['AllowArbitraryServer'] = false;        ##修改前
$cfg['AllowArbitraryServer'] = true;         ##修改後

⑥單獨訪問動態網站域名(不經過代理訪問),測試phpMyadmin的session寫入redis是否正常

image.png

[root@database /]# redis-cli -h 192.168.2.226
192.168.2.226:6379> KEYS *
1) "PHPREDIS_SESSION:h03uj561td63t40vicb1e07e12esaoab"
2) "a"
192.168.2.226:6379>

⑦在另一臺動態服務器先不安裝redis插件(默認將session保存到服務器本地),而後上傳phpMyadmin源碼包到網站根目錄,訪問代理服務器域名登陸測試

[root@lap-B /]# unzip phpMyAdmin-4.0.4-all-languages.zip 
[root@lap-B /]# cp -rf phpMyAdmin-4.0.4-all-languages/* /var/www/html/
[root@lap-B /]# vim /var/www/html/libraries/config.default.php 
---------------------------------------------------------------
$cfg['AllowArbitraryServer'] = false;        ##修改前
$cfg['AllowArbitraryServer'] = true;         ##修改後

訪問代理服務器後發現圖片沒法加載(由於作了動靜分離,將phpMYadmin源碼包上傳一份到靜態服務器的8080和8090網站根目錄各一份便可)

image.png

[root@static /]# unzip phpMyAdmin-4.0.4-all-languages.zip 
[root@static /]# cp -rf phpMyAdmin-4.0.4-all-languages/* /web/static1/
[root@static /]# cp -rf phpMyAdmin-4.0.4-all-languages/* /web/static2/

再次訪問或刷新頁面便可顯示圖片等靜態資源

image.png

訪問代理服務器登陸測試會話信息(發現一點登陸就跳轉到新的空白頁面;是由於第一次處理請求的session沒有保存到redis服務器,點擊執行後調度器將請求調度到一臺新的動態服務器進行處理,此服務器沒有找到對應的session信息,全部就要從新登陸)

image.png

⑦另外一臺動態服務器也是安裝php-redis擴展插件,而後配置php和httpd加載redis模塊,而後配置redis服務器地址(我這裏就不重複寫了,自行配置);


最終的結果驗證:

驗證代理高可用性:關閉nginx-master的keepalived服務和nginx服務,客戶端從新訪問www.aa1.com可正常訪問(此時是nginx-backup提供服務)

驗證動靜分離:將靜態服務器上的網站源碼刪除,客戶端從新訪問www.aa1.com可正常訪問(圖片、js、css等靜態資源沒法加載)

image.png

驗證負載均衡:關閉其中一個動態服務器,客戶端從新訪問網站(可正常訪問),將被關閉httpd啓動,而後關閉另一臺客戶端從新訪問(可正常訪問)

驗證session共享:將兩臺動態服務器都啓動服務,客戶端訪問網站並登錄成功測試;無限操做,不會提示session過時或無限登錄


遇到的一些坑以及解決辦法

問題一:緣由是沒有安裝php-devel軟件包,使用yum安裝一下就能夠了

[root@Nginx-backup redis-4.3.0]# phpize 
Can't find PHP headers in /usr/include/php
The php-devel package is required for use of this command.

問題二:各服務器時間同步的問題,遇到各類奇葩的問題都是由於時間同步,必定要記住多主機搭建環境首先確保多機之間的時間要保持一致

相關文章
相關標籤/搜索