项目实战目标
| 主机名 | IP地址 |
|---|---|
| client01 | 192.168.88.10/24 |
| web1 | 192.168.88.11/24 |
| web2 | 192.168.88.12/24 |
| web3 | 192.168.88.13/24 |
| database | 192.168.88.21/24 |
| nfs | 192.168.88.31/24 |
| haproxy01 | 192.168.88.5 |
| haproxy02 | 192.168.88.6 |
单机安装基于LNMP结构的WordPress网站
LNMP是一种常见的Web服务器架构,其中L代表Linux,N代表Nginx,M代表MySQL,P代表PHP。LNMP分离部署是将LNMP中的数据也就是MySQL分离到另一台服务器上,达到LNMP分离部署的目的。
基本环境准备
创建虚拟机,并配置防火墙、SELINUX、主机名、IP地址、yum
配置ansible管理环境
# 1. 创建工作目录
[root@pubserver ~]# mkdir -p project01/files
[root@pubserver ~]# cd project01/
# 2. 创建主配置文件、主机清单文件、yum配置文件
[root@pubserver project01]#vim ansible.cfg
[defaults]
inventory = inventory
host_key_checking = false
[root@pubserver project01]#vim inventory
[webservers]
web1 ansible_host=192.168.88.11
[all:vars]
ansible_ssh_user=root
ansible_ssh_pass=a
[root@pubserver project01]#vim files/local88.repo
[BaseOS]
name = BaseOS
baseurl = ftp://192.168.88.240/dvd/BaseOS
enabled = 1
gpgcheck = 0
[AppStream]
name = AppStream
baseurl = ftp://192.168.88.240/dvd/AppStream
enabled = 1
gpgcheck = 0
[rpms]
name = rpms
baseurl = ftp://192.168.88.240/rpms
enabled = 1
gpgcheck = 0
配置yum服务
[root@pubserver project01]#vim 01-upload-repo.yml
---
- name: config repos.d
hosts: all
tasks:
- name: delete repos.d
file:
path: /etc/yum.repos.d
state: absent
- name: create repos.d
file:
path: /etc/yum.repos.d
state: directory
mode: '0755'
- name: upload local88
copy:
src: files/local88.repo
dest: /etc/yum.repos.d/
[root@pubserver project01]# ansible-playbook 01-upload-repo.yml
配置nginx
配置web1服务
[root@pubserver project01]#vim 02-config-web1.yml
---
- name: config web1
hosts: webservers
tasks:
- name: install pkgs # 安装软件包
yum:
name:
- nginx
- mysql-server
- php-mysqlnd
- php-fpm
- php-json
state: present
- name: start service # 循环启动多个服务
service:
name: "{{item}}"
state: started
enabled: yes
loop:
- nginx
- php-fpm
- mysqld
[root@pubserver project01]# ansible-playbook 02-config-web1.yml
编写php文件,并访问http://192.168.88.11/测试
[root@web1 ~]# vim /usr/share/nginx/html/index.php
<?php
phpinfo();
?>
测试完成后,删除文件
[root@web1 ~]# rm -f /usr/share/nginx/html/index.php
配置数据库服务
安装Wordpress网站,需要数据库,创建数据库并授权
# 1. 编写用于创建数据库和用户的脚本
[root@pubserver project01]#vim files/config_mysql.sh
#!/bin/bash
mysql -e "create database wordpress character set utf8mb4"
mysql -e "create user wpuser01@localhost identified by 'wordpress'"
mysql -e "grant all privileges on wordpress.* to wpuser01@localhost"
# 2. 通过ansible的script模块执行脚本
[root@pubserver project01]#vim 03-config-mysql.yml
---
- name: config mysql
hosts: web1
tasks:
- name: create database
script: files/config_mysql.sh
[root@pubserver project01]# ansible-playbook 03-config-mysql.yml
# 3. 测试账号,如果可以成功登陆mysql,则数据库和用户创建正确
[root@web1 ~]#mysql -uwpuser01 -pwordpress -hlocalhost wordpress
部署wordpress
复制程序文件到nginx工作目录
# 1. 拷贝wordpress到web1
[root@myhost ~]# scp /linux-soft/s2/zzg/project01_soft/wordpress-6.1.1-zh_CN.tar.gz 192.168.88.11:/root/# wordpress包自行准备
# 2. 解压并复制文件到nginx文档目录
[root@web1 ~]# tar xf wordpress-6.1.1-zh_CN.tar.gz
[root@web1 ~]#cp -r wordpress/* /usr/share/nginx/html/
# 3. php程序是由php-fpm处理的,php-fpm以apache身份运行
[root@web1 ~]# ps aux | grep php-fpm
root 5655 0.0 0.4 395620 19056 ? Ss 12:13 0:00 php-fpm: master process (/etc/php-fpm.conf)
apache 5670 0.0 0.3 412108 13812 ? S 12:13 0:00 php-fpm: pool www
# 4. 为了让php-fpm程序能对html目录进行读写操作,需要为他授予权限
[root@web1 ~]#chown -R apache:apache /usr/share/nginx/html/
访问http://192.168.88.11/,根据提示进行初始化
注意:注销登陆后,如果再次登陆,需访问http://192.168.88.11/wp-login.php
web与数据库服务分离
准备数据库服务器
修改ansible配置环境
[root@pubserver project01]#vim inventory
[webservers]
web1 ansible_host=192.168.88.11
[dbs]
database ansible_host=192.168.88.21
[all:vars]
ansible_ssh_user=root
ansible_ssh_pass=a
配置数据库服务器
# 1. 修改yum配置
[root@pubserver project01]#ansible-playbook 01-upload-repo.yml
# 2. 安装数据库服务,并创建数据库及用户
[root@pubserver project01]#vim files/config_mysql2.sh
#!/bin/bash
mysql -e "create database wordpress character set utf8mb4"
mysql -e "create user wpuser01@'%' identified by 'wordpress'"
mysql -e "grant all privileges on wordpress.* to wpuser01@'%'"
[root@pubserver project01]#vim 04-config-database.yml
---
- name: config database
hosts: dbs
tasks:
- name: install mysql # 安装数据库服务
yum:
name: mysql-server
state: present
- name: start service # 启动数据库服务
service:
name: mysqld
state: started
enabled: yes
- name: create database
script: files/config_mysql2.sh
[root@pubserver project01]# ansible-playbook 04-config-database.yml
迁移数据库
发布停服更新通知
注意:默认的wordpress对中文标题支持有bug,需要修改源码修复bug。或者更改【固定链接】配置,如下:
迁移数据库
# 1. 在源服务器上备份数据库中的数据。备份数据库wordpress中的数据到wordpress.sql文件
[root@web1 ~]#mysqldump wordpress > wordpress.sql
# 2. 将备份文件拷贝到新数据库服务器
[root@web1 ~]#scp wordpress.sql 192.168.88.21:/root/
# 3. 在新数据库服务器上,导入数据。将wordpress.sql中的数据导入到wordpress数据库中
[root@database ~]#mysql wordpress < wordpress.sql
# 4. 修改php网站,将数据库服务器地址,指向新数据库服务器
[root@web1 ~]#vim /usr/share/nginx/html/wp-config.php
...略...
31 /** Database hostname */
32 define( 'DB_HOST', '192.168.88.21' );
...略...
# 5. 停止web1上的数据库服务,wordpress网站仍然可以访问
[root@web1 ~]# systemctl stop mysqld
[root@web1 ~]# yum remove -y mysql-server
# 6. 停止database上的数据库服务,wordpress将不能访问
查询数据库中的内容
[root@database ~]# mysql # 打开mysql命令行
mysql> show databases; # 查看有哪些数据库
mysql> use wordpress; # 切换到wordpress数据库
mysql> show tables; # 查看wordpress库中有哪些表
mysql> select * from wp_posts\G # 查看wp_posts表中的内容
配置额外的web服务器
修改ansible配置
[root@pubserver project01]#vim inventory
[webservers]
web1 ansible_host=192.168.88.11
web2 ansible_host=192.168.88.12
web3 ansible_host=192.168.88.13
[dbs]
database ansible_host=192.168.88.21
[all:vars]
ansible_ssh_user=root
ansible_ssh_pass=a
配置web服务
# 1. 配置yum
[root@pubserver project01]#ansible-playbook 01-upload-repo.yml
# 2. 配置web服务器
[root@pubserver project01]#vim 05-config-webservers.yml
---
- name: config webservers
hosts: webservers
tasks:
- name: install pkgs # 安装软件包
yum:
name:
- nginx
- php-mysqlnd
- php-fpm
- php-json
state: present
- name: start service # 循环启动多个服务
service:
name: "{{item}}"
state: started
enabled: yes
loop:
- nginx
- php-fpm
[root@pubserver project01]# ansible-playbook 05-config-webservers.yml
将web1的html目录打包并下载
[root@pubserver project01]#vim 06-fetch-web1.yml
---
- name: copy web
hosts: web1
tasks:
- name: compress html # 压缩html目录到/root下
archive:
path: /usr/share/nginx/html
dest: /root/html.tar.gz
format: gz
- name: download html # 下载压缩文件
fetch:
src: /root/html.tar.gz
dest: files/
flat: yes
[root@pubserver project01]# ansible-playbook 06-copy-web.yml
释放html压缩包到web2和web3上
[root@pubserver project01]#vim 07-deploy-web23.yml
---
- name: deploy web2 and web3
hosts: web2,web3
tasks:
- name: unarchive to web # 解压文件到指定位置
unarchive:
src: files/html.tar.gz
dest: /usr/share/nginx/
[root@pubserver project01]# ansible-playbook 07-deploy-web23.yml
访问http://192.168.88.12/和http://192.168.88.13/将会得到与http://192.168.88.11/相同的页面
深入理解程序的数据存储
程序将文字数据保存到数据库中
程序将非文字数据(如图片、视频、压缩包等)保存到相应的文件目录中
验证
发一篇文章,文章内容包含文字和图片
在数据库中查看文字数据。在最新的一条记录中,可以查看到图片的保存位置
[root@database ~]# mysql
mysql> use wordpress;
mysql> select * from wp_posts\G
在文件系统中查看图片文件。
/usr/share/nginx/html/wp-content/uploads/是固定位置,其后的2025/12是年和月目录。每个月上传的图片,都会保存到相应的月份目录。
[root@web1 html]#ls /usr/share/nginx/html/wp-content/uploads/2025/12/
snow.jpg
配置NFS服务器
配置ansible环境
[root@pubserver project01]#vim inventory
[webservers]
web1 ansible_host=192.168.88.11
web2 ansible_host=192.168.88.12
web3 ansible_host=192.168.88.13
[dbs]
database ansible_host=192.168.88.21
[storages]
nfs ansible_host=192.168.88.31
[all:vars]
ansible_ssh_user=root
ansible_ssh_pass=a
配置nfs服务
# 1. 配置yum
[root@pubserver project01]#ansible-playbook 01-upload-repo.yml
# 2. 配置nfs服务
[root@pubserver project01]#vim 08-config-nfs.yml
---
- name: config nfs
hosts: nfs
tasks:
- name: install nfs # 安装nfs
yum:
name: nfs-utils
state: present
- name: mkdir /nfs_root # 创建共享目录
file:
path: /nfs_root
state: directory
mode: "0755"
- name: nfs share # 修改配置文件
lineinfile:
path: /etc/exports
line: '/nfs_root 192.168.88.0/24(rw)'
- name: start service # 循环启动服务
service:
name: "{{item}}"
state: started
enabled: yes
loop:
- rpcbind # nfs服务依赖rpcbind服务
- nfs-server
[root@pubserver project01]# ansible-playbook 08-config-nfs.yml
# 3. 查看共享输出
[root@nfs ~]# showmount -e
Export list for nfs:
/nfs_root 192.168.88.0/24
迁移文件至nfs共享
# 1. 重新下载web1的html目录
[root@pubserver project01]#cp 06-fetch-web1.yml 09-fetch-web1.yml#修改剧本
---
- name: copy web
hosts: web1
tasks:
- name: compress html # 压缩html目录到/root下
archive:
path: /usr/share/nginx/html
dest: /root/html2.tar.gz
format: gz
- name: download html
fetch:
src: /root/html2.tar.gz # 下载压缩文件
dest: files/
flat: yes
[root@pubserver project01]# ansible-playbook 09-fetch-web1.yml
# 2. 释放压缩包到nfs服务器
[root@pubserver project01]#cp 07-deploy-web23.yml 10-deploy-nfs.yml
[root@pubserver project01]#vim 10-deploy-nfs.yml
---
- name: deploy nfs
hosts: nfs
tasks:
- name: unarchive to web # 将控制端压缩文件解压到指定位置
unarchive:
src: files/html2.tar.gz
dest: /nfs_root/
[root@pubserver project01]# ansible-playbook 10-deploy-nfs.yml
# 3. 清除web服务器的html目录
[root@pubserver project01]#vim 11-rm-html.yml
---
- name: rm html
hosts: webservers
tasks:
- name: rm html
file:
path: /usr/share/nginx/html
state: absent
- name: create html
file:
path: /usr/share/nginx/html
state: directory
owner: apache
group: apache
mode: "0755"
[root@pubserver project01]# ansible-playbook 11-rm-html.yml
# 4. 挂载nfs到web服务器
[root@pubserver project01]#vim 12-mount-nfs.yml
---
- name: mount nfs
hosts: webservers
tasks:
- name: install nfs
yum:
name: nfs-utils
state: present
- name: mount nfs
mount:
path: /usr/share/nginx/html
src: 192.168.88.31:/nfs_root/html
fstype: nfs
state: mounted
[root@pubserver project01]# ansible-playbook 12-mount-nfs.yml
配置代理服务器
在负载均衡方面,LVS、nginx和haproxy都是常用的开源软件。以下是它们的特点:
LVS
Nginx
Haproxy
支持TCP协议的负载均衡转发,可以对MySQL读进行负载均衡,对后端的MySQL节点进行检测和负载均衡。
负载均衡策略非常多,包括Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)等。
支持两种代理模式TCP(四层)和HTTP(七层),也是支持虚拟主机的。
支持Session的保持,Cookie的引导;同时支持通过获取指定的URL来检测后端服务器的状态。
单纯从效率上来讲,Haproxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。
由于Haproxy是专业的代理服务器,配置简单,所以中小型企业推荐使用Haproxy。
配置ansible环境
[root@pubserver project01]#vim inventory
[webservers]
web1 ansible_host=192.168.88.11
web2 ansible_host=192.168.88.12
web3 ansible_host=192.168.88.13
[dbs]
database ansible_host=192.168.88.21
[storages]
nfs ansible_host=192.168.88.31
[lb]
haproxy1 ansible_host=192.168.88.5
haproxy2 ansible_host=192.168.88.6
[all:vars]
ansible_ssh_user=root
ansible_ssh_pass=a
配置高可用、负载均衡功能
# 1. 配置yum
[root@pubserver project01]#ansible-playbook 01-upload-repo.yml
# 2. 配置调度服务器
[root@pubserver project01]#vim 13-install-lb.yml
---
- name: install lb
hosts: lb
tasks:
- name: install pkg
yum:
name: haproxy,keepalived
state: present
[root@pubserver project01]# ansible-playbook 13-install-lb.yml
# 3. 修改配置文件并启动服务
[root@pubserver project01]#vim 14-config-lb.yml
---
- name: config haproxy
hosts: lb
tasks:
- name: rm lines
shell: sed -i '64,$d' /etc/haproxy/haproxy.cfg
- name: add lines
blockinfile:
path: /etc/haproxy/haproxy.cfg
block: |
listen wordpress
bind 0.0.0.0:80
balance roundrobin
server web1 192.168.88.11:80 check inter 2000 rise 2 fall 5
server web2 192.168.88.12:80 check inter 2000 rise 2 fall 5
server web3 192.168.88.13:80 check inter 2000 rise 2 fall 5
listen mon
bind 0.0.0.0:1080
stats refresh 30s
stats uri /mon
stats auth admin:admin
- name: start service
service:
name: haproxy
state: started
enabled: yes
[root@pubserver project01]# ansible-playbook 14-config-lb.yml
# 4. haproxy1配置keepalived,实现高可用集群
[root@haproxy1 ~]#vim /etc/keepalived/keepalived.conf
...略...
12 router_id haproxy1 # 为本机取一个唯一的id
13 vrrp_iptables # 自动开启iptables放行规则
...略...
20 vrrp_instance VI_1 {
21 state MASTER # 主服务器状态是MASTER
22 interface eth0
23 virtual_router_id 51
24 priority 100
25 advert_int 1
26 authentication {
27 auth_type PASS
28 auth_pass 1111
29 }
30 virtual_ipaddress {
31 192.168.88.80 # vip地址
32 }
33 }
# 以下全部删除
# 5. haproxy2配置keepalived
[root@haproxy1 ~]#scp /etc/keepalived/keepalived.conf 192.168.88.6:/etc/keepalived/
[root@haproxy2 ~]#vim /etc/keepalived/keepalived.conf
...略...
12 router_id haproxy2 # 为本机取一个唯一的id
13 vrrp_iptables # 自动开启iptables放行规则
...略...
20 vrrp_instance VI_1 {
21 state BACKUP # 备份服务器状态是BACKUP
22 interface eth0
23 virtual_router_id 51
24 priority 80 # 备份服务器优先级低于主服务器
25 advert_int 1
26 authentication {
27 auth_type PASS
28 auth_pass 1111
29 }
30 virtual_ipaddress {
31 192.168.88.80
32 }
33 }
# 6. 启动服务
[root@haproxy1 ~]# systemctl enable keepalived.service --now
[root@haproxy2 ~]# systemctl enable keepalived.service --now
# 7. 验证。haproxy1上出现VIP。客户端访问http://192.168.88.80即可
[root@haproxy1 ~]# ip a s | grep 192
inet 192.168.88.5/24 brd 192.168.88.255 scope global noprefixroute eth0
inet 192.168.88.80/32 scope global eth0
配置名称解析
通过本机hosts文件实现名称解析
[root@myhost ~]#echo "192.168.88.80 www.danei.com" >> /etc/hosts
当点击http://www.danei.com页面中任意链接时,地址栏上的地址,都会变成
192.168.88.11。通过以下方式修复它:
# 在nfs服务器上修改配置文件
[root@nfs ~]#vim /nfs_root/html/wp-config.php
# define('DB_NAME', 'wordpress')它的上方添加以下两行:
define('WP_SITEURL', 'http://www.danei.com');
define('WP_HOME', 'http://www.danei.com');