LNMP结构 博客网站 day1
小伙伴们,LNMP结构在第一二阶段浅浅的学习过,这里我们可以离线部署该结构。L指(虚拟机)服务器,nginx(前端代理服务器)+mysql数据库,最后基于php建设动态资源网站。
#也有前端代理服务器是apache的,建站语言还有tomcat(*^▽^*)
#服务器一般都是用linux系统的,好处安全隔离,不占空间内存大。
nginx担任前端代理服务器,负责负载均衡和前端代理作用。
它可以配置多台web网页服务器,访问相关站点资源。
NFS是起文件共享作用,mysql的作用是存储网页数据。
一般网站都会架构mysql主从同步读写分离的数据库。php需要在nginx安装的环境下,才能产生作用。
#准备以下机器,方便环境进行,单机环境即可,不上云平台购买。
主机名 | 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 |
一、单机安装WordPress
#类似WordPress的博客类网站很多(织梦,帝国等),这里只是举例子,感兴趣的可以去看看。下图是wordpress博客样例。具体功能建完我再将。^_^
- 创建虚拟机,并配置防火墙、SELINUX、主机名、IP地址、yum
配置ansible管理环境
#这里我们用的是云计算2阶段留下来的虚拟机(192.168.88.240)主机名随课程环境更改。
你也可以自己创个master虚拟机,觉得机器多的话,可以在client虚拟机里面设置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
[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
[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/测试
- #再次提醒,必须先配置NGINX和php相关依赖,才能出现下图。
[root@web1 ~]# vim /usr/share/nginx/html/index.php <?php phpinfo(); ?>
#测试能看到这个界面,说明环境配置成功。
二、分离数据库
- 安装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"
#上面是编写了脚本,执行了创建数据库用户和密码,下图则是通过ansible的script模块调用脚本文件。
# 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
# 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/ # 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/
#这里我们可以直接,进入wordpress官网下载中文版,之后从真机传入虚拟机服务器。
最后按照上述骤检查 。
- 访问http://192.168.88.11/,根据提示进行初始化
#这里的数据库名和密码,和你前面设置的mysql数据库的对应上,不然进不去嗷。
#网站登录密码,自己设置好记的,邮箱随便填写。
#博客网站取名随意
注意:注销登陆后,如果再次登陆,需访问http://192.168.88.11/wp-login.php
三、配置额外的web服务器
web与数据库服务分离
#只有1台web服务器肯定是不行的,所以需要配置多台web服务器,进行负载均衡的选择。
搭建好 database 服务器,之后配好IP 192.168.88.21
修改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
迁移数据库 (测试新数据库的功能)
#文章里面的区块附近,可以点击查看相关设置,有网页设计知识的都看得懂,比较简单。结构都是HTML ,CSS,JAVAscript的相关内容,不涉及JAVA前端Vue框架知识。都看得懂
- 注意:默认的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服务器
#注意如果你们一开始机器就准备好了,这里的两台web2-web3服务器,和它们的IP地址就别设置到了 。
你们应该看出来了,机器和相应的ansible自动化配置,没有一开始配完。主要是考虑思路,循序渐进的演示,如果一开始ip和机器配好,自动化也设置好,就会有点知识不过脑。
- 修改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/相同的页面
LNMP结构 博客网站 day2
深入理解程序的数据存储
- 程序将文字数据保存到数据库中
- 程序将非文字数据(如图片、视频、压缩包等)保存到相应的文件目录中
验证
- 发一篇文章,文章内容包含文字和图片
- 在数据库中查看文字数据。在最新的一条记录中,可以查看到图片的保存位置
- #去博客上面发哈。
[root@database ~]# mysql mysql> use wordpress; mysql> select * from wp_posts\G
- 在文件系统中查看图片文件。
/usr/share/nginx/html/wp-content/uploads/
是固定位置,其后的2024/10
是年和月目录。每个月上传的图片,都会保存到相应的月份目录。[root@web1 html]# ls /usr/share/nginx/html/wp-content/uploads/2024/10/ snow.jpg
配置NFS服务器
#老样子,首先配好nfs服务器IP,以后可以更具需求架构图,先配置好
- 配置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共享
- 迁移文件至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
配置代理服务器
#配置好机器IP
- 配置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 } # 以下全部删除
# ######### 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 }
#区别1个是master,1个配置为了backup.
服务器ID不一样,优先级不一样。别搞混乱了
# 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
- 如果客户端是windows主机,则使用记事本程序打开
C:\windows\System32\drivers\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');
以上就是全部的云计算第一个简单项目了,该项目主要讲述了,搭建网站的lnmp结构。和相关的数据库读写分离,web服务器的keepalived,与NGINX的负载均衡设值。
彩蛋:
很多国产监控面板,上面都有一键建站功能,你熟悉了上述功能之后,你就可以快速上手使用了。
功能也很多,和华为云、阿里云也有合作。在两家平台创建服务器时,可以自己勾选宝塔面板,安装在服务器上。设置也方便绑定ip。windterm等远程连接软件,都可以在命令行输入
bt 调用出bt终端。
想要下载可以点下方链接,下载电脑对应版本。
宝塔面板下载,免费全能的服务器运维软件
我不是打广告的,宝塔也没给我钱嗷,喜欢就可以试试,毕竟宝塔本省也是国产监控软件 的一种,了解一下。 ^_^
问题: 单机版可以进入自己的域名网站,自己也可以领ssl测试证书。如果是公网部署网站,需要自己 买域名,配置SSL安全证书,网站工商局网上备案等相关细微操作。