Linux


Author
|
Earl
Describe
|
该文档整理Linux系统下的常用软件安装及基本设置、Linux常用命令、Linux常用应用及相应快捷键;以下的演示均在CentOS7.6 mini版中实现;远程客户端使用XShell7,文件传输工具使用Xftp7
Last Update
|
2024-4-16

 

系统安装

linux系统不同发行版本安装指南

VirtualBox

VirtualBox可能发生冲突的软件有红蜘蛛、360、净网大师、CSGO的完美平台,安装VirtualBox需要卸载上述软件

安装CentOS7

VirtualBox和Vagrant全部要下最新版,否则安装Centos7会报错,不要使用下面课程的

安装步骤
  1. https://www.virtualbox.org/wiki/Download_Old_Builds下载VirtualBox-6.0.12并点击安装

  2. https://developer.hashicorp.com/vagrant/install下载vagrant-2.2.5并点击安装

    VirtualBox和Vagrant全部安装最新版,否则centos安装不上去,我这里安装的是VirtualBox7.0.41和Vagrant2.4.1

  3. 在windows系统上点击win+r,输入cmd打开管理员cmd窗口,输入命令Vagrant init centos/7初始化centos系统,此时会在C:/User/Earl下创建一个名为Vagrantfile的文件

    在D盘的D:\centos7vbox目录进入cmd进行初始化和安装Centos7,否则centos7会直接下载到c盘

    果然下载最新的VirtualBox和Vagrant安装centos7没问题【呵呵】,初始用户是vagrant,root用户的初始密码也是vagrant

  4. 使用命令vagrant up安装并启动Centos7,root用户的初始密码是vagrant

    • 日常使用启动虚拟机最好不要使用vagrant up,应该选择从VirtualBox中选择虚拟机启动,不需要界面或者使用远程连接的选择无界面启动,因为使用vagrant up启动可能会被vagrant覆盖已经被修改的网卡设置,docker老是重启网络服务或者系统后无法拉取镜像就是这个问题,修改了vim /etc/resolv.conf文件改了DNS地址后重启网络或者重启虚拟机该文件自动被覆盖,导致每次拉取镜像都要更改这个文件;使用vagrant up快速创建出虚拟机即可

  5. 使用命令vagrant ssh从CDM窗口连接虚拟机,登录以后使用命令whoami能看到当前用户是vagrant

  6. 在VirtualBox中右键关机可以直接关闭虚拟机,也可以在VirtualBox中右键开机,开机还可以在cmd窗口使用命令vagrant up启动虚拟机

  7. 默认VirtualBox对虚拟机的网络地址转换和端口转发,类似于docker的端口映射,但是每次装软件都要在VirtualBox中设置,不方便;给虚拟机设置固定的IP地址

    • D:\centos7vbox\Vagrantfile文件中放开config.vm.network "private_network", ip: "192.168.33.10"的注释,并将ip修改为windows的VirtualBox Host-only Ethernet Adapter同一网段的另一个IP,我改成了192.168.56.10,可能名字是以太网#,上述名字找不到,此时使用命令ipconfig /all查看描述信息可以看到VirtualBox Host-only Ethernet Adapter,我这里是以太网3,IPV4对应也是192.168.56.1

    • 改完以后在D:\centos7vboxcmd命令窗口使用命令vagrant reload对虚拟机进行重启

    • 重启后在虚拟机使用命令ip addr查看eth1是否是设置的192.168.56.10,并在主机和虚拟机之间相互ping一下ip【windows的Ip是无线局域网WLAN的IP】,可以ping通没问题

  8. 开启CentOS的远程登录功能,使用VirtualBox安装的CentOS默认只允许ssh免密登录方式,只能通过CMD窗口使用命令vagrant ssh连接,为了操作方便、文件上传等,需要配置允许使用账号密码远程登录,这样才能使用xshell或者xftp等远程工具连接CentOS

    • 使用命令vi /etc/ssh/sshd_config打开文件/etc/ssh/sshd_config

    • 使用命令/PasswordAuthentication no搜索并将配置PasswordAuthentication no修改为PasswordAuthentication yes

    • 使用命令service sshd restart重启ssh服务,此时就可以使用ssh工具远程登录了,注意CentOS的远程登录root的密码也是vagrant

  9. VirtualBox安装的CentOS7可能无法ping通外网【也可能能ping通,因为我这儿配置没改过,但是能ping通外网,而且yum之类的命令都能正常使用】,即ping baidu.com失败,解决办法如下

    • 使用命令ip addr找到当前ip对应的网卡如eth1,对应的配置文件在/etc/sysconfig/network-scripts/ifcfg-eth1

    • 使用命令vi /etc/sysconfig/network-scripts/ifcfg-eth1修改网卡配置如下

      【Vagrant自动默认配置】

      【更改后的配置】

      • 添加网关地址GATEWAY=192.168.56.1,一般网关地址都是IP的最后一位取1

      • 配置DNS地址,可以配置两个DNS服务器地址DNS1=114.114.114.114DNS2=8.8.8.8

    • 使用命令service network restart重启网卡

    • 使用命令ping baidu.com测试是否能正常ping通百度

  10. 修改yum源,VirtualBox安装的CentOS默认的yum源还是国外的,最好修改为国内镜像,速度更快

    • 使用命令mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup备份原yum源

    • 使用命令curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo配置使用新yum源

    • 使用命令yum makecache生成缓存

     

     

 

软件安装

Linux系统上常用软件单机集群安装指南,需要远程访问的应用端口需要设置安全组【即打开对应的端口】或者内网关闭防火墙

安装jdk

安装步骤

安装成功测试

 

安装Vim

安装步骤

安装成功测试

 

安装Canal

Canal的运行需要linux下的jdk环境

注意,canal运行没有端口号,与外界的通讯需要通过数据库端口3306,防火墙需要放开3306端口

安装步骤

安装成功测试

 

安装Maven

maven3的历史版本在Maven – Download Apache Maven的Other Releases目录下点击 Maven 3 archives可以进行访问

安装步骤

  1. 上传介质到/opt/maven目录,使用命令cp apache-maven-3.6.3-bin.tar.gz /usr/local/maven/apache-maven-3.6.3-bin.tar.gz将介质复制一份到/usr/local/maven目录

    apache-maven-3.6.3-src.tar.gz是源码文件,不是maven软件

    软件是apache-maven-3.6.3-bin.tar.gz

  2. 使用命令tar -zxvf apache-maven-3.6.3-bin.tar.gz解压介质

  3. 使用命令vim /etc/profile修改环境变量,修改后使用命令source /etc/profile让文件立即生效

     

安装成功测试

  1. mvn -v可以显示maven版本号

 

安装Git

  1. 使用命令yum -y install git即可完成安装

 

安装Docker

方法一

参考文档:https://help.aliyun.com/document_detail/60742.html?spm=a2c4g.11174283.6.548.24c14541ssYFIZ

安装步骤
  1. 使用命令yum install -y yum-utils device-mapper-persistent-data lvm2安装一些必要的系统工具

  2. 使用命令yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安装一些必要的系统工具

  3. 使用命令yum makecache fast和命令yum -y install docker-ce更新并安装Docker-CE

  4. 使用命令service docker start开启Docker服务

  5. 这种安装方式需要使用命令yum remove docker-ce进行卸载,直接使用yum remove docker是卸载不掉的

     

安装成功测试
  1. 使用命令docker -v显示docker版本信息即安装成功

 

官网安装步骤

官方推荐最多人使用的安装方法,好家伙和第一种安装方法基本相同

安装文档:https://docs.docker.com/engine/install/centos/

安装步骤
  1. 使用命令yum install -y gcc和命令yum install -y gcc-c++安装Docker依赖

  2. 使用命令yum install -y yum-utils安装yum-utils

    老版本的docker还会执行yum install -y device-mapper-persistent-datayum install -y lvm2来安装其他依赖,阳哥和官网并没有对这进行要求,在谷粒商城项目上我是执行了这两步的,和课程保持一致

  3. 使用命令yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo设置Docker稳定的镜像仓库

    不要使用官网推荐的Docker镜像仓库,因为国内访问该仓库下载镜像文件大概率会失败,使用阿里云的镜像仓库

  4. 使用命令yum makecache fast更新yum软件包索引,建立yum源数据缓存,是将软件包信息提前在本地索引缓存,用来提高搜索安装软件的速度,以后下载东西更快一些

  5. 使用命令yum -y install docker-ce docker-ce-cli containerd.io安装Docker CE

 

安装成功测试
  1. 使用命令systemctl start docker启动Docker

  2. 使用命令ps -ef | grep docker查看docker的运行状态

  3. 使用命令docker --help能查看docker的常用命令和格式

  4. 使用命令docker cp --help能查看cp命令下更详细的格式

    通过命令docker --help能查到常用功能对应的命令

    再对查询命令使用上诉命令能查询到对应命令的具体用法

  5. 使用命令docker version能够查看Docker安装的客户端、服务端的版本信息

    使用命令docker info能够看到更详细的docker概要信息

  6. 使用命令docker run hello-world运行docker镜像

    提示信息为不能在本地找到'hello-world:latest'镜像,这里docker运行的镜像就是hello-world

    Docker运行镜像会先在本地寻找镜像,找不到再去远程仓库把镜像拉取到本地然后再运行镜像

  7. 使用命令systemctl enable docker是设置Docker开机启动

  8. Docker卸载

    依次执行以下命令完成Docker的卸载

    • systemctl stop docker

    • yum remove docker-ce docker-ce-cli containerd.io

    • rm -rf /var/lib/docker

    • rm -rf /var/lib/containerd

问题汇总
  1. Docker镜像无法拉取:

    在虚拟机上装完docker后,并且配置了阿里云镜像加速的情况下,下载镜像速度还是很慢,拉个redis镜像试了几十次都不行,报错如下:

    • 原因

      • DNS有问题,换成阿里云的DNS即可

    • 解决方法

      • 使用命令vi /etc/resolv.conf编辑对应文件

      • 将nameserver 后面的IP改成223.5.5.5

    • 解决效果

安装Jenkins

Jenkins有很多安装方式,最方便的是使用war包进行安装,war包就是一个web项目,通过浏览器能进行访问,war包放在tomcat中能直接运行

最新版本的Jenkins不支持java8了要注意

下载地址:步骤:官网--download--stable--Past Releases 进去选择对应版本的war包就能下载

安装步骤

  1. 下载Jenkins的war包传到/usr/local/jenkins

  2. 使用命令nohup java -jar /usr/local/jenkins/jenkins.war >/usr/local/jenkins/jenkins.out &直接启动

    java -jar /usr/local/jenkins/jenkins.war是命令的核心部分,war包目录要和命令一致

    /usr/local/jenkins/jenkins.out是日志输出的目录和日志名称,日志输出到jenkins.out文件

    nohup是命令前缀,表示后台静默启动,前台不会看见日志,日志会被输出到日志文件中

    &是命令后缀,表示该进程是守护线程

    这种方式启动后最后会提示忽略输入重定向错误到标准输出端,就是控制台不输出日志,然后再点击一次回车才能成功启动

安装成功测试

  1. 访问http://ip:8080能够成功访问Jenkins页面【ip为linux系统的ip地址】,需要放开8080端口的防火墙通讯

 

 

安装Zookeeper



单机版安装

安装步骤
  1. 在Apache Zookeeper官网Apache ZooKeeper点击Download按钮跳转至Apache ZooKeeper下载中心,一般下载稳定版本【stable release】,企业开发也避讳使用最新的版本,避免遇到bug没有参考资料;历史版本下载地址Index of /dist/zookeeper (apache.org),下载后缀为bin.tar.gz的压缩包

  2. 将安装包拷贝到/opt/zookeeper目录下

  3. 使用命令tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /usr/local/zookeeper将压缩包解压到指定目录/usr/local/zookeeper

  4. 使用命令mv apache-zookeeper-3.5.7-bin/ zookeeper-3.5.7将解压文件名更改为zookeeper-3.5.7

  5. 进入conf目录,使用命令mv zoo_sample.cfg zoo.cfg将文件名改为zoo.cfg

  6. /usr/local/zookeeper/目录下创建目录zkData用于存放Zookeeper的数据快照

  7. 使用命令vim zoo.cfgdataDir=/tmp/zookeeper配置成zkData所在的目录

 

目录说明
  1. bin目录是Zookeeper服务端的命令脚本目录

  2. conf是配置目录

    • conf目录只需要关注zoo_sample.cfg文件,Zookeeper运行的时候会加载配置文件zoo.cfgzoo_sample.cfg是Zookeeper为zoo.cfg文件提供的配置模板文件,用户需要自己以模板文件内容为蓝本创建配置文件zoo.cfg并修改其中配置来实现对Zookeepeer运行实例的配置,同时最好保留zoo_sample.cfg以备后续修改使用

  3. docs是文档目录

  4. lib第三方依赖目录

 

配置文件参数

配置文件是zoo.cfg

  1. 配置文件示例

  2. tickTime=2000【通信心跳时间】

    • 配置通信心跳时间为2000ms,该心跳客户端与服务端间可以互相发送,服务端与服务端间也可以互相发送,目的是检测目标服务是否仍然存活

  3. initLimit=10【LF初始通信时限】

    • Leader和Follower建立初始连接时能容忍的最大心跳数,如果10个心跳时间内还没有成功建立Leader和Follower之间的连接,就认为本次初始通信失败,Leader就是主,Follower就是从

  4. syncLimit=5【LF同步通信时限】

    • 初始化通信给的时间相较于同步通信时限长一些,后续通信如果超过5个心跳还没有建立连接,Leader认为Follower服务器已经挂了,会从服务器列表中删除Follower

  5. dataDir=/tmp/zookeeper【Zookeeper数据保持路径】

    • 注意:dataDir=/tmp/zookeeper意思是快照数据会存在/tmp/zookeeper目录下,默认的tmp目录,不要使用/tmp目录存储数据,因为/tmp目录存储的临时数据,容易被Linux系统定期删除,一般需要自定义目录,这里的/tmp/zookeeper只是模板示例,通常会在Zookeeper的安装目录下创建zkData目录存储数据

  6. clientPort=2181【客户端连接服务端的端口】

    • 客户端通过端口2181与Zookeeper服务器通讯,这个通常不做修改,就使用默认的

  7. maxClientCnxns=60【客户端连接Zookeeper的最大连接数】

    • 客户端连接Zookeeper的最大连接数,默认是60,一般使用默认配置

 

安装成功测试

Zookeeper中既有服务端,又有客户端

  1. 使用命令bin/zkServer.sh start启动Zookeeper服务端

    • 注意:当Zookeeper集群超过半数宕机Zookeeper不可用,启动集群需要启动一半以上的服务器zookeeper才能正常访问,单机版不用考虑这个问题

      • 🔎:单机版启动后使用命令bin/zkServer.sh status提示信息最后一行会提示Mode: standalone

  2. 使用命令jps查看Zookeeper进程,使用jps -l查看Zookeeper进程的全限定类名【jps:JVM会讲】

  3. 使用命令bin/zkCli.sh启动并进入Zookeeper客户端,注意这个不能加start

    • 命令ls在Zookeeper下也能使用

    • 使用命令quit退出zookeeper客户端

  4. 使用命令bin/zkServer.sh stop停止Zookeeper服务

  5. 使用命令bin/zkServer.sh restart重启Zookeeper服务

  6. 使用命令bin/zkServer.sh status查看Zookeeper服务的状态

 

基本指令

  1. **

    • 功能解析:输入非指令的任意字符串,Zookeeper会提示出所有能在客户端使用的指令

    • 使用示例

  2. ls [-s] [-w] [-R] <path>

    • 功能解析:查看指定节点路径path下的所有子节点

    • 使用示例

    • 补充说明

      • 节点路径必须写全路径,返回的是子节点名字数组,没有子节点会返回空数组

  3. get [-s] [-w] <path>

    • 功能解析:查看指定全路径path节点的数据内容

    • 使用示例

    • 补充说明

      • 新创建的节点没有数据会返回null,zookeeper中默认节点也没有数据但是使用该指令会返回空白的一行

  4. create [-s] [-e] [-c] [-t ttl] <path> [data] [acl]

    • 功能解析:在指定路径位置创建一个节点,[data]是指定节点的数据内容,[-e]是指定临时节点,[-s]是创建序列化永久节点

    • 使用示例

    • 补充说明

      • 指定位置节点已经存在的前提下再创建该节点会报错,

      • 创建节点同时指定节点数据,如果数据中有空格需要使用双引号将数据完整括起来,否则空格后面的内容会被识别为acl参数

      • 创建节点时必须父节点存在才能创建子节点,父节点不存在创建子节点会直接报错

      • 创建序列化永久节点,节点名称后面会自动添加顺序编号,该编号从0开始,且查询节点也需要带顺序编号,否则会提示该节点不存在

  5. delete [-v version] <path>

    • 功能解析:删除指定位置的节点

    • 使用示例

    • 补充说明

      • 节点删除成功不会有任何提示

  6. set [-s] [-v version] <path> <data>

    • 功能解析:更改指定节点的数据

    • 使用示例

  7. stat [-w] path

    • 功能解析:查看指定路径节点的状态,[-w]是监听节点状态

    • 使用示例

    • 补充说明

      • cZxid:节点事务ID,每次修改节点ZooKeeper都会收到一个zxid形式的时间戳,这就是ZooKeeper事务ID。事务ID在ZooKeeper中表示所有修改的次序,每个修改都有唯一的zxid,如果zxid1小于zxid2,那么说明zxid1在zxid2之前发生

      • ctime:znode被创建的毫秒数(从1970年开始)

      • mZxid:znode最后修改的zxid

      • mtime:znode最后修改的毫秒数(从1970年开始)

      • pZxid:znode最后更新的子节点zxid

      • cversion:znode子节点变化号,每变化一次就自增1

      • dataVersion:znode数据变化号,数据每变化一次就自增1(每次更新读取最新的值,可用于实现类似数据库乐观锁功能)

      • aclVersion:znode访问控制列表的变化号

      • ephemeralOwner:如果是临时节点,这个是znode拥有者的session id。如果不是临时节点则是0

      • dataLength:znode的数据长度

      • numChildren:znode子节点数量

      • 即使节点不存在执行监听指令报错依然能监听成功,监听的节点发生变化会直接显示在执行监听命令的客户端

 

节点类型


  1. 永久节点PERSISTENT

    • 概念:客户端与Zookeeper服务器断开连接后仍然存在于服务器中的节点

      • 🔎:默认情况下创建的节点都是永久节点,即使Zookeeper服务器关了也一样会保存其中的数据

  2. 临时节点EPHEMERAL

    • 概念:客户端与Zookeeper服务器断开连接后就会被Zookeeper服务器删除的节点

      • 🔎:注意必须是创建临时节点的客户端断开连接才能删除对应的临时节点,其他客户端断开也只会删除其自身创建的临时节点;而且断开以后的几秒钟时间内,所有的客户端都还能正常查询到对应的节点和其中的数据

      • 🔎:老师说这是Zookeeper本地客户端的问题,使用Java客户端断开连接后,节点会直接删除,再连上不管时间多短节点都直接被删了

    • 创建方法:临时节点需要使用创建节点命令时添加-e参数如create -e /zz "hello"来创建一个路径为/zz,节点内容为hello的临时节点

  3. 序列化永久节点PERSISTENT_SEQUENTIAL

    • 概念:客户端与Zookeeper服务器断开连接后仍然存在于服务器中且相同名称的节点可以被多次创建,Zookeeper会给对应节点名称后面添加一串从0开始的顺序编号

      • 🔎:注意这里的序列化不是Java中那个序列化的意思,而是在节点名称后面顺序编号

    • 创建方法:序列化的永久节点需要使用创建节点命令时添加-s参数如create -s /ss "hello"来创建

      • 示例

  4. 序列化临时节点PERSISTENT_SEQUENTIAL

    • 概念:客户端与Zookeeper服务器断开连接后就会被Zookeeper服务器删除的节点,且Zookeeper会给对应节点名称后面添加一串从0开始的顺序编号,只是简单结合了给节点名称按顺序编号和关闭创建该节点的客户端节点就会被Zookeeper服务器删掉的节点,注意序列化临时节点被删除不会影响序列化永久节点的编号

    • 创建方法:序列化的临时节点需要使用创建节点命令时组合添加-s-e参数如create -s -e /ss "hello"来创建

     

节点事件监听


  1. 节点创建

    • 事件类型:NodeCreated

    • 通过命令stat -w <path>监听指定节点的节点创建事件,该命令执行时指定节点不存在会报错,但是不影响监听效果

  2. 节点删除

    • 事件类型:NodeDeleted

    • 通过命令stat -w <path>监听指定节点的节点删除事件

  3. 节点数据变化

    • 事件类型:NodeDataChanged

    • 通过命令get -w <path>监听指定节点的节点数据变化事件

  4. 子节点变化

    • 事件类型:NodeChildrenChanged

    • 通过命令ls -w <path>监听指定节点的子节点变化事件

 

 

集群版安装

Zookeeper集群最少是3台,

安装步骤
安装成功测试

 

安装RabbitMQ

官网:https://www.rabbitmq.com/download.html

RabbitMQ的运行需要Erlang语言的运行环境,RabbitMQ用的最多的是linux系统的,RabbitMQ的版本需要对应linux系统的版本,使用命令uname -a查看当前linux系统的版本。el7表示linux7

安装步骤

  1. 将以下文件上传至/opt/rabbitmq目录下

  2. 将以下两个文件移动到/usr/local/rabbitmq目录下

  3. 使用以下命令安装对应软件

    • 使用命令rpm -ivh erlang-21.3-1.el7.x86_64.rpm安装erlang环境【i表示安装,v表示显示安装进度】

    • 使用命令yum install socat -y【安装rabbitmq需要安装rabbitmq的依赖包socat】

      yum命令需要去互联网联网下载安装包

    • 使用命令rpm -ivh rabbitmq-server-3.8.8-1.el7.noarch.rpm安装rabbitmq

 

安装成功测试

  1. 使用命令chkconfig rabbitmq-server on设置rab bitmq服务开机启动

  2. 使用命令/sbin/service rabbitmq-server start手动启动rabbitmq服务

  3. 使用命令/sbin/service rabbitmq-server status查看rabbitmq服务状态【如果服务是启动状态active会显示running,正在启动会显示activing,inactive表示服务已经关闭】

  4. 使用命令/sbin/service rabbitmq-server stop停止rabbitmq服务

  5. 在rabbitmq服务关闭的状态下使用命令rabbitmq-plugins enable rabbitmq_management安装rabbitmq的web管理插件【执行了该命令才能通过浏览器输入地址http://主机地址:rabbitmq端口号15672访问rabbitmq,访问rabbitmq需要开启防火墙端口通讯】

    初始账号和密码默认都是guest,第一次登录会显示没有用户只能通过本地登录,此时需要添加一个账户进行远程登录

    【开放rabbitmq防火墙端口通讯】

    【web控制台】

  6. 添加用户并设置超级管理员权限以登录web控制台

    • 使用命令rabbitmqctl add_user earl 123456创建账户,账户名earl,密码123456

    • 使用命令rabbitmqctl set_user_tags earl administrator设置用户earl的角色为超级管理员

    • 使用命令rabbitmqctl set_permissions -p "/" earl ".*" ".*" ".*"设置用户权限

      [-p <vhostpath>] <user> <conf> <write> <read>;-p <vhostpath>表示设置vhost的路径,conf表示可以配置哪些资源,user表示用户,write表示写权限、read表示读权限

      上个命令的意思表示对于用户earl设置具有对/vhost1这个virtual host中的所有资源的配置、写、读权限;每个vhost代表一个库,不同vhost中的交换机和队列是不同的

      guest访问不了就是因为没有设置"/"vhost的路径

    • 使用命令rabbitmqctl list_users查看当前rabbitmq server有哪些用户

     

    【MQ的后台管理界面】

    admin路由中就可以显示增删改用户

     

安装解决延迟队列缺陷的插件

安装RabbitMQ插件解决延迟队列缺陷

  1. 官网下载插件rabbitmq_delayed_message_exchange,放在RabbitMQ的插件目录/usr/lib/rabbitmq/lib/rabbitmq_server-3.8.8/plugins

    这个插件不会实时更新,一直会维持放进去时候的情况

  2. 执行命令让插件生效并使用命令systemctl restart rabbitmq-server重启RabbitMQ

    安装不需要写插件的版本号

  3. 弄好之后在前端控制台的exchange列表中点击添加交换机多出来一个x-delayed-message类型的交换机,同时也意味着延迟消息不由队列控制,由交换机来控制

 

RabbitMQ集群搭建

添加其他RabbitMQ服务器,将其加入1号节点服务器就可以形成集群,比如2加入1号,4加入2号和4加入1号效果是一样的,类似于redis集群

  1. 集群架构

    添加两台新机器,都加入RabbitMQ节点1号

  2. 集群搭建实操

    • 将当前机器克隆三份并修改三台机器的ip地址,不要使其冲突【电脑好,扛得住】,使用xshell对三台机器进行远程连接

    • 使用命令vim /etc/hostname修改3台机器的主机名称为目标名称node1、node2、node3并使用命令shutdown -r now重启机器,使用命令hostname查看当前机器的主机名

    • 使用命令vim /etc/hosts添加各机器节点的ip和hostname配置各个虚拟机节点并重启机器,让各个节点能识别对方

    • 要确保各个节点的cookie文件使用的是同一个值,在node1节点上执行远程操作命令scp /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq/.erlang.cookiescp /var/lib/rabbitmq/.erlang.cookie root@node3:/var/lib/rabbitmq/.erlang.cookie将第一台机器的cookie复制给第二台和第三台机器

    • 三台机器使用命令rabbitmq-server -detached重启RabbitMQ服务、顺带重启Erlang虚拟机和RabbitMQ的应用服务

    • 以node1为集群将node2和node3加入进去,分别在node2和node3节点执行以下命令

      关闭RabbitMQ服务,将rabbitmq重置,将node2和node3节点分别加入node1节点【这里将node2节点加入node3节点观察后续移除node2节点后node3的效果,凉了手速过快,一起连上了】

      执行命令rabbitmqctl join_cluster rabbit@node1必须开放node1的4369和25672端口,否则会报错;网上一堆操作猛如虎,没一个讲到点上的;克隆的系统相关端口也是开放的

      我靠,血泪教训,最多只能有一个机器不开放4369和25672端口,其他所有机器都必须开放这俩接口,否则严重点会直接导致所有的RabbitMQ没有一台机器能启动,一直显示正在启动中,启动命令一直卡在运行中,其他的rabbitmq命令报错消息还很傻逼,只会提醒应用没启动,网上还没啥解决方案【fuck】,最后只启动node1发现突然能启动,且能进后台,然后启动node2突然能启动了,node3死活启动不了,终于开放node2的两个端口后node3就能自动启动了,为了方便以后不出问题,建议所有机器节点都开放这俩端口,连带5672端口和15672端口

      【没开放端口的情况】

      【开放4369端口的情况和开放了25672端口的情况】

    • 使用命令rabbitmqctl cluster_status查看集群状态

      2号节点一直在启动,不知道为啥

    • 只需要在一台机器上使用以下命令重新设置用户

  3. 搭建成功标志

    • 进入网页服务界面能看到3个RabbitMQ节点【状态都是绿色就表示非常健康】

  4. 解除集群节点的命令【node2和node3分别执行以脱离,最后测试一下2号机脱离通过2号机联机集群的3号机的状态,手快了全绑在node1下了】

    【脱离机器node2或node3分别执行】

    【node1执行命令忘记脱离的节点】

 

Docker安装RabbitMQ



 

  1. 安装步骤

    • 使用命令docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 25672:25672 -p 15671:15671 -p 15672:15672 rabbitmq:management安装RabbitMQ,其中

      • 436925672端口是Erlang发现端口和集群端口,RabbitMQ是用Erlang语言编写的

      • 56725671是AMQP端口

      • 15672是web管理后台端口

      • 6161361614是STOMP协议端口,开启了STOMP协议才需要开放该端口

      • 18838883是MQTT协议端口,开启了MQTT协议才需要开放该端口

      • RabbitMQ的RabbitMQ官方文档对这些端口有具体说明

    • 使用命令docker update rabbitmq --restart=always让容器随着Docker启动自动启动

    • 使用命令docker exec -it rabbitmq /bin/bash进入容器rabbitmq的bash命令控制台,无需停止rabbitmq直接使用命令rabbitmq-plugins enable rabbitmq_management,也无需重启容器

      • 后台管理系统http://192.168.56.10:15672的默认账号和登录密码都是guest,如果不执行上述步骤只能打开登录页无法登录进入首页

      • 如何在docker内部使用命令停止rabbitmq没学过,使用原生rpm安装的的Rabbitmq命令提示找不到对应服务

 

安装Nacos

安装步骤

  1. 从地址https://github.com/alibaba/nacos/tags下载linux系统下的nacos安装包nacos-server-1.3.1.tar.gz

  2. nacos-server-1.3.1.tar.gz安装包拷贝到/usr/local/nacos目录下

  3. 使用命令tar -zxvf nacos-server-1.3.1.tar.gz解压安装包到当前目录

  4. 进入bin目录使用命令startup 8848启动nacos

安装成功测试

  1. 启动nacos,使用浏览器访问http://localhost:8848/nacos出现nacos可视化页面即安装成功

  2. 启动nacos时提示Public Key Retrieval is not allowed错误解决方法

    • 背景

      在使用hive元数据服务方式访问hive时,使用jdbc连接到mysql时提示错误:java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed

      img

    • 原因分析

      如果用户使用了 sha256_password 认证,密码在传输过程中必须使用 TLS 协议保护,但是如果 RSA 公钥不可用,可以使用服务器提供的公钥;可以在连接中通过 ServerRSAPublicKeyFile 指定服务器的 RSA 公钥,或者AllowPublicKeyRetrieval=True参数以允许客户端从服务器获取公钥;但是需要注意的是 AllowPublicKeyRetrieval=True可能会导致恶意的代理通过中间人攻击(MITM)获取到明文密码,所以默认是关闭的,必须显式开启。

    • 解决措施

      在请求的url后面添加参数allowPublicKeyRetrieval=true&useSSL=false

      亲测加了以后不报错正常启动

      • 如果是xml配置注意&符号的转义

      img

      注意:Xml文件中不能使用&,要使用他的转义&来代替。

 

Nacos集群配置

【集群架构图】

)

nacos1.3.1能连上mysql8,且配置mysql友好,最好在根目录下创建plugins/mysql目录,把对应mysql的驱动jar包放进去,linux和windows用的驱动jar包是一样的

一台nginx+三台nacos+一台mysql实现注册配置中心集群化配置【自带消息总线】

  1. nacos启动命令startup 8848默认使用8848,单机版以集群的方式启动,需要修改startup.sh添加startup -p 8848statup -p 8849startup -p 8850以多端口的方式启动nacos

  2. 配置nacos使用mysql数据库进行持久化

    凡是修改配置文件的

    • 在linux系统下的mysql中创建数据库nacos_config,在该数据库下使用命令source /usr/local/nacos/nacos/conf/nacos-mysql.sql执行nacos的confg目录下的nacos-mysql.sql中的SQL语句

    • 修改配置文件application.properties,让nacos使用外置数据库mysql

    • linux服务器上nacos的集群配置cluster.conf

      定出3台nacos服务的端口号,默认出厂没有cluster.conf文件,只有一个cluster.conf.example

      • 使用命令|拷贝cluster.conf.example文件并重命名cluster.conf

      • 使用命令hostname -i查看本机ens33的ip地址

      • 配置cluster.conf集群配置

        集群配置一定要用上述的ip地址

      • 修改nacos启动脚本startup.sh,使其能接受不同的启动端口

        就是在启动脚本中写入命令startup -p 8849【端口号一定要是在cluster.conf中配置过的端口】

        使用命令set numberset nu在vim中显示行号,使用命令set nonu[mber]取消显示行号,使用命令set nu!或者set invnu[mber]反转行号【反转行号显示的效果是有行号变成不显示行号,没有行号的变成显示行号】,使用命令set relativenumber设置相对于某一行的行号

        将反转行号绑定到按键将这行代码nnoremap <C-N><C-N> :set invnumber<CR>放入vimrc文件中,意思是连按两下<Ctrl-N>便可以反转行号显示【<Ctrl-N>就是CTRL+n的意思,CTRL+N也可以用】,如果要在【insert模式】下反转行号显示,可以使用代码:inoremap <C-N><C-N> <C-O>:set invnumber<CR>

        【修改启动脚本】

        • 修改前:如果启动命令传递的是m就走模式分支MODE,传递的是f就走FUNCTION MODE分支,传递的是s就走SERVER分支

          • 修改后添加了p:,传参p就会走PORT分支,表示传递变量值$OPTARG给变量PORT

        • 在$JAVA和$JAVA_OPT之间加了-Dserver.port=${PORT}表示把输入启动命令的参数值即此前给PORT赋值的参数值传递给$JAVA -Dserver.port

          • Nacos本身没做这个原因应该是,学习是在同一台机器进行。实际生产在不同服务器做分布式集群。

    • 在nacos根目录下创建plugins/mysql目录,将对应mysql数据库的驱动引入其中,windows下用的jar包就行,经过测试,能正常启动,因为第一次的startup.sh的-Dserver.port写到上一行去了,所以启动不起来才考虑加入mysql驱动插件的,然后发现startup.sh写错了,改了以后启动正常了,但是是否要加驱动jar包就不知道了,反正加了不会报错

    • 修改Nginx配置,让其作为负载均衡器

      • nginx的配置

    • 测试

      • 启动mysql服务

      • 在nacos的bin目录下使用命令./startup.sh -p 8849./startup.sh -p 8850./startup.sh -p 8851在不同端口启动3台nacos服务器

        启动单台一定要测试是否启动成功,直接在浏览器访问对应端口的服务,启动不了nginx是访问不了的

        使用ps命令确认过三台nacos服务都启动了

        使用命令ps -ef|grep nacos|grep -v grep|wc -l可以查看nacos服务器启动的台数

      • 在nginx的sbin目录下使用命令./nginx -c /usr/local/nginx/conf/nginx.conf启动nginx

        使用ps命令确认过nginx服务已经启动

      • 使用请求路径192.168.200.132:1111/nacos访问nacos集群

      • 测试集群是否搭建成功

        • 启动后发现只有两台nacos启动了,第三台无法访问

          原因是虚拟机内存用完了

          【nacos服务状态】

          第三台因为内存不够没启动成功,这里有第一个8848端口的nacos是因为配置文件写错了,后来改了,最后一个是因为虚拟机内存不够了,启动不起来

        • 新建配置文件

          配置文件会创建在数据库nacos_config的config_info表下,存在服务器没起来也能新建配置文件写入数据库,但是存在nacos服务器起不来,无法向nacos集群注册服务,服务列表是空的

          【数据库配置文件存储实况】

          文件名、配置文件信息都和新建配置一模一样

      • 将SpringCloud学习项目的模块23的注册中心迁移到linux系统上由nginx负责负载均衡的nacos集群上来

        此时读取的应该是linux上mysql数据库的配置文件

        • 23模块配置文件切换注册中心为nacos集群

        • 如果nacos注册中心中服务列表显示该模块则证明服务成功注册到nacos集群中

          几个要点,

          • nacos中的集群管理的节点列表中会显示写在配置文件的所有nacos服务器,只要这个列表中有一台服务器起不起来,比如虚拟机内存不够了服务就启动不起来,此时服务就无法注册到nacos集群中,服务列表不会显示启动的服务【错误配置8848端口的nacos没有上线其他三台正常服务无法注册;更正8848后故意只启动两台,服务无法注册,报错拒绝连接;此时启动第三台,服务成功注册】只要有一台nacos服务器宕机,服务就无法注册到注册中心,这不是违背高可用和配置集群的原则吗?

          • 可以修改nacos的配置文件来限制nacos的运行内存大小,达到增加集群中服务器数量的目的

        • 修改nacos运行内存限制

          【运行内存的默认配置】

          在startup.sh中的JVM配置中

          【更改后的运行内存配置】

          【修改后再次启动三个服务均运行正常】

          第一个有8848纯属是nacos集群配置文件写错了,多加了一个8848,更改后就好了

         

Docker安装RabbitMQ



  1. 安装步骤

    • 使用命令docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 25672:25672 -p 15671:15671 -p 15672:15672 rabbitmq:management安装RabbitMQ,其中

      • 436925672端口是Erlang发现端口和集群端口,RabbitMQ是用Erlang语言编写的

      • 56725671是AMQP端口

      • 15672是web管理后台端口

      • 6161361614是STOMP协议端口,开启了STOMP协议才需要开放该端口

      • 18838883是MQTT协议端口,开启了MQTT协议才需要开放该端口

      • RabbitMQ的RabbitMQ官方文档对这些端口有具体说明

    • 使用命令docker update rabbitmq --restart=always让容器随着Docker启动自动启动

    • 使用命令docker exec -it rabbitmq /bin/bash进入容器rabbitmq的bash命令控制台,无需停止rabbitmq直接使用命令rabbitmq-plugins enable rabbitmq_management,也无需重启容器

      • 后台管理系统http://192.168.56.10:15672的默认账号和登录密码都是guest,如果不执行上述步骤只能打开登录页无法登录进入首页

      • 如何在docker内部使用命令停止rabbitmq没学过,使用原生rpm安装的的Rabbitmq命令提示找不到对应服务

 

安装Nginx

使用nginx1.20.2

安装步骤

基础部分学习使用最原始版本

  1. 将nginx的安装包nginx-1.20.2.tar.gz上传到linux的/opt/nginx目录下

  2. 使用命令mkdir /usr/local/nginx创建/usr/local/nginx目录

  3. 使用命令tar -zxvf nginx-1.20.2.tar.gz解压文件到/opt/nginx目录

  4. 进入解压目录,进入nginx解压文件,使用命令./configure [--prefix=/usr/local/nginx]【--prefix是可选项,指定安装目录】尝试检查是否满足安装条件,期间会提示缺少的依赖,以下是需要依赖的安装

    成功安装的标志是没有报错

    • 使用命令yum install -y gcc安装c语言编译器gcc【-y是使用默认安装,不提示信息】

    • 使用命令yum install -y pcre pcre-devel安装perl库【pcre是perl的库】

    • 使用命令yum install -y zlib zlib-devel安装zlib库

    • 检查没有问题后执行命令make进行编译

    • 执行make install安装nginx

安装成功测试

  1. 使用命令cd /usr/local/nginx进入nginx安装目录,查看是否有相应文件

  2. 进入sbin目录,使用命令./nginx启动nginx服务

    启动时会启动多个线程

  3. 使用命令systemctl stop firewalld.service关闭防火墙服务

    虚拟机是内网上的机器,外网接不进来,关闭防火墙不一定意味着不安全,当然放行端口80更完美;学习过程不需要开启,生产的时候多数时候也不需要开启,除非机器有外网直接接入,或者公司比较大,要防外边和公司里的程序员,可能开启内部的监控和日志记录,一般中小型公司是不会开内网的防火墙的,因为有硬件防火墙或者云的安全组策略

  4. 使用请求地址http://129.168.200.132:80访问nginx

    nginx的默认端口就是80端口,一定要关梯子进行访问,靠北

  5. 使用命令./nginx -s stop快速停止nginx

  6. 使用命令./nginx -s quit在退出前完成已经接受的链接请求

    如用户下载文件,等用户下载完成后再停机,此时不会再接收任何新请求

  7. 使用命令./nginx -s reload重新加载nginx配置

    可以让nginx更新配置立即生效而不需要重启整个nginx服务器,机制是执行过程中优雅停止nginx,保持链接,reload过程开启新的线程读取配置文件,原有线程处理完任务后就会被杀掉,加载完最新配置的线程继续杀掉线程的工作

  8. 此时启动nginx比较麻烦,需要使用nginx的可执行文件,意外重启的时候很麻烦,需要登录到控制台手动启动,将nginx安装成系统服务脚本启动就会非常简单

    • 使用命令vi /usr/lib/systemd/system/nginx.service创建服务脚本

      粘贴文本普通模式粘贴可能丢字符,插入状态粘贴就不会丢字符 WantedBy=multi-user.target 属于[install],shell脚本不能有注释,否则无法设置开机自启动

    • 使用命令systemctl daemon-reload重新加载系统服务并关闭nginx服务

    • 使用命令systemctl start nginx.service用脚本启动nginx【启动前注意关闭nginx,避免发生冲突】

    • 使用命令systemctl status nginx查看服务运行状态

    • 使用命令systemctl enable nginx.service设置nginx开机启动

      nginx.service中的[Install]部分中的WantedBy=multi-user.target不能有注释,不能拼写错误,否则无法设置开机自启动

Nginx安装Sticky

sticky是google开源的第三方模块

sticky在nginx上的使用说明:http://nginx.org/en/docs/http/ngx_http_upstream_module.html#sticky

tengine版本中已经有sticky这个模块了,安装的时候需要进行编译;其他的版本还是需要单独安装,sticky模块用的比较多

下载地址:BitBucket下载地址,里面也有对sticky使用的介绍github下载地址,github是第三方作者的,google主要开源在BitBucket上

sticky主要还是使用BitBucket下载,该Sticky由google进行的迁移,而且一般都下载这个,下载点击downloads--Tags选择版本【很多年不更新了,但是功能已经算比较完善了,有不同的压缩格式,linux选择.gz】--点击.gz进行下载【sticky安装在nginx负载均衡器上即131】

  1. 将文件nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d.tar.gz上传至linux系统/opt/nginx目录下

  2. 使用命令tar -zxvf nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d.tar.gz将文件解压到当前目录

  3. 在nginx的解压目录/opt/nginx/nginx-1.20.2目录下使用命令./configure --prefix=/usr/local/nginx/ --add-module=/opt/nginx/nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d检查环境并配置将nginx编译安装至/usr/local/nginx目录下

    nginx重新编译会生成全新的nginx,如果老nginx配置比较多需要全部备份并编译后进行替换

    --add-module是添加第三方的模块,如果是nginx自带的模块编译的时候用的是--vs-module命令,表示模块已经在nginx的官方安装包里了

  4. 在nginx的解压目录/opt/nginx目录下使用命令make安装nginx

    编译过程如果遇到sticky报错,是因为sticky过老的问题,需要修改源码,在sticky的解压文件中找到ngx_http_sticky_misc.h文件的第十二行添加以下代码

    添加后需要重新./configure一下再执行make

    安装sticky模块需要openSSL依赖,如果没有make的时候也会报错没有openssl/sha.h文件,此时使用命令yum install -y openssl-devel安装openssl-devel,再使用./configure检查环境并make进行编译安装,没有报错就安装成功了

  5. 在nginx解压目录使用命令make upgrade检查新编译的安装包是否存在问题【在不替换原nginx的情况下尝试跑一下新的nginx】,而不是直接把新的替换掉旧的

    nginx解压目录中objs是nginx编译后的文件,objs目录下的nginx.sh就是新编译的nginx可执行文件,想要平滑升级nginx不破坏原有配置可以将该nginx.sh文件直接替换掉原安装目录中的nginx.sh,但是一定要注意原文件的备份

  6. 使用命令mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old对原nginx可执行文件进行备份,使用命令cp nginx /usr/local/nginx/sbin/将nginx解压包objs目录下的nginx.sh拷贝到目录/usr/local/nginx/sbin/

  7. 使用命令./nginx -V来查看nginx的版本和nginx的编译安装参数

  8. 使用命令systemctl start nginx启动nginx,并使用浏览器访问nginx观察访问是否正常,访问正常即nginx升级第三方模块成功

 

Nginx安装Brolti

安装ngx_brotli和brotli稍微麻烦一点,因为有子项目依赖

  1. 从下载地址https://github.com/google/ngx_brotli下载broltinginx上的插件ngx_brotli

    ngx_brotli下载地址有文档,配置使用官方推荐的动态模块的方式,动态加载模块是nginx在1.9版本以后才支持的,禁用模块无需重新进行编译,直接在配置文件中进行配置要使用的模块就可以直接使用了【就是安装是安装,需要使用要在配置文件进行配置,不配置对应的模块就会禁用】

    ngx_brotli下载点击release下载,只能下载到源码,需要自己在本地进行编译和安装;或者从git直接拉取到本地进行编译和安装;稳定版本现在只有1.0.0,linux系统下载tar.gz版本

  2. 从下载地址https://codeload.github.com/google/brotli/tar.gz/refs/tags/v1.0.9下载brotli单独的算法

    仓库地址:https://github.com/google/brotli,也可以直接从对应仓库的release下载tar.gz的源码压缩包

  3. 使用命令tar -zxvf ngx_brotli-1.0.0rc.tar.gz解压ngx_brotli的压缩包

  4. 使用命令tar -zxvf brotli-1.0.9.tar.gz解压brolti的压缩包

  5. 进入brolti的解压目录,使用命令mv ./* /opt/nginx/ngx_brotli-1.0.0rc/deps/brotli将brotli算法的压缩包移动到ngx_brotli解压目录下的ngx_brotli-1.0.0rc/deps/brolti目录【注意不要 把解压目录brotli-1.0.9也拷贝过去了,只拷贝该目录下的文件,目录层级不对预编译检查会报错】

  6. 在nginx的解压目录使用命令./configure --with-compat --add-dynamic-module=/opt/nginx/ngx_brotli-1.0.0rc --prefix=/usr/local/nginx/ --add-module=/opt/nginx/nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d --with-http_gzip_static_module --with-http_gunzip_module以动态化模块的方式【传统的方式模块无法禁用】对ngx_brolti进行编译,传统的编译可以在./configure中使用--add-dynamic-module=brotli目录

  7. 在nginx的解压目录使用命令make进行编译

    没报错就是成功的,经测试没问题

  8. 使用命令mkdir /usr/local/nginx/modules在nginx安装目录下创建一个modules模块专门来放置第三方模块,默认是没有的

  9. 在nginx解压目录进入objs目录,使用命令cp ngx_http_brotli_filter_module.so /usr/local/nginx/modules/以及cp ngx_http_brotli_static_module.so /usr/local/nginx/modules/将模块ngx_http_brotli_filter_module.songx_http_brotli_static_module.so拷贝到nginx安装目录的modules目录下,以后就可以在nginx配置文件动态的加载brotli模块了

  10. 停止nginx的运行,使用命令mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old3,使用命令cp nginx /usr/local/nginx/sbin/objs/nginx.sh复制到nginx的sbin目录

    只要进行了编译就要将新的主程序nginx拷贝到nginx的安装目录,否则即使之前的步骤都没问题模块也是用不了的

    每次预编译都要带上之前添加的完整的模块,否则可能由于对某些模块有配置但是没有安装相应的模块,会导致服务启动不起来

    可以在拷贝完成后再重启nginx服务

    能成功重启nginx就是正常的

 

Nginx安装Concat

官网地址:https://github.com/alibaba/nginx-http-concat

nginx官网对Concat的介绍:https://www.nginx.com/resources/wiki/modules/concat/

Tengine的官网也有介绍,该模块最早是tengine发布的,tengine已经被捐献给apache开源组织,tengine是基于nginx开源版基础上再源码层面做了很多的修改,不只是增加了模块和功能,大部分的tengine的模块直接拿到nginx中是用不了的,但是Concat模块是能直接拿过来使用的,Concat虽然很久没用了,但是比较简单,就一个C源文件,而且release中没有发行版,只能通过git clone进行安装或者点击code通过download zip将压缩包nginx-http-concat-master.zip下载下来

  1. 将压缩包nginx-http-concat-master.zip拷贝到/opt/nginx目录下

    这里有个坑,大家用git指令下载的文件是和直接下载的文件是不一样的,git下载的文件名没有-master

  2. 在nginx的解压目录中使用命令./configure --with-compat --add-dynamic-module=/opt/nginx/ngx_brotli-1.0.0rc --prefix=/usr/local/nginx/ --add-module=/opt/nginx/nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d --with-http_gzip_static_module --with-http_gunzip_module --add-module=/opt/nginx/nginx-http-concat-master进行预编译,然后使用make命令编译

    这里面为了nginx的课程连续性,添加了很多其他模块,自己根据需要选择,预编译检查的命令不是固定的,对nginx.sh使用命令./nginx -V能够查看当前nginx的版本,gcc版本和安装的模块

  3. 使用命令systemctl stop nginx停掉nginx,在/objs目录下使用命令cp nginx /usr/local/nginx/sbin/将编译好的nginx运行文件替换掉老的nginx.sh,然后重启nginx

    一般来说各个模块包括第三方模块之间不会有冲突性问题

 

Nginx安装GEOIP2

GEOIP是一家商业公司开发的组件,现在升级到版本2,不仅可以使用在nginx,还可以使用在java、python上,提供云API供用户直接调用,IP和地区对应的库该公司也免费开放出来了,免费版比商业版的数据精确度差一点;早期的DNS解析做的不是很好使用比较广泛,现在基本各大云平台都有很强大的DNS解析技术;自己搭建一个DNS解析系统配置和部署比较麻烦,但是现在都是云平台商提供;因此现在的GEOIP的应用场景其实不是很多,主要都是阻断一些用户请求【比如站点不对一个国家开放,或者站点只对一个城市开放,又或者根据用户所属不同区域向用户展示不同的站点,现在也比较少了,用的最多的也就是一些资源只限某个地区的用户使用】

  1. GEOIP2的安装

    tcp连接IP是无法造假的,因为tcp造假服务端数据就无法正常响应给用户

    GEOIP的安装比较麻烦,需要下载3个资源

    GEOIP的Nginx模块配置官方文档:http://nginx.org/en/docs/http/ngx_http_geoip_module.html#geoip_proxy

    • 需要前往GEOIP的官网下载ip数据库

      要下载需要注册并登录,GEOLite2是免费版的库,GEO2是付费版的库,而且他的库更新频率特别高,线上使用也要频繁的去更新

      登录使用邮箱和密码

      【下载选项】

      country只能检索到国家,City能够检索到城市,ASN能检索到更详细一点的区域;测试下载country版本的就行,数据库越大,检索的效率太低,下载gzip版本;csv版本可以直接导入数据库如mysql或者oracle

      测试导入云服务器上,这样能解析我们自己的ip,在自己电脑上部署无法进行访问,导入/opt/nginx目录下

    • 前往GEOIP的官方git下载GEOIP模块的相关依赖:https://github.com/maxmind/libmaxminddb

      下载1.6.0版本libmaxminddb-1.6.0.tar.gz

      安装需要gcc,使用命令yum install -y gcc安装gcc,解压后在安装目录执行./confugure,使用make进行编译,使用make install进行安装;使用命令echo /usr/local/lib >> /etc/ld.so.conf.d/local.conf配置动态连接库【相当于在系统的动态连接库下额外增加一个目录】,使用命令ldconfig刷新系统的动态链接库

    • 前往GEOIP的官方git下载GEOIP的对应Nginx上的模块:https://github.com/leev/ngx_http_geoip2_module

      下载3.3版本ngx_http_geoip2_module-3.3.tar.gz

      安装GEOIP需要pcre-devel,使用命令yum install -y pcre pcre-devel安装;

      安装GEOIP需要zlib,使用命令yum install -y zlib-devel安装;

      解压缩GEOIP模块的压缩包,进入nginx的解压目录使用命令./configure --prefix=/usr/local/nginx/ --add-module=/opt/nginx/ngx_http_geoip2_module进行静态安装【动态安装更好,静态安装只是安装更省事】,使用make进行编译,使用make install进行安装【此时已经安装完毕,只需要在配置文件中进行配置,我云服务器上的nginx是通过oneinstack.com安装的,不知道安装包在哪儿,且那个nginx正在跑博客,这里就不实验了,后续记录老师的演示】

Nginx安装Purger

  1. 将文件ngx_cache_purge-2.3.tar.gz上传到/opt/nginx目录下,使用命令tar -zxvf ngx_cache_purge-2.3.tar.gz解压缩压缩包

  2. 进入nginx的解压目录,使用命令./configure --with-compat --add-dynamic-module=/opt/nginx/ngx_brotli-1.0.0rc --prefix=/usr/local/nginx/ --add-module=/opt/nginx/nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d --add-module=/opt/nginx/ngx_cache_purge-2.3 --with-http_gzip_static_module --with-http_gunzip_module --add-module=/opt/nginx/nginx-http-concat-master进行预编译,没有报错使用命令make进行编译

    这里图省事加了很多其他模块的配置,自己根据需要删减或者增加即可

  3. 使用命令mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old4将老的nginx运行文件备份,使用命令cp /opt/nginx/nginx-1.20.2/objs/nginx /usr/local/nginx/sbin/nginx将新的nginx文件拷贝到nginx的安装目录

  4. 在nginx中对purger进行配置

    这里自定义了参数proxy_cache_key $uri;,默认的该参数配置$scheme$proxy_host$request_uri,生成的key效果为http://stickytest/page.css$proxy_host是upstream的名字,可以认为该参数实际读取的是proxy_pass的host部分;这个key必须和清理缓存站点的proxy_cache_purge的配置【此处配置是$1,表示uri中的第一个参数】相同,否则无法找到对应的缓存文件并删除该缓存文件

    自定义参数proxy_cache_key $uri;的好处是不管访问的是http的资源,还是https的资源,或者通过各种域名访问到主机,一概不进行区分,只对访问的具体资源进行区分;这个对访问文件生成的key的协议和主机以及uri有影响,默认设置可能来自不同协议、域名等请求可能对同一份响应文件生成多个不同key的缓存文件,使用uri来作为key能够避免区分协议和不同的域名,相同的响应文件只生成同一份缓存文件

    proxy_cache_key $uri;还可以使用很多其他的变量,官方git举了一些例子【具体可用的参数课程没有讲过,自己总结】,比如proxy_cache_key $host$uri$is_args$args;$is_args是判断是否有参数】,一旦修改了proxy_cache_keyproxy_cache_purge中的最后一个参数也要和key的形式保持一致

安装redis连接模块

  1. https://github.com/openresty/redis2-nginx-module/tags下载模块redis2-nginx-module,这里与课程一致下载0.15版本,上传至linux的/opt/nginx目录下

    • 使用命令tar -zxvf redis2-nginx-module-0.15.tar.gz解压压缩包

    • 进入nginx的安装目录,使用命令./configure --prefix=/usr/local/nginx/ -add-module=/opt/nginx/redis2-nginx-module-0.15进行预编译,然后使用命令make

      实际不要直接用这个命令,要根据实际添加的模块来进行自定义该命令,实际我这里使用的是./configure --with-compat --add-dynamic-module=/opt/nginx/ngx_brotli-1.0.0rc --prefix=/usr/local/nginx/ -add-module=/opt/nginx/redis2-nginx-module-0.15 --add-module=/opt/nginx/nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d --add-module=/opt/nginx/ngx_cache_purge-2.3 --with-http_gzip_static_module --with-http_gunzip_module --add-module=/opt/nginx/nginx-http-concat-master

    • 使用命令mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old5将老nginx运行文件备份,在nginx的解压目录的objs目录下使用命令cp objs/nginx /usr/local/nginx/sbin/将编译好的nginx拷贝到nginx的安装目录

 

Docker安装Nginx

  1. 使用命令docker run -p 80:80 --name nginx -d nginx:1.10随便启动一个nginx实例,这一步只是为了复制出nginx的配置

    • 不用单独拉取nginx镜像,docker运行上述命令发现没有对应的镜像会自动先去拉取该镜像

  2. 在目录/malldata下使用命令docker container cp nginx:/etc/nginx .将容器内的配置文件拷贝到当前目录,此时拷贝过来的目录名字就叫nginx/etc/nginx目录实际上就是nginx的conf目录

  3. 依次使用命令docker stop nginxdocker rm 容器id终止容器运行并删除容器实例

  4. malldata目录使用命令mv nginx confnginx目录的名字改为conf,使用命令mkdir nginx在malldata目录下创建nginx目录,使用命令mv conf nginx/将conf目录移动到nginx目录下

  5. 使用命令mkdir /malldata/nginx/logs和命令mkdir /malldata/nginx/html创建静态资源和日志文件对应的挂载目录,使用命令chmod -R 777 /malldata/nginx给予nginx目录可读可写可执行权限

    • 实际上不用执行该命令,执行容器实例带挂载目录的命令也会自动创建对应的挂载目录,这里为了保证万无一失提前创建了

  6. 使用以下命令创建新的nginx容器实例

    • 将nginx上所有的静态资源挂载到/malldata/nginx/html目录下

    • 将nginx上的所有日志文件挂载到/malldata/nginx/logs目录下

    • 将nginx上的所有配置文件挂载到/malldata/nginx/conf目录下

  7. 使用命令docker update --restart=always nginx将容器实例设置为开机随docker自启动

  8. 在nginx的挂载目录html中设置一个首页,通过ip从浏览器进行访问来验证容器实例的运行是否正常

 

 

安装keepalived

编译安装

安装包下载地址:https://www.keepalived.org/download.html#

  1. 解压安装包,在当前目录下使用命令./configure查看安装环境是否完整,如果有如下报错信息需要使用命令yum install openssl-devel安装openssl-devel的依赖

  2. 编译安装以前安装过,后面补充,包括上一条命令添加安装的位置

 

安装步骤

  1. 使用命令yum install -y keepalived安装keepalived

    需要在线监测的所有机器都要安装keepalived

    • 如果安装提示缺少需要:libmysqlclient.so.18()(64bit),依次使用命令wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-community-libs-compat-5.7.25-1.el7.x86_64.rpmrpm -ivh mysql-community-libs-compat-5.7.25-1.el7.x86_64.rpm安装对应的依赖【是否需要注意mysql的版本和本机匹配,我这里匹配了没有问题】,然后再次执行yum install -y keepalived安装keepalived即可

    • keepalived的配置文件在目录/etc/keepalived/keepalived.conf,使用命令vim /etc/keepalived/keepalived.conf修改keepalived的配置文件

      用来做nginx服务器在线监测的keepalived配置

      【默认的keepalived配置文件】

      【做nginx代理服务器的keepalived配置文件】

      【备用机的keepalived配置】

      注意同一组的实例名、virtual_router_id、authentication得是一样的

      注意备机的priority 要设置的比主机小,state需要改成BACKUP

      且备用机使用命令ip addr不会看到虚拟ip的信息

    • 使用命令systemctl start keepalived运行keepalived

安装成功测试

  1. 启动keepalived后使用命令ip addr查询ip信息

    在ens32下在原来真实的ip下会多出来一个inet虚拟ip:192.168.200.200

  2. 在windows命令窗口使用命令ping 192.168.200.200 -t在windows系统ping一下这个虚拟IP,观察该ip是否能ping通

    没有-t只会ping4次,像下图这种情况

  3. 在linux系统下使用命令init 0关掉master机器模拟nginx服务器宕机,在windows命令窗口观察网络通信情况

    windows通信切换时丢包一次,然后再次ping通,在备用机132上使用命令ip addr能够观察到虚拟ip漂移到132机器上

 

安装Tomcat

tomcat的运行需要jdk

安装步骤

  1. 将tomcat的安装包文件拷贝到linux系统下的/opt/tomcat目录下

  2. 使用命令tar zxvf apache-tomcat-9.0.62.tar.gz -C /usr/local/将压缩包解压到/usr/local目录

  3. tomcat的目录结构

    • bin --启动命令目录

    • conf --配置文件目录 *重点

    • lib --库文件目录

    • logs --日志文件目录 *重点

    • temp --临时缓存文件

    • webapps --web应用家目录 *重点

    • work --工作缓存目录

  4. 修改tomcat环境变量

    解压后需要再tomcat中配置jdk的目录,修改tomcat环境变量有三种方法

    • 第一种:定义在全局里;如果装有多个JDK的话,定义全局会冲突,不建议

    • 第二种:写用户家目录下的环境变量文件.bash_profile

    • 第三种:是定义在单个tomcat的启动和关闭程序里,建议使用这种

      把startup.sh和shutdown.sh这两个脚本里的最前面加上下面一段:

      【配置详情】

      classpath是指定你在程序中所使用的类(.class)文件所在的位置

      path是系统用来指定可执行文件的完整路径

      CentOS 7 Tomcat服务的安装与配置

  5. 使用命令/usr/local/tomcat/bin/startup.sh启动tomcat

  6. 使用命令/usr/local/tomcat/bin/shutdown.sh可以关闭tomcat

  7. 使用命令vim /usr/local/tomcat/conf/server.xml更改配置文件的port=80可以将tomcat的端口由8080改为80

  8. 注意这种方式安装的tomcat存在无法关闭的现象

    • 提示信息

    • 目前的解决方式是在bin目录下创建setenv.sh文件,写入以下配置【来自于stackOverflow】

      目前测试能关闭,能起来;使用shutdown.sh进行关闭,网上有执行流程的帖子,虽然使用shutdown.sh关闭,但是实际还是用catalina.sh关闭的帖子,catalina.sh中提示缺少的参数JAVA_OPTS要写在setenv.sh文件中

    • 关闭效果

       

       

安装成功测试

  1. 浏览器输入URL``访问机器上的tomcat,出现如下界面即安装成功

    CentOS 7 Tomcat服务的安装与配置

 

 

 

 

安装Gzip

用来压缩和解压缩文件为后缀.gz的文件

  1. 使用命令yum install gzip安装gzip

 

安装Unzip

用来解压缩文件为后缀.zip的文件

  1. 使用命令yum install -y unzip安装unzip

 

安装Tree

以树形结构查看文件目录结构的

  1. 使用命令yum install -y tree安装tree

 

安装Strace

追踪进程在干什么

  1. 使用命令yum install -y strace安装strace

 

安装Redis

Redis比memcache的流行程度更高,功能强大,性能不低,非常哇塞的缓存中间件

Nginx可以通过插件化的第三方模块redis2-nginx-module去连接Redis,redis2-nginx-module【这里的redis的2指的是协议2.0,不是版本2.0】是一个支持 Redis 2.0 协议的 Nginx upstream 模块,它可以让 Nginx 以非阻塞方式直接访问远方的 Redis 服务,同时支持 TCP 协议和 Unix Domain Socket 模式,并且可以启用强大的 Redis 连接池功能。

  1. 使用命令yum install epel-release更新yum源

    关于源的这部分基本都没讲过,以后自己研究

  2. 使用命令yum install -y redis安装redis

    yum安装的坏处是软件的版本可能比较老,只是安装比较方便,但是redis的协议没怎么变化,不影响使用效果

 

安装ElasticSearch

安装步骤

  1. 从地址https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-8-0选中LINUX_X86_64 sha下载指定版本的Linux版本的ES压缩包elasticsearch-7.8.0-linux-x86_64.tar.gz并上传至Linux系统

  2. 在上传目录使用命令tar -zxvf elasticsearch-7.8.0-linux-x86_64.tar.gz解压缩压缩包,解压后的名字较长,使用命令mv elasticsearch-7.8.0 es-7.8.0将ES的名字修改为es-7.8.0

  3. 使用root用户创建新用户来使用es

    • 出于安全问题,ES不允许root用户直接运行,需要在root用户中创建新的用户

    • 使用命令useradd es为linux系统创建es用户

    • 使用命令passwd es在弹窗界面为es用户设置密码

    • 如果用户创建错误可以使用命令userdel -r es删除用户es

    • 使用命令chown -R es:es /opt/elasticsearch/es-7.8.0设置es用户为es解压文件的所有者

  4. 修改根目录下的配置文件/config/elasticsearch.yml,添加以下配置

  5. 修改Linux系统配置文件

    ES生成的数据和文件比较多,生成文件时使用系统默认配置可能会出一些问题,需要对系统的配置进行修改

    • 使用vim /etc/security/limits.conf修改文件/etc/security/limits.conf,在文件末尾添加每个进程可以打开的文件数的限制的以下配置

    • 使用命令vim /etc/security/limits.d/20-nproc.conf修改系统配置文件,在文件末尾添加以下配置

    • 使用命令vim /etc/sysctl.conf在文件末尾追加配置一个进程可以拥有的虚拟内存的数量

    • 使用命令sysctl -p重新加载系统配置

  6. 启动ES

    • 不能直接进入es根目录使用命令bin/elasticsearch运行程序,会直接报错,因为不允许使用root用户运行程序,要使用命令su es将当前系统用户切换成es【或者自定义用户】再使用命令bin/elasticsearch来运行程序,此时如果之前没有设置chown -R es:es /opt/elasticsearch/es-7.8.0用户权限,此时启动创建文件会出现问题

安装成功测试

  1. 正常启动的效果和windows是一样的,只要出现控制台日志[2024-04-13T17:59:19,809][INFO ][o.e.n.Node] [node-1] node name [node-1], node ID [7aDVXWxuRMirgLOTBBgUPw], cluster name [my-application]没有报错就是正常启动了,更准确的测试是像服务器发送请求http://192.168.200.136:9200/_cluster/health查询节点状态并响应如下内容

    注意这一步发送请求需要关闭防火墙或者放开对应的端口

 

集群部署

  1. 从地址https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-8-0选中LINUX_X86_64 sha下载指定版本的Linux版本的ES压缩包elasticsearch-7.8.0-linux-x86_64.tar.gz并上传至Linux系统

  2. 在上传目录使用命令tar -zxvf elasticsearch-7.8.0-linux-x86_64.tar.gz解压缩压缩包,解压后的名字较长,使用命令mv elasticsearch-7.8.0 es-7.8.0-cluster将ES的名字修改为es-7.8.0-cluster

  3. 在虚拟机ip分别为131和135的机器上再重复解压安装一遍,实际上可以使用命令进行其他机器的文件分发,这个在尚硅谷的Hadoop课程中有讲文件分发,后续补充,这里先试用手动解压的方式安装

  4. 为所有es创建操作用户,赋予操作用户对应文件目录的权限,自定义三台主机的主机名

    自定义主机名的方法见本文档命令大全中系统操作中的主机名,三台机器136、131、135对应的主机名分别为elasticsearch1、nginx1和elasticsearch3

  5. 修改136机器上的配置文件/opt/elasticsearch/es-7.8.0-cluster/config/elasticsearch.yml

    • 136的配置文件

      初始默认配置文件全是注释,直接在文件末尾添加以下配置即可

    • 131的配置文件

      相比于136只是修改了节点名称和主机名称

    • 135的配置

      同样相比于136只是修改了节点名称和主机名称

  6. 每台主机都修改对应的系统配置文件

    ES生成的数据和文件比较多,生成文件时使用系统默认配置可能会出一些问题,需要对系统的配置进行修改

    • 使用vim /etc/security/limits.conf修改文件/etc/security/limits.conf,在文件末尾添加每个进程可以打开的文件数的限制的以下配置

    • 使用命令vim /etc/security/limits.d/20-nproc.conf修改系统配置文件,在文件末尾添加以下配置

    • 使用命令vim /etc/sysctl.conf在文件末尾追加配置一个进程可以拥有的虚拟内存的数量

    • 使用命令sysctl -p重新加载系统配置

  7. 修改每个节点所在主机的/etc/hosts文件

    这个必须把集群节点所在的所有主机名和ip的映射关系在每一台主机上都要全部写上,如果不写当前主机和对应的ip映射关系,ES节点中network.host写当前主机的主机名非master的ES节点会直接启动报错,提示以下信息【以前的其他软件集群部署都是在所有节点主机的/etc/hosts文件中写上包括本机在内的完整的节点映射信息】

    • /etc/hosts文件示例

      即每个节点所在主机的hosts中都要配置完整集群节点的主机名IP映射,如果当前主机没有配置,非masterES中的network.host使用当前主机的主机名会直接导致ES启动报错,此时把network.host配置成0.0.0.0能够正常启动,但是不建议这么做,此外一定不能在/etc/hosts中将主机名配置成127.0.0.1的映射关系,会直接导致包括master节点在内的ES服务器无法被访问【连HTTP端口也无法访问】

  8. 切换成对应机器分别切到操作用户按顺序启动三个节点,使用PostMan发送请求http://192.168.200.136:9200/_cat/nodes【GET】查看节点所在集群的所有节点信息

    • 当只有136节点启动时的响应结果

    • 当136和131都启动时的响应结果

    • 当136、131和135都启动时的响应结果

       

Docker安装ES

  1. 使用命令sudo docker pull elasticsearch:7.4.2拉取ES的Docker镜像

  2. 创建ElasticSearch实例

    • 使用命令mkdir -p /malldata/elasticsearch/config创建ES实例的配置挂载目录

    • 使用命令mkdir -p /malldata/elasticsearch/data创建ES数据的挂载目录

    • 使用命令mkdir -p /malldata/elasticsearch/plugins创建ES插件的挂载目录,可以放ik分词器或者npl相关的插件

    • 使用命令echo "http.host: 0.0.0.0" >> /malldata/elasticsearch/config/elasticsearch.yml向配置文件elasticsearch.yml中写入配置http.host: 0.0.0.0,该配置表示ES可以被远程的任何机器进行访问

    • 使用命令chmod -R 777 /malldata/elasticsearch/来设置容器实例【设置任何用户或者任何组都可读可写可执行】对挂载目录的相应可读可写可执行权限【这里教学图方便用的777】,如果没有该设置,容器实例会运行失败

    • 使用以下命令创建并运行docker实例

      • 创建一个名为elasticsearch:7.4.2的ES实例,分别指定HTTP通信端口和内部节点通信端口分别为9200和9300

      • \表示当前命令要换行到下一行了

      • -e "discovery.type=single-node"表示当前实例以单节点的方式运行

      • -e ES_JAVA_OPTS="-Xms64m -Xmx512m"设置ES的JVM内存占用,这个非常重要,因为ES的默认JVM内存配置为1G,但是我们的虚拟机内存总共就只有1G,不将该配置减小,ES一启动就会将虚拟机卡死,实际生产环境ES服务器的内存占用单节点一般都是32G左右

      • -v /malldata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml将容器实例中的配置文件elasticsearch.yml和挂载到自定义挂载目录中的配置文件

      • -v /malldata/elasticsearch/data:/usr/share/elasticsearch/data将ES的数据目录挂载到自定义挂载目录中的data目录

      • -v /malldata/elasticsearch/plugins:/usr/share/elasticsearch/plugins将ES的插件目录挂载到自定义的插件目录来方便直接在容器外挂载目录

      • -d elasticsearch:7.4.2是指定要运行的镜像并以后台运行的方式启动,

      • 注意原版文档的启动命令没有在容器数据卷后添加--privileged=true,能正常启动,但是无法正常通过浏览器访问,需要在挂载的容器数据卷后面添加--privileged=true启动后才能正常访问,原因还是Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied,解决办法:在挂载目录后多加一个--privileged=true参数即可,猜测是因为容器没有读取到挂载目录的配置文件配置http.host: 0.0.0.0,所以无法被访问【Docker的ES配置和windows以及linux上的配置不同,其他两个上即使没有http.host: 0.0.0.0浏览器和其他工具也照样能访问,而且单机情况下的配置Docker明显更简单】

    • 通过浏览器访问http://192.168.56.10:9200看到如下信息说明安装成功

       

  3. ES容器实例安装ik分词器

    • 使用命令docker exec -it 容器id /bin/bash进入容器的控制台,使用命令pwd能看见当前路径,默认路径就在/usr/share/elasticsearch目录下,该目录就是ElasticSearch的根目录

    • 使用命令cd plugins进入ES容器的plugins目录,使用命令wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip获取ik分词器的压缩文件,plugins目录由于已经挂载到malldata目录,也可以直接在malldata目录进行操作

      • 注意,基础的容器实例不包含wget命令,无法在容器中使用wget,所以还是在挂载目录使用wget下载和操作对应的插件比较好

      • virtual box安装的CentOS也是没有wget和unzip的,需要先试用命令yum install wgetyum install unzip安装wget和unzip

    • 使用命令unzip elasticsearch-analysis-ik-7.4.2.zip -d ik解压缩ik分词器的压缩文件

    • 使用命令rm -rf *.zip删除ik分词器的压缩文件

    • 进入/bin目录,其中有一个命令elasticsearch plugin list:列出当前系统安装的插件,观察是否有ik分词器

    • 退出容器,使用命令docker restart elasticsearch重启容器实例

 

安装Kibana



Docker安装

  1. Docker安装Kibana7.4.2

    • 使用命令sudo docker pull kibana:7.4.2拉取kibana镜像

    • 使用命令sudo docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.56.10:9200 -p 5601:5601 \ -d kibana:7.4.2来运行kibana实例

      • ELASTICSEARCH_HOSTS=http://192.168.56.10:9200是指定kibana要链接ES服务器的地址

      • -p 5601:5601是指定kibana的HTTP访问地址

 

命令大全

man命令能查看常用的linux命令

yum操作

更新linux的yum源

  1. 使用命令mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup备份原yum源

  2. 使用命令curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo配置使用新yum源

  3. 使用命令yum makecache生成缓存

 

 

系统操作

  1. uname -a查看当前系统的版本

  2. uname -r查看当前系统的linux内核版本,系统类型

  3. reboot重启linux系统

  4. 使用top命令能查看系统CPU和内存的消耗情况

  5. 使用命令free -h也能查看当前CPU和内存的消耗情况

  6. cat /etc/redhat-release查看当前系统的发行版版本

  7. 使用命令df -h能查看linux上磁盘空间使用情况

  8. su root将当前用户切换为root用户

  9. whoami可以查看当前用户的用户名

  10. 使用命令free -m可以查看当前系统的内存使用情况

    • available是可用内存

     

     

     

     

远程操作

  1. 使用Xshell对linux进行远程连接

    多台linux虚拟机、多客户端、修改配置文件情况下原版界面不好用

    • 使用命令ip addr查看本机ip【inet】

    • 在Xshell点击新建会话,设置主机名称和远程linux主机地址

 

主机名

  1. 使用命令hostnamehostnamectl可以查看本机主机名

  2. 使用命令vim /etc/hostname修改主机名称,修改后重启系统或者使用命令systemctl restart systemd-hostnamed重新加载主机名

 

文件操作

创建文件

  1. mkdir /usr/local/zookeeper

    • 创建zookeeper目录,该路径可以是相对路径,也可以是绝对路径

  2. echo "www" >> /usr/local/nginx/1

    • 将内容www写入文件/usr/local/nginx/1

移动文件

  1. cp canal.deployer-1.1.4.tar.gz /usr/local/canal/

    • 将当前目录下的文件canal.deployer-1.1.4.tar.gz拷贝一份到/usr/local/canal目录下,如果目标目录下存在同名文件会直接将同名文件内容覆盖

  2. cp ngx_http_brotli_filter_module.so /usr/local/nginx/modules

    modules是一个空目录

    • 将当前目录下的文件ngx_http_brotli_filter_module.so拷贝到nginx目录下并重命名为modules

  3. mv /opt/jdk/jdk1.8.0_261 /usr/local/java/jdk1.8.0_261

    • /opt/jdk/jdk1.8.0_261文件移动到/usr/local/java目录下

      mv /opt/jdk/jdk1.8.0_261 /usr/local/java会直接把文件移至/usr/local目录下并将文件改名为java

  4. mv ./* /opt/nginx/ngx_brotli-1.0.0rc/deps/brotli

    将当前目录下的所有文件移动【不保留】到指定目录/opt/nginx/ngx_brotli-1.0.0rc/deps/brotli

  5. tail -f /usr/local/nginx/logs/access.log

    能在linux客户端实时显示文件内容

文件名更改

  1. mv apache-zookeeper-3.5.7-bin zookeeper-3.5.7

    • 将文件apache-zookeeper-3.5.7-bin改名为zookeeper-3.5.7【名字一般都要带版本号】

     

删除文件

  1. rm -rf conf/

    • 删除conf目录下的所有文件

 

压缩文件

gzip命令是一款强大的文件压缩工具,它可以通过压缩文件的方式显著减小文件大小,常用于文件备份、数据传输和发布软件包

Gzip
  1. 参数列表

    参数参数详情功能
    -c--stdout将压缩数据输出到标准输出,保留原文件
    -d--decompress解压缩文件
    -f--force强制压缩文件,覆盖已有压缩文件
    -r--recursive递归地压缩目录及其内容
    -t--test测试压缩文件是否损坏
    -v--verbose显示压缩进度信息
    -##表示数字#取值范围1-9,默认是6
    -h--help显示帮助信息
    -k 压缩文件后保留原文件
  2. 常用命令示例

    • gzip example.txt

      将当前目录下的example.txt的文本文件压缩成压缩文件example.txt.gz,原始文件example.txt将被删除。

    • gzip -d example.txt.gz

      将压缩文件example.txt.gz解压为example.txt

    • gzip -r my_directory

      递归压缩当前目录下名为my_directory的目录中的所有文件

    • gzip -cd example.txt.gz

      在不解压压缩文件的前提下将压缩文件内容输出到终端

    • gzip -t example.txt.gz

      测试压缩文件是否完整或已经损坏,输出显示"example.txt.gz: OK",则表示文件完整无损。若显示错误消息,则表明文件可能已损坏。

    • gzip -f example.txt

      默认情况下,若压缩文件已经存在,gzip不会对该文件进行覆盖,使用该命令可以强制压缩文件并覆盖已有同名压缩文件

    • gzip -9 example.txt

      调整压缩级别来平衡压缩比和压缩速度。默认压缩级别为6,可以在1到9之间进行调整。较低的级别(例如1)可以更快地完成压缩,但压缩比较低;较高的级别(例如9)会产生更好的压缩比,但速度较慢

    • ls -l | gzip > file_list.gz

      显示当前目录的文件列表,并将列表内容压缩到名为file_list.gz的文件中

    • gzip file1.txt file2.txt file3.txt

      同时压缩file1.txt、file2.txt和file3.txt三个文件:

    • gzip -k example.txt

      压缩example.txt文件并保留原文件

     

 

解压文件

Gunzip
  1. gunzip -r ./

    能够解压当前目录下的所有gzip压缩方式压缩的文件,如果当前目录下有其他格式的文件会自动忽略

 

Unzip


  1. unzip elasticsearch-analysis-ik-7.4.2.zip -d ik

    • 解压文件elasticsearch-analysis-ik-7.4.2.zip到指定目录ik

  2. unzip elasticsearch-analysis-ik-7.4.2.zip

    • 解压文件elasticsearch-analysis-ik-7.4.2.zip到当前目录,当前目录下会出现很多文件

 

Tar
  1. tar zxvf canal.deployer-1.1.4.tar.gz

    • 解压文件canal.deployer-1.1.4.tar.gz到当前目录

  2. tar zxvf canal.deployer-1.1.4.tar.gz -C /usr/local/canal

    • 解压文件canal.deployer-1.1.4.tar.gz到指定目录/usr/local/canal,该目录必须已经存在,且解压到指定目录时不能指定解压文件的名称,需要在解压目录单独更改文件名称

 

查找文件绝对路径

  1. find / -name "hudson.model.UpdateCenter.xml"

    • 查找文件hudson.model.UpdateCenter.xml的绝对路径,如果找到了会返回路径,没找到说明没有该文件

 

查看文件内容

  1. tail -n 20 Dockerfile

    • 查看文件的最后20行

 

目录操作

  1. pwd

    显示当前目录绝对路径

  2. rm -rf brotli-1.0.9

    强制递归删除当前目录下的brotli-1.0.9目录,如果没有任何参数,会提示删除的是一个目录,如果只有递归删除-r会每删除一个文件确认一次删除单个文件,使用-rf就可以直接强制递归删除一个目录

  3. cd

    直接进入家目录

  4. tree /usr/local/nginx/

    以树形图的形式展示一个目录的结构

  5. mkdir -p /usr/local/nginx/ngx_logs

    递归创建子目录/usr/local/nginx/ngx_logs

  6. where is mysql

    查看本机上mysql目录的所有路径

 

 

查找软件安装位置

  1. which jdk

 

进程操作

查看端口

  1. netstat -ntlp

    • 查看所有服务以及端口和进程号,可以使用grep进行过滤

  2. 使用命令netstat -anp | grep 80

    • 查看端口80被占用的服务

  3. 使用命令lsof -i:8080能查看指定的8080端口运行情况

  4. ps -ef

    • 查看所有进程,结合管道命令使用grep过滤掉非指定信息如ps -ef|grep java

  5. ps -Tf -p <PID>

    • 查看指定PID进程的所有线程的信息,显示信息包括进程运行者、PID、进程可执行文件的位置

  6. kill <PID>

    • 杀死指定PID进程

  7. kill -9 <PID>

    • 强制杀死指定PID进程

  8. top

    • 以动态的方式查看当前系统运行的所有进程的进程名、PID和对应的CPU、内存消耗情况

    • Shift+h切换是否显示线程信息

    • 使用快捷键Ctrl+c退出监控窗口

  9. top -H -p <PID>

    • 查看指定PID对应进程和进程中的所有线程信息,也包含每个线程占用的CPU和内存占用情况和线程对应的PID

      • java程序比较常见的有finalizer线程【垃圾回收线程】,C1 CompilerThre、C2 CompilerThre【这两个线程是jdk提供的即时编译器线程】

 

 

防火墙操作

  1. systemctl start firewalld

    • 开启防火墙

  2. systemctl restart firewalld

    • 重启防火墙

  3. firewall-cmd --list-all

    • 查看防火墙已经配置的规则

  4. systemctl stop firewalld

    • 关闭防火墙

  5. systemctl disable firewalld.service

    虚拟机是内网上的机器,外网接不进来,关闭防火墙不一定意味着不安全,当然放行端口80更完美;学习过程不需要开启,生产的时候多数时候也不需要开启,除非机器有外网直接接入,或者公司比较大,要防外边和公司里的程序员,可能开启内部的监控和日志记录,一般中小型公司是不会开内网的防火墙的,因为有硬件防火墙或者云的安全组策略

    • 禁止防火墙开机自启动

  6. service iptables status

    • 这个系统学习一下,体系感觉比较庞大

 

指定端口开启防火墙通讯

生产环境,防火墙打开外部请求数据包不能跟服务器监听端口通讯,需要打开指定的端口

  1. firewall-cmd --permanent --add-port=3306/tcp

    • 开启3306端口端口通讯监听、tcp是协议,可以通过netstat -ntlp查看

  2. firewall-cmd --reload

    • 防火墙重新载入,使端口开放生效

  3. firewall-cmd --query-port=3306/tcp

    • 查询3306端口是否开放

 

指定端口和指定ip访问

  1. firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.44.101" port protocol="tcp" port="8080" accept"

    • 防火墙富规则【富规则可以定义相对复杂的防火墙规则,添加到rich rule分组下,不是简单的开放端口】,开启指定ip:192.168.44.101对本机8080端口的访问,添加该规则到ipv4这个family中

  2. firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.44.101" port port="8080" protocol="tcp" accept"

    • 移除指定ip:192.168.44.101对本机8080端口的访问

     

 

Java操作

查看所有java相关命令

  1. java

    • 能查看java开始的所有相关命令

  2. 查看所有java进程

    • 使用命令jps查看当前电脑上运行的所有Java进程,显示PID和对应的Java程序名

  3. 查看指定PID的Java进程的所有线程状态

    • 使用命令jstack <PID>查看指定PID的Java进程的所有线程状态

      • 缺点是该命令只能抓取Java线程状态快照,不像top命令一样是动态的;优点是抓取的线程信息比较详细

 

 

脚本操作

启动shell脚本

  1. bin/zkServer.sh start

    • 在bin目录上一层启动bin目录下的shell脚本zkServer.sh,可以使用快捷键bin/后连按两次tab

  2. ./zkServer.sh start

    • 当前目录下启动shell脚本需要加上./

 

网络操作

常见公网DNS服务器

  1. 阿里

    • 223.5.5.5

    • 223.6.6.6

  2. 腾讯

    • 119.29.29.29

    • 182.254.118.118

  3. 百度

    • 180.76.76.76

  4. 114DNS

    • 114.114.114.114

    • 114.114.115.115

  5. 谷歌

    • 8.8.8.8

    • 8.8.4.4

 

查看windows本地IP

查看Linux本地IP

修改linux的ip地址

生产环境不要随便更改ip地址,可能导致当前服务占用其他服务的ip导致其他服务无法使用

  1. 使用命令ipconfigip addr查看当前系统的ip

  2. 使用命令vim /etc/sysconfig/network-scripts/ifcfg-ens32修改其中的IPADDR为目标IP

    迷你版没有vim使用命令vi /etc/sysconfig/network-scripts/ifcfg-ens32修改其中的IPADDR为目标IP,开始无法联网下载vim

    ifcfg-ens32对应ip addr中的ens32,该目录下还有一个ifcfg-lo【lo是local的意思】,正好对应ip addr中的lo

  3. 修改ifcfg-ens32

    只需要关注以下三个参数,属性名都是区分大小写的

    • BOOTPROTO:默认值是dhcp,意思是系统启动的时候会自动帮用户找一个ip,自定义IP必须将该属性值改为static,可以不加双引号

    【以下为自定义IP才需要设置】

    • IPADDR:自定义固定ip需要对该属性值进行配置,IP地址可以配置多个,使用dhcp策略可以不设置

    • ONBOOT:意思是系统启动时是否启动网卡,默认是no,设置为yes下次启动就会自动启动网卡,不启动网卡会导致网络无法使用

    • NETMASK:意思是子网掩码,设置固定地址需要设置该属性值为255.255.255.0

    • GATEWAY:意思是网关,设置固定地址需要设置该属性值,通常来说网关设置成IPADDR相同网段,即前三位不变,最后一位设置成1【这里的示例是2】

      【虚拟网络编辑器】

      两个选项卡对应两种虚拟网卡,分别对应两种接入互联网的模式,NAT模式对应VMnet8,点击VMnet8选项卡,下方子网IP会显示当前网段,更改这个网段可以更改虚拟机的网段

      • 点击更改设置可以更改网段和网关,在弹窗选中VMnet8选项卡,点击NAT设置,可以修改网关地址,这个网关地址必须和ifcfg-ens32文件中的GATEWAY的地址保持一致

      • 在windows的网络和共享中心菜单中,WLAN是无线网卡,还有VMnet1和VMnet8两个网卡,点开两个网卡点击详细信息,IPV4地址就是当前网卡地址,这个地址就是网关,虚拟机会通过该地址转发网络数据包,IPv4 WINS服务器的ip地址也可以作为网关【网关可以有两个】,设置NAT模式的虚拟机的网关地址必须和这个VMnet8选项卡下的windows网关中的一个相同才能正常联网

      【windows的网关地址】

      这里的网关地址决定了NAT模式的虚拟机的网关可以为192.168.44.1192.168.44.2

    • DNS1:DNS服务器,DNS服务器可以配置多个,可以直接设置成8.8.8.8

      DNS1最好直接设置成8.8.8.8,避免Docker拉取镜像的时候报错

  4. 使用命令systemctl restart network重启网络服务

  5. 使用命令ping www.baidu.com测试网络是否连通

    也可以ping DNS服务器地址来检查网络是否通畅

 

服务操作

  1. 使用命令systemctl status firewalld查看防火墙状态

  2. 使用命令systemctl stop firewalld关闭防火墙

  3. 使用命令systemctl disable firewalld.service可以设置防火墙下次开机也不会自动启动

 

 

目录结构

  1. var

    • 目录作用:

 

 

 

快捷键大全

系统快捷键

  1. crtl+c结束未完成的指令

  2. vmware选中虚拟机使用快捷键ctrl+e按一下就快速关机

 

应用操作指南


Vim快捷键

  1. u 撤销上一步的操作

  2. Ctrl+r 恢复上一步被撤销的操作

Vim设置

  1. 突破Vim粘贴50行限制

    类unix系统,Vim粘贴不能超过超过50行,以下是修改方法

    • 在当前用户主目录~编辑.vimrc,没有则新建

普通模式

  1. 快捷键

    区分大小写

    快捷键效果
    gg光标定位到文件首行
    V进入可视模式
    G跳转到文件末尾行
    y复制到0号寄存器,即系统粘贴板
    p系统粘贴板内容粘贴到文本
    o进入编辑模式且光标立即置于下一行首位
    dd删除当前行
      
      
      
      
      
      
      
      
      
      
      
      
  2. 快捷键组合

    • 文件内容全选复制

      键盘按 ggVGy,按键区分大小写,复制内容使用p按键粘贴到文本,如果vim没有设置默认情况下最多只能粘贴50行

    • 多行删除

      💡删除第7-19行

      命令行模式下7,19d【起始行在前,末尾行在后,中间用逗号隔开,d表示执行删除命令】

      💡删除文件所有内容

      在终断使用命令echo '' > vim_test,将空字符串重定向到vim_test文件中

       

 

命令行模式

  1. 使用命令set nu开启行号

  2. 使用命令qa!是放弃更改强制退出vim界面

 

tree命令

tree需要安装应用tree来使用

Curl命令

  1. curl -H 'accept-encoding:br' -I http://192.168.200.131

    -H表示向请求头中添加信息,-I表示请求URL

 

Docker命令

镜像命令

  1. docker images

    列出本地主机上的所有镜像

    第一行是表头:REPOSITORY是镜像名【课堂说是镜像的仓库源,但是这里不是镜像的名字吗,因为一个名字是一个镜像源,里面有不同版本的镜像】;TAG是镜像的标签,即版本号【运行镜像不指定版本号就默认使用的最近latest版本,一般用REPOSITORY:TAG来指定对应版本的镜像】;IMAGE ID是镜像ID【镜像ID就像数据库主键】;CREATED是镜像的创建时间;SIZE是镜像文件的大小

    【参数说明】

    • -p:只显示镜像ID

    • -a::列出本地所有的镜像(含历史映像层)

  2. docker search hello-world

    搜索远程仓库是否包含指定的镜像,类似rancher/hello-world这种是某个组织和个人提交的,一般选择拉取第一个官方认证的

    DESCRIPTION是镜像描述,STARS是点赞数,OFFICIAL是官方认证,AUTOMATED是是否是自动构建编译的

    【参数说明】

    • --limit:只列出N个镜像,默认是25个

      • 用法:docker search --limit 5 redis

  3. docker pull 镜像名字[:TAG]

    下载指定版本的镜像,不写:TAG会自动默认拉取latest版本

  4. docker system df

    查看镜像/容器/数据卷所占的空间

    TYPE是数据卷分类;TOTAL是文件个数;SIZE是以使用大小;

  5. docker rmi 某个XXX镜像名字ID

    根据镜像ID删除本地的镜像,rmi是remove image的意思

    【参数说明】

    • -f:强制删除

      使用镜像生成过容器实例的镜像必须强制删除才能删除

      • 用法:docker rmi -f d2c94e258dcb

        发现ID实际上取的是sha256的前几位作为ID的

    • docker rmi -f 镜像名1:TAG 镜像名2:TAG

      强制删除多个镜像

    • docker rmi -f $(docker images -qa)

      强制删除全部的镜像,docker images -qa是获取所有镜像的ID

 

容器命令

  1. docker container cp nginx:/etc/nginx .

    • 在目录/malldata下使用命令docker container cp nginx:/etc/nginx .将容器内的配置文件拷贝到当前目录/malldata,这种方式可以实现在最外层的linux系统上将容器内部的文件拷贝到当前的linux系统宿主机上

  2. docker update --restart=always 3133

    • 设置容器实例id为3133dc7bb77a的容器设置为随docker自启动

  3. docker update --restart=no 3111

    • 设置容器实例id为3133dc7bb77a的容器设置为docker启动容器实例不自启动

 

 

常见问题

  1. Docker拉取镜像报错

    【报错信息】

    • 补充说明:第一天是正常的,第二天拉取镜像连续报以下错误

    【原因分析】

    • /etc/sysconfig/network-scripts/ifcfg-ens32文件中的DNS服务器配置的是DNS1=192.168.200.2,修改该配置为DNS1=8.8.8.8,修改后就能拉取镜像了

    • 使用命令systemctl restart network重新加载网络配置

    • 如果以上方法不行,将/etc/sysconfig/network-scripts/ifcfg-ens32恢复原样,一般我们都直接使用下面的方法直接搞

      不同安装方式可能导致网络的配置文件不同,此时不要直接修改ifcfg-ens32

    • 使用命令vim /etc/resolv.conf修改resolv.conf文件为以下内容

      就是DNS解析出了问题,把DNS解析服务器设置成下列几个服务器就恢复正常了

      • 注意更改完该文件以后不要直接使用命令systemctl restart network重启网络,直接使用docker pull拉取需要的镜像,重启网络或者重启系统都会导致该文件被重新覆写,拉取会再次失败;只有找到方法保证该文件每次网络重启或者系统重新启动不会被自动覆写,才能实现每次拉取镜像都不用修改该文件

      • 补充说明

        • /etc/resolv.conf是DNS客户机的配置文件,用于设置DNS服务器的IP地址及DNS域名,还包含了主机的域名搜索顺序。该文件是由域名解析器(resolver,一个根据主机名解析IP地址的库)使用的配置文件。它的格式比较简单,每行以一个关键字开头,后接一个或多个由空格隔开的参数。

        • resolv.conf的4个主要关键字

          • nameserver:定义DNS服务器的IP地址 ,表示域名解析时使用该地址指定的主机为域名服务器,其中域名服务器是按照文件中出现的顺序来查询的,且只有当第一个nameserver没有反应时才查询下面的nameserver。

          • domain:定义本地域名,声明主机的域名,很多程序会用到,如邮件系统。当为没有域名的主机进行DNS查询时,也要用到。如果没有域名,主机名将被使用,删除所有在第一个点(.)前面的内容

          • search:定义域名的搜索列表,它的多个参数指明域名查询顺序,当要查询没有域名的主机,主机将在由search声明的域中分别查找。注意search和domain不能共存,如果同时存在,后面出现的将会被使用

          • sortlist:对返回的域名进行排序,运行将得到域名结果进行特定的排序。它的参数为网络/掩码对,允许任意的排列顺序。

          • 🔎:注意这里最主要的就是nameserver关键字,如果没有指定nameserver就找不到DNS服务,其它关键字是可选的。

    • 阿里云自2024年7月把非阿里云产品的镜像加速功能给禁掉了,具体通知https://help.aliyun.com/zh/acr/product-overview/product-change-acr-mirror-accelerator-function-adjustment-announcement,拉取报错Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp [2a03:2880:f10f:83:face:b00c:0:25de]:443: connect: network is unreachable,国内厂商太抽象了,在上面更改/etc/resolv.conf的基础上将配置文件vi /etc/docker/daemon.json修改为以下内容,就可以正常拉取了,注意一定要保证/etc/resolv.conf的内容与上面一致,不要使用VirtualBox自动生成的,使用自动生成的也拉取不了

  2. Redis各版本的默认配置文件

    官网全版本配置示例:https://redis.io/docs/management/config/

    • redis6.0.8

容器挂载目录

  1. mysql5.7

    • 完整挂载运行命令

    • 容器内需要挂载目录

      • /etc/mysql:容器内mysql配置文件

      • /var/log/mysql:容器内mysql的日志文件

      • /var/lib/mysql:容器内mysql的数据文件

 

 

附录

  1. Xshell通过查看--撰写--撰写栏可以在Xshell底部调出编撰栏,通过该编撰栏的蓝色图标可以选择同时将指令发到多个客户端