Linux笔记02—Linux进阶应用

时间:2024-04-16 19:34:43

Linux系统管理命令

使用ifconfig查看网卡ip

 netstat查看网络端口号 

网络协议  接收队列数量  发送队列数量  本地地址  远程地址  网络连接的状态  创建了网络连接的应用的进程编号(唯一标识)/名字

发送队列数量长时间不为0,可能是数据处理不过来网络阻塞了。

netstat -tulpn (推荐)

netstat -ano

netstat常用选项:

查看进程&杀掉进程

 

图中又使用到了|通道,grep 是通过正则表达式对结果进行筛选

5412那一列是pid进程编号 vim test.txt那一列显示启动时使用的命令是什么

有些应用不需要进行网络通信,这时用netstat就无法查到它的pid,要用ps -ef

ps -ef  查看当前系统进程有哪些

kill -9 PID 在内存中将对应pid的进程删除(尽量使用应用程序特有的关闭方式来关闭程序,强制kill可能造成数据丢失等情况)

应用服务化

应用服务化是指让应用程序以服务方式在系统后台运行;

Linux系统对服务化应用进行统一管理;

服务管理命令:

  systemctl

systemctl常用指令

 

例子:将redis服务化,让redis随系统启动

1)查看redis的pid文件名及目录

  里面存放的是redis当前进程的pid,将redis服务化后,要对redis进行开启和关闭时要从这个文件中读取进程编号,再通过kill杀掉redis进程。

2)进入 /usr/lib/systemd/system 目录

  里面有许多.service结尾的文件,是服务描述文件,要将redis服务化,也要在这个目录中创建一个redis的服务描述文件,文件名就是默认的服务名。

  vim打开并编辑redis.service,要注意大小写。

  [Unit]

  description:描述这个服务是干嘛的

  After:在服务启动时,先启动其后的服务,再启动redis服务。大多数情况下都是图中那些

  [Service]用于服务描述

  Type: 服务运行的类型,forking表示后台运行

  PIDFile=pid文件  指向上面介绍的描述进程号的pid文件

  ExecStart=应用服务的完整路径 配置文件  表示服务启动时使用什么命令,服务启动时会调用应用服务启动配置文件

  ExecStop=:表示服务关闭时使用什么命令,利用kill命令对指定进程进行关闭。-s QUIT表示按照正常对流程通知进程关闭,推荐。-9表示强制删除进程,无法正常退出再用。

  PrivateTmp:为每个服务设置私有的tmp临时文件目录

  [Install]安装配置项

  WantedBy:将redis服务分配到multi-user.target服务组上,multi-user.target是系统默认的一个服务组,系统为它分配了一个权限,允许当前服务组中所有的服务可以随系统自动启动,只要把服务分配到这个服务组中,这个服务就会被允许随系统自动启动

    

3)重载redis.service使其生效

还在/usr/lib/systemd/system 目录下执行

systemctl daemon-reload

4)将之前自己启动的redis关闭

5)启动服务 

systemctl start redis

如果没有看到报错,表示服务在后台启动成功

6)查看redis服务启动的状态

systemctl status redis

可以看到active(running) ,表示程序是激活的并且正在运行

process后是当前redis进程号

底下是redis启动日志

7)关闭服务

systemctl stop redis

8)重启服务

 systemctl restart redis

会先关闭当前redis,再重新启动一个新的redis服务

9)让服务随系统启动

systemctl enable redis

软关联:类似windows中的快捷方式

立即重启:shutdown -r now 

这时当前的centos7连接就断开了,我们再手动重新连接上

再查看redis服务状态,发现已经随系统自动启动了

10)让服务不随着系统启动

 systemctl disable redis

在multi-usr服务组 redis的软关联(快捷方式)就被删除了,自然redis服务也不会再随着系统启动了。

11)查看当前系统都有那些服务,服务的状态,这些服务都包含了哪些信息?

systemctl list-unit-files

还可以利用通道和gref命令进行筛选 

Linux用户与权限

1)用户

Linux是多用户多任务系统,包含两个概念:用户和用户组;

用户与账户是同一概念,用于登录系统与区分资源权限;

用户让系统变得更安全,同时也保护了用户的个人数字资产。

2)用户组

用户组就是将用户分组,隶属用户自动拥有组权限;

一个用户可隶属于多个组,用户可任意切换当前组;

用户组的出现让用户权限管理变的更轻松。

3)用户与用户组常用命令

4)项目内部文件权限管理实践

假如一个项目组有三名员工:两个程序猿+一个测试,分别在研发组和测试组

1⃣️创建3个用户,并设置密码(最好8位以上,包含字母数字)

2⃣️创建两个组,将人员分配到各自组中  -g ⚠️注意是小写

3⃣️创建3个centos副本,分别用三个用户登录

查看用户隶属于哪个组,执行命令:

groups

4⃣️root用户为初始的目录进行创建和授权 

假设资源放在共享资源目录 /usr/local/share

创建各组的文件夹

ll可以查看目录的权限

第一个root列表示当前目录是哪个用户创建的(属主,拥有者,用户名) ,第二个root列表示这个目录关联的用户组是哪个

drwxr... 表示权限代码,由10位组成。权限码右边一列的数字表示权限的权重。

文件权限代表码:

红色(1~4位)表示属主的权限

黄色(5~7位)表示与属主相同用户组下的其他用户所拥有的权限 

蓝色(8~10位)表示属主所在用户组以外的其他用户拥有的权限

-表示没有对应属性

调整dev-document目录的权限:

chown 用户:组名 目录名字   更改对应文件/目录的属主或用户组

chmod 权限码 目录  改变对应目录/文件的权限

chmod 750  组用户可读写,其他用户不允许访问;7=4+2+1属主有全部权限,5=4+1所在用户组有读和执行权限,0=其他用户没有任何权限

chmod 777  所有用户拥有完整权限;

chmod 700  只有属主拥有完整权限。

设置其他用户不可访问后,其他组将没有权限查看

在目录上的w写权限,表示对目录名称修改的权限 

属主d1要创建一个文件,允许研发组所有研发人员可见:

以下是默认产生的权限

第一位是d表示是一个文件夹,-表示是文件

修改权限为770,d2也可以进行该文件的操作,但t2没有权限

给一个用户赋予多个用户组 -G ⚠️注意是大写

但对于d1用户来说,如果要是新的用户组权限对他生效,需要将系统断开重新连接

默认左边第一个是当前用户组

切换到新的用户组:

5)sudo超级管理员命令

sudo可以让普通用户拥有超级管理员的执行权限;

普通用户要进行经过超级管理员授权才能使用;

对某一用户进行sudo授权,授权命令:

visudo 查看授权文件

tips:在普通模式下输入100gg 可以快速定位到100行

进入编辑模式,在root下面一行,增加用户d1 以及相关权限信息

第一个ALL表示允许d1用户从哪个客户端上进行远程连接(可修改为主机名,这样就只有主机名一致的电脑才能远程连接d1做sudo管理员的任务)

第二个ALL表示切换用户的意思,可以切换至其他任意用户来执行某个命令

第三个ALL表示利用sudo可以执行哪些超级管理员的命令

:wq保存并退出

格式检查授权文件:

visudo -c

这时d1就有了sudo权限。

可以测试一下,默认情况下,除了系统管理员root是不能够创建其他用户的

很多拥有sudo权限的用户不希望每次使用sudo命令的时候都重新输入密码,这个可以进行配置:

在root用户上对sudo配置进行修改

执行visudo,定位至100行,在第三个ALL前增加NOPASSWD:

保存并退出

格式检查授权文件:

visudo -c

重新连接d1,直接使用sudo命令,就不用再输入密码了 

 

Centos 7 防火墙firewall

防火墙是借助硬件和软件对内外部网络环境对保护措施;(主动防御外部网络的攻击&将服务器内部的网络资源对外暴露时加以控制)

centos7基于firewall实现应用层防火墙,centos6基于iptables实现网络层防火墙;应用层设置可以更细粒度。

firewall-cmd是firewall的核心命令。

对外开放tomcat

在tomcat的bin目录中有一个核心的启动脚本程序文件:startup.sh

启动tomcat:

 

判断tomcat是否启动成功: 

那么在外部就能访问了呢?

回到虚拟机桌面,点击应用程序,打开浏览器,输入访问地址localhost:8080,可以看到在虚拟机内部本机可以正常访问

在我们自己的电脑桌面,远程访问,就无法访问到   

  虚拟机ip地址:8080 

这就是centos7防火墙设置的,默认不对外开放8080端口,只需要让防火墙放行8080端口即可

firewall-cmd

systemctl start|restart firewalld  启动防火墙

firewall0cmd --state|--reload  查看状态,重载防火墙

firewall-cmd --list-ports   查看防火墙放行的端口有哪些

firewall-cmd --zone=public --permanent --add-port=8080/tcp

  zone区域 默认防火墙区域的名字为public

  permanent产生永久变更,不加这一项表示临时更改防火墙策略

  --add-port  添加端口号

  端口号/什么协议下放行

更改好后,要重启防火墙才能生效:

firewall-cmd --reload

此时远程访问就能成功了!

移除掉放行单个端口:

firewall-cmd --zone=public --permanent --remove-port=8080/tcp 

别忘了重载firewall:firewall-cmd --reload

放行一个区域(zone)的所有端口:如放行8000~9000的端口

firewall-cmd --zone=public --permanent --add-port=8000-9000/tcp

别忘了重载firewall:firewall-cmd --reload 

移除一个区域(zone)的所有端口的放行:如移除8000~9000的端口 

firewall-cmd --zone=public --permanent --remove-port=8000-9000/tcp 

Bash Shell

什么是Shell

Shell是一个用c语言编写的脚本解释器,是用户通过代码操作Linux的桥梁(类似windows中解释.bat脚本文件的程序);

Shell脚本描述要执行的任务,完成系列复杂操作,文件通常以.sh后缀;

Shell脚本通过Shell解释器执行,按解释器分类分为多种类型。

Linux中Shell分类

Bourne Shell 最早使用的解释器  

bash  大多数Linux发行版默认的解释器,是bourne shell的升级版

其他的都用的不太多,他们都有自己独立的特性及相关语法,比如bash开发的脚本放到其他shell中可能就无法执行

目前统一用bash

一键发布Tomcat应用程序

新建一个shell文件

  vim deploy_tomcat.sh

编辑脚本:

echo 文本 运行后,屏幕上显示的文字

wget  网址   从指定网址(官网,gz安装包下载,右键复制下载链接)下载文件到当前目录

tar zxf 文件名   解压安装包

firewall-cmd --zone=public --permanent --add-port=8080/tcp    防火墙开放8080端口

firewall-cmd --reload  重载firewall 

cd ./apache-tomcat-9.0.34/bin   进入tomcat的bin目录

./startup.sh   启动tomcat

保存脚本:

:wq!

运行shell脚本:

/bin/bash 脚本名字

因为当前系统默认使用bash,可以简化执行代码如下:

./脚本名

提示权限不够?

ll查看发现

新创建的bash文件,属主只拥有读写的权利,没有执行的权利

需要再设置下权限:

chmod 755 文件名

再重新执行脚本即可:

 

综合训练

Linux部署项目

部署架构

用户通过浏览器访问➡️tomcat web服务器➡️mysql数据服务器

步骤:

需要两台虚拟服务器,分别作为tomcat web服务器和mysql数据服务器

1)mysql数据服务器

 软件选择:最小安装

但这种方式安装,很多常用命令都没有,比如ifconfig

系统安装好后,可以通过yum安装这些常用工具

就可以使用ifconfig了

2)同样的方式安装tomcat web服务器

3)在mysql服务器(centos)上安装mysql8

yum上没有mysql相关组件和应用程序,所以从mysql官网获取

官网中提供了各类仓库源,供我们安装最新版本

找到centos7对应的下载版本,点击download

找到nothanks那句话,点击右键,复制链接地址,使用wget命令进行下载

结果wget命令也不存在。。。

先用yum安装wget

重新下载mysql

使用本地的rpm文件进行应用安装

yum localinstall -y 文件名

看到已安装表示mysql8的安装源准备成功

再用yum search就能看到mysql相关组件了

这时再使用yum安装

  yum install -y mysql-community-server

但是我们在国内通过国外仓库下载可能速度会很慢,如何进行快速安装呢?

先按ctrl + c 停止安装

切换至刚刚yum下载的缓存路径

所有下载的rpm包都在里面,但由于我们刚刚中断了下载,mysql的安装包是不完整的

我们可以自己找到这些rpm文件,替换进来,这样yum在下载时看到有了就不会重复下载了,会直接进行安装

百度搜索:mysql 下载

找到mysql下载的链接,里面有各平台mysql二进制安装文件的下载路径

此时我们选择红帽企业版及对应版本

下方会出现若干备选项

 我们选择最新最完整的版本下载

在nothanks链接右键,下载

我们将这些文件替换到刚刚的缓存目录中即可

先将之前不完整的缓存文件删除,再将这些rpm文件复制进去

  疑问:既然能够下载到这些rpm为啥还要在线安装呢?

  因为除了这些rpm包以外还有许多依赖需要下载,如果直接使用这些rpm文件或使用localinstall的方式安装,就需要手动找到那些依赖找到并安装,非常大工作量且麻烦,所以目前只能用手动下载rpm 再通过yum在线安装的方式 比较妥

重新执行yum安装:

  yum install -y mysql-community-server

这样下载安装就很快了。

看到完毕,表示mysql8已经安装完成了。

启动mysql:

用rpm的方式安装,程序会以服务的形式驻留

可以用systemctl命令启动服务:

  systemctl start mysqld

  如果没有任何报错,表示服务启动成功,默认3306端口,可以用netstat -tulpn查看是否存在

查看服务状态:

  systemctl status mysqld

  

 设置mysql为开机启动:

  systemctl enable mysqld

安装好后,还不能使用,还需要默认密码,远程登录,数据库数据表初始化等的配置。

初始化Mysql 8:

mysql安装过程中会自动将密码保存到日志文件中。

默认情况下最小安装版的Linux不会提供vim指令,只有vi指令,我们可以用vi命令查看密码

  vi /var/log/mysqld.log

  /var/log 这个目录用于保存系统运行过程中的应用程序日志

可以看到mysql为root用户随机生成的一个临时密码,我们直接复制密码,退出vi编辑器

  :q

用root用户登录本机mysql

  mysql -uroot -p

回车后,粘贴上刚刚的密码(屏幕上不会显示)

再回车,进入了mysql

修改密码:

  alter user \'root\'@\'localhost\' identified with mysql_native_password by \'新密码\'

  localhost表示root用户只允许用本机登录 

  新密码要求必须包含英文,数字,特殊符号,长度大于八位,且不能有连续的常见的字符串

  with mysql_native_password 兼容性考虑,mysql8对于密码进行存储时默认采用的是sha256的方式进行加密存储,早期mysql5以前的版本使用的是mysql本地密码表的方式,两者是有区别的,如果客户端使用的是navicat,没有进行及时更新,可能导致新版mysql8不兼容的情况,无法登录;增加这个参数可以让mysql8和navicat更好地兼容。

  回车,密码即变更。 

现在默认的root用户只能从本机登录,我们刚开始部署数据库时,往往需要远程连接,如何设置root可以在远程访问?

  use mysql 切换到mysql数据库

  select host,user from user; 查看主机和用户表,host表示当前用于允许在哪些计算机上登录

  update user set host=\'%\' where user = \'root\';    将host值改为%,代表任意设备都可以使用root用户来远程连接到mysql服务器。

  回车,更改成功!  

  

但如果想让root用户但权限生效还需运行一条指令,让刚刚修改的权限立即生效:

   flush privileges;

退出mysql:

  exit

放行防火墙3306端口:

  firewall-cmd --zone=public --permanent --add-port=3306/tcp

重启防火墙:

  firewall-cmd --reload

这样就可以从外部访问mysql服务器了。

使用navicat连接mysql数据库:

创建数据库,导入数据:

在当前连接创建一个新的数据库

在新数据库右键,执行sql文件

 选择sql文件,点击开始,即可将数据导入。

4)tomcat web应用服务器部署

进入tomcat服务器。

1⃣️安装jdk

tomcat是依赖java运行的,所以需要在当前系统中安装jdk或jre

可以安装开源的openjdk或标准的sun公司jdk,基本一致

文件名后的.x86_64可以省略

等待下载和安装所有的依赖。

查看java的版本和安装位置

2⃣️安装tomcat

tar zxf apache-tomcat-9.0.34.tar.gz

3⃣️应用程序部署

准备好打包好的程序war包,解压

移动这个解压好的目录到tomcat9的web-apps下

这个应用是要连接到数据库的,之前开发时默认连接的是本地的数据库,需要远程连接mybatis对数据库连接进行配置:

安装vim的公共基础包和增强包:

  yum install vim-common

  yum install vim-enhanced  (vim命令包含在这里)

vim打开配置文件:

/root  进行全文查找

修改连接属性:

 

配置tomcat运行参数:

两部分:

修改server.xml修改端口号,以及将我们的应用设置为默认的context上下文,映射到上下文路径,指向默认的根路径

/8080 搜索8080

修改配置,改为过端口80对外暴露应用

按键盘pagedown找到文件末尾,在host标签结尾前增加context标签:

启动tomcat:

将防火墙80端口放行,重启防火墙:

此时可以成功访问项目登录页:

如果能登录成功,进入系统,说明底层数据库也连接成功。

风险:任何一个主机都可以通过网络连接我们的数据库,很危险。

解决方式:对指定ip的指定端口进行放行

进入mysql服务器,关闭防火墙对3306端口对放行

更改端口放行规则:

rich-rule规则表达式,图中的意思是图上的ip向本机3306端口发送的数据包给予放行。

此时其他ip已经无法远程连接我们的数据库。

重启tomcat,应用也能正常登录访问,并没有影响web应用服务器和数据库服务器之间的通讯。