1. Linux前置知识

1.1. 什么是Linux

Linux 是由林纳斯·托瓦兹(Linus Torvalds)在 1991 年创立并发展至今成为服务器操作系统领域的核心系统。

Linux 与 Windows 一样,是一种操作系统(搞管理的软件),Linux 严格意义来说只是一个 “操作系统内核”;一个完整的操作系统 = 操作系统内核 + 配套的应用程序。

Linux 可以称之为当今第一大操作系统,在桌面端, Linux 大概落后 Windows 20 年左右的水平(相当于windows xp),所以人们日常使用的主要是 Windows;而在服务器端,Linux 基本上吃掉了绝大部分市场份额(Windows 也有 Windows Server);在移动端,Linux 也是大哥大, Android 系统本质上就是个 Linux,IOS 虽然不算是 Linux,但是是表兄弟关系,嵌入式设备(冰箱洗衣机空调路由器…),还得是Linux;Linux 的实际市场份额是更多的。

由于 Linux 是一个完全开源免费的内核,因此有些公司/开源组织又基于 Linux 内核,提供了不同的配套程序,这就构成了不同的 “发行版”,企业中使用最多的发行版是 RedHat(红帽),但是它是付费的,我们可以使用基于红帽系统的的社区免费版本 CentOS。

img

Windows 主要操作都是通过图形化界面,而 Linux 主要是通过命令行操作的,因为 Linux 操作系统的图形化页面不好用且(经常有 bug),使用命令行的形式操作更加高效且稳定资源占用低。

1.2. Linux环境的搭建

想要学习 Linux 就得先有 Linux 环境,Linux的环境搭建有以下方法:

  1. 使用物理机:直接将 Linux 装在电脑上(不要 Windows),如果你真这么搞,我敬你是一条汉子;Linux 桌面使用起来是不太不友好的,一天能崩溃好几次,操作难度也比较大,不推荐。
  2. 使用虚拟机:在你的电脑上装个虚拟机软件(使用软件模拟硬件),此时就能在虚拟机上装系统了,但是目前的虚拟机软件存在一些 bug,会莫名其妙出现一些问题,而且没有外网 IP 推荐。
  3. 使用 WSL:WSL (Windows Subsystem for Linux)是 Windows 近几年开发的新功能,在 Windows 系统内集成了一个 Linux,但是目前这个技术还不够成熟,不能作为生产环境,不推荐。
  4. 使用云服务器:强烈推荐,它会有一个外网 IP,可以将项目部署被外部访问;学生买一个云服务器很便宜,学习阶段,腾讯云、阿里云、华为云这些厂商哪个便宜买哪一个就成。
  5. 实体服务器:这个更香,但是要求比较高,你得有一些基本的服务器维护的技能,是比较麻烦的。

至于云服务器的使用,登录你所买的云服务器官网管理平台,安转系统镜像( CentOS 7),找到服务器的 IP,然后设置一下云服务器的用户名(默认是 root)与密码就可以使用了。

云服务器是不在我们主机上的,这里推荐使用XShell来远程控制云服务器使用 Linux。

下面来介绍 Xshell 的安装与使用
1️⃣第一步,下载,点击下方官网链接,下载免费版的 XShell。
https://www.xshell.com/zh/xshell/

img

img

img

2️⃣第二步,安装,设置路径,一路 next 即可。

3️⃣第三步,使用。

首先,点击新建创建一个会话。
img
输入相关信息和外网 IP,点击链接。
img
输入云服务器账户和密码,账户一般为root,密码就是你自己设的。
img
img
像下面这样就表示登成功了,你就可以操控云服务器的 Linux 系统了。
img

命令提示符:[当前登录的用户名@主机名:当前目录(~表示home目录,是用户存放数据的目录)]#(管理员)/$(普通用户),root 用户的 home 目录就是 /root, 是以 root 身份登录后,默认所在的目录。

比如:

img
命令行操作的好处:

  1. 带宽、系统资源的占用非常低
  2. 适合通过脚本来实现批量的重复的操作

2. Linux常用命令

Linux 中ctrl+c表示取消当行输入,ctrl+insert表示复制,shift+insert表示粘贴,ctrl+l清屏。

man是帮助指令,可以查看 Linux 中的指令帮助,配置文件帮助和编程帮助等信息。

Linux,命令通用格式:

command [-options] [parameter]

command:命令本身。
-options:[可选项]命令的一些选项,可以通过选项来控制命令的行为细节。
parameter:[可选项]命令的参数,多用于命令的指向目标等。

ls

ls:查看当前目录里所包含的文件和目录。

 ls [-a -l -h] [Linux路径]

当我们不使用选项和参数时,直接使用 ls 时,就会以平埔的方式列出当前目录下的内容,蓝色的是目录,白色的是普通文件。

img

-a选项,表示 all,即列出全部文件(包含隐藏的文件/文件夹),这里列出的是/(根目录的文件夹和文件),云服务器的任意一个文件都是从属于/目录的。

img

图中以./..开头的,就是 Linux 系统中隐藏的文件/文件夹。

-l选项,表示以列表的形式展示内容,展示更多信息,可以使用ll来替代ls -l

img

语法中的选项是可以组合使用的,比如 -a -l,下面几种写法效果都是一样的。

ls -l -a
ls -la
ls -al

-h的作用是列出文件的大小 K、M、G,-h 必须搭配 -l 一起使用,因为 -l 才会列出文件大小的属性。

img

-d将目录像文件一样显示,而不是显示其下的文件。

-r对目录反向排序。

-t以时间排序。

-R列出所有子目录下的文件(递归)。

cd pwd

cd:切换目录,cd ./路径可以简写为cd 路径

cd [Linux路径]

cd 无需选项,只有参数,表示切换到指定目录下,如果 cd 不写参数,会直接返回到 home 目录(回程)。

在使用 cd 的时候,切换的路径不一定要逐字母输入,可以使用tab键补全,如果只有一个匹配的选项直接就补全了,如果有多个选项,双击tab可以列出所有匹配结果。

我们敲的所有的 Linux 命令, 都可以使用tab键来尝试补全, 加快效率。

路径可以使用绝对路径(以/开头)和相对路径(使用特殊路径符)。

.    表示当前目录
..   表示上一级目录
~    表示初始目录

pwd:查看当前所在目录的路径。

touch cat more echo mkdir

touch:创建一个空文件。
cat:显示一个文件的内容。

more:显示一个文件的内容,cat 是直接将文件内容全部显示出来,more 支持翻页,如果文件内容过多,可以一页页的展示,查看过程中,按空格翻页,按q退出查看。

touch Linux路径
cat Linux路径
more Linux路径

echo:打印文件名在控制台,也可以用来写文件,比如echo+字符串就是在控制台打印一个字符串,echo 字符串 > 文件名.后缀表示将字符串写入后面的文件中,叫做重定向,每次重定向,会清空文件原有的内容;将>换成>>效果就会有覆盖变为拼接。

mkdir:创建目录。

mkdir [-p] Linux路径

参数是必填的,表示 Linux 路径,即要创建文件的路径,-p可选表示自动创建不存在的父目录,适用于我们创建连续多层级的目录。

vi/vim

vi\vim 是 Linux 最经典的文本编辑器,vim 是 vi 的加强版,兼容 vi 的所有指令,它为了为了追求编辑效率,引入了大量的快捷键,默认情况下,键盘上的按键都是按照快捷键的方式来进行作用的,此时,键盘按键都被赋予了特殊的含义,不再是单纯的输入文本了。

 vim 文件路径

vim 命令默认进入的是普通模式(normal),不能对文件内容进行修改,此时的键盘按键都是快捷键,要编辑文件内容,进入 vim 后需要使用i命令切换到插入模式(insert);

文件内容修改完毕以后,先按esc退出插入模式,回到默认的普通模式,输入:wq保存退出,wwriteqquit:的作用就是切换到底线命令模式。

底线命令模式命令:

命令作用
:wq保存并退出
:q退出
:q!强制退出
:w保存
:set nu显示行号
:set paste设置粘贴

如果 vim 没有正确关闭,在下次启动的时候,就会报错(提示你说上次使用没有正确关闭),此时可以直接按D就是删除未保存的内容,按R就是恢复之前的编辑内容。

rm cp mv

rm: 删除文件/删除目录

rm [-r -f] 参数1 参数2 ... 参数n

rm 文件名:删除文件,会提示是否删除,输入 y 就删除。

rm -r 目录名:递归式删除目录,会提示是否确认删除。
rm -rf 目录名:递归式删除目录,不会提示是否确认删除,直接强制删除目录,rm -rf /表示删除系统上的所有文件,危险操作,慎重使用rm命令,因为如果将rm -rf /路径命令中的路径前面多敲了一个空格,系统会认为要删除/目录和./路径目录,一样会触发删除所有文件的操作。

rm 命令支持通配符*(匹配任何内容,包含空)来做模糊匹配:

  • test*代表匹配任何以 test 开头的内容
  • *test代表匹配任何以 test 结尾的内容
  • *tets*代表匹配任何包含 test的内容

cp:用于复制文件/文件夹

cp [-r] 参数1 参数2

-r用于复制文件夹使用,表示递归,参数 1 表示被复制的文件或文件夹,参数 2 表示要复制去的地方,要注意,拷贝操作,有的时候是比较危险的,如果拷贝的目标文件已经存在,就会发生“覆盖”的情况。

mv:用于移动文件\文件夹,改名(Linux中没有单独的命令重命名)

mv 参数1 参数2

参数 1 表示被移动的文件或文件夹,参数 2 表示要移动的地方;如果参数 2 目标不存在,则将参数 1 则文件/文件夹移动到参数 2 路径的同时改名为参数 2 的文件/文件夹名(一边移动一边改名);如果两个参数都是在同一目录下,这个时候就是单纯的改名作用了;如果参数 1 和参数 2 都是文件,且参数 2 存在的情况下,参数 1 中的内容会覆盖掉参数 2 的内容,相当于将参数的文件删除。

grep ps netstat 管道符

grep:字符串查找,从文件中通过关键字过滤文件行

grep [-n -R] "关键字" 文件路径

选项-n显示匹配结果行的行号,-R表示递归搜索,如果当前目录下还有目录,就会自动进入目录中进行搜索,如果文件路径使用*就表示扫描当前目录下的所有文件。

img

管道符 |:将管道符左边命令的结果,作为右边命令的输入。

img

ps:用于查看当前系统上运行的进程

 ps [-a -u -x]

-a显示一个终端的所有进程,-u以用户为主的格式来显示程序状况,-x显示所有程序,不以终端机来区分。

img

可以结合管道符使用,快速筛选指定项进程状态。

ps aux | grep "关键字"

比如要查看 mysql 进程的 pid。

img

netstat:查看系统上的网络状态

netstat [-a -n -p]

-a显示所有正在或不在侦听的套接字,-n显示数字形式的网络地址而不去解析主机、端口或用户名,-p显示套接字所属进程的 pid 和名称。

img

也可以结合管道符使用。

 netstat -anp | grep "关键字"

比如,想查询 mysql 服务器的端口号。

img

yum相关

tree:查看目录结构,是第三方的 Linux 命令,需要先下载安装,安装命令为yum install tree,其中yum命令是一种“包管理器”相当于“应用商店”。

yum list [条件]:搜索指定条件的资源(指令也算),条件可以没有,相当于手机的应用商店。
yum install [资源名称]:下载指定资源。

Linux权限

r:可读权限
w:可写权限
x:可执行权限

例如:
rx表示可读可写但是不可执行
rw表示可读可执行但是不可写
rwx表示可读可写可执行

可以使用chmod指令进行权限的修改。

chmod [-R] 权限 文件/文件夹

-R表示对文件夹内的全部内容应用同样的操作。

例如,将 test.txt 权限修改为 rwxr-x–x,u 代表 user(文件的拥有者),g 代表 group(同组成员),o 代表 other(其它人)。

chmod u=rwx,g=rx,o=x test.txt

3. 使用Linux部署Servlet项目

我们要部署 Servlet项目,首先我们需要下载 Servlet 项目相关的支持,我们代码是用 Java 写的,所以需要 JDK,我们项目需要实现数据持久化,就需要数据库,我们的项目还需要一个 HTTP 服务器,所以需要 Tomcat。

下面的通过yum完成的操作要保证当前登录使用的用户是 root 用户。

3.1. 安装JDK

可以基于yum来安装即可。
grep可以进行字符串过滤。

查询yum list | grep jdk,查询含有jdk字样的软件包。

img
我们选择 jdk8,64 位的。
img

然后执行安装命令:

yum install java-1.8.0-openjdk-devel.x86_64 //安装

在安装的过程中,有个提示你是否要确认安装,按 y 就行了。

我们这里安装的是 open jdk,与我们在 Windows 上面的 jdk 并不是完全一样的,我们 Windows 上面的 jdk 是 oracle 官方的,而我们使用yum在 Linux 上安装的是开源组织的 jdk,但由于使用的 jvm 是相同的,区别也不是很大。

安装完成后,输入 javac 来判断是否安装成功,如果安装成功,输入javac会有如下的页面。

img

3.2. 安装Tomcat

yum 上安转 Tomcat 是存在问题的,我们使用yum在 Linux 上搜索 Tomcat 会发现版本都比较老了,

img

由于不同版本的 Servlet 代码需要不同版本的 Tomcat,我这里需要的是 8.5 系列版本的 Tomcat,所以需要去其他的地方去下载 Tomcat,直接去官网下载即可。

下载好后就是将 Tomcat 安装包上传到 Linux 上(上传前要保证有 JDK),直接将安装包拖到Xshell上就行,但是它是基于rz命令实现的,但是rz在 Linux 中默认是没有的,需要使用yum进行下载,命令为yum install rzszrz是把文件从 Windows 上传到 Linux,sz是把文件从 Linux 传给 Windows。
img
上传完成后,我们需要进行解压缩,需要使用unzip命令,没有这个命令的话还是需要下载,yum installer unzip

upzip apache-tomcat-8.5.87.zip

在linux中startup.sh文件可以启动Tomcat程序,我们需要给这些启动脚本赋予权限。
bin目录,然后执行chmod +x *.sh即可。

加权限之前:
img
加上权限之后:
img
使用sh startup.sh启动 Tomcat,启动前先检查一下 Tomcat 需要的端口是否空闲(8080,8005)。

img
如何验证 Tomcat 是否工作?

方式1:查 看进程ps aux | grep tomcat
img
方式2:查看端口netstat -anp | grep 8080

img::::/:::*是 ipv6 的写法。

Tomcat 默认端口有 8080,8005 两个端口,再看一下 8005。

img

方式3:访问 Tomcat 的欢迎页面。

还可以是访问公网IP:8080,看有没有 Tomcat 的欢迎页面,但是第一次访问大概率是访问不了了,因为云服务器对大部分端口默认是不支持外部访问的,这样是为了减少黑客的攻击,需要我们去设置一下云服务器的防火墙,设置过程如下:

img

img
按照下图填写即可。
img

点击确定,小等一会儿,就能通过访问8080端口访问 Tomcat 的欢迎页面了。
img

3.3. 通过yum安装MariaDB

MariaDB 语法与 MySQL 是差不多的,它是 MySQL 被 Oracle 收购后,MySQL 创始人又发明了 MariaDB。

🍂安装

安装 mariadb 服务

yum install -y mariadb-server

安装 mariadb 命令行客户端

yum install -y mariadb

安装 mariadb C library

yum install -y mariadb-libs

安装 mariadb 开发包

yum install -y mariadb-devel

🍂启动

启动服务

systemctl start mariadb

设置开机自动启动服务

systemctl enable mariadb

查看服务器状态

systemctl status mariadb

注意到 Active 状态为 active (running**)**

img

🍂测试连接

默认是无密码的,使用命令行客户端尝试连接

mysql -uroot

img

查看mariadb版本号:

select version();

img

创建数据库时为了支持中文,统一使用 utf8mb4 字符集

MariaDB [(none)]> create database demo_db charset utf8mb4;

可以使用 ctrl+d 退出 mysql 客户端。

3.4. 部署Servlet项目

我这里部署的是我写的一个 Servlet 版的博客系统。

1️⃣第一步,在服务器建库建表,找到之前写的sql语句,粘贴到服务器数据库即可。
2️⃣第二步,微调 Java 代码,主要就是 DBUtil 类中的数据源配置信息,主要是要修改为服务器数据库所对应的 url,用户名和密码,我这里的服务器数据库上是没有密码的,因此需要将密码设置为空字符串"",数据库用户名仍然为root,不需要改变,建库建表也是一样的,所以 url 也不用改。
3️⃣第三步,设置打包格式为war包和名称,就是在pom.xml配置文件加上以下格式的语句即可:

<!-- 设置打包方式为war包, 不写默认为jar包-->
<packaging>war</packaging>
<build>
    <!--指定war包名-->
    <finalName>blog_system</finalName>
</build>

4️⃣第四步,打包部署,上传到服务器 Tomcat 的webapps目录中,即将war包拖拽到webapps目录。

此时程序算部署好了,就可以公网使用 IP 来访问进行访问,地址为http://101.42.25.148:8080/blog_system/login.html

img

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐