Nginx架构拆分集群

06 Nginx架构拆分集群

1、拆分数据库至独立服务器

1.1 为何要拆分数据库

单台服务器运行整个 LNMP 架构会导致网站访问缓慢,当系统内存被吃满时,很容易导致系统出现oom,从而killMySQL数据库,为了避免这种情况的发生,我们可以将数据库服务拆分到独立的服务器上部署。拆分数据库可以带来以下好处:

  • 1.缓解web网站的压力;
  • 2.增强数据库读写性能;
  • 3.提高用户访问的速度;

1.2 数据库拆分架构

image.png

1.3 数据库拆分环境

系统环境主机名称应用环境外网地址内网地址
RockyLinux9web01.newy.netnginx+php10.0.0.7172.16.1.7
RockyLinux9db01.newy.netmysql10.0.0.51172.16.1.51

1.4 拆分数据库实践

要将数据库服务迁移到一个独立的服务器运行,可以按照如下步骤进行操作:

  • 1、首先,我们需要备份当前 Web 服务器上 MySQL 的数据。然后将备份的文件拷贝到新的数据库服务器。
  • 2、在新服务器上安装 MySQL ,并导入刚才备份的数据,确保数据库内容是最新的。
  • 3、在新的 MySQL 服务上创建一个远程可以访问数据库的用户,并赋予对应的权限。
  • 4、最后将应用程序数据库的连接地址,指向新的数据库服务器地址。

1、备份 web服务器上的数据库,然后将备份的文件拷贝到新的数据库服务器上;

[root@web01 ~]# mysqldump -uroot -p'newy.net' -B wordpress zh > app-database.sql
[root@web01 ~]# scp app-database.sql root@172.16.1.51:/tmp

2、在新的数据库服务器上安装MySQL,然后导入数据

[root@db01 ~]# yum install mysql-server -y
[root@db01 ~]# systemctl enable mysqld --now

[root@db01 ~]# mysql -uroot < /tmp/app-database.sql

3、在新的MySQL服务上创建一个能通过远程访问的用户

CREATE USER 'app'@'%' IDENTIFIED BY 'newy.net';
grant all privileges ON *.* TO 'app'@'%';
flush privileges;

4、修改代码指向新的数据库

# wordpress

[root@web01 ~]# vim /code/wordpress/wp-config.php
define('DB_NAME', 'wordpress');
define('DB_USER', 'app');
define('DB_PASSWORD', 'newy.net');
define('DB_HOST', '172.16.1.51');


# wecenter
[root@web01 zh]#  grep -iR "newy.net"|grep -v cache
system/config/database.php:  'password' => 'newy.net',
[root@web01 zh]# vim /code/zh/system/config/database.php
'host' => '172.16.1.51',
'username' => 'app',
'password' => 'newy.net',
'dbname' => 'zh',

2、扩展多台相同的Web应用

2.1 为何要扩展多台web节点

目前站点仅运行在一台服务器上,那么它能够同时处理的用户数量是有限的。为了让网站能够接收更多的用户请求,我们需要配置多台服务器,来共同提供支撑。这样做有几个好处:

  • 1、单台web节点如果故障,会导致业务整体down机;
  • 2、多台web节点能保证业务的持续稳定,扩展性高;
  • 3、多台web节点能有效的提升用户访问网站的速度;

2.2 扩展多web节点架构

image.png

2.3 扩展多web节点环境

系统环境主机名称应用环境外网地址内网地址
RockyLinux9web01.newy.netnginx+php10.0.0.7172.16.1.7
RockyLinux9web02.newy.netnginx+php10.0.0.8172.16.1.8
RockyLinux9db01.newy.netmysql10.0.0.51172.16.1.51

2.4 扩展多web节点实践

基于现有的web01节点,快速扩展一台web02的节点,数据库统一使用 db01
1、安装LNP环境
2、将web01节点的Nginx、PHP配置文件拷贝至web02节点
3、将web01节点的代码拷贝至web02节点
4、启动服务,而后使用客户端进行验证服务;

1、安装LNP环境(创建用户、安装软件)

[root@web02 ~]# groupadd -g666 www
[root@web02 ~]# useradd -u666 -g666 www

[root@web02 ~]# scp -rp root@172.16.1.7:/etc/yum.repos.d/nginx.repo /etc/yum.repos.d/
[root@web02 ~]# yum install -y nginx php php-fpm php-cli \
php-common php-devel php-embedded php-gd php-mcrypt php-bcmath php-mbstring php-pdo php-xml \
php-mysqlnd php-opcache php-pecl-zip php-pecl-redis php-pecl-mongodb

2、使用 scp 或 rsync 将 web01nginx、php 配置文件拷贝到 web02

[root@web02 ~]# scp -rp root@172.16.1.7:/etc/nginx /etc/
[root@web02 ~]# scp -rp root@172.16.1.7:/etc/php-fpm.d /etc/
[root@web02 ~]# scp -rp root@172.16.1.7:/etc/php.ini /etc/

3、使用 scp 或 rsync 将 web01 的代码拷贝到 web02 服务器上

[root@web01 ~]# tar czf code.tar.gz /code
[root@web01 ~]# scp code.tar.gz root@172.16.1.8:/tmp

[root@web02 ~]# tar xf /tmp/code.tar.gz -C /

4、启动 nginxphp-fpm 并加入开机自启

[root@web02 ~]# systemctl enable nginx php-fpm --now

3、拆分静态资源至独立服务器

3.1 为何要拆分静态资源

当前后端有多台 web 节点,会导致用户上传的图片、视频附件等内容仅上传到了一台 web 服务器,那么其他的 web 服务器则无法访问到该图片。为了解决这个问题,我们可以使用NFS共享存储。这么做有几个好处:

  • 1、保证了多台 web 节点静态资源一致。
  • 2、有效节省多台 web 节点的存储空间。
  • 3、后期通过自动化更新代码,只需要考虑更新代码的变动,而无需考虑静态资源。

3.2 拆分静态资源架构

image.png

3.3 增加共享存储环境

系统环境主机名称应用环境外网地址内网地址
RockyLinux9web01.newy.netnginx+php10.0.0.7172.16.1.7
RockyLinux9web02.newy.netnginx+php10.0.0.8172.16.1.8
RockyLinux9nfs.newy.netnfs10.0.0.22172.16.1.22
RockyLinux9db01.newy.netmysql10.0.0.51172.16.1.51

3.4 增加共享存储实践

配置共享存储实现思路;

  • 1、首先增加一台独立的服务器,然后安装好对应的NFS,并对外共享目录;
  • 2、找到应用存储静态资源的路径,而后将静态资源全部同步到NFS存储中;
  • 3、将应用站点的静态目录,挂载到NFS存储对应的目录上;

1、安装NFS

[root@nfs ~]# yum install nfs-utils -y

[root@nfs ~]# cat /etc/exports
/data/blog 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
/data/zh 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

[root@nfs ~]# mkdir /data/{blog,zh} -p
[root@nfs ~]# chown -R www.www /data/
[root@nfs ~]# systemctl restart nfs-server

2、将静态资源文件同步到共享存储中

[root@web01 ~]# scp -rp /code/wordpress/wp-content/uploads/* root@172.16.1.22:/data/blog

3、各个节点挂载对应的存储

[root@web01 ~]# mount -t nfs 172.16.1.22:/data/blog /code/wordpress/wp-content/uploads/
[root@web02 ~]# mount -t nfs 172.16.1.22:/data/blog /code/wordpress/wp-content/uploads/

4、问题思考

4.1 如何快速扩展新节点

如果我们添加了一台C应用服务器,如何能实现快速扩展?

  • 1.准备LNP环境,(手动 | Ansible)
  • 2.拷贝任意A或B上的配置文件,代码
  • 3.挂载NFS存储

4.2 多节点该如何访问

现在有多个WEB服务器,该如何进行访问?
1、DNS轮询

  • (1)需要所有的web节点具备公网IP地址
  • (2)公网独立IP需要费用,而且不便宜。
  • (3)所有的web节点有公网IP,不安全。
  • (4)DNS只有轮询机制,没有 健康检查功能。

2、负载均衡

  • (1)所有的web节点不需要有公网IP,能节省成本、并保证安全
  • (2)能够对后端的web节点进行健康检查机制;
  • (3)负载均衡有多种调度算法来满足企业不同需求;

image.png

4.3 Nginx负载均衡配置

wordpress的配置

[root@proxy01 ~]# cat /etc/nginx/conf.d/proxy_blog.newy.net.conf 

upstream blog {
	server 172.16.1.7:80;
	server 172.16.1.8:80;
}


server {
	listen 80;
	server_name blog.newy.net;
	
	location / {
		proxy_pass http://blog;
		proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	}
}

zh的配置

[root@proxy01 ~]# cat /etc/nginx/conf.d/proxy_zh.newy.net.conf 

upstream zh {
	server 172.16.1.7:80;
	server 172.16.1.8:80;
}


server {
	listen 80;
	server_name zh.newy.net;
	
	location / {
		proxy_pass http://zh;
		proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	}

}

6.Nginx负载均衡会话共享

6.1 什么是会话保持

当用户登陆一个网站服务器,网站服务器会将用户的登陆信息存储下来(存储下来的内容叫 Session ),以保证我们能够一直处于 ”登陆在线“ 状态。

6.2 为什么需要会话保持

由于我们使用的是负载均衡轮询机制,会导致用户请求分散在不同的节点,从而造成会话无法保持。
假设用户A,通过负载均衡登陆了网站,此时会话信息存储在A节点,那么当它一刷新,负载均衡会将请求分发给B节点,那么B节点没有用户A的登陆信息,就会提示用户A登陆,当A用户点击登陆时又会将请求分发给C节点,从而造成用户A无法实现会话保持。

6.3 如何实现会话保持

  • 1、粘性session:指Ngnix每次都将同一用户的所有请求转发至同一台服务器上,及Nginx的 IP_hash。
  • 2、session复制:每次session发生变化,就广播给集群中的服务器,使所有的服务器上的session相同。
  • 3、session持久化:将session存储至数据库中,像操作数据一样操作session。
  • 4、session共享:将session至内存数据库中,使用redis,memcached实现。
  • 5、Cookies植入: 使用负载均衡来实现,例如Haproxy;(在nginx中暂不实现)

6.4 会话保持场景演示

6.4.1 配置web节点

1.首先安装并配置 phpmyadmin

[root@web01 ~]# wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.zip
[root@web01 ~]# unzip phpMyAdmin-5.2.1-all-languages.zip -d /code/
[root@web01 ~]# ln -s /code/phpMyAdmin-5.2.1-all-languages/ /code/phpmyadmin

2.修改 phpmyadmin 连接远程的数据库

[root@web01 code]# cd /code/phpmyadmin
[root@web01 phpmyadmin]# cp config.sample.inc.php config.inc.php
[root@web01 phpmyadmin]# vim config.inc.php
/* Server parameters */
$cfg['Servers'][$i]['host'] = '172.16.1.51';

3.在多台 web 上准备 phpmyadminnginx 配置文件*

[root@web01 phpmyadmin]# cat /etc/nginx/conf.d/phpmyadmin.newy.net.conf
server {
	listen 80;
	server_name admin.newy.net;
	root /code/phpmyadmin;

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

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


#重启Nginx服务
[root@web01 ~]# systemctl restart nginx
6.4.2 配置负载均衡

1.编写一份 proxy 负载均衡的配置文件,将请求调度到后端 web 节点

[root@proxy01 ~]# cat /etc/nginx/conf.d/proxy_php.com.conf 
upstream php {
        server 172.16.1.7:80;
        server 172.16.1.8:80;
}
server {
        listen 80;
        server_name php.newy.net;
        location / {
                proxy_pass http://php;
                proxy_set_header Host $http_host;
        }
}

2.检查语法并重载 nginx

[root@proxy01 conf.d]# nginx -t
[root@proxy01 conf.d]# systemctl restart nginx
6.4.3 配置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 start redis
[root@db01 ~]# systemctl enable redis
6.4.4 配置php连接Redis

1.修改 /etc/php.ini 文件。[所有节点都需要操作]

[root@web ~]# vim /etc/php.ini
session.save_handler = redis
session.save_path = "tcp://172.16.1.41:6379"
;session.save_path = "tcp://172.16.1.41:6379?auth=123" #如果redis存在密码,则使用该方式

2.注释 php-fpm.d/www.conf 里面的两条内容,否则 session 内容会一直写入 /var/lib/php/session 目录中,从而造成会话共享失败。[所有节点都需要操作]

[root@web ~]# vim /etc/php-fpm.d/www.conf
;php_value[session.save_handler] = files
;php_value[session.save_path]    = /var/lib/php/session

3.重启 php-fpm 服务。[所有节点都需要操作]

[root@web ~]# php-fpm -t
[root@web ~]# systemctl  restart php-fpm
6.4.5 测试集群会话共享

自行测试

  • 16
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值