06 Nginx架构拆分集群
1、拆分数据库至独立服务器
1.1 为何要拆分数据库
单台服务器运行整个 LNMP
架构会导致网站访问缓慢,当系统内存被吃满时,很容易导致系统出现oom
,从而kill
掉MySQL
数据库,为了避免这种情况的发生,我们可以将数据库服务拆分到独立的服务器上部署。拆分数据库可以带来以下好处:
- 1.缓解
web
网站的压力; - 2.增强数据库读写性能;
- 3.提高用户访问的速度;
1.2 数据库拆分架构
1.3 数据库拆分环境
系统环境 | 主机名称 | 应用环境 | 外网地址 | 内网地址 |
---|---|---|---|---|
RockyLinux9 | web01.newy.net | nginx+php | 10.0.0.7 | 172.16.1.7 |
RockyLinux9 | db01.newy.net | mysql | 10.0.0.51 | 172.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节点架构
2.3 扩展多web节点环境
系统环境 | 主机名称 | 应用环境 | 外网地址 | 内网地址 |
---|---|---|---|---|
RockyLinux9 | web01.newy.net | nginx+php | 10.0.0.7 | 172.16.1.7 |
RockyLinux9 | web02.newy.net | nginx+php | 10.0.0.8 | 172.16.1.8 |
RockyLinux9 | db01.newy.net | mysql | 10.0.0.51 | 172.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 将 web01
的 nginx、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、启动 nginx
与 php-fpm
并加入开机自启
[root@web02 ~]# systemctl enable nginx php-fpm --now
3、拆分静态资源至独立服务器
3.1 为何要拆分静态资源
当前后端有多台 web
节点,会导致用户上传的图片、视频附件等内容仅上传到了一台 web
服务器,那么其他的 web
服务器则无法访问到该图片。为了解决这个问题,我们可以使用NFS共享存储。这么做有几个好处:
- 1、保证了多台
web
节点静态资源一致。 - 2、有效节省多台
web
节点的存储空间。 - 3、后期通过自动化更新代码,只需要考虑更新代码的变动,而无需考虑静态资源。
3.2 拆分静态资源架构
3.3 增加共享存储环境
系统环境 | 主机名称 | 应用环境 | 外网地址 | 内网地址 |
---|---|---|---|---|
RockyLinux9 | web01.newy.net | nginx+php | 10.0.0.7 | 172.16.1.7 |
RockyLinux9 | web02.newy.net | nginx+php | 10.0.0.8 | 172.16.1.8 |
RockyLinux9 | nfs.newy.net | nfs | 10.0.0.22 | 172.16.1.22 |
RockyLinux9 | db01.newy.net | mysql | 10.0.0.51 | 172.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)负载均衡有多种调度算法来满足企业不同需求;
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
上准备 phpmyadmin
的 nginx
配置文件*
[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 测试集群会话共享
自行测试