Linux软件安装
Anaconda
下载相关环境
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2019.10-Linux-x86_64.sh --no-check-certificate
1增加执行权限
chmod +x Anaconda3-2019.10-Linux-x86_64.sh
1安装(按照提示操作即可)
bash Anaconda3-2019.10-Linux-x86_64.sh
1加载环境变量
source /root/.bashrc
1或者
source ~./bashrc
1检查是否安装成功
which python
1
torchvision
下载torchvison地址:https://download.pytorch.org/whl/cu110/torch_stable.html
torchvision-0.8.2%2Bcu110-cp38-cp38-win_amd64.whl中的命名解释:
torchvision-0.8.2
:表示 torchvision版本为:0.8.2cu110
:支持的cuda(GPU)版本为:11.0【cu102
:表示cuda版本为10.2】cp38
:指的是anaconda中的python版本为python38win_amd64
:用于64位window系统。torch-1.7.1
:表示torch版本为1.7.1
我的anacond中python版本为python38,在windows64位系统上运行,故需要的版本为:torchvision-0.8.2%2Bcu110-cp38-cp38-win_amd64.whl
编程环境和软件工具安装手册 (opens new window)
💗 具体版本应根据实际需求确定
Java
jdk 下载
JDK 历史版本页面
- JDK 历史版本:https://www.oracle.com/java/technologies/oracle-java-archive-downloads.html
- JDK8 历史版本:https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html
JDK 国内官网下载地址:
JDK8 国内官网下载地址:
卸载已有的 openJDK
查询本机中已经安装过的 java rpm 包,命令如下;
rpm -qa |grep java
[root@localhost ~]$ rpm -qa |grep java
java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64
java-1.7.0-openjdk-headless-1.7.0.91-2.6.2.3.el7.x86_64
javapackages-tools-3.4.1-11.el7.noarch
java-1.8.0-openjdk-headless-1.8.0.65-3.b17.el7.x86_64
nuxwdog-client-java-1.0.3-2.el7.x86_64
java-1.7.0-openjdk-1.7.0.91-2.6.2.3.el7.x86_64
mysql-connector-java-5.1.25-3.el7.noarch
python-javapackages-3.4.1-11.el7.noarch
tzdata-java-2015g-1.el7.noarch
javassist-3.16.1-10.el7.noarch
java-1.7.0-openjdk-devel-1.7.0.91-2.6.2.3.el7.x86_64
javamail-1.4.6-8.el7.noarch
2
3
4
5
6
7
8
9
10
11
12
13
14
如上,将下面几个删除即可
java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64
java-1.7.0-openjdk-headless-1.7.0.91-2.6.2.3.el7.x86_64
java-1.8.0-openjdk-headless-1.8.0.65-3.b17.el7.x86_64
nuxwdog-client-java-1.0.3-2.el7.x86_64
java-1.7.0-openjdk-1.7.0.91-2.6.2.3.el7.x86_64
java-1.7.0-openjdk-devel-1.7.0.91-2.6.2.3.el7.x86_64
2
3
4
5
6
.noarch 文件属于通用文件,不影响,不用删除,删了也没事~
javapackages-tools-3.4.1-11.el7.noarch
mysql-connector-java-5.1.25-3.el7.noarch
python-javapackages-3.4.1-11.el7.noarch
tzdata-java-2015g-1.el7.noarch
javassist-3.16.1-10.el7.noarch
javamail-1.4.6-8.el7.noarch
2
3
4
5
6
删除命令,(注:删除命令需要用 root 权限)
rpm -e --nodeps xxx
`rpm -e --nodeps` java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64
`rpm -e --nodeps` java-1.7.0-openjdk-headless-1.7.0.91-2.6.2.3.el7.x86_64
`rpm -e --nodeps` java-1.8.0-openjdk-headless-1.8.0.65-3.b17.el7.x86_64
`rpm -e --nodeps` nuxwdog-client-java-1.0.3-2.el7.x86_64
`rpm -e --nodeps` java-1.7.0-openjdk-1.7.0.91-2.6.2.3.el7.x86_64
`rpm -e --nodeps` java-1.7.0-openjdk-devel-1.7.0.91-2.6.2.3.el7.x86_64
2
3
4
5
6
检查是否已经删除成功
在命令窗口键入java -version
,如下说明已经删除成功了:
[root@localhost ~]$ java -version
-bash: java: command not found
2
安装 + 配置 JDK
以下方式适用于安装各版本 JDK,本文以 JDK1.8 为例
1、创建一个 java 目录
mkdir -p /usr/local/java
2、进入目录
cd /usr/local/java
3、通过rz
命令或 xftp 将下载的 jdk 包上传到该目录
4、解压 jdk 压缩包
tar -zxvf jdk-8u271-linux-x64.tar.gz
5、配置环境变量
用 vim 或 vi 打开/etc/profile 文件
vim /etc/profile
6、点击键盘 i
进行编辑;
将下面内容粘贴到末尾;
JAVA_HOME=/usr/local/java/jdk1.8.0_271
CLASSPATH=$JAVA_HOME/lib/
PATH=$PATH:$JAVA_HOME/bin
export PATH JAVA_HOME CLASSPATH
2
3
4
注意JAVA_HOME=/home/local/java/jdk1.8.0_271
就是你自己的 jdk 目录
7、保存修改
- Esc
- Shift + q 进入键盘编辑
- wq 保存并退出
8、重新加载配置文件,命令:
source /etc/profile
验证安装情况
1、输入:java -version
2、输入:javac
3、输入:java
Reference
Tomcat
下载
官网 https://tomcat.apache.org/

根据自己需求选择相应版本,不建议选择最新版本,笔者选择了8.5.82
版 :apache-tomcat-8.5.82.tar.gz
上传解压
上传至
/root
目录解压安装
在
/usr/local/
下创建tomcat
⽂件夹并进⼊cd /usr/local/ mkdir tomcat cd tomcat
1
2
3将 Tomcat 安装包解压到
/usr/local/tomcat
中即可tar -zxvf /root/apache-tomcat-8.5.55.tar.gz -C ./
1解压完之后,
/usr/local/tomcat
⽬录中会出现⼀个apache-tomcat-8.5.82
的⽬录
启动 TOMCAT
直接进 apache-tomcat-8.5.82
⽬录,执⾏其中 bin
⽬录下的启动脚本即可
cd /bin
./startup.sh
2
访问测试
这时候浏览器访问: 你的主机IP:8080
,得到如下画⾯说明成功启动了

配置快捷操作和开机启动
⾸先进⼊ /etc/rc.d/init.d ⽬录,创建⼀个名为 tomcat 的⽂件,并赋予执⾏权限
[root@hwzhao bin]## cd /etc/rc.d/init.d/
[root@hwzhao init.d]## touch tomcat
[root@hwzhao bin]## chmod +x tomcat
2
3
接下来编辑 tomcat
⽂件,并在其中加⼊如下内容:
#!/bin/sh
## chkconfig: 345 99 10
## description: Auto-starts tomcat
## /etc/init.d/tomcatd
## Tomcat auto-start
## Source function library.
. /etc/init.d/functions
## source networking configuration.
. /etc/sysconfig/network
RETVAL=0
## 切换成自己的路径
export JAVA_HOME=/usr/local/java/jdk1.8.0_271
export CATALINA_HOME=/usr/local/tomcat/apache-tomcat-8.5.82
export CATALINA_BASE=/usr/local/tomcat/apache-tomcat-8.5.82
start()
{
if [ -f $CATALINA_HOME/bin/startup.sh ];
then
echo $"Starting Tomcat"
$CATALINA_HOME/bin/startup.sh
RETVAL=$?
echo " OK"
return $RETVAL
fi
}
stop()
{
if [ -f $CATALINA_HOME/bin/shutdown.sh ];
then
echo $"Stopping Tomcat"
$CATALINA_HOME/bin/shutdown.sh
RETVAL=$?
sleep 1
ps -fwwu tomcat | grep apache-tomcat|grep -v grep | grep -v PID | awk '{print $2}'|xargs kill -9
echo " OK"
## [ $RETVAL -eq 0 ] && rm -f /var/lock/...
return $RETVAL
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
echo $"Restaring Tomcat"
$0 stop
sleep 1
$0 start
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 1
;;
esac
exit $RETVAL
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
这样后续对于 Tomcat 的开启和关闭只需要执⾏如下命令即可:
service tomcat start
service tomcat stop
2
现在将其添加到系统服务,使用命令:chkconfig --add tomcat
然后使用chkconfig --list
查看服务是否添加成功最后加⼊开机启动即可【可以使用chkconfig tomcat on/off
切换开机启动关闭】
chkconfig --add tomcat
chkconfig tomcat on
2
MySQL
宋红康 MySQL环境搭建 (opens new window)
下载
进入 mysql 官网下载 mysql http://www.mysql.com/downloads/
滑到最下方
根据电脑选择相应的版本


安装

MySql Driver


下载完成后解压即可

Docker 版
拉取镜像
docker pull mysql:5.7
运行 docker 命令
运行命令:
docker run -p 3307:3306 --name mysql-master \
-v /mydata/mysql-master/log:/var/log/mysql \
-v /mydata/mysql-master/data:/var/lib/mysql \
-v /mydata/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
#高版本MySQL
docker run -p 3308:3306 --name mysql8 \
-v /mydata/mysql8/log:/var/log/mysql \
-v /mydata/mysql8/data:/var/lib/mysql \
-v /mydata/mysql8/conf:/etc/mysql/conf.d \
-v /etc/localtime:/etc/localtime:ro \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:8.0
2
3
4
5
6
7
8
9
10
11
12
13
14
15
安装成功。
进入容器查看配置,并进行字符集等默认配置:
[root@hadoop-104 conf]# docker exec -it mysql /bin/bash
root@b3a74e031bd7:/# whereis mysql
mysql: /usr/bin/mysql /usr/lib/mysql /etc/mysql /usr/share/mysql
root@b3a74e031bd7:/# ls /etc/mysql
my.cnf
root@b3a74e031bd7:/# cat /etc/mysql/my.cnf
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
root@b3a74e031bd7:/#
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
设置启动 docker 时,即运行 mysql
[root@hadoop-104 ~]# docker update mysql --restart=always
mysql
[root@hadoop-104 ~]#
2
3
Redis
基于 CentOS 7 Redis 的官方网站地址:https://redis.io/
安装 Redis 依赖
Redis 是基于 C 语言编写的,因此首先需要安装 Redis 所需要的 gcc 依赖:
yum install -y gcc tcl
上传安装包并解压
然后将 Redis 安装包上传到虚拟机的任意目录:
例如,我放到了/usr/local/src 目录:
解压缩:
tar -xzf redis-6.2.6.tar.gz
解压后:
进入 redis 目录:
cd redis-6.2.6
运行编译命令:
make && make install
如果没有出错,应该就安装成功了。
默认的安装路径是在 /usr/local/bin
目录下:
该目录以及默认配置到环境变量,因此可以在任意目录下运行这些命令。其中:
- redis-cli:是 redis 提供的命令行客户端
- redis-server:是 redis 的服务端启动脚本
- redis-sentinel:是 redis 的哨兵启动脚本
启动
redis 的启动方式有很多种,例如:
- 默认启动
- 指定配置启动
- 开机自启
默认启动
安装完成后,在任意目录输入 redis-server 命令即可启动 Redis:
redis-server
如图:
这种启动属于前台启动
,会阻塞整个会话窗口,窗口关闭或者按下CTRL + C
则 Redis 停止。不推荐使用。
指定配置启动
如果要让 Redis 以后台
方式启动,则必须修改 Redis 配置文件,就在我们之前解压的 redis 安装包下(/usr/local/src/redis-6.2.6
),名字叫 redis.conf:
我们先将这个配置文件备份一份:
cp redis.conf redis.conf.bck
然后修改 redis.conf 文件中的一些配置:
## 允许访问的地址,默认是127.0.0.1,会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问,生产环境不要设置为0.0.0.0
bind 0.0.0.0
## 守护进程,修改为yes后即可后台运行
daemonize yes
## 密码,设置后访问Redis必须输入密码
requirepass 123321
2
3
4
5
6
Redis 的其它常见配置:
## 监听的端口
port 6379
## 工作目录,默认是当前目录,也就是运行redis-server时的命令,日志、持久化等文件会保存在这个目录
dir .
## 数据库数量,设置为1,代表只使用1个库,默认有16个库,编号0~15
databases 1
## 设置redis能够使用的最大内存
maxmemory 512mb
## 日志文件,默认为空,不记录日志,可以指定日志文件名
logfile "redis.log"
2
3
4
5
6
7
8
9
10
启动 Redis:
## 进入redis安装目录
cd /usr/local/src/redis-6.2.6
## 启动
redis-server redis.conf
2
3
4
停止服务:
## 利用redis-cli来执行 shutdown 命令,即可停止 Redis 服务,
## 因为之前配置了密码,因此需要通过 -u 来指定密码
redis-cli -u 123321 shutdown
2
3
开机自启
我们也可以通过配置来实现开机自启。
首先,新建一个系统服务文件:
vi /etc/systemd/system/redis.service
内容如下:
[Unit]
Description=redis-server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /usr/local/src/redis-6.2.6/redis.conf
PrivateTmp=true
[Install]
WantedBy=multi-user.target
2
3
4
5
6
7
8
9
10
11
然后重载系统服务:
systemctl daemon-reload
现在,我们可以用下面这组命令来操作 redis 了:
## 启动
systemctl start redis
## 停止
systemctl stop redis
## 重启
systemctl restart redis
## 查看状态
systemctl status redis
2
3
4
5
6
7
8
执行下面的命令,可以让 redis 开机自启:
systemctl enable redis
Docker 版
拉取镜像
[root@hwServer ~]# docker pull redis:6.2.7
创建挂载目录
[root@hwServer ~]# mkdir -p /home/redis/conf
[root@hwServer ~]# touch /home/redis/conf/redis.conf
2
启动 redis
docker run -p 6379:6379 --name redis -v /home/redis/data:/data \
-v /home/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis:6.2.7 redis-server /etc/redis/redis.conf
2
3
设置 redis 容器在 docker 启动的时候启动
[root@hadoop-104 ~]# docker update redis --restart=always
redis
[root@hadoop-104 ~]#
2
3
测试
[root@hwServer ~]# docker exec -it redis redis-cli
Redis 客户端
安装完成 Redis,我们就可以操作 Redis,实现数据的 CRUD 了。这需要用到 Redis 客户端,包括:
- 命令行客户端
- 图形化桌面客户端
- 编程客户端
Redis 命令行客户端
Redis 安装完成后就自带了命令行客户端:redis-cli,使用方式如下:
redis-cli [options] [commonds]
其中常见的 options 有:
-h 127.0.0.1
:指定要连接的 redis 节点的 IP 地址,默认是 127.0.0.1-p 6379
:指定要连接的 redis 节点的端口,默认是 6379-a 123321
:指定 redis 的访问密码
其中的 commonds 就是 Redis 的操作命令,例如:
ping
:与 redis 服务端做心跳测试,服务端正常会返回pong
不指定 commond 时,会进入redis-cli
的交互控制台:
图形化桌面客户端
GitHub 上的大神编写了 Redis 的图形化桌面客户端,地址:https://github.com/uglide/RedisDesktopManager
不过该仓库提供的是 RedisDesktopManager 的源码,并未提供 windows 安装包。
在下面这个仓库可以找到安装包:https://github.com/lework/RedisDesktopManager-Windows/releases
安装
在课前资料中可以找到 Redis 的图形化桌面客户端:
解压缩后,运行安装程序即可安装:
此处略。
安装完成后,在安装目录下找到 rdm.exe 文件:
双击即可运行:
建立连接
点击左上角的连接到Redis服务器
按钮:
在弹出的窗口中填写 Redis 服务信息:
点击确定后,在左侧菜单会出现这个链接:
点击即可建立连接了:
Redis 默认有 16 个仓库,编号从 0 至 15. 通过配置文件可以设置仓库数量,但是不超过 16,并且不能自定义仓库名称。
如果是基于 redis-cli 连接 Redis 服务,可以通过 select 命令来选择数据库:
## 选择 0号库
select 0
2
Docker
Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。
Docker CE 分为 stable
test
和 nightly
三个更新频道。
官方网站上有各种环境下的 安装指南 (opens new window),这里主要介绍 Docker CE 在 CentOS 上的安装。
CentOS 安装 Docker
Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10, CentOS 7 满足最低内核的要求,所以我们在 CentOS 7 安装 Docker。
卸载(可选)
如果之前安装过旧版本的 Docker,可以使用下面命令卸载:
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
2
3
4
5
6
7
8
9
10
11
安装 docker
首先需要大家虚拟机联网,安装 yum 工具
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
2
3
然后更新本地镜像源:
## 设置docker镜像源
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
2
3
4
5
6
7
然后输入命令:
yum install -y docker-ce
docker-ce 为社区免费版本。稍等片刻,docker 即可安装成功。
启动 docker
Docker 应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!
启动 docker 前,一定要关闭防火墙后!!
## 关闭
systemctl stop firewalld
## 禁止开机启动防火墙
systemctl disable firewalld
#查看是否关闭防火墙
systemctl status firewalld
2
3
4
5
6
通过命令启动 docker:
systemctl start docker ## 启动docker服务
systemctl stop docker ## 停止docker服务
systemctl restart docker ## 重启docker服务
2
3
4
5
然后输入命令,可以查看 docker 版本:
docker -v
如图:
配置镜像加速
docker 官方镜像仓库网速较差,我们需要设置国内镜像服务:
参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
CentOS7 安装 DockerCompose
下载
Linux 下需要通过命令下载:
## 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
2
修改文件权限
修改文件权限:
## 修改权限
chmod +x /usr/local/bin/docker-compose
2
Base 自动补全命令:
## 补全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
2
如果这里出现错误,需要修改自己的 hosts 文件:
echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts
Docker 镜像仓库
搭建镜像仓库可以基于 Docker 官方提供的 DockerRegistry 来实现。
官网地址:https://hub.docker.com/_/registry
简化版镜像仓库
Docker 官方的 Docker Registry 是一个基础版本的 Docker 镜像仓库,具备仓库管理的完整功能,但是没有图形化界面。
搭建方式比较简单,命令如下:
docker run -d \
--restart=always \
--name registry \
-p 5000:5000 \
-v registry-data:/var/lib/registry \
registry
2
3
4
5
6
命令中挂载了一个数据卷 registry-data 到容器内的/var/lib/registry 目录,这是私有镜像库存放数据的目录。
访问 http://YourIp:5000/v2/_catalog 可以查看当前私有镜像服务中包含的镜像
配置 Docker 信任地址
我们的私服采用的是 http 协议,默认不被 Docker 信任,所以需要做一个配置:
## 打开要修改的文件
vi /etc/docker/daemon.json
## 添加内容:
"insecure-registries":["http://192.168.164.129:8080"]
## 重加载
systemctl daemon-reload
## 重启docker
systemctl restart docker
2
3
4
5
6
7
8
带有图形化界面版本
使用 DockerCompose 部署带有图象界面的 DockerRegistry,命令如下:
version: '3.0'
services:
registry:
image: registry
volumes:
- ./registry-data:/var/lib/registry
ui:
image: joxit/docker-registry-ui:static
ports:
- 8080:80
environment:
- REGISTRY_TITLE=Hello Geeks_Z
- REGISTRY_URL=http://registry:5000
depends_on:
- registry
2
3
4
5
6
7
8
9
10
11
12
13
14
15
阿里云服务器(ECS)安装 Docker
部署并使用 Docker(CentOS 8) (opens new window)
Nacos
Linux 或者 Mac 安装方式与 Windows 类似。
安装 JDK
见Java安装-Linux`
上传安装包
如图:
也可以直接使用课前资料中的 tar.gz:
上传到 Linux 服务器的某个目录,例如/usr/local/src
目录下:
解压
命令解压缩安装包:
tar -xvf nacos-server-1.4.1.tar.gz
然后删除安装包:
rm -rf nacos-server-1.4.1.tar.gz
目录中最终样式:
目录内部:
端口配置
与 windows 中类似
启动
在 nacos/bin 目录中,输入命令启动 Nacos:
sh startup.sh -m standalone
Docker安装
拉取镜像
docker pull nacos/nacos-server:v2.0.4
创建挂载目录
mkdir -p /home/nacos/logs/
mkdir -p /home/nacos/conf/
2
修改配置文件(没有需先行创建)
vim /home/nacos/conf/application.properties
server.contextPath=/nacos
server.servlet.contextPath=/nacos
server.port=8848
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://ip:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user= #账号
db.password= #密码
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i
nacos.security.ignore.urls=/,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/login,/v1/console/health/**,/v1/cs/**,/v1/ns/**,/v1/cmdb/**,/actuator/**,/v1/console/server/**
nacos.naming.distro.taskDispatchThreadCount=1
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true
nacos.naming.expireInstance=true
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
启动nacos容器
docker run \
--name nacos -d \
-p 8848:8848 \
--privileged=true \
--restart=always \
-e JVM_XMS=256m \
-e JVM_XMX=256m \
-e MODE=standalone \
-e PREFER_HOST_MODE=hostname \
-v /home/nacos/logs:/home/nacos/logs \
-v /home/nacos/conf/application.properties:/home/nacos/init.d/custom.properties \
nacos/nacos-server:v2.0.4
2
3
4
5
6
7
8
9
10
11
12
语句讲解
- docker run -d : 启动容器 -d是后台启动并返回容器id的意思
- –name nacos :为容器指定一个名称
- -p 8848:8848 -p 9848:9848 -p 9849:9849 : 指定端口映射,注意这里的p不能大写,大写是随机端口映射
- –privileged=true : 扩大容器内的权限,将容器内的权限变为root权限,不加的话就是普通用户权限,可能会出现cannot open directory
- -e JVM_XMS=256m : 为jvm启动时分配的内存
- -e JVM_XMX=256m : 为jvm运行过程中分配的最大内存
- -e MODE=standalone : 使用 standalone模式(单机模式),MODE值有cluster(集群)模式/standalone模式两种,MODE必须大写
- –restart=always :重启docker时,自动启动相关容器
浏览器登录访问
https:xx.xx.xx.xx:8848 账号:nacos 密码:nacos
Nacos 的依赖
父工程的 pom 文件中的<dependencyManagement>
中引入 SpringCloudAlibaba 的依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
2
3
4
5
6
7
客户端:
<!-- nacos客户端依赖包 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2
3
4
5
6
Nginx
解压 Nginx 包,并安装
tar -zxvf nginx-1.21.6.tar.gz #解压到当前目录
cd nginx-1.21.6 #进入解压后的文件夹
ls #文件夹中的文件:auto CHANGES.ru configure html man src CHANGES conf contrib LICENSE README
2
3
4
安装依赖库
#安装C编译器
yum install -y gcc
#安装pcre库
yum install -y pcre pcre-devel
#安装zlib
yum install -y zlib zlib-devel
2
3
4
5
6
7
8
安装
./configure --prefix=/usr/local/nginx #使用prefix选项指定安装的目录
make
make install
2
3
启动
cd /usr/local/nginx/sbin
ls ## 里面是一个nginx的可执行文件
./nginx ## 启动这个可执行
2
3
关闭防火墙
systemctl stop firewalld
补充 Nginx 命令
./nginx -s stop #快速停止
./nginx -s quit #完成已接受的请求后,停止
./nginx -s reload #重新加载配置
./nginx -t #检查nginx配置是否正确
2
3
4
查看 nginx 状态
ps -ef|grep nginx
启动时:
停止时:
注册系统服务
通过系统服务的方式启动 nginx
vim usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target ## 多用户
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
重新加载系统服务
systemctl daemon-reload
启动服务
systemctl start nginx.service
开机启动
systemctl enable nginx.service
Docker
寻找Nginx (opens new window)镜像
下载 Nginx 镜像
命令 | 描述 |
---|---|
docker pull nginx | 下载最新版 Nginx 镜像 (其实此命令就等同于 : docker pull nginx:latest ) |
docker pull nginx:xxx | 下载指定版本的 Nginx 镜像 (xxx 指具体版本号) |
检查当前所有Docker下载的镜像
docker images
创建 Nginx 配置文件
启动前需要先创建 Nginx 外部挂载的配置文件( /home/nginx/conf/nginx.conf) 之所以要先创建 , 是因为 Nginx 本身容器只存在/etc/nginx 目录 , 本身就不创建 nginx.conf 文件 当服务器和容器都不存在 nginx.conf 文件时, 执行启动命令的时候, docker 会将 nginx.conf 作为目录创建 , 这并不是我们想要的结果 。
# 创建挂载目录
mkdir -p /home/nginx/conf
mkdir -p /home/nginx/log
mkdir -p /home/nginx/html
2
3
4
复制容器文件到宿主机
# 先生成容器
docker run --name nginx -p 9001:80 -d nginx:1.24
# 将容器nginx.conf文件复制到宿主机
docker cp nginx:/etc/nginx/nginx.conf /home/nginx/conf/nginx.conf
# 将容器conf.d文件夹下内容复制到宿主机
docker cp nginx:/etc/nginx/conf.d /home/nginx/conf/conf.d
# 将容器中的html文件夹复制到宿主机
docker cp nginx:/usr/share/nginx/html /home/nginx/
2
3
4
5
6
7
8
删除已启动Nginx容器
# 直接执行docker rm nginx或者以容器id方式关闭容器
# 找到nginx对应的容器id
docker ps -a
# 关闭该容器
docker stop nginx
# 删除该容器
docker rm nginx
# 删除正在运行的nginx容器
docker rm -f nginx
2
3
4
5
6
7
8
9
创建 Nginx 容器并运行
docker run \
-p 9002:80 \
--name nginx \
-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /home/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /home/nginx/log:/var/log/nginx \
-v /home/nginx/html:/usr/share/nginx/html \
-d nginx:1.24
2
3
4
5
6
7
8
命令 | 描述 |
---|---|
–name nginx | 启动容器的名字 |
-d | 后台运行 |
-p 9002:80 | 将容器的 9002(后面那个) 端口映射到主机的 80(前面那个) 端口 |
-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf | 挂载 nginx.conf 配置文件 |
-v /home/nginx/conf/conf.d:/etc/nginx/conf.d | 挂载 nginx 配置文件 |
-v /home/nginx/log:/var/log/nginx | 挂载 nginx 日志文件 |
-v /home/nginx/html:/usr/share/nginx/html | 挂载 nginx 内容 |
nginx:1.24 | 本地运行的版本 |
\ | shell 命令换行 |
单行模式
docker run -p 80:80 --name nginx -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/conf/conf.d:/etc/nginx/conf.d -v /home/nginx/log:/var/log/nginx -v /home/nginx/html:/usr/share/nginx/html -d nginx:1.22
结果检测
修改内容进行展示
# 重启容器
docker restart nginx
2
RabbitMQ
单机部署
我们在 Centos7 虚拟机中使用 Docker 来安装。
下载镜像
方式一:在线拉取
docker pull rabbitmq:3-management
方式二:从本地加载
在课前资料已经提供了镜像包:
上传到虚拟机中后,使用命令加载镜像即可:
docker load -i mq.tar
安装 MQ
执行下面的命令来运行 MQ 容器:
docker run \
-e RABBITMQ_DEFAULT_USER=zhw \
-e RABBITMQ_DEFAULT_PASS=1024 \
--name mq \
--hostname mq1 \
-p 15672:15672 \
-p 5672:5672 \
-d \
rabbitmq:3-management
2
3
4
5
6
7
8
9
安装 DelayExchange 插件
官方的安装指南地址为:https://blog.rabbitmq.com/posts/2015/04/scheduling-messages-with-rabbitmq
上述文档是基于 linux 原生安装 RabbitMQ,然后安装插件。
因为我们之前是基于 Docker 安装 RabbitMQ,所以下面我们会讲解基于 Docker 来安装 RabbitMQ 插件。
下载插件
RabbitMQ 有一个官方的插件社区,地址为:https://www.rabbitmq.com/community-plugins.html
其中包含各种各样的插件,包括我们要使用的 DelayExchange 插件:
大家可以去对应的 GitHub 页面下载 3.8.9 版本的插件,地址为https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/tag/3.8.9这个对应RabbitMQ的3.8.5以上版本。
上传插件
因为我们是基于 Docker 安装,所以需要先查看 RabbitMQ 的插件目录对应的数据卷。如果不是基于 Docker 的同学,请参考第一章部分,重新创建 Docker 容器。
我们之前设定的 RabbitMQ 的数据卷名称为mq-plugins
,所以我们使用下面命令查看数据卷:
docker volume inspect mq-plugins
可以得到下面结果:
接下来,将插件上传到这个目录即可:
安装插件
最后就是安装了,需要进入 MQ 容器内部来执行安装。我的容器名为mq
,所以执行下面命令:
docker exec -it mq bash
执行时,请将其中的 -it
后面的mq
替换为你自己的容器名.
进入容器内部后,执行下面命令开启插件:
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
结果如下:
集群部署
接下来,我们看看如何安装 RabbitMQ 的集群。
集群分类
在 RabbitMQ 的官方文档中,讲述了两种集群的配置方式:
- 普通模式:普通模式集群不进行数据同步,每个 MQ 都有自己的队列、数据信息(其它元数据信息如交换机等会同步)。例如我们有 2 个 MQ:mq1,和 mq2,如果你的消息在 mq1,而你连接到了 mq2,那么 mq2 会去 mq1 拉取消息,然后返回给你。如果 mq1 宕机,消息就会丢失。
- 镜像模式:与普通模式不同,队列会在各个 mq 的镜像节点之间同步,因此你连接到任何一个镜像节点,均可获取到消息。而且如果一个节点宕机,并不会导致数据丢失。不过,这种方式增加了数据同步的带宽消耗。
我们先来看普通模式集群,我们的计划部署 3 节点的 mq 集群:
主机名 | 控制台端口 | amqp 通信端口 |
---|---|---|
mq1 | 8081 ---> 15672 | 8071 ---> 5672 |
mq2 | 8082 ---> 15672 | 8072 ---> 5672 |
mq3 | 8083 ---> 15672 | 8073 ---> 5672 |
集群中的节点标示默认都是:rabbit@[hostname]
,因此以上三个节点的名称分别为:
- rabbit@mq1
- rabbit@mq2
- rabbit@mq3
获取 cookie
RabbitMQ 底层依赖于 Erlang,而 Erlang 虚拟机就是一个面向分布式的语言,默认就支持集群模式。集群模式中的每个 RabbitMQ 节点使用 cookie 来确定它们是否被允许相互通信。
要使两个节点能够通信,它们必须具有相同的共享秘密,称为Erlang cookie。cookie 只是一串最多 255 个字符的字母数字字符。
每个集群节点必须具有相同的 cookie。实例之间也需要它来相互通信。
我们先在之前启动的 mq 容器中获取一个 cookie 值,作为集群的 cookie。执行下面的命令:
docker exec -it mq cat /var/lib/rabbitmq/.erlang.cookie
可以看到 cookie 值如下:
FXZMCVGLBIXZCDEMMVZQ
接下来,停止并删除当前的 mq 容器,我们重新搭建集群。
docker rm -f mq
准备集群配置
在/tmp 目录新建一个配置文件 rabbitmq.conf:
cd /tmp
## 创建文件
touch rabbitmq.conf
2
3
文件内容如下:
loopback_users.guest = false
listeners.tcp.default = 5672
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config
cluster_formation.classic_config.nodes.1 = rabbit@mq1
cluster_formation.classic_config.nodes.2 = rabbit@mq2
cluster_formation.classic_config.nodes.3 = rabbit@mq3
2
3
4
5
6
再创建一个文件,记录 cookie
cd /tmp
## 创建cookie文件
touch .erlang.cookie
## 写入cookie
echo "FXZMCVGLBIXZCDEMMVZQ" > .erlang.cookie
## 修改cookie文件的权限
chmod 600 .erlang.cookie
2
3
4
5
6
7
准备三个目录,mq1、mq2、mq3:
cd /tmp
## 创建目录
mkdir mq1 mq2 mq3
2
3
然后拷贝 rabbitmq.conf、cookie 文件到 mq1、mq2、mq3:
## 进入/tmp
cd /tmp
## 拷贝
cp rabbitmq.conf mq1
cp rabbitmq.conf mq2
cp rabbitmq.conf mq3
cp .erlang.cookie mq1
cp .erlang.cookie mq2
cp .erlang.cookie mq3
2
3
4
5
6
7
8
9
启动集群
创建一个网络:
docker network create mq-net
docker volume create
运行命令
docker run -d --net mq-net \
-v ${PWD}/mq1/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=itcast \
-e RABBITMQ_DEFAULT_PASS=123321 \
--name mq1 \
--hostname mq1 \
-p 8071:5672 \
-p 8081:15672 \
rabbitmq:3.8-management
2
3
4
5
6
7
8
9
10
docker run -d --net mq-net \
-v ${PWD}/mq2/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=itcast \
-e RABBITMQ_DEFAULT_PASS=123321 \
--name mq2 \
--hostname mq2 \
-p 8072:5672 \
-p 8082:15672 \
rabbitmq:3.8-management
2
3
4
5
6
7
8
9
10
docker run -d --net mq-net \
-v ${PWD}/mq3/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=itcast \
-e RABBITMQ_DEFAULT_PASS=123321 \
--name mq3 \
--hostname mq3 \
-p 8073:5672 \
-p 8083:15672 \
rabbitmq:3.8-management
2
3
4
5
6
7
8
9
10
测试
在 mq1 这个节点上添加一个队列:
如图,在 mq2 和 mq3 两个控制台也都能看到:
数据共享测试
点击这个队列,进入管理页面:
然后利用控制台发送一条消息到这个队列:
结果在 mq2、mq3 上都能看到这条消息:
可用性测试
我们让其中一台节点 mq1 宕机:
docker stop mq1
然后登录 mq2 或 mq3 的控制台,发现 simple.queue 也不可用了:
说明数据并没有拷贝到 mq2 和 mq3。
镜像模式
在刚刚的案例中,一旦创建队列的主机宕机,队列就会不可用。不具备高可用能力。如果要解决这个问题,必须使用官方提供的镜像集群方案。
官方文档地址:https://www.rabbitmq.com/ha.html
镜像模式的特征
默认情况下,队列只保存在创建该队列的节点上。而镜像模式下,创建队列的节点被称为该队列的主节点,队列还会拷贝到集群中的其它节点,也叫做该队列的镜像节点。
但是,不同队列可以在集群中的任意节点上创建,因此不同队列的主节点可以不同。甚至,一个队列的主节点可能是另一个队列的镜像节点。
用户发送给队列的一切请求,例如发送消息、消息回执默认都会在主节点完成,如果是从节点接收到请求,也会路由到主节点去完成。镜像节点仅仅起到备份数据作用。
当主节点接收到消费者的 ACK 时,所有镜像都会删除节点中的数据。
总结如下:
- 镜像队列结构是一主多从(从就是镜像)
- 所有操作都是主节点完成,然后同步给镜像节点
- 主宕机后,镜像节点会替代成新的主(如果在主从同步完成前,主就已经宕机,可能出现数据丢失)
- 不具备负载均衡功能,因为所有操作都会有主节点完成(但是不同队列,其主节点可以不同,可以利用这个提高吞吐量)
镜像模式的配置
镜像模式的配置有 3 种模式:
ha-mode | ha-params | 效果 |
---|---|---|
准确模式 exactly | 队列的副本量 count | 集群中队列副本(主服务器和镜像服务器之和)的数量。count 如果为 1 意味着单个副本:即队列主节点。count 值为 2 表示 2 个副本:1 个队列主和 1 个队列镜像。换句话说:count = 镜像数量 + 1。如果群集中的节点数少于 count,则该队列将镜像到所有节点。如果有集群总数大于 count+1,并且包含镜像的节点出现故障,则将在另一个节点上创建一个新的镜像。 |
all | (none) | 队列在群集中的所有节点之间进行镜像。队列将镜像到任何新加入的节点。镜像到所有节点将对所有群集节点施加额外的压力,包括网络 I / O,磁盘 I / O 和磁盘空间使用情况。推荐使用 exactly,设置副本数为(N / 2 +1)。 |
nodes | node names | 指定队列创建到哪些节点,如果指定的节点全部不存在,则会出现异常。如果指定的节点在集群中存在,但是暂时不可用,会创建节点到当前客户端连接到的节点。 |
这里我们以 rabbitmqctl 命令作为案例来讲解配置语法。
语法示例:
exactly 模式
rabbitmqctl set_policy ha-two "^two\." '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
rabbitmqctl set_policy
:固定写法ha-two
:策略名称,自定义"^two\."
:匹配队列的正则表达式,符合命名规则的队列才生效,这里是任何以two.
开头的队列名称'{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
: 策略内容"ha-mode":"exactly"
:策略模式,此处是 exactly 模式,指定副本数量"ha-params":2
:策略参数,这里是 2,就是副本数量为 2,1 主 1 镜像"ha-sync-mode":"automatic"
:同步策略,默认是 manual,即新加入的镜像节点不会同步旧的消息。如果设置为 automatic,则新加入的镜像节点会把主节点中所有消息都同步,会带来额外的网络开销
all 模式
rabbitmqctl set_policy ha-all "^all\." '{"ha-mode":"all"}'
ha-all
:策略名称,自定义"^all\."
:匹配所有以all.
开头的队列名'{"ha-mode":"all"}'
:策略内容"ha-mode":"all"
:策略模式,此处是 all 模式,即所有节点都会称为镜像节点
nodes 模式
rabbitmqctl set_policy ha-nodes "^nodes\." '{"ha-mode":"nodes","ha-params":["rabbit@nodeA", "rabbit@nodeB"]}'
rabbitmqctl set_policy
:固定写法ha-nodes
:策略名称,自定义"^nodes\."
:匹配队列的正则表达式,符合命名规则的队列才生效,这里是任何以nodes.
开头的队列名称'{"ha-mode":"nodes","ha-params":["rabbit@nodeA", "rabbit@nodeB"]}'
: 策略内容"ha-mode":"nodes"
:策略模式,此处是 nodes 模式"ha-params":["rabbit@mq1", "rabbit@mq2"]
:策略参数,这里指定副本所在节点名称
测试
我们使用 exactly 模式的镜像,因为集群节点数量为 3,因此镜像数量就设置为 2.
运行下面的命令:
docker exec -it mq1 rabbitmqctl set_policy ha-two "^two\." '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
下面,我们创建一个新的队列:
在任意一个 mq 控制台查看队列:
测试数据共享
给 two.queue 发送一条消息:
然后在 mq1、mq2、mq3 的任意控制台查看消息:
测试高可用
现在,我们让 two.queue 的主节点 mq1 宕机:
docker stop mq1
查看集群状态:
查看队列状态:
发现依然是健康的!并且其主节点切换到了 rabbit@mq2 上
仲裁队列
从 RabbitMQ 3.8 版本开始,引入了新的仲裁队列,他具备与镜像队里类似的功能,但使用更加方便。
添加仲裁队列
在任意控制台添加一个队列,一定要选择队列类型为 Quorum 类型。
在任意控制台查看队列:
可以看到,仲裁队列的 + 2 字样。代表这个队列有 2 个镜像节点。
因为仲裁队列默认的镜像数为 5。如果你的集群有 7 个节点,那么镜像数肯定是 5;而我们集群只有 3 个节点,因此镜像数量就是 3.
测试
可以参考对镜像集群的测试,效果是一样的。
集群扩容
加入集群
1)启动一个新的 MQ 容器:
docker run -d --net mq-net \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=itcast \
-e RABBITMQ_DEFAULT_PASS=123321 \
--name mq4 \
--hostname mq5 \
-p 8074:15672 \
-p 8084:15672 \
rabbitmq:3.8-management
2
3
4
5
6
7
8
9
2)进入容器控制台:
docker exec -it mq4 bash
3)停止 mq 进程
rabbitmqctl stop_app
4)重置 RabbitMQ 中的数据:
rabbitmqctl reset
5)加入 mq1:
rabbitmqctl join_cluster rabbit@mq1
6)再次启动 mq 进程
rabbitmqctl start_app
增加仲裁队列副本
我们先查看下 quorum.queue 这个队列目前的副本情况,进入 mq1 容器:
docker exec -it mq1 bash
执行命令:
rabbitmq-queues quorum_status "quorum.queue"
结果:
现在,我们让 mq4 也加入进来:
rabbitmq-queues add_member "quorum.queue" "rabbit@mq4"
结果:
再次查看:
rabbitmq-queues quorum_status "quorum.queue"
查看控制台,发现 quorum.queue 的镜像数量也从原来的 +2 变成了 +3:
OpenResty
安装
首先你的 Linux 虚拟机必须联网
1)安装开发库
首先要安装 OpenResty 的依赖开发库,执行命令:
yum install -y pcre-devel openssl-devel gcc --skip-broken
2)安装 OpenResty 仓库
你可以在你的 CentOS 系统中添加 openresty
仓库,这样就可以便于未来安装或更新我们的软件包(通过 yum check-update
命令)。运行下面的命令就可以添加我们的仓库:
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
如果提示说命令不存在,则运行:
yum install -y yum-utils
然后再重复上面的命令
3)安装 OpenResty
然后就可以像下面这样安装软件包,比如 openresty
:
yum install -y openresty
4)安装 opm 工具
opm 是 OpenResty 的一个管理工具,可以帮助我们安装一个第三方的 Lua 模块。
如果你想安装命令行工具 opm
,那么可以像下面这样安装 openresty-opm
包:
yum install -y openresty-opm
5)目录结构
默认情况下,OpenResty 安装的目录是:/usr/local/openresty
看到里面的 nginx 目录了吗,OpenResty 就是在 Nginx 基础上集成了一些 Lua 模块。
6)配置 nginx 的环境变量
打开配置文件:
vi /etc/profile
在最下面加入两行:
export NGINX_HOME=/usr/local/openresty/nginx
export PATH=${NGINX_HOME}/sbin:$PATH
2
NGINX_HOME:后面是 OpenResty 安装目录下的 nginx 的目录
然后让配置生效:
source /etc/profile
启动和运行
OpenResty 底层是基于 Nginx 的,查看 OpenResty 目录的 nginx 目录,结构与 windows 中安装的 nginx 基本一致:
所以运行方式与 nginx 基本一致:
## 启动nginx
nginx
## 重新加载配置
nginx -s reload
## 停止
nginx -s stop
2
3
4
5
6
nginx 的默认配置文件注释太多,影响后续我们的编辑,这里将 nginx.conf 中的注释部分删除,保留有效部分。
修改/usr/local/openresty/nginx/conf/nginx.conf
文件,内容如下:
#user nobody;
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8081;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
在 Linux 的控制台输入命令以启动 nginx:
nginx
然后访问页面:http://47.92.99.39:8081/,注意ip地址替换为你自己的虚拟机IP:
备注
加载 OpenResty 的 lua 模块 (添加在 nginx.conf 的 http 下面):
#lua 模块
lua_package_path "/usr/local/openresty/lualib/?.lua;;";
#c模块
lua_package_cpath "/usr/local/openresty/lualib/?.so;;";
2
3
4
common.lua
-- 封装函数,发送http请求,并解析响应
local function read_http(path, params)
local resp = ngx.location.capture(path,{
method = ngx.HTTP_GET,
args = params,
})
if not resp then
-- 记录错误信息,返回404
ngx.log(ngx.ERR, "http not found, path: ", path , ", args: ", args)
ngx.exit(404)
end
return resp.body
end
-- 将方法导出
local _M = {
read_http = read_http
}
return _M
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
释放 Redis 连接 API:
-- 关闭redis连接的工具方法,其实是放入连接池
local function close_redis(red)
local pool_max_idle_time = 10000 -- 连接的空闲时间,单位是毫秒
local pool_size = 100 --连接池大小
local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)
if not ok then
ngx.log(ngx.ERR, "放入redis连接池失败: ", err)
end
end
2
3
4
5
6
7
8
9
读取 Redis 数据的 API:
-- 查询redis的方法 ip和port是redis地址,key是查询的key
local function read_redis(ip, port, key)
-- 获取一个连接
local ok, err = red:connect(ip, port)
if not ok then
ngx.log(ngx.ERR, "连接redis失败 : ", err)
return nil
end
-- 查询redis
local resp, err = red:get(key)
-- 查询失败处理
if not resp then
ngx.log(ngx.ERR, "查询Redis失败: ", err, ", key = " , key)
end
--得到的数据为空处理
if resp == ngx.null then
resp = nil
ngx.log(ngx.ERR, "查询Redis数据为空, key = ", key)
end
close_redis(red)
return resp
end
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
开启共享词典:
## 共享字典,也就是本地缓存,名称叫做:item_cache,大小150m
lua_shared_dict item_cache 150m;
2
Canal
下面我们就开启 mysql 的主从同步机制,让 Canal 来模拟 salve
开启 MySQL 主从
Canal 是基于 MySQL 的主从同步功能,因此必须先开启 MySQL 的主从功能才可以。
这里以之前用 Docker 运行的 mysql 为例:
开启 binlog
打开 mysql 容器挂载的日志文件,我的在/tmp/mysql/conf
目录:
修改文件:
vi /tmp/mysql/conf/my.cnf
添加内容:
log-bin=/var/lib/mysql/mysql-bin
binlog-do-db=heima
2
配置解读:
log-bin=/var/lib/mysql/mysql-bin
:设置 binary log 文件的存放地址和文件名,叫做 mysql-binbinlog-do-db=heima
:指定对哪个 database 记录 binary log events,这里记录 heima 这个库
最终效果:
[mysqld]
skip-name-resolve
character_set_server=utf8
datadir=/var/lib/mysql
server-id=1000
log-bin=/var/lib/mysql/mysql-bin
binlog-do-db=heima
2
3
4
5
6
7
设置用户权限
接下来添加一个仅用于数据同步的账户,出于安全考虑,这里仅提供对 heima 这个库的操作权限。
create user canal@'%' IDENTIFIED by 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%' identified by 'canal';
FLUSH PRIVILEGES;
2
3
重启 mysql 容器即可
docker restart mysql
测试设置是否成功:在 mysql 控制台,或者 Navicat 中,输入命令:
show master status;
安装 Canal
创建网络
我们需要创建一个网络,将 MySQL、Canal、MQ 放到同一个 Docker 网络中:
docker network create heima
让 mysql 加入这个网络:
docker network connect heima mysql
安装 Canal
课前资料中提供了 canal 的镜像压缩包:
大家可以上传到虚拟机,然后通过命令导入:
docker load -i canal.tar
然后运行命令创建 Canal 容器:
docker run -p 11111:11111 --name canal \
-e canal.destinations=heima \
-e canal.instance.master.address=mysql:3306 \
-e canal.instance.dbUsername=canal \
-e canal.instance.dbPassword=canal \
-e canal.instance.connectionCharset=UTF-8 \
-e canal.instance.tsdb.enable=true \
-e canal.instance.gtidon=false \
-e canal.instance.filter.regex=heima\\..* \
--network heima \
-d canal/canal-server:v1.1.5
2
3
4
5
6
7
8
9
10
11
说明:
-p 11111:11111
:这是 canal 的默认监听端口-e canal.instance.master.address=mysql:3306
:数据库地址和端口,如果不知道 mysql 容器地址,可以通过docker inspect 容器id
来查看-e canal.instance.dbUsername=canal
:数据库用户名-e canal.instance.dbPassword=canal
:数据库密码-e canal.instance.filter.regex=
:要监听的表名称
表名称监听支持的语法:
mysql 数据解析关注的表,Perl正则表达式.
多个正则之间以逗号(,)分隔,转义符需要双斜杠(\\)
常见例子:
1. 所有表:.* or .*\\..*
2. canal schema下所有表: canal\\..*
3. canal下的以canal打头的表:canal\\.canal.*
4. canal schema下的一张表:canal.test1
5. 多个规则组合使用然后以逗号隔开:canal\\..*,mysql.test1,mysql.test2
2
3
4
5
6
7
8
Elasticsearch
部署单点 es
创建网络
因为我们还需要部署 kibana 容器,因此需要让 es 和 kibana 容器互联。这里先创建一个网络:
docker network create es-net
加载镜像
这里我们采用 elasticsearch 的 7.12.1 版本的镜像,这个镜像体积接近 1G。可以自行 pull 或者上传tar
包。
docker pull elasticsearch:7.12.1
如果采用上传的方式,上传到虚拟机中后运行命令加载即可:
## 导入数据
docker load -i es.tar
2
同理还有kibana
的 tar 包也需要这样做。
运行
运行 docker 命令,部署单点 es:
docker run -d \
--name es \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-e "discovery.type=single-node" \
-v es-data:/usr/share/elasticsearch/data \
-v es-plugins:/usr/share/elasticsearch/plugins \
--privileged \
--network es-net \
-p 9200:9200 \
-p 9300:9300 \
elasticsearch:7.12.1
2
3
4
5
6
7
8
9
10
11
命令解释:
-e "cluster.name=es-docker-cluster"
:设置集群名称-e "http.host=0.0.0.0"
:监听的地址,可以外网访问-e "ES_JAVA_OPTS=-Xms512m -Xmx512m"
:内存大小-e "discovery.type=single-node"
:非集群模式-v es-data:/usr/share/elasticsearch/data
:挂载逻辑卷,绑定 es 的数据目录-v es-logs:/usr/share/elasticsearch/logs
:挂载逻辑卷,绑定 es 的日志目录-v es-plugins:/usr/share/elasticsearch/plugins
:挂载逻辑卷,绑定 es 的插件目录--privileged
:授予逻辑卷访问权--network es-net
:加入一个名为 es-net 的网络中-p 9200:9200
:端口映射配置
在浏览器中输入:http://IP:9200 即可看到 elasticsearch 的响应结果:
部署 kibana
kibana 可以给我们提供一个 elasticsearch 的可视化界面,便于我们学习。
拉取镜像
docker pull kibana:7.12.1
部署
运行 docker 命令,部署 kibana
docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network=es-net \
-p 5601:5601 \
kibana:7.12.1
2
3
4
5
6
--network es-net
:加入一个名为 es-net 的网络中,与 elasticsearch 在同一个网络中-e ELASTICSEARCH_HOSTS=http://es:9200"
:设置 elasticsearch 的地址,因为 kibana 已经与 elasticsearch 在一个网络,因此可以用容器名直接访问 elasticsearch-p 5601:5601
:端口映射配置
kibana 启动一般比较慢,需要多等待一会,可以通过命令:
docker logs -f kibana
查看运行日志,当查看到下面的日志,说明成功:
此时,在浏览器输入地址访问:http://IP:5601,即可看到结果
DevTools
kibana 中提供了一个 DevTools 界面:
这个界面中可以编写 DSL 来操作 elasticsearch。并且对 DSL 语句有自动补全功能。
安装 IK 分词器
在线安装 ik 插件(较慢)
## 进入容器内部
docker exec -it elasticsearch /bin/bash
## 在线下载并安装
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip
#退出
exit
#重启容器
docker restart elasticsearch
2
3
4
5
6
7
8
9
10
离线安装 ik 插件(推荐)
1)查看数据卷目录
安装插件需要知道 elasticsearch 的 plugins 目录位置,而我们用了数据卷挂载,因此需要查看 elasticsearch 的数据卷目录,通过下面命令查看:
docker volume inspect es-plugins
显示结果:
[
{
"CreatedAt": "2022-05-06T10:06:34+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/es-plugins/_data",
"Name": "es-plugins",
"Options": null,
"Scope": "local"
}
]
2
3
4
5
6
7
8
9
10
11
说明 plugins 目录被挂载到了:/var/lib/docker/volumes/es-plugins/_data
这个目录中。
2)解压缩分词器安装包
解压缩 ik 分词器,重命名为ik
3)上传到 es 容器的插件数据卷中
也就是/var/lib/docker/volumes/es-plugins/_data
:
4)重启容器
## 4、重启容器
docker restart es
2
## 查看es日志
docker logs -f es
2
5)测试:
IK 分词器包含两种模式:
ik_smart
:最少切分ik_max_word
:最细切分
GET /_analyze
{
"analyzer": "ik_max_word",
"text": "黑马程序员学习java太棒了"
}
2
3
4
5
结果:
{
"tokens": [
{
"token": "黑马",
"start_offset": 0,
"end_offset": 2,
"type": "CN_WORD",
"position": 0
},
{
"token": "程序员",
"start_offset": 2,
"end_offset": 5,
"type": "CN_WORD",
"position": 1
},
{
"token": "程序",
"start_offset": 2,
"end_offset": 4,
"type": "CN_WORD",
"position": 2
},
{
"token": "员",
"start_offset": 4,
"end_offset": 5,
"type": "CN_CHAR",
"position": 3
},
{
"token": "学习",
"start_offset": 5,
"end_offset": 7,
"type": "CN_WORD",
"position": 4
},
{
"token": "java",
"start_offset": 7,
"end_offset": 11,
"type": "ENGLISH",
"position": 5
},
{
"token": "太棒了",
"start_offset": 11,
"end_offset": 14,
"type": "CN_WORD",
"position": 6
},
{
"token": "太棒",
"start_offset": 11,
"end_offset": 13,
"type": "CN_WORD",
"position": 7
},
{
"token": "了",
"start_offset": 13,
"end_offset": 14,
"type": "CN_CHAR",
"position": 8
}
]
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
扩展词词典
随着互联网的发展,“造词运动”也越发的频繁。出现了很多新的词语,在原有的词汇列表中并不存在。比如:“奥力给”,“传智播客” 等。
所以我们的词汇也需要不断的更新,IK 分词器提供了扩展词汇的功能。
1)打开 IK 分词器 config 目录:
2)在 IKAnalyzer.cfg.xml 配置文件内容添加:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 *** 添加扩展词典-->
<entry key="ext_dict">ext.dic</entry>
</properties>
2
3
4
5
6
7
3)新建一个 ext.dic,可以参考 config 目录下复制一个配置文件进行修改
传智播客
奥力给
2
4)重启 elasticsearch
docker restart es
## 查看 日志
docker logs -f elasticsearch
2
3
4
日志中已经成功加载 ext.dic 配置文件
5)测试效果:
GET /_analyze
{
"analyzer": "ik_max_word",
"text": "传智播客Java就业超过90%,奥力给!"
}
2
3
4
5
注意当前文件的编码必须是 UTF-8 格式,严禁使用 Windows 记事本编辑
停用词词典
在互联网项目中,在网络间传输的速度很快,所以很多语言是不允许在网络上传递的,如:关于宗教、政治等敏感词语,那么我们在搜索时也应该忽略当前词汇。
IK 分词器也提供了强大的停用词功能,让我们在索引时就直接忽略当前的停用词汇表中的内容。
1)IKAnalyzer.cfg.xml 配置文件内容添加:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典-->
<entry key="ext_dict">ext.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典 *** 添加停用词词典-->
<entry key="ext_stopwords">stopword.dic</entry>
</properties>
2
3
4
5
6
7
8
9
3)在 stopword.dic 添加停用词
习大大
4)重启 elasticsearch
## 重启服务
docker restart elasticsearch
docker restart kibana
## 查看 日志
docker logs -f elasticsearch
2
3
4
5
6
日志中已经成功加载 stopword.dic 配置文件
5)测试效果:
GET /_analyze
{
"analyzer": "ik_max_word",
"text": "传智播客Java就业率超过95%,习大大都点赞,奥力给!"
}
2
3
4
5
注意当前文件的编码必须是 UTF-8 格式,严禁使用 Windows 记事本编辑
部署 es 集群
部署 es 集群可以直接使用 docker-compose 来完成,不过要求你的 Linux 虚拟机至少有4G的内存空间
首先编写一个 docker-compose 文件,内容如下:
version: '2.2'
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:7.12.1
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data01:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- elastic
es02:
image: docker.elastic.co/elasticsearch/elasticsearch:7.12.1
container_name: es02
environment:
- node.name=es02
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data02:/usr/share/elasticsearch/data
networks:
- elastic
es03:
image: docker.elastic.co/elasticsearch/elasticsearch:7.12.1
container_name: es03
environment:
- node.name=es03
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data03:/usr/share/elasticsearch/data
networks:
- elastic
volumes:
data01:
driver: local
data02:
driver: local
data03:
driver: local
networks:
elastic:
driver: bridge
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
Run docker-compose
to bring up the cluster:
docker-compose up
MinIO
- 拉取docker镜像
docker pull minio/minio
- 设置minio用到的文件路径
mkdir minio
进入minio目录:
mkdir data
mkdir config
2
- 启动服务:注意,这里要单独设置console的端口,不然会报错,且无法访问
这种安装方式 MinIO 自定义 Access 和 Secret 密钥要覆盖 MinIO 的自动生成的密钥
docker run --name minio \
-p 9000:9000 \
-p 9999:9999 \
-d --restart=always \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=admin123" \
-v /home/minio/data:/data \
-v /home/minio/config:/root/.minio \
minio/minio server /data \
--console-address '0.0.0.0:9999'
2
3
4
5
6
7
8
9
10
- 防火墙设置,需要为minio开放两个端口,一个9000端口,一个静态端口,此处为9999
firewall-cmd --zone=public --add-port=9000/tcp --permanent
firewall-cmd --zone=public --add-port=9999/tcp --permanent
firewall-cmd --reload
2
3
- 登录客户端(浏览器):注意—>此处的端口,是你设置的console的端口:9999
http://ip:9999
此处的用户名密码为启动服务时,设置的用户名密码:admin admin123:
Reference
- https://github.com/hansonwang99/JavaCollection
- 黑马程序员 (opens new window)
- 尚硅谷 (opens new window)