赞
踩
Linux 基本使用和 web 程序部署
Linux 背景知识
Linux 是什么
Linux 是一个操作系统. 和 Windows 是 “并列” 的关系.
Unix & Linux 发展历程图
这俩大佬本来是想开发一个操作系统, 但是开发着开发着, 发现现有的编程语言不太好使, 于是俩人 一合计, 先整个编程语言出来吧. 于是C 语言 就诞生了.
Dennis Ritchie 大佬 2011 年就去天堂写代码了. Ken Tompson 大佬后来在 google, 又参与发明 了 Go语言.
Minix 的启发, 开发出了 Linux 的第一个版本.
值的一提的是, Linus 在开发 Linux 的时候, 觉得现有的 版本管理工具 并不太方便. 于是开发了一 个新的版本管理工具.也就是现在最广泛使用的 git .
Linus 大佬现在 50 多岁了, 但是仍然在互联网上非常活跃. 经常会拍一些视频. 在 油管 或者 B站 上 就可以找到.https://www.bilibili.com/video/BV1qv411b79d?from=search&seid=3828654573220073441
经过这么多年的发展, Linux 已经成为 世界第一大操作系统.
有的同学可能表示, Linux 都是世界第一大操作系统了, 我咋还没听说过? 不, 其实你听说过. 安卓系 统本质上就是 Linux.
Linux 发行版
Linux 严格意义来说只是一个 “操作系统内核”.
一个完整的操作系统 = 操作系统内核 + 配套的应用程序.
由于 Linux 是一个完全开源免费的内核, 因此有些公司/开源组织又基于 Linux 内核, 提供了不同的配套 程序. 这就构成了不同的 “发行版”.
企业中最主要使用的发行版是 RedHat (红帽). 但是 RedHat 是一个收费的系统(报价参考 https://www.r edhat.com/en/store/linux-platforms?intcmp=701f20000012m33AAA). 因此我们课堂上使用的是基于红帽系统的的社区免费版本 CentOS.
CentOS 和 RedHat 的关系
RedHat一直都提供源代码的发行方式,CentOS就是将RedHat发行的源代码去掉 RedHat 的 logo商标, 重新编译一次.
RedHat对这种发行版的态度是:“我们其实并不反对这种发行版,真正向我们付费的用户,他们重视的并不是系统本身,而是我们所提供的商业服务。”
所以,CentOS可以得到RedHat的所有功能,甚至是更好的软件。但CentOS并不向用户提供商业 支持,当然也不负上任何商业责任。
关于 Linux 我们学习什么
1) 基础命令
Linux 虽然也有图形化界面, 但是在 服务器 / 嵌入式设备上往往都是通过命令行的方式操作的. 因此学习Linux 命令就是使用 Linux 的重要基础.
使用命令相比于使用图形界面主要有以下好处:
Windows 也有命令(也就是 cmd), 只是对于普通用户来说很少使用.
2) 系统编程 & 网络编程
Linux 自身提供了一些 API, 供程序猿调用来完成一些更复杂的编程任务(比如文件操作, 多线程编程, socket 编程等).
但是由于 Java 跨平台的特性, 这部分功能已经被 Java 自身封装好了 (流对象, Thread 对象, Socket 对象 等). 所以这部分内容我们不必再学习了.
3) 部署 JavaWeb 项目
我们自己写的 web 程序, 要想让其他的用户能够访问, 就需要发布到服务器上. 这是我们接下里重点学习 的内容.
小结: 对于 Java 程序猿, 关于 Linux 重点学习 基础命令 和 项目部署 即可.
Linux 环境搭建
要想学习 Linux , 需要先有一个 Linux 的环境.
主要有四种:
1. 直接安装在物理机上. 但是由于 Linux 桌面使用起来非常不友好. [不推荐].
2. 使用虚拟机软件, 将 Linux 搭建在虚拟机上. 但是由于当前的虚拟机软件(如 VMWare 之类的)存在 一些 bug , 会导致环境上出现各种莫名其妙的问题, 比较折腾. [非常不推荐]
3. 使用 WSL (Windows Subsystem for Linux). 这个是 Windows 近几年开发的新功能, 在 Windows
系统内集成了一个 Linux. 但是目前这个技术还不够成熟. [暂时不推荐].
4. 使用云服务器, 可以直接在 腾讯云, 阿里云或华为云 等服务器厂商处直接购买一个云服务器. [墙裂 推荐]
如腾讯云阿里云等为在校学生提供了优惠, 只要通过学生认证, 最低可以 10 块钱一个月. 还是非常 划算的.
甚至同学们可以 4 , 5 个人共用一台服务器, 平均下来一个人一个月 2 块钱.
使用云服务器不仅环境搭建简单, 避免折腾, 同时还有一个最大的好处, 部署在云服务器上的项目可以直 接被外网访问到, 这个时候就和一个公司发布一个正式的网站没有任何区别. 也就能让我们自己写的程序 真的去给别人去使用.
能够在外网被访问是非常有意义的. 这样我们以后面试的时候就可以提前部署好项目, 现场给面试 官演示了.
我们以腾讯云为例, 其他的服务器厂商也是类似.
注意: 由于腾讯云官网一直在改版, 同学们实际看到的页面可能和课件上略有差别. 如果遇到某个环 节搞不定, 随时可以咨询腾讯云的客服小姐姐. (腾讯云的客服是非常热情的, 尤其是在你付钱之前~~).
1. 进入官方网站 https://cloud.tencent.com/act/campus (直接在百度上搜 “腾讯云校园计划”)
2. 登陆网站(可以使用 qq 或者 微信 登陆)
3. 右侧的操作系统选择 CentOS 7.6 64位. 购买时长根据需要选择(建议1年), 点击立即购买即可. 这个 步骤需要实名认证, 否则会提示
点击立即认证, 按照系统提示, 完成实名认证即可(认证速度很快).
4. 购买完成后, 可以在控制台中找到自己买的服务器. 点进去能够看到服务器的 IP 地址.
蓝色方框为公网 ip 地址, 稍后我们就会使用这个 ip 登陆服务器.
5. 设置 root 密码: 勾选服务器, 点击重置密码(这个环节可能需要手机短信验证). root 密码建议设置的 稍微复杂一些, 否则容易被黑客入侵.
小结: 在这个环节我们最重要的是得到三个信息:
这三个信息是我们登陆到 Linux 上的必要条件.
使用终端软件连接到 Linux
什么是终端软件
终端软件是一类工具软件, 可以和远程的主机建立网络连接, 从而对主机进行一些操作. 常见的终端软件:
我们课堂上使用的是 XShell.
下载安装 XShell
下载地址: https://www.netsarang.com/en/free-for-home-school/
XShell 提供了两种授权方式.
我们选择 家庭/教育 版即可. 下载的时候需要填一下名字和邮箱. 下载链接会被发送到填写的邮箱中.
邮箱中收到的内容形如:
点击邮箱中的下载链接即可完成下载.
使用 XShell 登陆主机
在 XShell 终端下输入
ssh 服务器外网ip地址
ip 为腾讯云后台页面中看到的 外网 IP.
如果网络畅通, 将会提示输入用户名密码. 输入即可正确登陆.
备注: 这里的用户名为 root, 密码是在最初购买服务器的时候设置的密码.
个别同学可能会出现无法输入密码的情况, 解决方案参考 https://www.cnblogs.com/lemon-le/p/11168609.html
关于XShell 下的复制粘贴
复制: ctrl + insert (有些同学的 insert 需要配合 fn 来按)
粘贴: shift + insert
ctrl + c / ctrl + v 是不行的.
语法: ls [选项] [目录或文件]
功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。
常用选项:
举例:
ls -l //通常使用 ll 代替左边的写法
语法: pwd
功能:显示用户当前所在的目录
举例:
pwd
Linux系统中,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件。
语法: cd 目录名
功能: 改变工作目录。将当前工作目录改变到指定的目录下.
举例:
cd .. : 返回上级目录
cd ~:进入用户家目
cd -:返回最近访问目录
认识 Linux 目录结构
Linux 是一个树形目录结构.
几个特殊的目录:
绝对路径 vs 相对路径
形如: /usr/share/tomcat/logs/
以根目录开头的, 称为绝对路径.
形如: ./logs
以 . 或者 . . 开头的, 称为相对路径.
使用 tab 键补全
我们敲的所有的 Linux 命令, 都可以使用 tab 键来尝试补全, 加快效率.
使用 ctrl + c 重新输入
如果命令或者目录敲错了, 可以 ctrl + c 取消当前的命令.
语法: touch [选项]… 文件…
功能: touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的 文件。
举例:
touch test.txt
语法:cat [选项] [文件]
功能: 查看目标文件的内容
常用选项:
cat test.txt
语法:echo [选项] [输出内容]
功能: 写内容到标准输出(控制台/文件)
常用选项:
[root@localhost ~]# echo "c.biancheng.net"
#echo的内容就会打印到屏幕上
c.biancheng.net
[root@localhost ~]#
语法:mkdir [选项] dirname…
功能:在当前目录下创建一个名为 “dirname”的目录
常用选项:
举例:
mkdir –p test/test1 : 递归建立多个目录
语法:rm [-f-i-r-v] [dirName/dir]
功能:删除文件或目录
常用选项:
举例:
rm test.txt
千万不要运行 rm -rf /
, 尤其是在公司的生产服务器上.
先手动创建如下目录结构:
test
├── a
│ ├── a1
│ │ ├── 1.txt
│ │ └── 2.txt
│ └── a2
├── b
│ ├── b1`
│ │ ├── 1.txt
│ │ └── 2.txt
│ └── b2
└── c
使用 rm -ri 命令删除 test, 观察删除的顺序.
语法:cp [选项] 源文件或目录 目标文件或目录
功能: 复制文件或目录
说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存 在的目录,则它会把前面指定的所有文件或目录复制到此目录中。若同时指定多个文件或目录,而最后 的目的地并非一个已存在的目录,则会出现错误信息
举例:
cp test1.txt test2.txt
语法: mv [选项] 源文件或目录 目标文件或目录
功能:
mv test1.txt test2.txt
Linux的命令有很多参数,我们不可能全记住,我们可以通过查看联机手册获取帮助。
语法: man [选项] 命令
man ls
语法: less [参数] 文件
功能:查看文件内容. 不会立刻把所有文件内容加载到内存中. 也能进行查找.
选项:
语法: head [参数] …[文件]…
功能:head 用来显示档案的开头至标准输出中,默认head命令打印其相应文件的开头10行。
选项:
语法: tail [必要参数] [选择参数] [文件]
功能: 用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。
举例:有一个文件共有100行内容,请取出第50行内容
# 方法1
head -n50 test > tmp # 将前50行装入临时文件 tmp
tail -n1 tmp # 得到中间行
# 方法2
head -n50 test | tail -n1
Linux 的很多指令, 如 cat head tail 等都是默认输出到 “标准输出” 中, 也就是显示器上的. 可以通 过 > 这样的符号把本来要输出到标准输出上的内容写到特定文件中. 这样的操作称为 “重定向”.
重定向有三种方式:
1. 标准输入重定向(<)
# 先构造一个文件, 里面添加一些内容.
cat < test.txt
2. 标准输出重定向 (>)
cat test.txt > test2.txt
3. 标准错误重定向 (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 +"%Y-%m-%d %H:%M:%S"
date 用法:date [OPTION]… [+FORMAT]
时间->时间戳:date +%s
时间戳->时间:date -d@1508749502
Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp)是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
vim 是一个知名的文本编辑器. 前面学习的 cat, less, head, tail 等命令只能查看文本, 不能编辑文本. 使 用 vim 就可以进行编辑了.
vim 就相当于 Windows 的记事本. 只不过功能比记事本强大一些.
vim [文件名]
2) 进入插入模式
vim 打开文件后默认是普通模式. 普通模式下键盘的按键表示一些特殊功能的快捷键. (例如按下 j 并不是 输入字母 “j”, 而是表示光标往下移动一行). 需要进入插入模式才能进行文本编辑.
使用 i 键可以进入到插入模式. (左下角提示 --INSERT-- ) 然后就可以像记事本一样正常编辑了.
在插入模式下不能保存文件, 需要先回到 普通模式 . 按下 Esc
回到普通模式. 在普通模式下输入 :w
, 再按下回车, 即可保存文件.
在插入模式下不能退出, 需要先回到 普通模式.
在普通模式下输入 :q
, 再按下回车, 即可退出.
也可以直接使用
:wq
同时执行保存和退出.
vim 跳到行首或者行尾
用vi命令打开文件直接跳到最后一行的方法如下:
:0
跳到文件第一行
:$
跳到文件最后一行
或 另外一组命令:
gg
跳到文件第一行
G
跳到文件最后一行
语法: grep [参数]… [文件]…
功能:用于查找文件中是否包含指定字符串, 并显示对应的行.
选项:
grep "hello" Hello.java
语法: ps [参数]…
功能:用于查看当前系统上运行的进程 (Process)
选项:
ps aux # 显示系统上所有的进程
ps aux | grep "进程名"
ps aux | grep "进程id"
ps aux | grep tomcat #查看tomcat进程
语法:netstat [参数]…
功能:查看系统上的网络状态.
选项:
netstat -anp
netstat -anp | grep "进程名"
netstat -anp | grep "端口号"
netstat -anp | grep 8080
用户操作
Linux下有两种用户:超级用户(root)、普通用户。
我们的服务器买好了, 默认是 root 用户. 但是 root 用户权力比较大, 一旦使用不当可能会造成严重后果
(例如 rm -rf /). 因此我们真正在公司中不会直接使用 root 用户来操作服务器.
命令 useradd [用户名]
功能 创建新的用户
示例
useradd test
命令 passwd [用户名]
功能 设置或修改用户密码
示例
passwd test
注意, 输入密码的时候, 在控制台中不会有提示. 但实际上已经输入进去了.
3. 切换用户
命令:su [用户名]
功能:切换用户。
例如,要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root用户的 口令。
访问一个文件的人可能分成三种类别.
命令 ll
显示了一个文件的详细信息. 解读如下图:
a) 文件类型
d:文件夹
-:普通文件
l:软链接(类似Windows的快捷方式)
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接口文件
b) 基本权限
功能: 设置文件的访问权限
格式: chmod [参数] 权限 文件名
常用选项:
chmod命令权限值的格式
① 用户表示符+/-=权限字符
实例:
# 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
类似的还有 chgrp, chown 命令. 同学们自行了解.
1.白色:表示是文件;
2.蓝色:表示目录;
3.绿色:表示可执行文件;
4.红色:表示压缩文件;
5.浅蓝色:表示链接文件;
6.灰色:表示其它文件;
7.红色:闪烁表示链接的文件有问题了;
8.黄色:是设备文件,包括block, char, fifo。
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 [软件包名字]
注意事项
ping www.baidu.com
来检测网络的畅通情况.# 由于带 git 关键字的软件包很多, 可以在 grep 的时候加上 -w , 表示全字匹配.
yum list | grep git -w
2. 安装 git
yum install git.x86_64
3. git 的基本使用(和 Windows 版本的 git 是一致的. 只是使用命令行操作)
git clone
git add
git commit
git push
JDK
yum install java-1.8.0-openjdk.x86_64
注意: yum上的 JDK 是 OpenJDK, 是一个开源版本的 JDK, 和 Oracle 官方的 JDK 略有差别. 此处我 们就使用 OpenJDK 即可. 安装 Oracle JDK 比较麻烦.
使用 java -version
验证是否安装成功. 如果提示 “java 命令找不到” 则说明安装失败.
yum list | grep maven -w
yum install maven.noarch
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"
此时说明安装成功.
由于 yum 源上默认的 Tomcat 7 版本, 比较旧了. 我们课堂上使用 Tomcat 8, 需要手动安装, 不能使用yum.
下载路径可以参考官网 https://tomcat.apache.org/download-80.cgi
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 -> 复制链接地址 获得.
# 使用 unzip 命令解压缩
unzip apache-tomcat-8.5.47.zip
如果 unzip 命令找不到, 则先 yum install unzip
即可.
cd apache-tomcat-8.5.47/bin
# 将所有 .sh 后缀的文件加上可执行权限(后面会介绍)
chmod +x *.sh
在tomcat文件目录下apache-tomcat-8.5.47/bin
sh startup.sh
验证启动成功
# 方法1 查看 tomcat 进程是否存在
ps aux | grep tomcat
# 方法2 查看端口 8080 是否被绑定
netstat -anp | grep 8080
# 方法3 使用 curl 命令访问默认 demo
curl 127.0.0.1:8080
如果进程存在或者端口状态正确(LISTEN状态)或者能够访问到默认主页, 说明启动成功.
Linux 的 Tomcat 目录结构和 Windows 完全一致. (就是同一个 zip 包解压缩出来的)
在浏览器地址栏中
http://[服务器外网ip]:8080/
即可看到默认的页面
在外网访问这个页面之前需要先开启服务器的 “防火墙” 功能. 登陆自己的云服务账户, 在主页中配置防火墙, 允许外部主机访问服务器的 8080 端口.
**备注:**防火墙配置界面如果找不到, 可以随时咨询云服务器客服.
MySQL 同样也可以使用 yum 安装. 但是要修改一些配置, 稍微复杂一些. 可以参考陈沛鑫老师写的一个知乎上的文章. https://zhuanlan.zhihu.com/p/49046496
yum 上的是 MariaDB, 和纯正的 MySQL 还不太一样.
MariaDB 和 MySQL 的关系, 类似于 CentOS 和 RedHat 的关系. 从使用角度上, MariaDB 和MySQL之间都是兼容的.
在数据库运行过程中出现问题, 可以查看 MySQL 的错误日志. 在 MySQL 中通过这个命令, 获取到日志的路径
mysql> show variables like 'log_error';
# 输出结果
+---------------+------------------------------+
| Variable_name | Value |
+---------------+------------------------------+
| log_error | /var/log/mariadb/mariadb.log |
+---------------+------------------------------+
使用 vim 或 less 查看该文件内容即可.
less /var/log/mariadb/mariadb.log
MySQL 中除了错误日志, 还有很多其他类型的日志. 详细可以参考
https://www.cnblogs.com/f-ck-need-u/p/9001061.html
工作中涉及到的 “环境”
把程序拷贝安装到生产环境上, 这个过程称为 “部署”. 也叫 “上线”. 这个过程需要拷贝对应的 .class 文件和依赖的资源文件(各种配置文件, html等) 一旦程序部署成功, 那么这个程序就能被外网中千千万万的普通用户访问到.
换句话说, 如果程序有 BUG, 这个 BUG 也就被千千万万的用户看到了.
部署过程至关重要, 属于程序开发中最重要的一环. 一旦部署出现问题, 极有可能导致严重的事故(服务器 不可用之类的).
为了防止部署出错, 一般公司内部都有一些自动化部署工具(如 Jenkins 等). 当前我们先使用手工部署的 方式来完成部署.
将本地代码上传到 github / 码云上
过程略, 参考之前的 git 使用过程.
通过 git 下载代码
# 进入用户家目录
cd ~
# 创建目录保存项目
mkdir project
cd project
# 使用 git 下载代码
git clone [项目链接]
备注:
除了使用 git 来完成代码同步之外, 也可以借助其他工具传输. 同学们可以自行了解 scp 命令和 rz/sz 命令.
按照之前的数据库建表脚本, 在服务器上运行, 建立相同的表结构.
mysql -u[数据库用户名] -p[数据库密码] < [数据库脚本].sql
切换到项目的主目录(包含 pom.xml的目录), 使用 mvn 打包项目
mvn package
此时在 target 目录下就会生成对应的 war 包.
曾经我们主要是在 IDEA 中通过图形化工具来使用 mvn. 事实上 mvn 本质是一个基于命令行的工具.
曾经在 IDEA 上进行的 mvn 操作在 Linux 中同样也可以通过命令行来完成.
将war 包拷贝到 Tomcat 的 webapps 目录中.
cp [war包名字] [tomcat webapps目录]
稍等片刻, Tomcat 会自动解压缩 war 包, 完成部署.
注意: 如果该项目之前部署过, 需要先删除之前的包.
在浏览器上访问项目的链接. (按照项目的功能进行验证).
1. 验证账户注册登录
2. 验证展示博客列表
3. 验证新增博客
4. 验证展示博客内容
5. …
注意事项:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。