Linux 系统

1.简介与安装

Linux 操作系统是基于 UNIX 操作系统发展而来的一种克隆系统,它诞生于1991 年的 [Linux桌面] 10 月5 日(这是第一次正式向外公布的时间)。以后借助于 Internet 网络,并通过全世界各地计算机爱好者的共同努力,已成为今天世界上使用最多的一种 UNIX 类操作系统,并且使用人数还在迅猛增长。

Linux 以它的高效性和灵活性著称,Linux 模块化的设计结构,使得它既能在价格昂贵的工作站上运行,也能够在廉价的 PC 机上实现全部的 Unix 特性,具有多任务、多用户的能力。Linux 是在 GNU 公共许可权限下免费获得的,是一个符合 POSIX 标准的操作系统。Linux 操作系统软件包不仅包括完整的 Linux 操作系统,而且还包括了文本编辑器、高级语言编译器等应用软件。它还包括带有多个窗口管理器的 X-Windows 图形用户界面,如同我们使用 Windows NT 一样,允许我们使用窗口、图标和菜单对系统进行操作。

Linux 系统发展到今天有很多优秀的种类,如:Red Hat(红帽),Ubuntu(乌班图),Debian [ˈdɛ.bi.ən],Centos [sent.os] 等,本课件以 Centos 7 为例,讲解 Linux 基本操作。

目前阿里云最支持的 linux 服务器为 centos,为了方便测试或学习,建议在阿里云上租用云服务器 ECS。 云服务器 ECS(Elastic Compute Service)是一种简单高效、处理能力可弹性伸缩的计算服务,同时租用的服务器有公网 IP 也方便我们后期部署和发布项目。 

网址 云服务器ECS_云主机_服务器托管_计算-阿里云

当然我们也可以安装本地虚拟机,在虚拟机上安装 centos 7 步骤如下:

1.安装 VMware WorkStation 虚拟机

下载地址:链接

虚拟机的网络连接三种形式说明

  • 桥连接:Linux 可以和其他的局域网的系统双向通信,但 Linux 会占用局域网 IP,可能造成 IP 冲突。 
  • NAT(默认):网络地址转换方式:Linux 可以访问外网,不会造成 IP 冲突,Linux 可以和主机双向通讯,但是不能被局域网内的其他主机访问。 
  • 主机模式:Linux 是一个独立的主机,不能访问外网,只能和外主机进行通讯。

安装完成如下图:

同时安装完成后在系统网络适配器中可以看到多出了两个虚拟网卡,没有特殊原因不能禁用该网卡,否则会导致外面的系统无法连接内部的虚拟机。

由于我们使用最多的的网络连接模式为 NAT 模式,所以我们可以配置相应的虚拟网络的 ip 分配器 DHCP 的网段。

安装 centos 7

下载 centos 7 系统镜像,地址:链接

安装时需要设置安装系统光盘的位置,同时安装过程中需要指定系统安装位置,并设置 root 的密码。

安装完成后启动 centos 系统,登录 root 账号。

输入账号:root,回车输入密码:输入密码时为了保护用户密码,centos7 光标不会发生变化,不要疑惑凭感觉直接输入即可。

看到 [root@localhost ~]# 就表示登录成功。

2.命令的基本格式

登录 root 账号后就会看到如下命令行提示,格式如下:

[root@localhost ~]# 提示符

root:当前登陆用户(超级管理员) 安装时会有一个普通用户(用于控制权限) 

localhost:主机名(本机)

~:家目录

注意:Linux 没有盘符,所有路径都是以 / 开头,即所有的文件都是在 / 根目录下。管理员有自己的别墅,家目录在 /root 下 ;而普通用户都合租在 /home/ 下。

#:表示超级管理员,$:表示普通用户 

查看文件命令

ls 查看当前目录下的所有的文件

ls -l:表示显示详细信息 (简写 ll,注意:ls 与参数 -l 之间都需要添加空格)

-rw-r--r--. 1 root root 12 11月 3 09:49 abc

第一个位置:

  • - 表示文件 
  • d 表示文件夹 
  • l 软连接文件(快捷方式)

前 3 个 rwx 表示所有者的权限,第二段 rwx 表示所属组的权限,第三段 rwx 表示其他人的权限

权限:r 读 w 写 x 执行

 1 引用次数

 前一个 root : 所有者

 第二个 root :所属组

12:表示文件大小

关机命令:

shutdown now

重启命令:

reboot

在Ubuntu系统中,超级管理员账号通常是root账号。root账号拥有系统上所有权限,可以执行任何操作,包括安装软件、管理系统设置、访问所有文件和管理其他用户。

要使用root账号,你可以使用以下命令切换到root用户:

sudo -i

或者

sudo su

这两个命令都会要求你输入你当前用户的密码,输入正确密码后,你就会切换到root用户环境。

如果你需要执行单条命令作为root,可以直接在命令前加sudo,例如:

sudo apt update

这将以root权限执行apt update命令。

注意:长时间使用root账号会增加系统安全风险,因为root账号可以执行任何操作,包括错误的操作,所以应该只在必要时使用,并尽快返回到普通用户账号。

在Ubuntu上启用root账号

1 设置root密码

sudo passwd root

2 启用root用户登录 Ubuntu默认情况下不允许root用户直接登录,可以通过以下步骤来启用root用户登录。

修改/etc/ssh/sshd_config文件,找到以下行 #PermitRootLogin prohibit-password  将其修改为 PermitRootLogin yes 

保存并关闭文件。 

3.重启SSH服务 修改完配置文件后,需要重启SSH服务使更改生效

systemctl restart sshd.service

这样就可以使用root账号和第一步设置的密码进行登录。

3.cd 改变当前位置

cd 是 change directory 简写,用于改变当前位置,类似于 windows 的资源管理器。

cd /root:进入root目录

cd ~:进入家目录(也可直接 cd 回车)

cd -:进入上次目录

cd ..:进入上层目录

相对路径与绝对路径

cd abc 相对路径(需要在/etc 目录下)

cd /etc/abc  绝对路径(在任何目录下都可以)

注意:适当单击 tab 补全路径,适当双击 tab 列出可用选项

pwd:显示当前路径

4.Linux 目录结构 (自学)

Linux的目录结构是一种层次化的文件系统结构,它以根目录(/)为起点,包含了一系列的目录和子目录,用于组织和存储文件、程序和系统配置等。

  1. 根目录(/):Linux文件系统的起始点,所有其他目录都是从根目录开始的。

  2. /bin和/sbin目录:存放系统的基本命令和系统管理员使用的命令。/bin目录包含一些常用的命令,如 ls、cp、mv 等,而/sbin目录包含一些只有系统管理员才能使用的命令,如 ifconfig、iptables 等。

  3. /etc目录:存放系统的配置文件,包括网络配置、用户账户配置、服务配置等。

  4. /home目录:存放用户的个人文件和目录,每个用户都有一个以用户名命名的子目录。

  5. /lib和/lib64目录:存放系统库文件,这些库文件被程序调用以提供特定的功能。

  6. /mnt和/media目录:用于挂载外部设备,如硬盘、光盘等。/mnt目录用于临时挂载,而/media目录用于挂载可移动媒体。

  7. /opt目录:存放可选软件包的安装目录,通常由第三方软件包使用。

  8. /proc目录:虚拟文件系统,提供了系统和进程的信息,以文件的形式呈现。

  9. /root目录:系统管理员的个人目录。

  10. /tmp目录:存放临时文件,重启系统后该目录下的文件会被清空。

  11. /usr目录:存放用户程序和文件,包括系统软件和应用程序。

  12. /var目录:存放经常变化的文件,如日志文件、缓存文件等。

总结: 

Linux的目录结构是按照一定的规范和标准进行组织的,这种层次化的结构使得用户能够方便地找到和管理文件和目录,同时也方便系统管理员进行系统配置和维护。

5.centos7 u 盘挂载

在CentOS 7上挂载U盘通常遵循以下步骤:

  1. 插入U盘。

  2. 确定U盘设备名称,使用lsblkfdisk -l

  3. 创建一个挂载点,例如/mnt/usbdrive

  4. 挂载U盘到挂载点,使用mount命令。

以下是一个简单的例子:

# 确定U盘设备名称,通常是/dev/sdX,其中X是一个字母
lsblk
 
# 创建挂载点
mkdir /mnt/usbdrive
 
# 挂载U盘,假设设备名称是/dev/sdb1
mount /dev/sdb1 /mnt/usbdrive
 
# 验证U盘是否挂载成功
df -h

案例:

[root@localhost media]# lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda               8:0    0 465.8G  0 disk 
├─sda1            8:1    0     1G  0 part /boot
└─sda2            8:2    0 464.8G  0 part 
  ├─centos-root 253:0    0    50G  0 lvm  /
  ├─centos-swap 253:1    0   3.9G  0 lvm  [SWAP]
  └─centos-home 253:2    0 410.9G  0 lvm  /home
sdb               8:16   1  57.8G  0 disk 
├─sdb1            8:17   1  56.8G  0 part 
└─sdb4            8:20   1   950M  0 part 

如果U盘是FAT32或NTFS文件系统,你可能需要安装EPEL仓库并且安装NTFS-3G支持:

# 安装EPEL仓库
yum install epel-release
 
# 安装NTFS-3G
yum install ntfs-3g
 
# 挂载NTFS分区
mount -t ntfs-3g /dev/sdb1 /mnt/usbdrive

完成操作后,你可以通过umount /mnt/usbdrive来卸载U盘。

6.文本编辑器 vi

vi 是 Linux 系统中最常用的文本编辑器之一,它提供了许多强大的编辑功能。它类似于 windows 系统的记事本。但由于是命令行操作。所以文本操作要稍微复杂一点。

下面是对 vi 命令的详细讲解:

  1. 打开文件:在终端中输入vi 文件名命令,可以打开一个文件进行编辑。如果文件不存在,会创建一个新文件。

  2. 命令模式和插入模式:打开文件后,会进入命令模式/预览模式。在命令模式下,输入的字符会被解释为命令。按下i键进入插入模式,此时可以输入文本。按 ESC 键回到命令模式。

  3. 保存和退出:在命令模式下,输入:w可以保存文件,:q可以退出vi。如果文件有修改但未保存,可以使用:wq命令保存并退出。使用 :q! 退出不保存。

  4. 移动光标:在命令模式下,可以使用以下命令移动光标:

    • 0:移动到行首
    • $:移动到行尾
    • gg:移动到文件开头
    • G:移动到文件末尾
    • nG:移动到第n行(n为行号)
  5. 删除和复制:在命令模式下,可以使用以下命令删除和复制文本:

    • x:删除光标所在位置的字符
    • dd:删除光标所在行
    • yy:复制光标所在行
    • p:粘贴复制的文本
  6. 撤销和重做:在命令模式下,可以使用以下命令撤销和重做操作:

    • u:撤销最后一次操作
    • Ctrl + r:重做最后一次撤销的操作
  7. 查找和替换:在命令模式下,可以使用以下命令查找和替换文本:

    • /关键词:向下查找关键词
    • ?关键词:向上查找关键词
    • n:定位到下一个匹配项
    • N:定位到上一个匹配项
    • :%s/旧词/新词/g:将旧词替换为新词(g表示全局替换)
  8. 设置行号:在命令模式下,输入以下命令可以设置行号的显示:

    • :set number:显示行号
    • :set nonumber:隐藏行号
  9. 批量操作:在命令模式下,可以使用以下命令进行批量操作:

    • :n1,n2d:删除n1到n2行
    • :n1,n2y:复制n1到n2行
    • :n1,n2m n3:将n1到n2行移动到n3行之后

注意:当命令堆满整个屏幕时,可以使用 ctrl+l 清屏。

练习:

以截图保存成 word 文档的方式提交作业。

1.创建一个 info.txt,内容为 

hello world !
hello world !
Linux
hello world !
hello world !
hello world !
Linux

2.使用搜索和查找里面的 Linux 这个单词。

3.显示全文的行号。

7.允许远程连接

centos7 命令:ip addr,其它操作系统有相应的区别,centos6 及红帽操作系统使用 ifconfig 查看 ip。windows 使用 ipconfig 查看。centos7 使用 ip addr 查看时第一次是没有显示 ip 的,因为网卡未开启,需要使用如下命令开启网卡。

编辑

vi /etc/sysconfig/network-scripts/ifcfg-ens33

把最后的一个单词 no-->yes

重启网络服务后

systemctl restart network

再查看 ip 地址即可。

远程登录 Linux 系统的工具有很多如:Putty [ˈpʌti]、SecureCRT [sɪˈkjʊə(r).crt]、Xmanager [x.ˈmænɪdʒə(r)]、idea 等。

如下为 SecureCRT 远程登陆 Linux 系统,上传下载文件等一系列操作。

下载地址:链接

启动时双击 SecureCRTPortable.exe

SecureCRT 可以传输命令,语法和 Linux 里面的用法相同。

通常我们还要用 SecureCRT 来传输文件,

即可打开文件传输窗口,通过该窗口可以很方便的传输文件。

如果只是简单的上传文件,也可以使用 alt + p 打开文件传输窗口,然后将要上传的文件拖拽到该窗口即可传输到 root 目录。

idea 远程链接 

点击 Tools 选择 Deployment > Configuration... 如下图:

在弹出的 Deployment(部署)窗口中点击添加 SFTP,在 SSH configuration 中继续添加连接信息,在其中填入主机,账号,密码即可远程连接。配置完成后在 Tools 中选择 Start SSH session 即可打开远程会话界面。

远程文件管理器

在该窗口中即可拖拽当前项目中的文件进行远程传输。

8.防火墙

防火墙对流经它的网络通信进行扫描,这样能够过滤掉一些攻击,以免其在目标计算机上被执行。防火墙还可以隔绝不使用的端口。而且它还能禁止特定端口的流出信息,封锁特洛伊木马。最后,它可以禁止来自特殊站点的访问,从而防止来自不明入侵者的所有通信。对于云服务器来说,直接配置安全组即可,不需要使用防火墙。

在Ubuntu中,防火墙功能由ufw(Uncomplicated Firewall)提供。以下是如何管理UFW的基本命令: 

关闭防火墙:

sudo ufw disable

开启防火墙:

sudo ufw enable

查看防火墙状态:

sudo ufw status

如果需要添加规则,可以使用以下命令: 允许端口(例如允许端口 80):

sudo ufw allow 80/tcp

拒绝端口(例如拒绝端口 25):

sudo ufw deny 25/tcp

删除规则,需要知道规则的编号,可以通过sudo ufw status numbered查看规则及其编号,然后使用以下命令删除规则(例如删除编号为1的规则):

sudo ufw delete 1

请根据实际需求使用相应的命令。

systemctl 是 Linux 系统中的一个管理服务的命令行工具,它可以用来启动、停止、重启、重载、查看状态等操作系统服务。

使用 systemctl 命令的基本语法如下:

systemctl [选项] [命令] [服务名]

常用的选项包括:

  • -a:显示所有的服务,包括未启动的服务。
  • -l:显示更详细的信息。
  • --no-pager:禁止使用分页显示。
  • --now:立即启动服务。

常用的命令包括:

  • start:启动服务。
  • stop:停止服务。
  • restart:重启服务。
  • reload:重新加载配置文件。
  • enable:设置服务开机自启动。
  • disable:取消服务开机自启动。
  • status:查看服务状态。
  • is-active:检查服务是否正在运行。
  • is-enabled:检查服务是否开机自启动。

示例:

  • 启动一个服务:systemctl start service_name
  • 停止一个服务:systemctl stop service_name
  • 重启一个服务:systemctl restart service_name
  • 重新加载配置文件:systemctl reload service_name
  • 设置服务开机自启动:systemctl enable service_name
  • 取消服务开机自启动:systemctl disable service_name
  • 查看服务状态:systemctl status service_name

通过 systemctl 命令,可以方便地管理 Linux 系统中的各种服务,提高系统的可用性和稳定性。

练习:

1.以截图保存成 word 文档的方式提交作业,并完成下面功能要求:

  1. 安装一个全新的 centos7 取名为 homework,开启 homework 的远程连接,使用远程连接工具完成以下操作。
  2. 在 homework 主机的的 /root 目录下面创建 一个 test1.txt 文件。
  3. 向 test1.txt 加入内容 "I love studying Linux." 并将其向下复制 10 行,并显示行号。
  4. 长期开放 homework 的 8888 防火墙端口。
  5. 将 test1.txt 下载传输到自己的 window 系统的 D 盘。

9.目录文件操作

创建单层文件夹

mkdir abc

创建多层文件夹

mkdir -p aaa/bbb

-p 先建立上层目录,确保能正确创建完整目录。

文本文件操作

除了前面的 vi 命令,经常使用的还有 cat 与 echo 命令。

cat 命令是 linux 下的一个文本输出命令,通常是用于观看某个文件的内容。

cat user.txt

echo 命令用于在 shell 中打印 shell 变量的值,或者直接输出指定的字符串。

[root@localhost ~]# echo $PATH
/root/jdk1.8.0_111/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# echo user
user
[root@localhost ~]# echo hello world > user.txt

注意:使用 echo 输出字符串到文件时,会覆盖文件内的原内容。

10.删除命令

在计算机操作中经常删除文件或目录,在 Linux 中使用 rm 命令 rm 是 remove [rɪˈmuːv] 的简写。

用法如下:

rm -f 文件名:不提示直接强制删除

rm -f aa.txt

rm -r 目录名:删除目录

rm -r aa

rm -rf 文件或目录名:强制删除文件或目录

使用通配符删除,删除后缀名为 java 的文件

rm -rf *.java

注意:命令行删除是没有回收站,删除就没有了,请谨慎使用。

11.复制与移动

拷贝也叫复制,拷贝分为文件拷贝和目录拷贝,在 Linux 中使用 cp 命令完成拷贝 cp 是 copy [ˈkɒpi] 的简写,文件拷贝语法如下:

拷贝到 /root 下不修改文件名

cp abc.txt /root/

拷贝时会修改文件名,将原来的文件名变为 abc

cp abc.txt /root/abc

拷贝目录:

将 root 目录拷贝到 /home/ 下,拷贝完成后目录结构 /home/root/

cp -rf /root/ /home/

-rf:与删除语法相同,f:表示当出现提醒时(如文件存在覆盖提醒)全部强制。r:表示递归(目录下可能还有多层目录,全部使用递归拷贝)

移动也叫剪切,在Linux 中使用 mv 命令,mv 是 move [muːv] 的简写,使用 mv 除了移动文件位置还可以给文件改名:mv 原名 新名

mv abc.txt aaa.tex

正常移动文件使用如下命令

mv abc.txt /root/aa/

正常移动文件夹 mv 将要移动的文件夹 目标位置

mv abc/ /root/

需要注意绝对路径和相对路径问题。

移动文件夹并改名,把 bbb 文件夹移动到 root 下并改名为 aaaa

mv bbb/ /root/aaaa

12.文件搜索

文件搜索一般可以根据文件名,类型,时间等搜索,本节只演示根据名称和类型搜索。使用命令 find 进行文件搜索,格式如下:

find 路径 -name 文件名

find /root/ -name abc.txt

当然,在搜索时也可以使用通配符 * ? [],注意使用通配符时文件名需要加单引号。

* 匹配任意内容

?匹配一个字符

[] 匹配任意一个中括号内的字符

find /root/ -name '*a*'

查询文件名中包含 a 字符的

find /root/ -name '?a*'

查询文件名第二个字母为 a 的文件

find /root/ -name '*[batc]sh*'

查询文件名包含 batcsh bash tcsh ash csh bsh tsh 字符串的文件(该命令会自动使用排列组合匹配对应的文件名)

find /home -type f

查询 /home 目录下的所有文件

f:文件

d:目录

13.权限与脚本

在使用 Linux 过程中,经常会用到一些重复性比较多的命令。有时为了减少命令的重复输入,我们通常把常用命令存入一个文本文件,并赋予它运行的权限,从而在需要使用时只需要运行即可。在 linux 上使用 chmod 授权。 

vi bat.sh 并把需要的命令放到里面

mkdir -p demo
cd demo
echo hello > a.txt
cat a.txt
cd ..

赋予该文件可执行的权限

chmod 777 bat.sh

读、写、运行三项权限可以用数字表示,就是 r=4,w=2,x=1,777 就是 rwxrwxrwx,意思是该登录用户(可以用命令 id 查看)、所在的组和其他用户都有最高权限。  

使用命令执行所写脚本

./bat.sh

14.压缩和解压

在 Linux 中压缩文件格式一般为 tar.gz 格式,大部分的 Linux 系统都默认支持该格式的文件压缩和解压,在 Linux 中使用 tar 命令完成文件的压缩和解压。如果需要压缩和解压其他格式需另行安装相应的解压和压缩软件。

tar -zxvf jdk-7u67-linux-x64.tar.gz

-c:产生 .tar 打包文件 

-v:显示详细信息 

-f:指定压缩后的文件名 

-z:打包同时压缩 

-x:解压.tar文件

压缩:tar -zcvf 压缩后文件名 要压缩的文件或目录

tar -zcvf jdk.tar.gz jdk1.8/

解压:tar -zxvf 要解压的文件

tar -zxvf jdk.tar.gz

解压到指定目录:tar -zxvf 要解压的文件 -C 指定目录,指定解压到的目录要存在。

tar -zxvf aa.tar.gz -C /home/

15.yum 与 apt

yum( Yellow dog Updater, Modified)是一个在 Fedora 和 RedHat 以及 CentOs 中的 Shell 前端软件包管理器,类似 windows 上的软件管家。基于 RPM 包管理 ,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。yum 提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。

yum 常用命令

  1. 列出所有可更新的软件清单命令:yum check-update
  2. 更新所有软件命令:yum update
  3. 仅安装指定的软件命令:yum install
  4. 仅更新指定的软件命令:yum update
  5. 列出所有可安裝的软件清单命令:yum list
  6. 删除软件包命令:yum remove
  7. 查找软件包命令:yum search
yum install wget -y

-y 表示所有的安装过程中全部选是。

安装完成后就可以使用 wget 下载网络资源。

wget http://img.mp.itc.cn/upload/20170112/e9781ccf2df84c959298d985414dc132_th.jpg

Linux中的APT (Advanced Package Tool) 是一个用于管理软件包的工具。它是Debian及其衍生发行版(比如Ubuntu)中的软件包管理系统。

APT用于从软件仓库中安装、升级和删除软件包,可以让用户很方便地管理系统中的软件。

以下是一些常用的APT命令:

  1. 更新软件包列表:sudo apt update运行此命令将更新软件包列表,使系统可以获取最新的软件包信息。

  2. 升级已安装的软件包:sudo apt upgrade运行此命令将升级系统中已安装的所有软件包到最新可用版本。

  3. 安装软件包:sudo apt install package_name使用此命令可以安装指定软件包。例如,要安装Vim编辑器,可以运行sudo apt install vim

  4. 删除软件包:sudo apt remove package_name通过此命令可以删除系统中的指定软件包,但保留其配置文件。

  5. 完全删除软件包:sudo apt purge package_name运行此命令将完全删除指定软件包,包括其配置文件。

  6. 搜索软件包:apt search search_term使用此命令可以搜索软件包。例如,apt search nginx将显示与nginx相关的软件包列表。

  7. 显示软件包详细信息:apt show package_name使用此命令可以显示特定软件包的详细信息,包括版本、大小、依赖关系等。

注意:在使用APT命令时,通常需要在前面添加sudo命令以获得管理员权限,以确保操作成功。

16.文件名编码

很多老版本的 Linux 系统的默认字符编码不是 UTF-8,所以很多时候我们上传的压缩文件内目录带中文时解压后会有乱码问题,安装 convmv 可以修改被请求的文件路径或者文件名的字符集。使用 yum 安装 convmv 

命令:

yum install convmv  -y

修改目录的字符编码

convmv -f GB2312 -t UTF-8 -r --notest /root/**

以上表示 /root/ 下的所有文件的文件名由 GB2312 转换为 UTF-8

1、-f ENCODING 指定目前文件名的编码,如-f gbk 

2、-t ENCODING 指定将要转换成的编码,如-f utf-8 

3、-r 递归转换目录下所有文件名 

4、–list 列出所有支持的编码 

5、–notest 默认是只打印转换后的效果,加这个选项才真正执行转换操作。

 注意:在将来的项目部署过程中,尽可能不要使用中文目录或中文文件名。

练习:

1.安装一个全新的 centos7 取名为 homework2,并配置远程连接。

2.创建一个脚本完成如下操作:截取脚本内容和运行后效果图。

在 homework2 主机下创建 /root/homework/test01 目录
在 /root/homework/test01 下面创建 test1.txt 文件内容为 "I love studying Linux." 
使用 cat 查看文件内容。
返回 root 的家目录。

3.使用 yum 安装 convmv 和 wget。 

4.下载如下地址的内容,解压后解决中文文件名乱码问题。下载时如果提示证书有问题可以在后面增加参数 --no-check-certificate。

http://58.42.239.163:8888/demo.tar.gz

17.安装配置 JDK

Linux 平台上运行的的 jdk 与 windows 的不是相同的,但是都是解压即可运行。这是 Linux 平台的 jdk 下载地址:链接

Linux 的环境变量在 /etc/profile 中,配置 jdk 时需要编辑该文件,养成良好的软件存放习惯 jdk 的解压位置统一放在 /opt/module/ 下。

vi /etc/profile

在文件头位置添加 jdk 环境变量示例如下:

export JAVA_HOME=/usr/local/jdk17
export PATH=$JAVA_HOME/bin:$PATH

一般需要配置 JAVA_HOME、CLASSPATH 和 PATH。配置完成后需要让操作系统重新加载坏境变量的配置文件。

source /etc/profile

最后查看 Java 版本

[root@localhost ~]# java -version
java version "17.0.7" 2023-04-18 LTS
Java(TM) SE Runtime Environment (build 17.0.7+8-LTS-224)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.7+8-LTS-224, mixed mode, sharing)

注意:在运行 java 程序过程中如果想结束程序,使用 ctrl + c 结束程序。

练习:

1.使用 vi 手写一个 Helloworld.java,并在 Linux 上编译(javac Helloworld.java)和运行(java Helloworld)。

2.将员工管理系统上传并运行在 centos 上。

18.安装 Tomcat

在 Linux 上使用 Tomcat 只需要简单的解压运行就可以使用,但是前提条件是必须要安装和配置 jdk 。无论是 window 还是还是 Linux,在 Tomact 上部署项目只需要将项目的 war 文件复制到 Tomcat 的 webapp 目录下即可。

Tomact 下载:链接

1.进入 bin 目录

./startup.sh
...
Tomcat started.

startup.sh 启动脚本

shutdown.sh 停止脚本
启动完成后可以使用 windows 的浏览器访问 Linux 里面启动的 tomcat,浏览器地址中输入 ip:端口 ,tomcat 默认的端口是 8080。

在 tomcat 的 webapp 里面部署的 web 项目,访问时除了 ip:端口还需要增加项目名,例如: http://192.168.5.128:8080/zy-company/
注意:如果启动的 tomcat 不能被其他浏览器访问,很大可能是由于端口不允许被外访问,此时需要关闭防火墙或允许 8080 端口可以被外界访问。

一个程序一般只能监听在一个端口,当再次启动或程序启动时经常遇到端口占用问题。通过 ss -lpn src :端口查看端口占用进程编号 pid

注意:一定要切换为超级管理员才能进行进程查询和结束。

[root@localhost bin]# ss -lpn src :8080
Netid    State    Recv-Q Send-Q    Local Address:Port    Peer Address:Port
tcp      LISTEN     0      100     :::8080               :::*    
users:(("java",pid=1344,fd=42))

根据 pid 结束进程

kill 1344

19.安装 Nginx

Nginx是一个高性能的HTTP和反向代理服务器,具备处理大量并发连接的能力,同时也提供IMAP/POP3代理服务。由于其事件驱动架构,Nginx能够高效地处理静态内容和负载均衡,广泛应用于高流量网站和应用。其模块化设计和简洁的配置文件使得用户可以灵活定制功能和优化性能,是现代互联网架构中不可或缺的重要组件。

更新apt命令

apt update

安装nginx

apt install nginx

查看nginx版本

root@test:~# nginx -v
nginx version: nginx/1.18.0 (Ubuntu)

启动nginx

systemctl start nginx

查看nginx的状态 

systemctl status nginx
root@test:~# systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2025-02-24 02:34:21 UTC; 9s ago
       Docs: man:nginx(8)
    Process: 3754 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 3766 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 3767 (nginx)
      Tasks: 9 (limit: 9257)

浏览器打开:127.0.0.1即可看到欢迎页。

安装nginx后的文件位置

  • /usr/sbin/nginx:主程序
  • /etc/nginx:存放配置文件
  • /var/www/html:存放静态文件,默认页 index.nginx-debian.html 
  • /var/log/nginx:存放日志

卸载nginx

先停止nginx命令

systemctl stop nginx

通过apt命令卸载nginx

apt remove nginx

20.安装 MySQL

在Ubuntu系统上安装MySQL 8.0可以通过以下步骤进行:

1.更新包列表:

sudo apt update

2.安装MySQL 服务器:

sudo apt install mysql-server

3.启动MySQL服务

sudo systemctl start mysql

4.使MySQL服务在系统启动时自动启动:

sudo systemctl enable mysql

检查MySQL服务状态:

sudo systemctl status mysql

完成以上步骤后,MySQL 8.0 应该已经在您的Ubuntu系统上安装并运行了。您可以通过运行mysql -u root -p并输入在安装过程中设置的root用户密码来登录到MySQL服务器。如果你登录到 Ubuntu 的用户不是 root 用户你将不能访问 MySQL 服务器。 注意,如果你尝试使用密码登录也将被拒绝连接,MySQL root 用户默认是没有密码。

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';
FLUSH PRIVILEGES;

编辑MySQL配置文件/etc/mysql/mysql.conf.d/mysqld.cnf,将bind-address这一行,将其改为:0.0.0.0。

将MySQL 里面的用户的 host 改为 % 后重启MySQL 服务即可远程连接。

显示数据库

mysql> show databases;

mysql 数据库用来存储数据库的基本信息,如用户名、密码、权限等等

mysql> use mysql;

显示当前使用的数据库所有的表。

mysql> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
.
.
.
| time_zone_transition_type |
| user                      |
+---------------------------+

查询所有可以连接当前数据库的用户

mysql> select host ,user from user;
+-----------+---------------+
| host      | user          |
+-----------+---------------+
| localhost | mysql.session |
| localhost | mysql.sys     |
| localhost | root          |
+-----------+---------------+
3 rows in set (0.00 sec)

需要将 root 的 host 改成 %

% 表示所有 ip 地址都可以远程连接

192.168.5.% 表示以192.168.5. 开头的 ip 才能连接该数据库。

mysql> update user set host='%' where user='root';

最后重启 mysql,数据库就可以远程连接,如果远程连接数据库有问题,一般是防火墙没关或防火墙不允许该端口被访问,mysql 的端口是 3306。

卸载 mysql 命令:

yum remove mysql-community-server -y

安装完成后在 windows 上使用 idea 连接到 Linux 的 mysql。

在数据库连接使用命令行工具创建数据库,创建一个名为 linux 的数据库,

create database linux

将创表和插入数据脚本 linux.sql 拷贝到项目中右键运行执行。下载地址

执行成功后,展开数据库,可以清楚的看到 student 表和表内的数据。

21.重设 mysql 密码

在 /etc/my.cnf 配置文件加入如下配置,让 mysql 跳过验证。修改成功后重启 mysql 服务即可通过免密登录。

skip-grant-tables

不输入密码的情况下登录,通过如下命令修改 root 密码

mysql> update mysql.user set authentication_string=password('cvcode') where user='root';

修改完成后刷新权限表。

mysql> flush privileges;

退出登录,并关闭免密登录并重启 mysql 服务。即可使用新密码登录。

22.安装 Redis

首先安装 redis 之前,可以点击这里,查看最新的 releases 版本。并使用 wget 下载:Index of /releases/

wget http://download.redis.io/releases/redis-4.0.10.tar.gz

安装 gcc

yum install gcc -y

解压

tar -zxvf  redis.tar.gz

进入目录安装 make 编译后再执行下面命令安装。

make PREFIX=/opt/redis MALLOC=libc install

然后 /opt/redis 目录下就会有一个 bin 目录,在该目录下执行 ./redis-server 就会启动 redis,但我们需要配置一下,需要用的 redis.conf,文件在哪里呢,在安装包中。

cp /root/redis-4.0.10/redis.conf /opt/redis/bin/

这样 redis.conf 就复制到和 redis-server 同级文件夹,需要做以下配置:

daemonize yes
#bind 127.0.0.1
protected-mode no

1.daemonize:By default Redis does not run as a daemon. Use 'yes' if you need it.默认情况下,Redis不作为守护进程运行。如果你需要,就说yes。

Note that Redis will write a pid file in /var/run/redis.pid when daemonized.注意,Redis将在 var/run/redis 中写入一个 pid 文件。被 daemon 化时的 Pid。

2.bind:By default, if no "bind" configuration directive is specified, Redis listens for connections from all the network interfaces available on the server. 默认情况下,如果没有指定“bind”配置指令,Redis将监听来自服务器上所有可用网络接口的连接。

It is possible to listen to just one or multiple selected interfaces using the "bind" configuration directive, followed by one or more IP addresses.使用“bind”配置指令,可以只监听一个或多个选定的接口,后面跟着一个或多个IP地址。

Examples:

bind 192.168.1.100 10.0.0.1
bind 127.0.0.1 ::1

~~~ WARNING ~~~

If the computer running Redis is directly exposed to the internet, binding to all the interfaces is dangerous and will expose the instance to everybody on the internet. So by default we uncomment the following bind directive, that will force Redis to listen only into the IPv4 lookback interface address (this means Redis will be able to accept connections only from clients running into the same computer it is running).如果运行Redis的计算机直接暴露在互联网上,绑定到所有接口是危险的,并且会将实例暴露给互联网上的每个人。因此,默认情况下,我们取消注释下面的bind指令,这将强制Redis只监听IPv4回看接口地址(这意味着Redis将只能接受来自运行到同一台计算机的客户端的连接)。

if you are sure you want your instance to listen to all the interfaces just comment the following line. 如果您确定希望实例侦听所有接口,只需注释下面一行即可。

#bind 127.0.0.1

3.protected-mode:Protected mode is a layer of security protection, in order to avoid that Redis instances left open on the internet are accessed and exploited.保护模式是一层安全保护,以避免互联网上开放的Redis实例被访问和利用。

When protected mode is on and if:当保护模式开启时,如果:

1) The server is not binding explicitly to a set of addresses using the "bind" directive.服务器没有使用“bind”指令显式绑定到一组地址。

2) No password is configured.未配置密码。

The server only accepts connections from clients connecting from the IPv4 and IPv6 loopback addresses 127.0.0.1 and ::1, and from Unix domain sockets.服务器只接受来自IPv4和IPv6环回地址127.0.0.1和::1以及Unix域套接字的客户端连接。

By default protected mode is enabled. You should disable it only if you are sure you want clients from other hosts to connect to Redis even if no authentication is configured, nor a specific set of interfaces are explicitly listed using the "bind" directive.缺省情况下,启用保护模式。只有当你确定你想要其他主机的客户端连接到Redis,即使没有配置身份验证,也没有使用“bind”指令显式列出特定的接口集时,你才应该禁用它。

./redis-server redis.conf

redis 启动在 6379 端口。

使用 redis-cli 检查 redis 服务是否启动成功。

[root@localhost bin]# ./redis-cli 
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> exit

停止 Redis 

./redis-cli shutdown

卸载时只需要删除 /opt/ 下的 redis 目录即可。

在Ubuntu系统中使用apt安装Redis的步骤如下:

更新本地包索引:

sudo apt update

安装Redis服务器:

sudo apt install redis-server

启动Redis服务:

sudo systemctl start redis-server

确认Redis正在运行:

sudo systemctl status redis-server

使Redis在系统启动时自动启动:

sudo systemctl enable redis-server

配置Redis以接受远程连接涉及几个步骤。以下是详细的步骤说明:

编辑Redis配置文件: 使用文本编辑器(如nano或vim)打开Redis的配置文件。这个文件通常位于/etc/redis/redis.conf。

sudo nano /etc/redis/redis.conf

修改bind配置项: 默认情况下,Redis只监听本地连接,这由bind配置项决定,其值通常为127.0.0.1。要允许远程连接,你可以将其设置为0.0.0.0,这将允许Redis接受来自任何IP地址的连接。如果你只想允许特定IP地址访问Redis,可以指定那个IP地址。

# 将bind 127.0.0.1修改为:  bind0.0.0.0

或者,如果你想限制特定的IP地址访问,可以这样设置:

bind your_specific_ip_address

关闭保护模式(如果需要): 如果你的Redis版本启用了保护模式(protected-mode),你可能还需要将其设置为no,以允许远程连接。

protected-mode no

保存并关闭配置文件: 完成上述更改后,保存并关闭配置文件。

重启Redis服务: 为了使上述更改生效,你需要重启Redis服务。

sudo systemctl restart redis-server

测试远程连接。

注意:允许Redis接受远程连接可能带来安全风险,因为Redis默认没有启用任何形式的身份验证。在生产环境中,你应该考虑配置Redis使用密码或其他安全措施来保护数据。

23.实战:OA 系统部署

1.使用 VM 安装一台全新的 centos 7 取名为 office,并配置相应的远程连接,关闭防火墙,也可以重新更换阿里云服务器系统和安全组规则。

2.安装 jdk 与 Tomcat。

3.安装 mysql 并配置远程连接,创建对应的数据库和导入数据。

4.下载相应的项目源码,使用 maven 将项目打包到 target 目录,复制 war 包到服务器上并部署。如果有静态资源在 windows 上使用命令 tar 将其压缩为 XXX.tar.gz 格式(或使用 bandizip 将其先压缩为 tar 格式后再压缩为 gz 格式),并上传到服务器。

5.使项目通过浏览器可以被访问。

练习:

1.安装一台 centos 7 取名为 company,并在其上部署公司门户系统。要求通过浏览器可以访问(提交部署过程截图文档:项目下载)
注意:项目部署完成后需要使用如下格式路径才能访问首页。

http://192.168.5.129:8080/zy-company

24.MySQL 集群方案

MGR是 mysql Group Replication 简称,中文名称是 Mysql 组复制,MGR 是 MySQL 官方于 2016 年 12 月推出的一个全新的高可用与高扩展的解决方案,提供了高可用、高扩展、高可靠的 MySQL 集群服务,目前只支持 MYSQL5.7 和 mysql8.0 版本

Mysql主从复制原理

主从复制是指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中。对于多级复制,数据库服务器即可充当主机,也可充当从机。MySQL主从复制的基础是主服务器对数据库修改记录二进制日志,从服务器通过主服务器的二进制日志自动执行更新。

Mysq主从复制的类型

  1. 基于语句的复制: 主服务器上面执行的语句在从服务器上面再执行一遍,在MySQL-3.23 版本以后支持。 存在的问题:时间上可能不完全同步造成偏差,执行语句的用户也可能是不同一个用户。 
  2. 基于行的复制: 把主服务器上面改编后的内容直接复制过去,而不关心到底改变该内容是由哪条语句引发的,在MySQL-5.0版本以后引入。 存在的问题:如果修改的行数过多,造成的开销比较大。

MySQL默认使用基于语句的复制,当基于语句的复制会引发问题的时候就会使用基于行的复制,MySQL会自动进行选择。 在MySQL主从复制架构中,读操作可以在所有的服务器上面进行,而写操作只能在主服务器上面进行。主从复制架构虽然给读操作提供了扩展,可如果写操作也比较多的话(多台从服务器还要从主服务器上面同步数据),单主模型的复制中主服务器势必会成为性能瓶颈。

Mysql主从复制的工作原理

如上图所示,主服务器上面的任何修改都会保存在二进制日志Binary log里面,从服务器上面启动一个I/O thread(实际上就是一个主服务器的客户端进程),连接到主服务器上面请求读取二进制日志,然后把读取到的二进制日志写到本地的一个Realy log里面。从服务器上面开启一个SQL thread定时检查Realy log,如果发现有更改立即把更改的内容在本机上面执行一遍。

如果一主多从的话,这时主库既要负责写又要负责为几个从库提供二进制日志。此时可以稍做调整,将二进制日志只给某一从,这一从再开启二进制日志并将自己的二进制日志再发给其它从。或者是干脆这个从不记录只负责将二进制日志转发给其它从,这样架构起来性能可能要好得多,而且数据之间的延时应该也稍微要好一些。

Mysql主从复制的过程

  1. Slave上面的IO进程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容。
  2. Master接收到来自Slave的IO进程的请求后,负责复制的IO进程会根据请求信息读取日志指定位置之后的日志信息,返回给Slave的IO进程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置。
  3. Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master从何处开始读取日志。
  4. Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。

linux安装mysql8并且实现主从同步

安装mysql 下载软件包:

wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm

本地安装:

yum localinstall mysql80-community-release-el7-1.noarch.rpm

安装mysql:

yum install mysql-community-server

设为开机启动:

systemctl enable mysqld
systemctl daemon-reload

启动mysql:

systemctl start mysqld

以上步骤就安装好 mysql8了。 获取 mysql 的临时密码:

grep 'temporary password' /var/log/mysqld.log

登录 mysql: 

mysql -uroot -p

会提示输入密码,输入之前获取的临时密码即可登录。 此时需要修改 mysql 的密码,要不然之后的步骤也会强制提示你需要修改密码:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';

mysql8 默认对密码的强度有要求,需要设置复杂一点,要不然也会提示错误。 

-- 密码验证策略低要求(0或LOW代表低级)
set global validate_password.policy=0;

-- 密码至少要包含的小写字母个数和大写字母个数
set global validate_password.mixed_case_count=0;

-- 密码至少要包含的数字个数。
set global validate_password.number_count=0; 

-- 密码至少要包含的特殊字符数
set global validate_password.special_char_count=0; 

-- 密码长度
set global validate_password.length=6;

最后刷新配置:

FLUSH PRIVILEGES;

主从配置

在主从配置之前需要确保两台 mysql 需要同步的库状态一致。

配置文件默认在/etc/my.cnf下。 在配置文件中新增配置:

[mysqld]
## 同一局域网内注意要唯一
server-id=100  
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin

修改配置后需要重启才能生效:

service mysqld restart

重启之后进入mysql: 

 mysql -uroot -p

在master数据库创建数据同步用户,授予用户 slave REPLICATION SLAVE 权限和 REPLICATION CLIENT 权限,用于在主从库之间同步数据。

CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '@#$Rfg345634523rft4fa';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

语句中的%代表所有服务器都可以使用这个用户,如果想指定特定的ip,将%改成ip即可。

查看主mysql的状态: 

show master status;

记录下File和Position的值,并且不进行其他操作以免引起Position的变化。

从在从my.cnf配置中新增:

[mysqld]
## 设置server_id,注意要唯一
server-id=101  
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin   
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin

修改配置后需要重启才能生效:

service mysqld restart

重启之后进入mysql:

mysql -uroot -p

使用命令完成同步

change master to master_host='192.168.2.130', master_user='slave', master_password='@#$Rfg345634523rft4fa', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 711;

master_host :Master的地址

master_port:Master的端口号 

master_user:用于数据同步的用户 

master_password:用于同步的用户的密码 

masterlogfile:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值 

masterlogpos:从哪个 Position 开始读,即上文中提到的 Position 字段的值  

masterconnectretry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒

在从mysql中查看主从同步状态: 

show slave status \G;

此时的SlaveIORunning 和 SlaveSQLRunning 都是No,因为我们还没有开启主从复制过程。 开启主从复制:

start slave;

再次查看同步状态,SlaveIORunning 和 SlaveSQLRunning 都是Yes说明主从复制已经开启。

若SlaveIORunning一直是Connecting,有下面4种原因:

1、网络不通,检查 ip 端口,防火墙

2、密码不对,检查用于同步的用户名和密码

3、pos不对,检查Master的Position

如果需要指定想要主从同步哪个数据库,可以在master的my.cnf添加配置:

binlog-do-db:指定mysql的binlog日志记录哪个db

或者在slave的my.cnf添加配置: `replicate-do-db=需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可replicate-ignore-db=不需要复制的数据库名,如果不想复制多个数据库,重复设置这个选项即可` 如果想要同步所有库和表,在从mysql执行:

STOP SLAVE SQL_THREAD;
CHANGE REPLICATION FILTER REPLICATE_DO_DB = ();
start SLAVE SQL_THREAD;

至此,MySQL 同步配置完成。

设置只读模式

由于集群模式下,要实现读写分离,写的功能在mysql主服务器上,从服务器集群允许只读模式,避免由于操作失误导致的同步问题,我们需要提前设置mysql从服务器的读写为readonly。

查看读写模式:

show global variables like "%read_only%";

设置为只读模式 readonly:

set global read_only=1;

springboot 配置读写分离

读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做。因此,一般来讲,读写分离有两种实现方式。第一种是依靠中间件(比如:MyCat),也就是说应用程序连接到中间件,中间件帮我们做SQL分离;第二种是应用程序自己去做分离。这里我们选择程序自己来做,主要是利用Spring提供的路由数据源,以及AOP

然而,应用程序层面去做读写分离最大的弱点(不足之处)在于无法动态增加数据库节点,因为数据源配置都是写在配置中的,新增数据库意味着新加一个数据源,必然改配置,并重启应用。当然,好处就是相对简单。

application.yml

spring:
  datasource:
    master:
      jdbc-url: jdbc:mysql://192.168.102.31:3306/test
      username: root
      password: 123456
      driver-class-name: com.mysql.jdbc.Driver
    slave1:
      jdbc-url: jdbc:mysql://192.168.102.56:3306/test
      username: pig   # 只读账户
      password: 123456
      driver-class-name: com.mysql.jdbc.Driver
    slave2:
      jdbc-url: jdbc:mysql://192.168.102.36:3306/test
      username: pig   # 只读账户
      password: 123456
      driver-class-name: com.mysql.jdbc.Driver

这里,我们配置了4个数据源,1个master,2两个slave,1个路由数据源。前3个数据源都是为了生成第4个数据源,而且后续我们只用这最后一个路由数据源。

import com.cjs.example.bean.MyRoutingDataSource;
import com.cjs.example.enums.DBTypeEnum;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;


@Configuration
public class DataSourceConfig {

    @Bean
    @ConfigurationProperties("spring.datasource.master")
    public DataSource masterDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties("spring.datasource.slave1")
    public DataSource slave1DataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties("spring.datasource.slave2")
    public DataSource slave2DataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public DataSource myRoutingDataSource(@Qualifier("masterDataSource") DataSource masterDataSource,
                                          @Qualifier("slave1DataSource") DataSource slave1DataSource,
                                          @Qualifier("slave2DataSource") DataSource slave2DataSource) {
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put(DBTypeEnum.MASTER, masterDataSource);
        targetDataSources.put(DBTypeEnum.SLAVE1, slave1DataSource);
        targetDataSources.put(DBTypeEnum.SLAVE2, slave2DataSource);
        MyRoutingDataSource myRoutingDataSource = new MyRoutingDataSource();
        myRoutingDataSource.setDefaultTargetDataSource(masterDataSource);
        myRoutingDataSource.setTargetDataSources(targetDataSources);
        return myRoutingDataSource;
    }

}

25.部署PHP项目

在 Ubuntu 上使用 PHP-FPM 与 Nginx 部署 PHP 项目是一种常见的方式,以下是一些步骤来实现这一目标:

1.安装 Nginx 和 PHP-FPM:

sudo apt update
sudo apt install nginx
sudo apt install php-fpm php-mysql php-common php-mbstring php-xml php-zip

php-common - PHP文档、示例和通用模块

php-mysql - 用于使用MySQL数据库 

php-zip - 用于处理压缩文件

php-gd - 用于处理图像

php-mbstring - 用于管理非ascii字符串

php-curl - 允许你用PHP发起HTTP请求

php-xml - 用于处理XML数据

2.配置 Nginx:

创建一个 Nginx 配置文件来指定 PHP-FPM 的连接方式。你可以在 /etc/nginx/sites-available/ 目录下创建一个新的配置文件,比如 youke.conf,然后在文件中添加类似以下内容的配置:

# 服务端配置节点
server {
    # 监听端口。此端口不能被占用了
    listen       80;
    # 此站点的域名。直接在宿主机配置一个host域名,或者在阿里云等云服务商那里解析过来。
    server_name  127.0.0.1;
    # 此站点的入口目录。这里要注意,这是当前容器内的路径。因为我等下会把宿主机的项目路径挂载到容器内的 /www 目录。
    root  /home/test/www/youke;
    # 入口目录里可识别的入口文件
    index index.html index.htm index.php;
    
    # 配置伪静态设置
    location / {
        #访问路径的文件不存在则重写URL转交给ThinkPHP处理
        if (!-e $request_filename) {
            rewrite  ^(.*)$  /index.php?s=$1  last;   break;
        }
    }

    # 配置url,处理及转发PHP请求
    location ~ \.php(/|$) {
        # 入口文件
        include snippets/fastcgi-php.conf; 
        # With php-fpm (or other unix sockets): 
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    }
    # 用户的访问日志。注意,这目录必须存在,否则nginx将启动不了。
    access_log  /www/youke.log;
    # 错误日志
    error_log  /www/youke.error.log;
}

fastcgi_pass:这个指令用于指定将 FastCGI 请求转发到哪里。在这里,它指向一个 Unix 套接字,而不是 TCP/IP 地址。 

unix:/run/php/php7.4-fpm.sock:这是 PHP-FPM 用于通信的 Unix 套接字文件的路径。通过套接字,Nginx 和 PHP-FPM 之间可以建立快速高效的通信通道。

通过创建软连接启用配置文件:

sudo ln -s /etc/nginx/sites-available/myproject.conf /etc/nginx/sites-enabled/

3.重启 Nginx 以使配置生效:

sudo systemctl restart nginx

4.重启 PHP-FPM:sudo systemctl restart php{version}-fpm

PHP 项目应该可以通过 Nginx 和 PHP-FPM 运行了。访问配置的服务器域名或 IP 地址应该可以看到项目运行的效果。

注意:项目路径 /home/test/www/youke 一定要有可读可写可运行权限。chmod -R 777 /path/to/directory

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值