📢博客主页:🏀敲代码的布莱恩特🏀
📢欢迎点赞 👍 收藏 ⭐留言 📝 欢迎讨论!👏
📢本文由 【敲代码的布莱恩特】 原创,首发于 CSDN🙉🙉🙉
📢由于博主是在学小白一枚,难免会有错误,有任何问题欢迎评论区留言指出,感激不尽!✨
📖精品专栏(不定时更新)【JavaSE】 【Java数据结构】【LeetCode】
【Linux】Linux基本使用和Web程序部署
Linux背景知识
Linux是什么
Linux 是一个操作系统. 和 Windows 是 “并列” 的关系.
- 1969-1970 年, 贝尔实验室的 Dennis Ritchie 和 Ken Tompson 开发了
Unix
操作系统. - Unix 火了之后, 衍生出很多的分支. 其中有一分支为 “
Minix
”. 由荷兰的Andrew S. Tanenbaum 教授开发. MINIX 含义为 “小型的UNIX”, 源代码开放给大学教学和研究工作. - 1991 年, 还在读大学的 芬兰人 Linus Benedict Torvalds (1969年12月28日出生, 当时 22 岁) 基于Minix 的启发, 开发出了
Linux
的第一个版本.
值的一提的是, Linus 在开发 Linux 的时候, 觉得现有的 版本管理工具 并不太方便. 于是开发了一个新的版本管理工具,也就是现在最广泛使用的 git
Linus 大佬现在 50 多岁了, 但是仍然在互联网上非常活跃. 经常会拍一些视频. 在 油管 或者 B站 上就可以找到.
Linux发行版
Linux 严格意义来说只是一个 “操作系统内核”.
一个完整的操作系统 = 操作系统内核 + 配套的应用程序.
由于 Linux 是一个完全开源免费的内核, 因此有些公司/开源组织又基于 Linux 内核, 提供了不同的配套程序. 这就构成了不同的 “发行版”.
企业中最主要使用的发行版是 RedHat (红帽). 但是 RedHat 是一个收费的系统
因此我们学习使用的是基于红帽系统的的社区免费版本 CentOS
CentOS 和 RedHat 的关系 RedHat一直都提供源代码的发行方式,CentOS就是将RedHat发行的源代码去掉RedHat 的 logo 商标, 重新编译一次.
RedHat对这种发行版的态度是:“我们其实并不反对这种发行版,真正向我们付费的用户,他们
重视的并不是系统本身,而是我们所提供的商业服务。”
所以,CentOS可以得到RedHat的所有功能,甚至是更好的软件。但CentOS并不向用户提供商业 支持,当然也不负上任何商业责任。
关于 Linux 我们学习什么
1) 基础命令
Linux 虽然也有图形化界面, 但是在 服务器 / 嵌入式设备上往往都是通过命令行的方式操作的.
因此学习Linux 命令就是使用 Linux 的重要基础.
2) 系统编程 & 网络编程
Linux 自身提供了一些 API, 供程序猿调用来完成一些更复杂的编程任务(比如文件操作, 多线程编程, socket 编程等). 但是由于 Java 跨平台的特性, 这部分功能已经被 Java 自身封装好了 (流对象, Thread 对象, Socket 对象等). 所以这部分内容我们不必再学习了.
3) 部署 JavaWeb 项目
我们自己写的 web 程序, 要想让其他的用户能够访问, 就需要发布到服务器上. 这是我们接下里重点学习的内容.
一句话:对于 Java 程序猿, 关于 Linux 重点学习 基础命令 和 项目部署 即可.
Linux环境搭建
环境搭建方式
主要四种方式:
- 直接安装在物理机上. 但是由于 Linux 桌面使用起来非常不友好. [不推荐].
- 使用虚拟机软件, 将 Linux 搭建在虚拟机上. 但是由于当前的虚拟机软件(如 VMWare 之类的)存在一些 bug , 会导致环境上出现各种莫名其妙的问题, 比较折腾. [非常不推荐]
- 使用 WSL (Windows Subsystem for Linux). 这个是 Windows 近几年开发的新功能, 在 Windows 系统内集成了一个 Linux. 但是目前这个技术还不够成熟. [暂时不推荐].
使用云服务器, 可以直接在 腾讯云, 阿里云或华为云 等服务器厂商处直接购买一个云服务器. [墙裂推荐]
使用云服务器不仅环境搭建简单, 避免折腾, 同时还有一个最大的好处, 部署在云服务器上的项目可以直接被外网访问到,
这个时候就和一个公司发布一个正式的网站没有任何区别. 也就能让我们自己写的程序真的去给别人去使用.
使用云服务器
- 购买一个云服务器(或者白嫖一个月)腾讯云官网
https://cloud.tencent.com/act/campus
3. 右侧的操作系统选择 CentOS 7.6 64位
. 购买时长根据需要选择(建议1年), 点击立即购买即可. 这个步骤需要实名认证
-
购买完成后, 可以在控制台中找到自己买的服务器. 点进去能够看到
服务器的 IP 地址
. -
-
设置
root 密码
: 勾选服务器, 点击重置密码
(这个环节可能需要手机短信验证). root 密码建议设置的稍微复杂一些, 否则容易被黑客入侵.
小结:
在这个环节我们最重要的是得到三个信息:
- 服务器的外网 IP
- 服务器的管理员账户 (固定为 root)
- 管理员(root)账户密码(在腾讯云网站上设置的)
这三个信息是我们登陆到 Linux 上的必要条件
.
使用终端软件连接到 Linux
什么是终端软件
终端软件是一类工具软件, 可以和远程的主机建立网络连接, 从而对主机进行一些操作.
常见的终端软件:
- XShell
- Putty
- MobaXTerm
- Iterm2
- SecureCRT
- …
我使用的是 XShell.
下载地址: https://www.netsarang.com/en/free-for-home-school/
使用 XShell 登陆主机
在 XShell 终端下输入
ssh 服务器外网ip地址
如果网络畅通, 将会提示输入用户名密码. 输入即可正确登陆.
备注:
- 这里的用户名为 root, 密码是在最初购买服务器的时候设置的密码.
- 关于XShell 下的复制粘贴
复制: ctrl + insert (有些同学的 insert 需要配合 fn 来按)
粘贴: shift+ insert- ctrl + c / ctrl + v 是不行的.
Linux 常用命令
ls
语法: ls [选项] [目录或文件]
功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。
常用选项:
- -a 列出目录下的所有文件,包括以 . 开头的隐含文件。
- -d 将目录象文件一样显示,而不是显示其下的文件。 如:ls –d 指定目录
- -k 以 k 字节的形式表示文件的大小。ls –alk 指定文件
- -l 列出文件的详细信息。
- -r 对目录反向排序。
- -t 以时间排序。
- -R 列出所有子目录下的文件。(递归)
举例:
ls -l 也可简写成 ll
ls -l
pwd
语法: pwd
功能:显示用户当前所在的目录
举例:
cd
Linux系统中,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件。
语法: cd 目录名
功能: 改变工作目录。将当前工作目录改变到指定的目录下.
举例:
- cd … : 返回上级目录
- cd ~:进入用户家目
- cd -:返回最近访问目录
认识 Linux 目录结构
Linux 是一个树形目录结构.
几个特殊的目录:
- / 称为根目录
- . 称为当前目录
- … 称为当前目录的上级目录
绝对路径 vs 相对路径
形如: /usr/share/tomcat/logs/ 以根目录开头的, 称为绝对路径.
形如: ./logs 以 . 或者 … 开头的, 称为相对路径.
使用 tab 键补全 我们敲的所有的 Linux 命令, 都可以
使用 tab 键来尝试补全
, 加快效率.
使用 ctrl + c 重新输入
如果命令或者目录敲错了, 可以 ctrl + c 取消当前的命令
touch
语法: touch [选项]… 文件…
功能: touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新
建一个不存在的文件。
举例:
cat
语法:cat [选项] [文件]
功能: 查看目标文件的内容
常用选项:
- -n 对输出的所有行编号
举例:
mkdir
语法:mkdir [选项] dirname…
功能:在当前目录下创建一个名为 “dirname”的目录
常用选项:
- -p, --parents 可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多级目录
举例:
mkdir –p test/test1 : 递归建立多个目录
rm
语法:rm [-f-i-r-v] [dirName/dir]
功能:删除文件或目录
常用选项:
- -f 即使文件属性为只读(即写保护),亦直接删除
- -i 删除前逐一询问确认
- -r 删除目录及其下所有文件
举例:
注意事项:
千万不要运行 rm -rf / , 尤其是在公司的生产服务器上.
理解递归删除的过程:先手动创建如下目录结构:
test
├── a
│ ├── a1
│ │ ├── 1.txt
│ │ └── 2.txt
│ └── a2
├── b
│ ├── b1`
│ │ ├── 1.txt
│ │ └── 2.txt
│ └── b2
└── c
使用 rm -ri 命令删除 test, 观察删除的顺序.
cp
语法:cp [选项] 源文件或目录 目标文件或目录
功能: 复制文件或目录
说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息
常用选项:
- -f 或 --force 强行复制文件或目录, 不论目的文件或目录是否已经存在
- -i 或 --interactive 覆盖文件之前先询问用户
- -r递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态,不属于目录或符号链接,则一律视为普通文件处理
- -R 或 --recursive递归处理,将指定目录下的文件及子目录一并处理
举例:
mv
语法: mv [选项] 源文件或目录 目标文件或目录
功能:
- 视mv命令中第二个参数类型的不同(是目标文件还是目标目录),mv命令将文件重命名或将其移至一个新的目录中。
- 当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。
- 当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中。
常用选项:
- -f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖
- -i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
举例:
mv wjq.txt zyq.txt
man
Linux的命令有很多参数,我们不可能全记住,我们可以通过查看联机手册获取帮助。
语法: man [选项] 命令
常用选项
- -k 根据关键字搜索联机帮助
- num 只在第num章节找
- man man 能够看到 man 手册中的若干个章节及其含义.
举例
man -ls
less
语法: less [参数] 文件
功能:查看文件内容. 不会立刻把所有文件内容加载到内存中
. 也能进行查找.
选项:
- j k / 方向键: 向上向下滚动屏幕.
- -N 显示每行的行号
- /字符串:向下搜索“字符串”的功能
- n:重复前一个搜索(与 / 或 ? 有关)
- q: 退出
head
语法:head [参数]… [文件]…
功能:head 用来显示档案的开头至标准输出中,默认head命令打印其相应文件的开头10行
。
选项:
- -n<行数> 显示的行数
tail
语法: tail [必要参数] [选择参数] [文件]
功能:用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。
选项:
- -f 循环读取 (
可以用于实时查看日志,默认最后10行
) - -n<行数> 显示行数
举例:有一个文件共有100行内容,请取出第50行内容
# 方法1
head -n50 test > tmp # 将前50行装入临时文件 tmp
tail -n1 tmp # 得到中间行
# 方法2
head -n50 test | tail -n1
关于重定向
Linux 的很多指令, 如 cat head tail 等都是默认输出到 “标准输出” 中, 也就是显示器上的. 可以通 过 > 这样的符号把本来要输出到标准输出上的内容写到特定文件中. 这样的操作称为 “重定向”. 重定向有三种方式:
- 标准输入重定向(<)
java 先构造一个文件, 里面添加一些内容. cat < test.txt
- 标准输出重定向 (>)
java cat test.txt > test2.txt
- 标准错误重定向 (2>), 注意 2 和 > 之间不能有空格.
# 尝试删除一个不存在的文件 rm aaa > test.txt # 输出结果, 这个提示并没有被重定向到 test.txt 文件中. rm: cannot remove ‘aaa’: No such file or directory # 正确做法 rm aaa 2> test.txt
标准输入, 标准输出, 标准错误 是三个特殊的文件
每个进程在启动的时候都会默认打开. 分别对应到:键盘, 显示器, 显示器这样的设备.
在 Java 中, 分别对应到 System.in , System.out , System.err
关于管道
管道是一种古老的 “进程间通信” 方式. 在 Linux 指令中可以使用 | 作为管道标记.
意思是将前一个指令标准输出的内容, 作为第二个指令的标准输入内容.
date
date 指定格式显示时间: date +“%Y-%m-%d %H:%M:%S”
date 用法:date [OPTION]… [+FORMAT]
1. 在显示方面,使用者可以设定欲显示的格式,格式设定为一个加号后接数个标记
%H : 小时(00…23)
%M : 分钟(00…59)
%S : 秒(00…61)
%X : 相当于 %H:%M:%S
%d : 日 (01…31)
%m : 月份 (01…12)
%Y : 完整年份 (0000…9999)
%F : 相当于 %Y-%m-%d
2. 时间戳
时间->时间戳:date +%s
时间戳->时间:date -d@1508749502
Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp)是从1970年1月1日
(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
vim
vim 是一个知名的文本编辑器. 前面学习的 cat, less, head, tail 等命令只能查看文本, 不能编辑文本
. 使 用 vim 就可以进行编辑了.
vim 就相当于 Windows 的记事本. 只不过功能比记事本强大一些.
- 创建文件 / 打开文件
vim [文件名]
- 进入插入模式
vim 打开文件后默认是普通模式. 普通模式下键盘的按键表示一些特殊功能的快捷键. (例如按下 j 并不是
输入字母 “j”, 而是表示光标往下移动一行). 需要进入插入模式才能进行文本编辑.
使用 i 键可以进入到插入模式
. (左下角提示 --INSERT-- ) 然后就可以像记事本一样正常编辑了.
- 保存
在插入模式下不能保存文件, 需要先回到 普通模式 . 按下 Esc
回到普通模式.
在普通模式下输入 :w
, 再按下回车, 即可保存文件.
- 退出
在插入模式下不能退出, 需要先回到 普通模式.
在普通模式下输入 :q
, 再按下回车, 即可退出.
也可以直接使用 :wq
同时执行保存和退出
(不要忘记引号!!!)
grep
语法:grep [参数]… [文件]…
功能:用于查找文件中是否包含指定字符串, 并显示对应的行.
选项:
- -n<行数> 显示的行数
- -w 全字匹配. 要求整个单词都完全相同的结果才能匹配出来, 而不仅仅是一个单词的一部分.
- -r 递归查找. 可以搜索多级目录下的所有文件.
- –color 高亮查找到的结果
- –include 指定查找某些文件
- –exclude 指定排除某些文件
举例:
grep "hello" Hello.java
ps
语法:ps [参数]…
功能:用于查看当前系统上运行的进程
选项:
- a 显示一个终端的所有进程
- u 以用户为主的格式来显示程序状况
- x 显示所有程序,不以终端机来区分
举例:
ps aux # 显示系统上所有的进程
ps aux | grep "进程名"
ps aux | grep "进程id"
netstat
语法:netstat [参数]…
功能:查看系统上的网络状态.
选项:
- -a 显示所有正在或不在侦听的套接字
- -n 显示数字形式地址而不是去解析主机、端口或用户名
- -p 显示套接字所属进程的PID和名称
举例:
netstat -anp
netstat -anp | grep "进程名"
netstat -anp | grep "端口号"
Linux权限
用户操作
Linux下有两种用户:超级用户(root)、普通用户。
- 超级用户:可以再linux系统下做任何事情,不受限制
- 普通用户:在linux下做有限的事情。
- 超级用户的命令提示符是“
#
”,普通用户的命令提示符是“$
”。
我们的服务器买好了, 默认是 root 用户. 但是 root 用户权力比较大, 一旦使用不当可能会造成严重后果
(例如 rm -rf /). 因此我们真正在公司中不会直接使用 root 用户来操作服务器.
- 创建用户
命令 useradd [用户名]
功能 创建新的用户
示例
useradd test
- 配置密码
命令 passwd [用户名]
功能 设置或修改用户密码
示例
passwd test
注意, 输入密码的时候, 在控制台中不会有提示. 但实际上已经输入进去了.
- 切换用户
命令: su [用户名]
功能: 切换用户。
例如,要从root用户切换到普通用户user,则使用 su user。
su user
要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root用户的
口令。
su root
三种角色
访问一个文件的人可能分成三种类别.
文件和文件目录的所有者:u—User
文件和文件目录的所有者所在的组的用户:g—Group
其它用户:o—Others
文件类型和访问权限
命令 ll 显示了一个文件的详细信息. 解读如下图:
a) 文件类型
- d:文件夹
- -:普通文件
- l:软链接(类似Windows的快捷方式)
- b:块设备文件(例如硬盘、光驱等)
- p:管道文件
- c:字符设备文件(例如屏幕等串口设备)
- s:套接口文件
b) 基本权限
- 读(r/4):Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
- 写(w/2):Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件
的权限 - 执行(x/1):execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
- “-” 表示不具有该项权限
修改文件权限
功能: 设置文件的访问权限
格式: chmod [参数] 权限 文件名
常用选项:
- R -> 递归修改目录文件的权限
- 说明:只有文件的拥有者和root才可以改变文件的权限
chmod命令权限值的格式
① 用户表示符+/-=权限字符
- +:向权限范围增加权限代号所表示的权限
- -:向权限范围取消权限代号所表示的权限
- =:向权限范围赋予权限代号所表示的权限
- 用户符号:
- u:拥有者
- g:拥有者同组用
- o:其它用户
- a:所有用户
实例:
# chmod u+w /home/abc.txt
# chmod o-x /home/abc.txt
# chmod a=x /home/abc.txt
② 三位8进制数字
实例:
# chmod 664 /home/abc.txt
# chmod 640 /home/abc.txt
搭建 Java 部署环境
想要部署一个在公网上能被其他用户访问到的网站,主要需要三个东西
- JDK
- Maven
- Tomcat(在服务器上保持启动状态)
安装方式可以有两种,推荐用宝塔面板一键安装,在此我主要讲下宝塔面板的玩法
1. 认识 yum
yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器. 主要应用在Fedora, RedHat,
Centos等发行版上.
包管理器就好比 “应用商店”, 我们可以在应用商店上下载一些 app.
yum 起到的功能和 Maven 的依赖管理功能类似. 使用 Maven 能帮我们方便的安装一些第三方 jar 包,
而 yum 方便我们方便的安装第三方程序.
类似的, Github 也能起到 “软件仓库” 的效果, 而且确实有些编程语言的包管理工具就是基于
Github (例如 Go 语言). 只不过, Github 不光能用于分发程序, 也能管理源码并进行协同开发, 而
yum 和 maven 都是仅用于分发程序.
查看软件包列表
yum list | grep [软件包关键字] # 注意, 最好要加上 grep, 否则罗列的内容会非常多, 导致机
器很卡.
安装软件包(需要管理员权限)
yum install [软件包名字]
卸载软件包(需要管理员权限)
yum remove [软件包名字]
注意事项
- yum 所有的命令必须保证网络是联通情况下, 才能使用(云服务器一般网络都是良好的).
- yum install / yum remove 必须具备管理员权限(root 用户).
- 可以使用 ping www.baidu.com 来检测网络的畅通情况.
2. 宝塔面板,傻瓜式安装,我奶奶看了都会
-
我们已经买好了一个全新的云服务器,重点来了,保证这是个全新的服务器,不然安装宝塔面板容易出问题
-
打开宝塔官网
https://www.bt.cn/new/download.html
-
下滑找到这个地方
-
输入自己买的服务器的公网ip和密码,可以去云服务器官网的控制台看,上文已经讲过在哪看了,不多赘叙
-
安装很快,安装好之后,打开云服务器终端,输入
bt
,就能看到宝塔面板菜单了 -
输入
bt default
就能看到面板账号密码都重置了
-
然后根据重置后的账号密码,打开外网面板地址,即可登录面板控制页(
如果重置的密码登不上,就bt 5 bt 6 自己改一下,就行了,这应该是个bug,反正我遇到了
)(再有如果无法访问面板,需要去服务器控制台,防火墙,添加安全组给宝塔面板的端口放行,如下图
)
- 进来是这样子
- 直接找到软件商店,把这个java项目管理器给我装上
- 点设置,进去,把Tomcat装上,他这里会自动装对应的JDK版本,很方便,我用的Tomcat8,Java对应版本也是1.8,注意这个端口,默认不是8080,可以手动的改成8080,别问为什么,问就是Tomcat官方就是8080端口,只不过宝塔面板给他改了,所以我们和官方一致,给他改成8080,乖乖的听话
- 然后去验证一下我们的Tomcat是否启动起来了,在浏览器地址栏中
http://[服务器外网ip]:8080/
即可看到这个默认页面(看不到这个默认页面的话请看下一个步骤) 第一次弄的话,现在应该看不到这个默认页面,因为你的云服务器防火墙没给8080这个端口开放,需要到云服务器官网控制台配置一下防火墙安全组
如图配置就行了
3. 代码打包上传
现在Tomcat和Java运行环境都搞定了,最后一步,就是将本地代码打包上传到我们的云服务器上去
-
在pom文件里的build标签下加上一个文件最终名
-
在pom文件最后加上这一句代码
-
双击package,即可完成打包
-
打包完就会生成一个war包
-
右键点击,在文件夹中显示
-
然后将我们的war包,直接拖动上传到,Tomcat目录下的webapps这个目录下,Linux即可自动解压
-
到这一步,就完成我们的部署了,当然,在这个过程中要注意代码中涉及到文件路径的地方,因为我们原本是在本地跑代码,涉及到的文件路径是我们本地电脑的文件目录,但现在是在服务器上跑,所以代码中涉及到文件路径的地方要改成我们服务器上的文件路径,这个很关键,不然代码肯定跑不起来
8.然后在浏览器输入正确的ip地址和资源路径即可访问到我们的页面了http://114.132.210.189:8080/java_doc_searcher/index.html