kylin-LNMP架构拆分-WordPress为例

LNMP架构拆分(以WordPress为例)

一、数据库拆分

  • 为什么要进行数据库拆分?

    ​ 由于单台服务器运行 LNMP架构会导致网站访问缓慢,当内存被占满时,很容易导致系统出现 oom 从而kill掉MySQL数据库,所以要将web和数据库进行独立部署。

  • 解决了什么问题?

    1.缓解web网站的压力

    2.增强数据库读写性能

    3.提高用户访问速度

  • 服务器准备

    主机名 公网IP 私网IP 功能
    web01 10.0.0.7 172.16.1.7 Nginx+PHP
    db01 10.0.0.51 172.16.1.51 MySQL
  • 拆分步骤

1.服务器web01已部署好LNMP及WordPress

2.准备好db01服务器,并安装mariadb-server、启动
[root@db01 ~]# yum -y install mariadb-server
[root@db01 ~]# systemctl start mariadb.service 
[root@db01 ~]# systemctl enable  mariadb.service

3.导出web01数据库的所有数据
[root@web01 ~]# mysqldump -uroot -pdzy123.com -A > all.sql
[root@web01 ~]# ls
all.sql

4.将all.sql拷贝到51服务器
[root@web01 ~]# scp all.sql 10.0.0.51:/root/

5.将all.sql导入db01的数据库,并重启服务
[root@db01 ~]# mysql -uroot < all.sql
[root@db01 ~]# systemctl restart mariadb.service

6.查看导入的信息
[root@db01 ~]# mysql -uroot -pdzy123.com -e 'show databases'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sheshop            |
| wordpress          |
+--------------------+

7.数据库为了安全,禁止root远程连接,必须使用普通账号进行远程连接
#测试root远程连接
[root@web01 ~]# mysql -uroot -pdzy123.com -h172.16.1.51
ERROR 1130 (HY000): Host '172.16.1.7' is not allowed to connect to this MariaDB server
#授权db01数据库普通账号密码为dzy123.com管理所有库和所有的表
[root@db01 ~]# mysql -uroot -pdzy123.com
MariaDB [(none)]> grant all on  *.* to dzy@'%' identified by 'dzy123.com';
#web01测试
[root@web01 ~]# mysql -h10.0.0.51  -udzy  -pdzy123.com

8.在web01查找WordPress的数据库配置文件,并修改。
[root@web01 ~]# vim /code/wordpress/wp-config.php
/** MySQL数据库用户名 */
define('DB_USER', 'dzy');

/** MySQL数据库密码 */
define('DB_PASSWORD', 'dzy123.com');

/** MySQL主机 */
define('DB_HOST', '172.16.1.51');

9.停止web01的数据库
[root@web01 ~]# systemctl stop mariadb
[root@web01 ~]# systemctl disable mariadb

10.重新测试访问业务

二、扩展web服务器

  • 作用:防止其中一台web服务器宕机;为后续负载均衡做准备
  • 服务器准备:
主机名 公网IP 私网IP 功能
web02 10.0.0.8 172.16.1.8 Nginx+PHP
  • 扩展步骤:
1.准备好web02服务器
2.安装nginx
[root@web02 ~]# scp 10.0.0.7:/etc/yum.repos.d/nginx.repo /etc/yum.repos.d/
[root@web02 ~]# yum -y install nginx

3.安装php
[root@web02 ~]# yum -y install php php-bcmath php-cli php-common php-devel php-embedded php-fpm php-gd php-intl php-mbstring php-mysqlnd php-opcache php-pdo   php-process php-xml php-json

4.创建虚拟用户uid gid 666 www
[root@web02 ~]# groupadd -g666 lnmp
[root@web02 ~]# useradd -u666 -g666 -M -s /sbin/nologin lnmp

5.将web01的nginx配置和web02进行同步
[root@web02 ~]# rsync -avz --delete 10.0.0.7:/etc/nginx/ /etc/nginx/

6.将web01的代码拷贝到web02
[root@web01 /]# tar zcvf code.tar.gz /code
[root@web01 ~]# scp code.tar.gz 10.0.0.8:/root/
[root@web02 ~]# tar xf code.tar.gz -C /

7.同步php的配置文件
[root@web02 ~]# rsync -avz --delete 10.0.0.7:/etc/php-fpm.d/ /etc/php-fpm.d/

8.启动nginx和php服务
[root@web02 ~]# systemctl start nginx php-fpm
[root@web02 ~]# systemctl enable nginx php-fpm

9.修改Windows本地hosts测试访问10.0.0.8的wp.dezyan.com
F12查看远程地址及状态代码,若为下列情况即为成功
状态代码:   200 OK
远程地址:   10.0.0.8:80

三、解决web服务器静态数据一致性

  • 服务器准备:
主机名 公网IP 私网IP 功能
nfs 10.0.0.31 172.16.1.31 nfs
  • 解决步骤:
1.安装nfs服务
yum -y install nfs-utils
2.配置nfs服务
vim /etc/exports
/data/wordpress 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anonuid=666)
3.创建必要数据
groupadd -g666 lnmp
useradd -u666 -g666 -M -s /sbin/nologin lnmp
mkdir /data/wordpress -p
chown lnmp.lnmp /data/wordpress
4.启动nfs服务
systemctl start nfs
systemctl enable nfs

5.将web02服务器WordPress业务的图片全部拷贝到31服务器
[root@web02 ~]# scp -r /code/wordpress/wp-content/uploads/* 10.0.0.31:/data/wordpress

6.web服务器挂载nfs
web01和web02:
mount -t nfs 172.16.1.31:/data/wordpress /code/wordpress/wp-content/uploads/

四、配置反向代理

  • 服务器准备:
主机名 公网IP 私网IP 功能
lb01 10.0.0.5 172.16.1.5 nginx反向代理
  • 配置过程:
1.配置nginx的yum仓库,安装
[root@lb01 ~]# scp 10.0.0.7:/etc/yum.repos.d/nginx.repo /etc/yum.repos.d/
[root@lb01 ~]# yum install -y nginx
2.配置代理,检查语法,重启服务
[root@lb01 ~]# cd /etc/nginx/conf.d/
#反向代理优化文件
vim /etc/nginx/proxy_params
	    proxy_set_header Host $http_host;	#必须要有
        proxy_http_version 1.1;				#必须要有
        proxy_connect_timeout 30;			#其余为优化项
        proxy_send_timeout 60;
        proxy_read_timeout 60;
        proxy_buffering on;
        proxy_buffer_size 32k;
        proxy_buffers 4 128k;
[root@lb01 conf.d]# vim lb.conf
server {
        listen 80;
        server_name wp.dezyan.com;

        location / {
        proxy_pass http://10.0.0.7;
        include proxy_params;
        }
}  
[root@lb01 conf.d]# nginx -t
3.Windows的本地hosts解析指向10.0.0.5,访问测试

五、负载均衡配置

1.修改lb.conf配置文件,增添解析模块(测试用),重启nginx服务
[root@lb01 conf.d]# vim lb.conf
upstream webs {						#通过upstream模块定义地址池
        server 172.16.1.7;
        server 172.16.1.8;
}
server {
        listen 80;
        server_name wp.dezyan.com;		
        
        location / {
        proxy_pass http://webs;		#使用proxy_pass模块将请求转发给地址池
        include proxy_params;
        }
}
server {
	listen 80;
	server_name www.test.com;
	location / {
	proxy_pass http://webs;
	include proxy_params;
	}
}
[root@lb01 conf.d]# systemctl restart nginx

2.在web01和web02上设置静态界面进行测试<平均请求>
#web01上:
[root@web01 ~]# cd /etc/nginx/conf.d/
[root@web01 conf.d]# vim test.conf
server {
	listen 80;
	server_name www.test.com;

	location / {
	root /code/test;
	index index.html;
	}
}
[root@web01 conf.d]# nginx -t
[root@web01 conf.d]# systemctl restart nginx
[root@web01 ~]# mkdir /code/test
[root@web01 ~]# echo web01..... > /code/test/index.html
#web02上
[root@web02 ~]# cd /etc/nginx/conf.d/
[root@web02 conf.d]# vim test.conf
server {
	listen 80;
	server_name www.test.com;

	location / {
	root /code/test;
	index index.html;
	}
}
[root@web02 conf.d]# nginx -t
[root@web02 conf.d]# mkdir /code/test
[root@web02 conf.d]# echo web02.... >/code/test/index.html

3.打开浏览器测试,不断刷新,页面循环出现web01和web02即为成功

面试题: 通过什么方式实现的负载均衡

nginx的proxy_pass模块将请求转发给了地址池,地址池是通过upstream模块来定义的。

posted @ 2025-03-21 08:43  丁志岩  阅读(23)  评论(0)    收藏  举报