社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  NGINX

零宕机!Nginx 集群化部署与高可用架构设计

Linux就该这么学 • 3 月前 • 124 次点击  

链接:https://blog.csdn.net/Sunfeiyanghtml/article/details/140270815?spm=1001.2014.3001.5502

Nginx架构拆分集群

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

1.1 为何要拆分数据库

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

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

1.2 数据库拆分架构

image.png
image.png

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节点架构

image.png
image.png

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 拆分静态资源架构

image.png
image.png

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)负载均衡有多种调度算法来满足企业不同需求;
image.png
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 上准备 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


END

想要学习Linux系统的读者可以点击 "阅读原文"按钮来了解书籍《Linux就该这么学》,同时也非常适合专业的运维人员阅读,成为辅助您工作的高价值工具书!


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/183741