news 2026/4/15 21:44:14

project - 1

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
project - 1

项目实战目标

主机名IP地址
client01192.168.88.10/24
web1192.168.88.11/24
web2192.168.88.12/24
web3192.168.88.13/24
database192.168.88.21/24
nfs192.168.88.31/24
haproxy01192.168.88.5
haproxy02192.168.88.6

单机安装基于LNMP结构的WordPress网站

LNMP是一种常见的Web服务器架构,其中L代表LinuxN代表NginxM代表MySQLP代表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');

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 5:04:22

告别手动替换!MyBatis SQL日志一键解析工具(附完整源码)

告别手动替换&#xff01;MyBatis SQL日志一键解析工具&#xff08;附完整源码&#xff09; 在日常开发中&#xff0c;我们经常需要通过 MyBatis 日志排查 SQL 问题&#xff0c;但 MyBatis 输出的日志中&#xff0c;SQL 语句的参数会以 ? 占位符显示&#xff0c;例如&#xff…

作者头像 李华
网站建设 2026/4/7 16:44:33

医疗影像AI开发革命:MONAIBundle极速配置新范式

在医疗影像AI开发领域&#xff0c;传统的手工编码模式正面临前所未有的挑战。研究人员在数据预处理、模型训练、性能评估等环节耗费大量时间&#xff0c;而临床部署的复杂性更是让许多优秀算法止步于实验室阶段。MONAIBundle的出现&#xff0c;标志着医疗AI开发正式进入"配…

作者头像 李华
网站建设 2026/4/15 13:13:27

CVAT标注工具入门指南:5分钟学会基本操作

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 使用CVAT标注工具&#xff0c;创建一个简单的图像分类任务。上传10张猫和狗的图片&#xff0c;用矩形框标注出动物位置&#xff0c;并打上类别标签。导出标注结果&#xff0c;生成T…

作者头像 李华
网站建设 2026/4/12 17:56:36

Simulink仿真:基于图腾柱PFC的单相整流器

simulink仿真-图腾柱 基于图腾柱PFC的单相整流器输入220V交流电 稳定输出400V直流电 电网电流电压同相位直接上干货&#xff01;今天要聊的是用Simulink实现基于图腾柱的无桥PFC整流器。这玩意儿能把220V交流电整成400V直流电&#xff0c;关键是能让电网电流和电压保持同相位—…

作者头像 李华