Linux 基本使用和 web 程序部署 ( 8000 字 Linux 入门 )
一:Linux 背景知识
1.1. Linux 是什么
Linux 是一个操作系统. 和 Windows 是 “并列” 的关系,经过这么多年的发展, Linux 已经成为世界第一大操作系统,安卓系统本质上就是 Linux.
1.2 Linux 发行版
Linux 严格意义来说只是一个 “操作系统内核”,一个完整的操作系统 = 操作系统内核 + 配套的应用程序,由于 Linux 是一个完全开源免费的内核, 因此有些公司 / 开源组织又基于 Linux 内核, 提供了不同的配套程序. 这就构成了不同的 “发行版”.
二: Linux 环境搭建
要想学习 Linux , 需要先有一个 Linux 的环境.
2.1 环境搭建方式
环境搭建方式主要有四种:
- 直接安装在物理机上. 但是由于 Linux 桌面使用起来非常不友好. [ 不推荐 ].
- 使用虚拟机软件, 将 Linux 搭建在虚拟机上. 但是由于当前的虚拟机软件 ( 如 VMWare 之类的 ) 存在一些 bug , 会导致环境上出现各种莫名其妙的问题, 比较折腾. [ 非常不推荐 ]
- 使用 WSL ( Windows Subsystem for Linux ). 这个是 Windows 近几年开发的新功能, 在 Windows 系统内集成了一个 Linux. 但是目前这个技术还不够成熟. [ 暂时不推荐 ].
- 使用云服务器, 可以直接在 腾讯云, 阿里云或华为云等服务器厂商处直接购买一个云服务器. [ 强烈推荐 ]
使用云服务器不仅环境搭建简单, 避免折腾, 同时还有一个最大的好处, 部署在云服务器上的项目可以直接被外网访问到, 这个时候就和一个公司发布一个正式的网站没有任何区别. 也就能让我们自己写的程序真的去给别人去使用.
2.2 使用云服务器
以腾讯云为例, 其他的服务器厂商也是类似.
- 进入官方网站 https://cloud.tencent.com/act/campus
- 登陆网站
-
右侧的操作系统选择 CentOS 7.6 64位. 购买时长根据需要选择, 点击立即购买即可. 这个步骤需要实名认证
-
购买完成后, 可以在控制台中找到自己买的服务器. 点进去能够看到服务器的 IP 地址.
蓝色方框为公网 ip 地址, 稍后我们就会使用这个 ip 登陆服务器.
- 设置 root 密码: 勾选服务器, 点击重置密码,root 密码建议设置的稍微复杂一些, 否则容易被黑客入侵.
2.3 使用终端软件连接到 Linux
终端软件是一类工具软件, 可以和远程的主机建立网络连接, 从而对主机进行一些操作,常见的终端软件:
- XShell
- Putty
- MobaXTerm
- Iterm2
- SecureCRT
- …
在此我们通过 XShell 连接 ,首先需要下载安装 XShell
XShell 提供了两种授权方式.
- 企业版: 收费.
- 家庭 / 教育版: 免费.
我们选择 家庭 / 教育 版即可. 下载的时候需要填一下名字和邮箱. 下载链接会被发送到填写的邮箱中.
点击邮箱中的下载链接即可完成下载.
2.4 使用 XShell 登陆主机
在 XShell 终端下输入:
ssh 服务器外网ip地址
ip 为腾讯云后台页面中看到的外网 IP,如果网络畅通, 将会提示输入用户名密码. 输入即可正确登陆,这里的用户名为 root, 密码是在最初购买服务器的时候设置的密码.
关于XShell 下的复制粘贴:
- 复制: ctrl + insert
- 粘贴: shift + insert
ctrl + c / ctrl + v 是不行的.
三: Linux 常用命令
3.1 ls 命令
语法: ls [选项] [目录或文件]
功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。
常用选项:
- -a 列出目录下的所有文件,包括以 . 开头的隐含文件。
- -d 将目录像文件一样显示,而不是显示其下的文件。 如:ls –d 指定目录
- -k 以 k 字节的形式表示文件的大小。ls –alk 指定文件
- -l 列出文件的详细信息。
- -r 对目录反向排序。
- -t 以时间排序。
- -R 列出所有子目录下的文件。( 递归 )
3.2 pwd 命令
语法: pwd
功能:显示用户当前所在的目录
3.3 cd 命令
语法: cd 目录名
功能: 改变工作目录。将当前工作目录改变到指定的目录下.
举例:
cd .. : 返回上级目录
cd ~:进入用户家目
cd -:返回最近访问目录
Linux 目录结构:
几个特殊的目录:
- / 称为根目录
- . 称为当前目录
- … 称为当前目录的上级目录
我们敲的所有的 Linux 命令, 都可以使用 tab 键来尝试补全, 加快效率,如果命令或者目录敲错了, 可以 ctrl + c 取消当前的命令.
3.4 touch 命令
语法: touch [选项]… 文件…
功能: touch 命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的文件。
3.5 cat 命令
语法:cat [选项] [文件]
功能: 查看目标文件的内容
常用选项:
- -n 对输出的所有行编号
3.6 mkdir 命令
语法:mkdir [选项] dirname…
功能:在当前目录下创建一个名为 “dirname”的目录
常用选项:
- -p, --parents 可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多级目录
3.7 rm 命令
语法:rm [-f-i-r-v] [dirName/dir]
功能:删除文件或目录
常用选项:
- -f 即使文件属性为只读(即写保护),亦直接删除
- -i 删除前逐一询问确认
- -r 删除目录及其下所有文件
注意:千万不要运行 rm -rf / , 尤其是在公司的生产服务器上.
3.8 cp 命令
语法:cp [选项] 源文件或目录 目标文件或目录
功能: 复制文件或目录
说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息
常用选项:
- -f 或 --force 强行复制文件或目录, 不论目的文件或目录是否已经存在
- -i 或 --interactive 覆盖文件之前先询问用户
- -r递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态,不属于目录
- 或符号链接,则一律视为普通文件处理
- -R 或 --recursive递归处理,将指定目录下的文件及子目录一并处理
3.9 mv 命令
语法: mv [选项] 源文件或目录 目标文件或目录
功能:
- 视 mv 命令中第二个参数类型的不同( 是目标文件还是目标目录 ),mv 命令将文件重命名或将其移至一个新的目录中。
- 当第二个参数类型是文件时,mv 命令完成文件重命名,此时,源文件只能有一个( 也可以是源目录名 ),它将所给的源文件或目录重命名为给定的目标文件名。
- 当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv 命令将各参数指定的源文件均移至目标目录中。
常用选项
- -f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖
- -i :若目标文件 ( destination ) 已经存在时,就会询问是否覆盖!
3.10 man 命令
Linux的命令有很多参数,我们不可能全记住,我们可以通过查看联机手册获取帮助。
语法: man [选项] 命令
常用选项
- -k 根据关键字搜索联机帮助
- num 只在第num章节找
- man man 能够看到 man 手册中的若干个章节及其含义.
3.11 less 命令
语法: less [参数] 文件
功能:查看文件内容. 不会立刻把所有文件内容加载到内存中. 也能进行查找.
常用选项:
- j k / 方向键: 向上向下滚动屏幕.
- -N 显示每行的行号
- /字符串:向下搜索“字符串”的功能
- n:重复前一个搜索(与 / 或 ? 有关)
- q: 退出
3.12 head 命令
语法:head [参数]… [文件]…
功能:head 用来显示档案的开头至标准输出中,默认head命令打印其相应文件的开头10行。
常用选项:
- -n<行数> 显示的行数
3.13 tail 命令
语法: tail [必要参数] [选择参数] [文件]
功能:用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。
常用选项:
- -f 循环读取
- -n<行数> 显示行数
3.14 data 命令
date 指定格式显示时间: date +“%Y-%m-%d %H:%M:%S”
date 用法:date [OPTION]… [+FORMAT]
在显示方面,使用者可以设定欲显示的格式,格式设定为一个加号后接数个标记
- %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
时间戳:
- 时间->时间戳:date +%s
- 时间戳->时间:date -d@1508749502
Unix时间戳( 英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp )是从1970年1月1日( UTC/GMT的午夜 )开始所经过的秒数,不考虑闰秒。
3.15 vim 命令
- 创建文件 / 打开文件
vim [文件名]
- 进入插入模式
vim 打开文件后默认是普通模式. 普通模式下键盘的按键表示一些特殊功能的快捷键. ( 例如按下 j 并不是输入字母 “j”, 而是表示光标往下移动一行 ). 需要进入插入模式才能进行文本编辑.
使用 i 键可以进入到插入模式. ( 左下角提示 --INSERT-- ) 然后就可以像记事本一样正常编辑了.
- 保存
在插入模式下不能保存文件, 需要先回到普通模式 . 按下 Esc 回到普通模式,在普通模式下输入 :w , 再按下回车, 即可保存文件.
- 退出
在插入模式下不能退出, 需要先回到 普通模式,在普通模式下输入 :q , 再按下回车, 即可退出,也可以直接使用 :wq 同时执行保存和退出.
3.16 grep 命令
语法:grep [参数]… [文件]…
功能:用于查找文件中是否包含指定字符串, 并显示对应的行.
常用选项:
- -n<行数> 显示的行数
- -w 全字匹配. 要求整个单词都完全相同的结果才能匹配出来, 而不仅仅是一个单词的一部分.
- -r 递归查找. 可以搜索多级目录下的所有文件.
- –color 高亮查找到的结果
- –include 指定查找某些文件
- –exclude 指定排除某些文件
3.16 ps 命令
语法:ps [参数]…
功能:用于查看当前系统上运行的进程
常用选项:
- a 显示一个终端的所有进程
- u 以用户为主的格式来显示程序状况
- x 显示所有程序,不以终端机来区分
3.16 netstat 命令
语法:netstat [参数]…
功能:查看系统上的网络状态.
常用选项:
- -a 显示所有正在或不在侦听的套接字
- -n 显示数字形式地址而不是去解析主机、端口或用户名
- -p 显示套接字所属进程的PID和名称
四: Linux 权限
4.1 用户操作
Linux下有两种用户:超级用户(root)、普通用户。
- 超级用户:可以再 linux 系统下做任何事情,不受限制
- 普通用户:在 linux 下做有限的事情。
超级用户的命令提示符是“#”,普通用户的命令提示符是“$”.
root 用户权力比较大, 一旦使用不当可能会造成严重后果,因此我们在公司中不会直接使用 root 用户来操作服务器.
4.1.1 创建用户
命令 useradd [用户名]
功能 创建新的用户
示例:
useradd test
4.1.2 配置密码
命令 passwd [用户名]
功能 设置或修改用户密码
示例
passwd test
注意, 输入密码的时候, 在控制台中不会有提示. 但实际上已经输入进去了.
4.1.3 切换用户
命令:su [用户名]
功能:切换用户。
例如,要从 root 用户切换到普通用户 user,则使用 su user,要从普通用户 user 切换到 root 用户则使用 su root( root 可以省略 ),此时系统会提示输入 root 用户的口令。
4.2 文件类型和访问权限
4.2.1 三种角色
访问一个文件的人可能分成三种类别.
- 文件和文件目录的所有者:u—User
- 文件和文件目录的所有者所在的组的用户:g—Group
- 其它用户:o—Others
命令 ll 显示了一个文件的详细信息. 解读如下图:
- 文件类型
d:文件夹
-:普通文件
l:软链接(类似Windows的快捷方式)
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接口文件
- 基本权限
读(r/4):Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
写(w/2):Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
执行(x/1):execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限“-” 表示不具有该项权限
4.2.2 修改文件权限
功能:设置文件的访问权限
格式: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
五: 搭建 Java 部署环境
5.1 yum
yum ( Yellow dog Updater, Modified ) 是 Linux 下非常常用的一种包管理器. 主要应用在 Fedora, RedHat,Centos 等发行版上,包管理器就好比 “应用商店”, 我们可以在应用商店上下载一些 app.
yum 起到的功能和 Maven 的依赖管理功能类似. 使用 Maven 能帮我们方便的安装一些第三方 jar 包,而 yum 方便我们方便的安装第三方程序
下面认识一些常用的 yum 命令:
- 查看软件包列表
yum list | grep [软件包关键字] # 注意, 最好要加上 grep, 否则罗列的内容会非常多, 导致机器很卡.
- 安装软件包(需要管理员权限
yum install [软件包名字]
- 卸载软件包(需要管理员权限)
yum remove [软件包名字]
注意事项
- yum 所有的命令必须保证网络是联通情况下, 才能使用
- yum install / yum remove 必须具备管理员权限 ( root 用户 ).
- 可以使用 ping www.baidu.com 来检测网络的畅通情况.
5.2 git
- 查看 git 安装包
# 由于带 git 关键字的软件包很多, 可以在 grep 的时候加上 -w , 表示全字匹配.
yum list | grep git -w
- 安装 git
yum install git.x86_64
- git 的基本使用 ( 和 Windows 版本的 git 是一致的. 只是使用命令行操作 )
git clone
git add
git commit
git push
5.3 JDK
yum install java-1.8.0-openjdk.x86_64
可以使用 java -version 验证是否安装成功,如果提示 “java 命令找不到” 则说明安装失败.
5.4 Maven
- 查看 Maven 安装包
yum list | grep maven -w
- 安装 Maven
yum install maven.noarch
- 验证 Maven
mvn -v
# 输出结果
Apache Maven 3.0.5 (Red Hat 3.0.5-17)
Maven home: /usr/share/maven
Java version: 1.8.0_232, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.232.b09-0.el7_7.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-957.5.1.el7.x86_64", arch: "amd64", family:
"unix"
此时说明安装成功.
5.5 Tomcat
由于 yum 源上默认的 Tomcat 7 版本, 比较旧了. 我们目前使用 Tomcat 8, 需要手动安装, 不能使用 yum.
- 下载 Tomcat 压缩包
下载路径可以参考官网
wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-
8/v8.5.47/bin/apache-tomcat-8.5.47.zip -O apache-tomcat-8.5.47.zip
如果上面的地址过期了, 不能下载, 则可以在官网上, 通过右键 zip -> 复制链接地址 获得.
- 解压缩 Tomcat
# 使用 unzip 命令解压缩
unzip apache-tomcat-8.5.47.zip
如果 unzip 命令找不到, 则先 yum install unzip 即可.
- 修改可执行权限
cd apache-tomcat-8.5.47/bin
# 将所有 .sh 后缀的文件加上可执行权限(后面会介绍)
chmod +x *.sh
- 启动 Tomcat
sh bin/startup.sh
- 验证启动成功
# 方法1 查看 tomcat 进程是否存在
ps aux | grep tomcat
# 方法2 查看端口 8080 是否被绑定
netstat -anp | grep 8080
# 方法3 使用 curl 命令访问默认 demo
curl 127.0.0.1:8080
如果进程存在或者端口状态正确 ( LISTEN 状态 ) 或者能够访问到默认主页, 说明启动成功.
- 外网访问 tomcat 默认 demo
在浏览器地址栏中:
http://[服务器外网ip]:8080/
即可看到默认的页面
5.6 MySQL
MySQL 同样也可以使用 yum 安装. 但是要修改一些配置, 稍微复杂一些,可以参考陈沛鑫老师写的一个知乎上的文章
六: 部署 Web 项目到 Linux
工作中涉及到的 “环境”:
- 开发环境: 程序猿写代码用的机器.
- 测试环境: 测试人员测试程序使用的机器. 一般是退役的部署机器.
- 生产环境 ( 线上环境 ): 最终项目发布时所使用的机器. 对稳定性要求很高.
把程序拷贝安装到生产环境上, 这个过程称为 “部署”. 也叫 “上线”,这个过程需要拷贝对应的 .class 文件和依赖的资源文件 ( 各种配置文件, html 等 ),一旦程序部署成功, 那么这个程序就能被外网中千千万万的普通用户访问到,换句话说, 如果程序有 BUG, 这个 BUG 也就被千千万万的用户看到了.
部署过程至关重要, 属于程序开发中最重要的一环. 一旦部署出现问题, 极有可能导致严重的事故,为了防止部署出错, 一般公司内部都有一些自动化部署工具 ( 如 Jenkins 等 ). 当前我们先使用手工部署的方式来完成部署.
6.1 使用 git 传输代码
首先将本地代码上传到 github / 码云上,通过 git 下载代码
# 进入用户家目录
cd ~
# 创建目录保存项目
mkdir project
cd project
# 使用 git 下载代码
git clone [项目链接]
6.2 数据库建表
按照之前的数据库建表脚本, 在服务器上运行, 建立相同的表结构.
mysql -u[数据库用户名] -p[数据库密码] < [数据库脚本].sql
6.3 构建项目并打包
切换到项目的主目录 ( 包含 pom.xml 的目录 ), 使用 mvn 打包项目
mvn package
此时在 target 目录下就会生成对应的 war 包.
6.4 拷贝到 Tomcat 中
将 war 包拷贝到 Tomcat 的 webapps 目录中.
cp [war包名字] [tomcat webapps目录]
稍等片刻, Tomcat 会自动解压缩 war 包, 完成部署,如果该项目之前部署过, 需要先删除之前的包.
6.5 验证
在浏览器上访问项目的链接 ( 按照项目的功能进行验证 ).
- 验证账户注册登录
- 验证展示博客列表
- 验证新增博客
- 验证展示博客内容
- …