实战一:实现LNMP与Keepalived、HAProxy做反向代理
框架图:
实现原理:
1、当A用户访问网站时,此时需要经过防火墙,防火墙将用户访问的IP地址处理后,如果允许访问,则就访问到HAroxy作为转发的反向代理服务器,用户通过访问VIP地址,然后转发到后端nginx和php服务器上;
2、后端服务器需要最少有两台备用,访问的数据要一致,当一台web服务器宕机后,另一台还能正常工作;
3、Keepalived作为对HAProxy健康性检查,一般最少有两台主机,作为主从备用,如果HAProxy、keepalived、nginx其中之一宕机后,就将VIP地址漂移到另一台HAProxy主机上;
4、HAProxy也会通过VIP地址及3306端口绑定,转发到后端mysql数据库上。
1、修改A主机的keepalived和HAProxy的配置文件
修改A主机的keepalived配置文件:vim /etc/keepalived/keepalived.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
| global_defs {
notification_email {
root@localhost 收邮件地址
}
notification_email_from root@localhost 发邮件地址
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id ka1
vrrp_skip_check_adv_addr
vrrp_iptables
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_haproxy {
script /etc/keepalived/chk_haproxy .sh 添加一个脚本检测机制,检测haproxy是否宕机,宕机时直接降级,VIP就跳转至从服务器上
interval 2 时间间隔2秒
weight -50 优先级减50
fall 3
rise 5
timeout 2
}
vrrp_instance VI_1 {
state MASTER 为主节点
interface ens33
virtual_router_id 50 路由ID要和从节点一致
priority 100 优先级100
unicast_src_ip 192.168.37.7 绑定单播地址,本地的IPD地址
unicast_peer {
192.168.37.17 目标从节点的IP地址
}
advert_int 2
authentication {
auth_type pass
auth_pass 123456
}
virtual_ipaddress {
192.168.37.100 dev ens33 label ens33:1 绑定VIP地址
}
track_script {
chk_haproxy 调用上面检测脚本的命名
}
}
|
在/etc/keepalived目录下创建一个检测haproxy状态的脚本,用来调用。
1
2
3
| [root@rs2keepalived] #cat chk_haproxy.sh
#!/bin/bash
killall -0 haproxy 发送信号,检测haproxy是否存活
|
修改A主机的haproxy配置文件:vim /etc/haproxy/haproxy.cfg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
| global
maxconn 100000
chroot /usr/local/haproxy
stats socket /var/lib/haproxy/haproxy .sock1 mode 600 level admin process 1
stats socket /var/lib/haproxy/haproxy .sock2 mode 600 level admin process 2
user haproxy
group haproxy
daemon
nbproc 2
cpu-map 1 0
cpu-map 2 1
#cpu-map 3 2
#cpu-map 4 3
pidfile /run/haproxy .pid
log 127.0.0.1 local3 info
defaults
option http-keep-alive
option forwardfor
maxconn 100000
mode http
timeout connect 300000ms
timeout client 300000ms
timeout server 300000ms
listen stats
bind :9527
stats enable
stats hide-version
stats uri /haproxy-status
stats realm HAPorxy\Stats\Page
stats auth haadmin:123456
stats auth admin:123456
stats refresh 30s
stats admin if TRUE
listen web_port
bind 0.0.0.0:80
mode http
log global
server web1 127.0.0.1:80 check inter 3000 fall 2 rise 5
#官网业务访问入口=====================================
listen WEB_PORT_80
bind 0.0.0.0:80 监控后端服务端口
mode tcp
server web1 192.168.37.27:80 check inter 3000 fall 3 rise 5
server web2 192.168.37.37:80 check inter 3000 fall 3 rise 5
listen MySQL_PORT
bind 0.0.0.0:3306 在haproxy中监测数据库端口
mode tcp
server web1 192.168.37.47:3306 cookie web-47 check inter 3000 fall 3 rise 5
|
2、修改B主机的Keepalived和HAProxy配置文件
修改B主机的keepalived配置文件:vim /etc/keepalived/keepalived.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
| global_defs {
notification_email {
root@localhost
}
notification_email_from root@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id ka2
vrrp_skip_check_adv_addr
vrrp_iptables
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_haproxy {
script /etc/keepalived/chk_haproxy .sh
interval 2
weight -50
fall 3
rise 5
timeout 2
}
vrrp_instance VI_1 {
state BACKUP 作为从节点
interface ens33
virtual_router_id 50
priority 80
unicast_src_ip 192.168.37.17
unicast_peer {
192.168.37.7
}
advert_int 2
authentication {
auth_type pass
}
virtual_ipaddress {
192.168.37.100 dev ens33 label ens33:1
}
track_script {
chk_haproxy
}
}
|
在/etc/keepalived目录下创建一个检测haproxy状态的脚本,用来调用。
1
2
3
| [root@rs2keepalived] #cat chk_haproxy.sh
#!/bin/bash
killall -0 haproxy 发送信号,检测haproxy是否存活
|
修改B主机的haproxy配置文件:vim /etc/haproxy/haproxy.cfg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
| global
maxconn 100000
chroot /usr/local/haproxy
stats socket /var/lib/haproxy/haproxy .sock1 mode 600 level admin process 1
stats socket /var/lib/haproxy/haproxy .sock2 mode 600 level admin process 2
user haproxy
group haproxy
daemon
nbproc 2
cpu-map 1 0
cpu-map 2 1
#cpu-map 3 2
#cpu-map 4 3
pidfile /run/haproxy .pid
log 127.0.0.1 local3 info
defaults
option http-keep-alive
option forwardfor
maxconn 100000
mode http
timeout connect 300000ms
timeout client 300000ms
timeout server 300000ms
listen stats
bind :9527
stats enable
stats hide-version
stats uri /haproxy-status
stats realm HAPorxy\Stats\Page
stats auth haadmin:123456
stats auth admin:123456
stats refresh 30s
stats admin if TRUE
listen web_port
bind 0.0.0.0:80
mode http
log global
server web1 127.0.0.1:80 check inter 3000 fall 2 rise 5
#官网业务访问入口=====================================
listen WEB_PORT_80
bind 0.0.0.0:80
mode tcp
server web1 192.168.37.27:80 check inter 3000 fall 3 rise 5
server web2 192.168.37.37:80 check inter 3000 fall 3 rise 5
listen MySQL_PORT
bind 0.0.0.0:3306
mode tcp
server web1 192.168.37.47:3306 cookie web-47 check inter 3000 fall 3 rise 5
|
3、在C主机编译安装nginx软件(1.14.2版本)
官网下载地址:http://nginx.org/en/download.html
1、下载好的nginx源码包进行解压
1
| [root@centos27src] #tar -xvf nginx-1.14.2.tar.gz
|
2、安装nginx相关的依赖包
1
2
3
4
| yum install -y vim lrzsz tree screen psmisc lsof tcpdump wget ntpdate \
gcc gcc -c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel \
net-tools iotop bc zip unzip zlib-devel bash -completion nfs-utils automake libxml2 \
libxml2-devel libxslt libxslt-devel perl perl-ExtUtils-Embed
|
3、然后切换到nginx目录下,指定源码编译安装的路径
1
2
3
4
5
6
7
8
9
10
11
12
| . /configure --prefix= /apps/nginx \
--user=www \
--group=www \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
|
4、最后进行make编译
1
| [root@centos27nginx-1.14.2] #make -j 2 && make install
|
5、创建一个nginx调用目录
1
2
3
4
5
| [root@centos27nginx-1.14.2] #mkdir /data/nginx/wordpress -p
[root@centos27nginx-1.14.2] #vim /data/nginx/wordpress/index.php 创建一个index.php测试页面
phpinfo();
?>
|
6、创建一个server目录,配置nginx文件,指定nginx测试页面路径,调用include函数
1
2
3
| [root@centos27server] #cd /apps/nginx/conf
[root@centos27conf] #mkdir server
[root@centos27conf] #vim test.conf
|
配置nginx文件:vim test.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| server {
listen 80;
server_name www.magedu.net;
location / {
root /data/nginx/wordpress ;
index index.php index.html index.htm;
}
location ~ \.php$ {
root /data/nginx/wordpress ;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
|
在nginx主配置文件中调用test.conf配置文件
1
2
3
4
| [root@centos27conf] #vim /apps/nginx/conf/nginx.conf
include /apps/nginx/conf/server/ *.conf;
}
|
7、检查nginx语法是否正确,成功后就启动nginx服务
1
2
3
4
5
| [root@centos27conf] #/apps/nginx/sbin/nginx -t
nginx: the configuration file /apps/nginx/conf/nginx .conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx .conf test is successful 已经OK,成功
[root@centos27conf] #ln -s /apps/nginx/sbin/nginx /usr/sbin 创建软链接
[root@centos27conf] #nginx 启动nginx服务
|
4、在C主机编译安装php软件(5.0以上版本)
1、在C主机解压php压缩包并安装相关的依赖包
1
2
3
| [root@centos27php-7.1.30] #cd /usr/local/src
[root@centos27php-7.1.30] #tar -vxf php-7.1.30.tar.gz
[root@centos27php-7.1.30] #cd php-7.1.30/
|
安装开发包组
1
| [root@centos7 ~] # yum groupinstall "development tools"
|
安装相关依赖包
1
2
3
4
| [root@centos7 ~] # yum -y install wget vim pcre pcre-devel openssl openssl-devel libicudevel gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype \
freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel ncurses ncurses-devel curl curl-devel krb5-devel libidn libidn-devel openldap \
openldap-devel nss_ldap jemalloc-devel cmake boost-devel bison automake libevent libevent-devel gd gd-devel libtool* libmcrypt libmcrypt-devel mcrypt mhash libxslt \
libxslt-devel readline readline-devel gmp gmp-devel libcurl libcurl-devel openjpeg-devel php-mysql
|
2、切换到解压后的php目录下,进行源码编译
1
2
3
4
5
6
7
| . /configure --prefix= /apps/php -- enable -fpm --with-fpm-user=www \
--with-fpm-group=www --with-pear --with-curl --with-png- dir --with-freetype- dir \
--with-iconv --with-mhash --with-zlib --with-xmlrpc --with-xsl --with-openssl \
--with-mysqli --with-pdo-mysql --disable-debug -- enable -zip -- enable -sockets \
-- enable -soap -- enable -inline-optimization -- enable -xml -- enable - ftp -- enable -exif \
-- enable -wddx -- enable -bcmath -- enable -calendar -- enable -shmop -- enable -dba \
-- enable -sysvsem -- enable -sysvshm -- enable -sysvmsg
|
3、指定安装包路径
1
| [root@centos27php-7.1.30] #make -j 2 && make install
|
4、进入php的www程序目录,并将里边的用户名和组名修改为www。
1
2
3
4
5
| [root@centos27php-fpm.d] #cd /apps/php/etc/php-fpm.d
[root@centos27php-fpm.d] #cp www.conf.default www.conf
[root@centos27php-fpm.d] #vim www.conf 修改启动用户账号
user www
group www
|
5、创建一个系统账号,复制php.ini-production文件到配置文件目录下,并起名为php.ini
1
2
| [root@centos27php-fpm.d] #useradd www -u 2019 -s /sbin/nologin 此UID要和D主机的php程序的用户名及UID要一致。
[root@centos27etc] #cp /usr/local/src/php-7.1.30/php.ini-production /apps/php/etc/php.ini
|
6、切换到配置文件目录下,将php默认主程序改名。
1
2
| [root@centos27etc] #cd /apps/php/etc
[root@centos27etc] #cp php-fpm.conf.default php-fpm.conf
|
7、启动php-fpm程序
1
| [root@centos27etc] #/apps/php/sbin/php-fpm -c /apps/php/etc/php.ini
|
查看php状态,此时php的9000端口已经打开。
在C主机开始配置wordpress文件
1、将wordpress包下载下来并存放在指定的目录
1
2
| [root@centos27wordpress] #cd /data/nginx/wordpress
[root@centos27wordpress] #rz
|
2、解压wordpress压缩包,并将wordpress目录、压缩包及之前测试的index.php文件移动到其他地方
1
2
3
4
5
6
7
8
9
| [root@centos27wordpress] #mv index.php wordpress-5.0.1-zh_CN.tar.gz /opt/ 将测试的文件及压缩包移动到opt目录
[root@centos27wordpress] #ls
wordpress
[root@centos27wordpress] #mv wordpress/* . 将wordpress目录移动到当前目录
[root@centos27wordpress] #ls
index.php wordpress wp-blog-header.php wp-content wp-links-opml.php wp-mail.php wp-trackback.php
license.txt wp-activate.php wp-comments-post.php wp- cron .php wp-load.php wp-settings.php xmlrpc.php
readme.html wp-admin wp-config-sample.php wp-includes wp-login.php wp-signup.php
[root@centos27wordpress] #mv wordpress /opt 将wordpress空目录移走
|
3、将wordpress配置文件进行修改,关联到数据库。
1
2
| [root@centos27wordpress] #cp wp-config-sample.php wp-config.php
[root@centos27wordpress] #chown -R www.www . 将此目录及以下的文件权限修改为www,否则无法上传图片
|
修改wordpress配置文件,关联到数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| [root@centos27wordpress] #vim wp-config.php
define( 'DB_NAME' , 'wordpress' );
/** MySQL数据库用户名 */
define( 'DB_USER' , 'wordpress' );
/** MySQL数据库密码 */
define( 'DB_PASSWORD' , 'centos' );
/** MySQL主机 */
define( 'DB_HOST' , '192.168.37.100' ); 写上VIP的地址。
/** 创建数据表时默认的文字编码 */
define( 'DB_CHARSET' , 'utf8' );
|
访问以下网站生成随机数,将数据路内容修改也可以。
5、在D主机编译安装nginx软件
官网下载地址:http://nginx.org/en/download.html
1、下载好的nginx源码包进行解压
1
| [root@centos27src] #tar -xvf nginx-1.14.2.tar.gz
|
2、安装nginx相关的依赖包
1
2
3
4
| yum install -y vim lrzsz tree screen psmisc lsof tcpdump wget ntpdate \
gcc gcc -c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel \
net-tools iotop bc zip unzip zlib-devel bash -completion nfs-utils automake libxml2 \
libxml2-devel libxslt libxslt-devel perl perl-ExtUtils-Embed
|
3、然后切换到nginx目录下,指定源码编译安装的路径
1
2
3
4
5
6
7
8
9
10
11
12
| . /configure --prefix= /apps/nginx \
--user=www \
--group=www \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
|
4、最后进行make编译
1
| [root@centos27nginx-1.14.2] #make -j 2 && make install
|
5、创建一个nginx调用目录
1
2
3
4
5
| [root@centos27nginx-1.14.2] #mkdir /data/nginx/wordpress -p
[root@centos27nginx-1.14.2] #vim /data/nginx/wordpress/index.php 创建一个index.php测试页面
phpinfo();
?>
|
6、创建一个server目录,配置nginx文件,指定nginx测试页面路径,调用include函数
1
2
3
| [root@centos27server] #cd /apps/nginx/conf
[root@centos27conf] #mkdir server
[root@centos27conf] #vim test.conf
|
配置nginx文件:vim test.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| server {
listen 80;
server_name www.magedu.net;
location / {
root /data/nginx/wordpress ;
index index.php index.html index.htm;
}
location ~ \.php$ {
root /data/nginx/wordpress ;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
|
在nginx主配置文件中调用test.conf配置文件
1
2
3
4
| [root@centos27conf] #vim /apps/nginx/conf/nginx.conf
user www; 用户名称和php名称一致
include /apps/nginx/conf/server/ *.conf;
}
|
7、检查nginx语法是否正确,成功后就启动nginx服务
1
2
3
4
| [root@centos27conf] #/apps/nginx/sbin/nginx -t
nginx: the configuration file /apps/nginx/conf/nginx .conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx .conf test is successful 已经OK,成功
[root@centos27conf] #/apps/nginx/sbin/nginx 启动nginx服务
|
6、D主机编译安装php软件(5.0以上版本)
1、在D主机解压php压缩包并安装相关的依赖包
1
2
3
| [root@centos27php-7.1.30] #cd /usr/local/src
[root@centos27php-7.1.30] #tar -vxf php-7.1.30.tar.gz
[root@centos27php-7.1.30] #cd php-7.1.30/
|
安装开发包组
1
| [root@centos7 ~] # yum groupinstall "development tools"
|
安装相关依赖包
1
2
3
4
| [root@centos7 ~] # yum -y install wget vim pcre pcre-devel openssl openssl-devel libicudevel gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype \
freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel ncurses ncurses-devel curl curl-devel krb5-devel libidn libidn-devel openldap \
openldap-devel nss_ldap jemalloc-devel cmake boost-devel bison automake libevent libevent-devel gd gd-devel libtool* libmcrypt libmcrypt-devel mcrypt mhash libxslt \
libxslt-devel readline readline-devel gmp gmp-devel libcurl libcurl-devel openjpeg-devel php-mysql
|
2、切换到解压后的php目录下,进行源码编译
1
2
3
4
5
6
7
| . /configure --prefix= /apps/php -- enable -fpm --with-fpm-user=www \
--with-fpm-group=www --with-pear --with-curl --with-png- dir --with-freetype- dir \
--with-iconv --with-mhash --with-zlib --with-xmlrpc --with-xsl --with-openssl \
--with-mysqli --with-pdo-mysql --disable-debug -- enable -zip -- enable -sockets \
-- enable -soap -- enable -inline-optimization -- enable -xml -- enable - ftp -- enable -exif \
-- enable -wddx -- enable -bcmath -- enable -calendar -- enable -shmop -- enable -dba \
-- enable -sysvsem -- enable -sysvshm -- enable -sysvmsg
|
3、指定安装包路径
1
| [root@centos27php-7.1.30] #make -j 2 && make install
|
在D主机开始配置wordpress文件
1、将wordpress包下载下来并存放在指定的目录
1
2
| [root@centos37wordpress] #cd /data/nginx/wordpress
[root@centos37wordpress] #rz
|
2、解压wordpress压缩包,并将wordpress目录、压缩包及之前测试的index.php文件移动到其他地方
1
2
3
4
5
6
7
8
9
| [root@centos37wordpress] #mv index.php wordpress-5.0.1-zh_CN.tar.gz /opt/ 将测试的文件及压缩包移动到opt目录
[root@centos37wordpress] #ls
wordpress
[root@centos37wordpress] #mv wordpress/* . 将wordpress目录移动到当前目录
[root@centos37wordpress] #ls
index.php wordpress wp-blog-header.php wp-content wp-links-opml.php wp-mail.php wp-trackback.php
license.txt wp-activate.php wp-comments-post.php wp- cron .php wp-load.php wp-settings.php xmlrpc.php
readme.html wp-admin wp-config-sample.php wp-includes wp-login.php wp-signup.php
[root@centos37wordpress] #mv wordpress /opt 将wordpress空目录移走
|
3、将wordpress配置文件进行修改,关联到数据库。
1
2
| [root@centos27wordpress] #cp wp-config-sample.php wp-config.php
[root@centos27wordpress] #chown -R www.www . 将此目录及以下的文件权限修改为www,否则无法上传图片
|
修改wordpress配置文件,关联到数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| [root@centos37wordpress] #vim wp-config.php
define( 'DB_NAME' , 'wordpress' );
/** MySQL数据库用户名 */
define( 'DB_USER' , 'wordpress' );
/** MySQL数据库密码 */
define( 'DB_PASSWORD' , 'centos' );
/** MySQL主机 */
define( 'DB_HOST' , '192.168.37.100' ); 写上VIP的地址。
/** 创建数据表时默认的文字编码 */
define( 'DB_CHARSET' , 'utf8' );
|
访问以下网站生成随机数,将数据路内容修改也可以。
7、后端E主机编译安装二进制mysql数据库
执行此脚本可以编译安装完成二进制数据库。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
| [root@routersrc] #cd /usr/local/src 切换到此目录下
[root@routersrc] #tar -xvf mysql-5.6.34-onekey-install.tar.gz 解压数据库文件
[root@routersrc] #cat mysql-install.sh
#!/bin/bash
DIR=` pwd `
NAME= "mysql-5.6.34-linux-glibc2.5-x86_64.tar.gz"
FULL_NAME=${DIR}/${NAME}
DATA_DIR= "/data/mysql"
yum install vim gcc gcc -c++ wget autoconf net-tools lrzsz iotop lsof iotop bash -completion -y
yum install curl policycoreutils openssh-server openssh-clients postfix -y
if [ -f ${FULL_NAME} ]; then
echo "安装文件存在"
else
echo "安装文件不存在"
exit 3
fi
if [ -h /usr/local/mysql ]; then
echo "Mysql 已经安装"
exit 3
else
tar xvf ${FULL_NAME} -C /usr/local/src
ln -sv /usr/local/src/mysql-5 .6.34-linux-glibc2.5-x86_64 /usr/local/mysql
if id mysql; then
echo "mysql 用户已经存在,跳过创建用户过程"
fi
useradd mysql -s /sbin/nologin
if id mysql; then
chown -R mysql.mysql /usr/local/mysql/ * -R
if [ ! -d /data/mysql ]; then
mkdir -pv /data/mysql && chown -R mysql.mysql /data -R
/usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir= /data/mysql --basedir= /usr/local/mysql/
cp /usr/local/src/mysql-5 .6.34-linux-glibc2.5-x86_64 /support-files/mysql .server /etc/init .d /mysqld
chmod a+x /etc/init .d /mysqld
cp ${DIR} /my .cnf /etc/my .cnf
ln -sv /usr/local/mysql/bin/mysql /usr/bin/mysql
/etc/init .d /mysqld start
else
echo "MySQL数据目录已经存在,"
exit 3
fi
fi
fi
|
执行安装数据库脚本:
1
| [root@routersrc] #bash mysql-install.sh
|
创建数据库,并创建一个数据库用户名及授权
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| [root@routersrc] #mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.34 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> create database wordpress; 创建数据库
Query OK, 1 row affected (0.00 sec)
MySQL [(none)]> grant all on wordpress.* to "wordpress" @ '192.168.37.%' identified by 'centos' ; 创建数据库名称
Query OK, 0 rows affected (0.01 sec)
MySQL [(none)]> flush privileges; 刷新数据库
Query OK, 0 rows affected (0.00 sec)
|
在后端E主机安装nfs共享包
1、安装nfs-utils包
1
| [root@routersrc] #yum install nfs-utils -y
|
2、新建一个共享目录,并修改配置文件,将新建的目录共享出来,授予都写权限。
1
| [root@routersrc] #mkdir /nfsdata/wordpress -p
|
修改配置文件,将目录共享
1
2
| [root@routersrc] #vim /etc/exports
/nfsdata/wordpress *(insecure,rw,async,no_root_squash) 避免客户端连接此nfs共享的目录是存在端口大于1024而被拒绝,需要加上insecure选项
|
3、启动nfs服务器,并设置为开机启动
1
2
| [root@routersrc] #systemctl start nfs 如果需要重启nfs,最好是重新加载,避免重启带来重新注册端口。
[root@routersrc] #systemctl enable nfs
|
在E主机安装完成nfs之后,我们需要在A或B主机进行验证一下此nfs文件是否可以挂载,是否可以看到此目录。
在A主机安装nfs-utils包,然后挂载后端E主机的nfs路径,此时可以看到目录文件即可。
1
2
3
4
5
6
7
| [root@centos7~] #yum install nfs-utils -y
[root@centos7~] #showmount -e 192.168.37.47 查看nfs共享的目录
Export list for 192.168.37.47:
/nfsdata/wordpress * 可以查看到nfs共享的目录
[root@centos7~] #mount -t nfs 192.168.37.47:/nfsdata/wordpress /mnt/ 测试挂载成功即可
[root@centos_17~] #umount /mnt 取消挂载
|
最后查看wordpress搭建效果
在本地windows的hosts文件中对后端服务器的IP地址进行域名解析
访问网页,此时就可以访问成功,并进行登录测试。
此时就可以创建自己的博客内容:
由于后端有两个nginx 服务器,此时宕机一个服务器,还是可以在后端进行服务,此时将一个nginx服务器宕机,然后在另一台主机插入图片。
此时,再开启宕机的nginx服务器,就不会查看到另一台主机插入的图片,为了让每个web服务器提供的内容都一致,我们就需要将nginx服务器内容进行挂载在缓存服务器上。
将数据最全的web服务器进行挂载在nfs缓存服务器上
原理:为了让每个web服务器提供的内容都一致,我们就需要将nginx服务器内容进行挂载在缓存服务器上,共享在nfs服务器上的文件内容就会一致。
1、切换到之前上传图片的目录下,并对图片进行备份
1
2
3
4
5
6
7
| [root@ka2wordpress] #cd /data/nginx/wordpress/wp-content/uploads/
[root@ka2uploads] #ls
2019
[root@ka2uploads] #cd 2019/12/
[root@ka212] #ls
26e07453fd1af76d.jpg 6d4d71f6da71f8a8.jpg
[root@ka212] #cp -p * /opt
|
2、在挂载nfs服务器之前,需要将web服务器(D主机)停止。
1
2
3
| [root@ka212] #nginx -s stop 停止nginx服务进行挂载
[root@ka2uploads] #mount -t nfs 192.168.37.47:/nfsdata/wordpress /data/nginx/wordpress/wp-content/uploads/ 由于挂载之后就会没有之前的图片数据
[root@ka2rh] #cp -p /opt/ /data/nginx/wordpress/wp-content/uploads 此时需要将备份在opt目录下的数据进行复制到upload目录下。
|
3、此时一台web服务器(D主机)的内容挂载在后端nfs服务器上,将另一台主机的nginx服务(C主机)停止,也进行挂载
1
2
| [root@lvs112] #nginx -s stop
[root@lvs112] #mount -t nfs 192.168.37.47:/nfsdata/wordpress /data/nginx/wordpress/wp-content/uploads/
|
开始测试效果:
将第一台挂载的web服务器(D主机)停止,查看此时另一台web服务器(C主机)是否可以同时访问一样的内容,此时可以看到,可以访问到两张图片。
1
2
| [root@ka2wp-content] #nginx -s stop 停止掉图片最全的nginx服务(第一台挂载的服务器D主机)
[root@lvs112] #nginx 开启C主机的nginx服务器
|
将hosts文件写成VIP地址,让HAProxy服务器做IP地址调度转发,此时访问的网页也是正常访问。
实战二:实现LNMP与LVS-DR模式负载均衡调度转发功能
框架图:
实现原理:
1、当A用户访问网站时,此时需要经过防火墙,防火墙将用户访问的IP地址处理后,如果允许访问,则就访问到LVS作为转发的反向代理服务器,用户通过访问VIP地址,然后转发到后端nginx和php服务器上;
2、后端服务器需要最少有两台备用,访问的数据要一致,当一台web服务器宕机后,另一台还能正常工作;
3、Keepalived作为对后端nginx服务器健康性检查,一般最少有两台Keepalived主机,作为主从备用,如果一台keepalived或者nginx宕机后,就将VIP地址漂移到另一台keepalived主机上。
4、LVS通过VIP地址对后端nginx服务器进行转发,作为负载均衡效果。
1、在A主机上配置keepalived和LVS规则
1、在A主机配置keepalived和LVS规则:vim /etc/keepalived/keepalived.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
| global_defs {
notification_email {
root@localhost
}
notification_email_from root@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id ka1
vrrp_skip_check_adv_addr
vrrp_iptables
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 50
priority 100
unicast_src_ip 192.168.37.7
unicast_peer {
192.168.37.17
}
advert_int 2
authentication {
auth_type pass
auth_pass 123456
}
virtual_ipaddress {
192.168.37.100 dev ens33 label ens33:1 添加VIP地址
}
}
virtual_server 192.168.37.100 80 { VIP地址,调度到后端服务器
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.37.27 80 { 后端服务器1
weight 1
TCP_CHECK { TCP模式
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.37.37 80 { 后端服务器2
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
|
查看规则生效情况:可以看到当前LVS配置TCP模式,指定VIP地址做转发(192.168.37.100),后端服务器提提供服务。
1
2
3
4
5
6
7
| [root@rs2keepalived] #ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.37.100:80 rr
-> 192.168.37.27:80 Route 1 0 0
-> 192.168.37.37:80 Route 1 0 0
|
2、在B主机上配置keepalived和LVS规则
在B主机上配置文件:vim /etc/keepalived/keepalived.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
| global_defs {
notification_email {
root@localhost
}
notification_email_from root@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id ka2
vrrp_skip_check_adv_addr
vrrp_iptables
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 50
priority 80
unicast_src_ip 192.168.37.17
unicast_peer {
192.168.37.7
}
advert_int 2
authentication {
auth_type pass
auth_pass 123456
}
virtual_ipaddress {
192.168.37.100 dev ens33 label ens33:1
}
}
virtual_server 192.168.37.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.37.27 80 {
weight 1
TCP_CHECK{
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.37.37 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
|
3、在后端服务器C绑定VIP地址到lo回环网卡上
执行以下脚本,可以将VIP地址绑定在lo回环网卡上
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| [root@lvs1~] #cat lvs_dr_rs.sh
#!/bin/bash
#Author:wangxiaochun
#Date:2017-08-13
vip=192.168.37.100
mask= '255.255.255.255'
dev=lo:1
rpm -q httpd &> /dev/null || yum -y install httpd &> /dev/null
service httpd start &> /dev/null && echo "The httpd Server is Ready!"
echo "
`hostname`
" > /var/www/html/index .html
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $dev $vip netmask $mask #broadcast $vip up
#route add -host $vip dev $dev
echo "The RS Server is Ready!"
;;
stop)
ifconfig $dev down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "The RS Server is Canceled!"
;;
*)
echo "Usage: $(basename $0) start|stop"
exit 1
;;
esac
|
执行脚本:
1
| [root@lvs1~] #bash lvs_dr_rs.sh start
|
查看绑定结果:
4、在后端服务器D绑定VIP地址到lo回环网卡上
执行以下脚本,可以将VIP地址绑定在lo回环网卡上
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| [root@lvs1~] #cat lvs_dr_rs.sh
#!/bin/bash
#Author:wangxiaochun
#Date:2017-08-13
vip=192.168.37.100
mask= '255.255.255.255'
dev=lo:1
rpm -q httpd &> /dev/null || yum -y install httpd &> /dev/null
service httpd start &> /dev/null && echo "The httpd Server is Ready!"
echo "
`hostname`
" > /var/www/html/index .html
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $dev $vip netmask $mask #broadcast $vip up
#route add -host $vip dev $dev
echo "The RS Server is Ready!"
;;
stop)
ifconfig $dev down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "The RS Server is Canceled!"
;;
*)
echo "Usage: $(basename $0) start|stop"
exit 1
;;
esac
|
执行脚本:
1
| [root@lvs1~] #bash lvs_dr_rs.sh start
|
查看绑定结果:
执行以下脚本,可以将VIP地址绑定在lo回环网卡上
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| [root@lvs1~] #cat lvs_dr_rs.sh
#!/bin/bash
#Author:wangxiaochun
#Date:2017-08-13
vip=192.168.37.100
mask= '255.255.255.255'
dev=lo:1
rpm -q httpd &> /dev/null || yum -y install httpd &> /dev/null
service httpd start &> /dev/null && echo "The httpd Server is Ready!"
echo "
`hostname`
" > /var/www/html/index .html
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $dev $vip netmask $mask #broadcast $vip up
#route add -host $vip dev $dev
echo "The RS Server is Ready!"
;;
stop)
ifconfig $dev down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0> /proc/sys/net/ipv4/conf/all/arp_announce
echo 0> /proc/sys/net/ipv4/conf/lo/arp_announce
echo "The RS Server is Canceled!"
;;
*)
echo "Usage: $(basename $0) start|stop"
exit 1
;;
esac
|
执行脚本:
1
| [root@lvs1~] #bash lvs_dr_rs.sh start
|
查看绑定结果:
nginx、php、mysql、以及后端存储nfs服务器,在实现haproxy时已搭建,详情看上面操作。
只需要将后端nginx服务器C主机和D主机进行修改关联数据库的IP地址,有几个后端服务器,就需要修改几个IP地址。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| [root@centos37wordpress] #cd /data/nginx/wordpress/
[root@centos37wordpress] #vim wp-config.php
/** WordPress数据库的名称 */
define( 'DB_NAME' , 'wordpress' );
/** MySQL数据库用户名 */
define( 'DB_USER' , 'wordpress' );
/** MySQL数据库密码 */
define( 'DB_PASSWORD' , 'centos' );
/** MySQL主机 */
define( 'DB_HOST' , '192.168.37.47' ); 修改为后端数据库的IP地址
/** 创建数据表时默认的文字编码 */
define( 'DB_CHARSET' , 'utf8' );
|
下来我们来验证下LVS作为负载均衡调度器进行转发效果:
将本地windows的hosts文件的VIP地址进行域名解析:
访问wordpress地址,此时就可以进行访问: