当前位置:首页 > 聚焦财报 > 正文内容

Nginx架构拆分集群详解

聚亿千财2025-06-30聚焦财报3834

Nginx架构拆分集群

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

1.1 为何要拆分数据库

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

• 1.缓解web网站的压力;

• 2.增强数据库读写性能;

• 3.提高用户访问的速度;

1.2 数据库拆分架构

04027494-50e5-11f0-b715-92fbcf53809c.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 ~]# systemctlenablemysqld --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节点环境

系统环境 主机名称 应用环境 外网地址 内网地址
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 ~]# systemctlenablenginx php-fpm --now

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

3.1 为何要拆分静态资源

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

• 1、保证了多台web节点静态资源一致。

• 2、有效节省多台web节点的存储空间。

• 3、后期通过自动化更新代码,只需要考虑更新代码的变动,而无需考虑静态资源。

3.2 拆分静态资源架构

042cbae2-50e5-11f0-b715-92fbcf53809c.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

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]#cpconfig.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 ~]# systemctlenableredis

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

链接:https://blog.csdn.net/Sunfeiyanghtml/article/details/140270815