1.Linux的基本使用
1.1 Linux 是什么
Linux 是⼀个操作系统.
和 Windows 是 "并列" 的关系.
1.2 Unix & Linux 发展历程图
1.1969−1970 年, ⻉尔实验室的 Dennis Ritchie (左) 和 Ken Tompson (右) 开发了 Unix 操作系统.
2.
Unix ⽕了之后, 衍⽣出很多的分⽀. 其中有⼀⽀为 "Minix". 由荷兰的Andrew S. Tanenbaum 教授开发. 源代码开放给⼤学教学和研究⼯作. (MINIX 含义为 "⼩型的UNIX")
3.
1991 年, 还在读⼤学的 芬兰⼈ Linus Benedict Torvalds (1969年12⽉28⽇出⽣, 当时 22 岁) 基于Minix 的启发, 开发出了 Linux 的第⼀个版本
经过这么多年的发展, Linux 已经成为 世界第⼀⼤操作系统
1.3 Linux 发⾏版
Linux 严格意义来说只是⼀个
"操作系统内核".
⼀个完整的操作系统 = 操作系统内核 + 配套的应⽤程序.
由于 Linux 是⼀个完全开源免费的内核, 因此有些公司/开源组织⼜基于 Linux 内核, 提供了不同的配套程序. 这就构成了不同的 "发⾏版".
企业中主要使⽤的发⾏版是 RedHat (红帽), CentOS(RedHat的社区免费版本)和ubuntu. 但是 RedHat是收费的, CentorOS官⽅在2020年12⽉份通知: 2021年底停⽌维护CentOS8, 2024年6⽉30⽇停⽌维护CentOS7,后续将⽆法获得官⽅升级和补丁.
1.4 Linux的优势
1.
开源(意味着免费, 便宜)
2.
稳定(Linux 可以运⾏很多年, 都不会发⽣重⼤问题)
3.
安全(Linux 只有管理员或者特定⽤⼾才能访问Linux内核)
4.
⾃由(不会被强加商业产品和服务)
5.
社区⽀持(Linux 在全球社区都⾮常活跃和使⽤⼴泛, 有很多志愿者在线帮⼤家解决问题)
1.5 Linux的基础命令
Linux 虽然也有图形化界⾯, 但是在 服务器 / 嵌⼊式设备上往往都是通过命令⾏的⽅式操作的.因此学习 Linux 命令就是使⽤ Linux 的重要基础
使⽤命令相⽐于使⽤图形界⾯主要有以下好处:• 节省系统资源: 运⾏图形界⾯需要让系统付出⼀些额外的资源开销. 尤其是对于配置⽐较低的嵌⼊式设备, 这⼀点⾄关重要.• 节省⽹络带宽: 如果通过⽹络访问服务器, 使⽤图形界⾯需要传输⼀帧⼀帧的图像, ⽽使⽤命令只需要传输简单的字符串.• 便于批量执⾏任务: 可以通过⼀些 "脚本" 代码 (⽐如 Linux Shell) 来批量执⾏⼀些任务, 完成⼀些简单的编程⼯作. (⽐如定时备份⽂件, 删除⽂件等).Windows 也有命令(也就是 cmd), 只是对于普通⽤⼾来说很少使⽤.
系统编程 & ⽹络编程
Linux ⾃⾝提供了⼀些 API, 供程序猿调⽤来完成⼀些更复杂的编程任务(⽐如⽂件操作, 多线程编程,socket 编程等).
但是由于 Java 跨平台的特性, 这部分功能已经被 Java ⾃⾝封装好了 (流对象, Thread 对象, Socket 对象等). 所以这部分内容不必再学习了.
部署 JavaWeb 项⽬
我们⾃⼰写的 web 程序, 要想让其他的⽤⼾能够访问, 就需要发布到服务器上
所以, 对于 Java 程序员来说, 关于 Linux 重点学习 基础命令 和 项⽬部署 即可
2. Linux 环境搭建
要想学习 Linux , 需要先有⼀个 Linux 的环境.
2.1 环境搭建⽅式
主要有四种:
1.
直接安装在物理机上. 但是Linux 桌⾯使⽤起来⾮常不友好. 所以不建议.
2.
使⽤虚拟机软件, 将 Linux 搭建在虚拟机上. 但是由于当前的虚拟机软件(如 VMWare 之类的)存在⼀些 bug , 会导致环境上出现各种莫名其妙的问题, ⽐较折腾.
3.
使⽤ WSL (Windows Subsystem for Linux). 这个是 Windows 近⼏年开发的新功能, 在 Windows
系统内集成了⼀个 Linux. 但是⽬前这个技术还不够成熟.
4. 使⽤云服务器, 可以直接在 腾讯云, 阿⾥云或华为云 等服务器⼚商处直接购买⼀个云服务器.
使⽤云服务器不仅环境搭建简单, 避免折腾, 同时还有⼀个最⼤的好处, 部署在云服务器上的项⽬可以直接被外⽹访问到, 这个时候就和⼀个公司发布⼀个正式的⽹站没有任何区别. 也就能让我们⾃⼰写的程序真的去给别⼈去使⽤
2.2 使⽤云服务器
2.3 使⽤终端软件连接到 Linux
2.3.1 终端软件
终端软件是⼀类⼯具软件, 可以和远程的主机建⽴⽹络连接, 从⽽对主机进⾏⼀些操作.
常⻅的终端软件:
• XShell
•
Putty
•
MobaXTerm
•
Iterm2
•
SecureCRT
•
......
3. Linux 常⽤命令
ls
语法: ls [选项] [⽬录或⽂件]功能:对于⽬录,该命令列出该⽬录下的所有⼦⽬录与⽂件。对于⽂件,将列出⽂件名以及其他信息。常⽤选项:• -a 列出⽬录下的所有⽂件,包括以 . 开头的隐含⽂件。• -d 将⽬录象⽂件⼀样显⽰,⽽不是显⽰其下的⽂件。 如:ls ‒d 指定⽬录• -k 以 k 字节的形式表⽰⽂件的⼤⼩。ls ‒alk 指定⽂件• -l 列出⽂件的详细信息。• -r 对⽬录反向排序。• -t 以时间排序。• -R 列出所有⼦⽬录下的⽂件。(递归)
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命令参数可更改⽂档或⽬录的⽇期时间,包括存取时间和更改时间,或者新建⼀个不存在的⽂件。举例:touch test.txt
cat
语法:cat [选项] [⽂件]功能: 查看⽬标⽂件的内容常⽤选项:• -n 对输出的所有⾏编号cat test.txt
mkdir
语法:mkdir [选项] dirname...功能:在当前⽬录下创建⼀个名为 “dirname”的⽬录常⽤选项:• -p, --parents 可以是⼀个路径名称。此时若路径中的某些⽬录尚不存在,加上此选项后,系统将⾃动建⽴好那些尚不存在的⽬录,即⼀次可以建⽴多级⽬录举例:# 递归建⽴多个⽬录mkdir –p test/test1
rm
语法:rm [-f-i-r-v] [dirName/dir]功能:删除⽂件或⽬录常⽤选项:• -f 即使⽂件属性为只读(即写保护),亦直接删除• -i 删除前逐⼀询问确认• -r 删除⽬录及其下所有⽂件举例:rm test.txt
重要注意事项:
千万不要运⾏ rm -rf / , 尤其是在公司的⽣产服务器上
cp
语法:cp [选项] 源⽂件或⽬录 ⽬标⽂件或⽬录功能: 复制⽂件或⽬录说明: cp指令⽤于复制⽂件或⽬录,如同时指定两个以上的⽂件或⽬录,且最后的⽬的地是⼀个已经存在的⽬录,则它会把前⾯指定的所有⽂件或⽬录复制到此⽬录中。若同时指定多个⽂件或⽬录,⽽最后的⽬的地并⾮⼀个已存在的⽬录,则会出现错误信息常⽤选项:• -f 或 --force 强⾏复制⽂件或⽬录, 不论⽬的⽂件或⽬录是否已经存在• -i 或 --interactive 覆盖⽂件之前先询问⽤⼾• -r递归处理,将指定⽬录下的⽂件与⼦⽬录⼀并处理。若源⽂件或⽬录的形态,不属于⽬录或符号链接,则⼀律视为普通⽂件处理• -R 或 --recursive递归处理,将指定⽬录下的⽂件及⼦⽬录⼀并处理举例:cp test1.txt test2.txt
mv
语法: mv [选项] 源⽂件或⽬录 ⽬标⽂件或⽬录功能:1. 视mv命令中第⼆个参数类型的不同(是⽬标⽂件还是⽬标⽬录),mv命令将⽂件重命名或将其移⾄⼀个新的⽬录中。2. 当第⼆个参数类型是⽂件时,mv命令完成⽂件重命名,此时,源⽂件只能有⼀个(也可以是源⽬录名),它将所给的源⽂件或⽬录重命名为给定的⽬标⽂件名。3. 当第⼆个参数是已存在的⽬录名称时,源⽂件或⽬录参数可以有多个,mv命令将各参数指定的源⽂件均移⾄⽬标⽬录中。常⽤选项• -f :force 强制的意思,如果⽬标⽂件已经存在,不会询问⽽直接覆盖• -i :若⽬标⽂件 (destination) 已经存在时,就会询问是否覆盖!举例mv test1.txt test2.txt
tail
语法: tail [必要参数] [选择参数] [⽂件]功能:⽤于显⽰指定⽂件末尾内容,不指定⽂件时,作为输⼊信息进⾏处理。常⽤查看⽇志⽂件。选项:• -f 循环读取• -n<⾏数> 显⽰⾏数举例:tail -10 t1.txt
vim
vim 是⼀个知名的⽂本编辑器. 使⽤ vim 可以进⾏⽂本编辑了.vim 就相当于 Windows 的记事本. 只不过功能⽐记事本强⼤⼀些.1) 创建⽂件 / 打开⽂件vim [ ⽂件名 ]2) 进⼊插⼊模式vim 打开⽂件后默认是普通模式. 普通模式下键盘的按键表⽰⼀些特殊功能的快捷键. (例如按下 j 并不是输⼊字⺟ "j", ⽽是表⽰光标往下移动⼀⾏). 需要进⼊插⼊模式才能进⾏⽂本编辑.使⽤ i 键可以进⼊到插⼊模式. (左下⻆提⽰ --INSERT-- ) 然后就可以像记事本⼀样正常编辑了.3) 保存在插⼊模式下不能保存⽂件, 需要先回到 普通模式 . 按下 Esc 回到普通模式.在普通模式下输⼊ :w , 再按下回⻋, 即可保存⽂件.4) 退出在插⼊模式下不能退出, 需要先回到 普通模式.退出时, 分以下情况:① ⽂件未修改: 输⼊ :q , 再按下回⻋, 即可退出② ⽂件修改并保存: 使⽤ :wq 同时执⾏保存和退出.③ ⽂件修改, 但不希望保存: 使⽤ :wq! 进⾏强制退出
grep语法:grep [参数]... [⽂件]...功能:⽤于查找⽂件中是否包含指定字符串, 并显⽰对应的⾏.选项:• -n<⾏数> 显⽰的⾏数• -w 全字匹配. 要求整个单词都完全相同的结果才能匹配出来, ⽽不仅仅是⼀个单词的⼀部分.• -r 递归查找. 可以搜索多级⽬录下的所有⽂件.• --color ⾼亮查找到的结果• --include 指定查找某些⽂件• --exclude 指定排除某些⽂件举例:grep "hello" Hello.java
ps
语法:ps [参数]...功能:⽤于查看当前系统上运⾏的进程选项:• a 显⽰⼀个终端的所有进程• u 以⽤⼾为主的格式来显⽰程序状况• x 显⽰所有程序, 不⽌是会话中的进程• e 显⽰所有进程, 包括系统守护进程• f 显⽰完整格式输出举例:ps aux # 显⽰系统上所有的进程ps aux | grep " 进程名 "ps aux | grep " 进程 id"
netstat
语法:netstat [参数]...功能:查看系统上的⽹络状态.选项:• -a 显⽰所有正在或不在侦听的套接字• -n 显⽰数字形式地址⽽不是去解析主机、端⼝或⽤⼾名• -p 显⽰套接字所属进程的PID和名称举例:netstat -anpnetstat -anp | grep " 进程名 "netstat -anp | grep " 端⼝号 "
管道
管道是⼀种古⽼的 "进程间通信" ⽅式. 在 Linux 指令中可以使⽤ | 作为管道标记.意思是将前⼀个指令标准输出的内容, 作为第⼆个指令的标准输⼊内容.举例:ps -ef|grep "java"ps -ef|head -10tail -f log.txt|grep "Exception"
4. 搭建 Java 部署环境
4.1 apt
apt(Advanced Packaging Tool), Linux软件包管理⼯具. ⽤于在Ubuntu、Debian和相关Linux发⾏版
上安装、更新、删除和管理deb软件包.
⼤多数apt命令必须以具有sudo权限的⽤⼾⾝份运⾏.
4.1.1 apt常⽤命令
列出所有软件包
apt list
这个命令输出所有包的列表, 内容⽐较多, 可以使⽤grep命令过滤输出.
apt list |grep "java"
...
未完
5.部署 Web 项⽬到 Linux
5.1 什么是部署
⼯作中涉及到的 "环境"
•
开发环境: 开发⼈员写代码⽤的机器.
•
测试环境: 测试⼈员测试程序使⽤的机器.
•
⽣产环境(线上环境): 最终项⽬发布时所使⽤的机器. 对稳定性要求很⾼.
把程序安装到⽣产环境上, 这个过程称为 "部署". 也叫 "上线".
⼀旦程序部署成功, 那么这个程序就能被外⽹中千千万万的普通⽤⼾访问到.
换句话说, 如果程序有 BUG, 这个 BUG 也就被千千万万的⽤⼾看到了.
部署过程⾄关重要, 属于程序开发中最重要的⼀环. ⼀旦部署出现问题, 极有可能导致严重的事故(服务器不可⽤之类的).
为了防⽌部署出错, ⼀般公司内部都有⼀些⾃动化部署⼯具(如 Jenkins 等). 当前我们先使⽤⼿⼯部署的⽅式来完成部署.
5.2 环境配置
程序正常运⾏, 需要保证环境和程序都要正确, 我们需要先设置环境
数据准备
按照之前的数据库建表脚本, 在服务器上运⾏, 建⽴相同的表结构.
进入数据库
mysql -root -p
建库
-- 建表SQL
create database if not exists java_blog_spring charset utf8mb4;
USE java_blog_spring;
-- 用户表
DROP TABLE IF EXISTS java_blog_spring.user;
CREATE TABLE java_blog_spring.user(
`id` INT NOT NULL AUTO_INCREMENT,
`user_name` VARCHAR ( 128 ) NOT NULL,
`password` VARCHAR ( 128 ) NOT NULL,
`github_url` VARCHAR ( 128 ) NULL,
`delete_flag` TINYINT ( 4 ) NULL DEFAULT 0,
`create_time` DATETIME DEFAULT now(),
`update_time` DATETIME DEFAULT now(),
PRIMARY KEY ( id ),
UNIQUE INDEX user_name_UNIQUE ( user_name ASC )) ENGINE = INNODB DEFAULT
CHARACTER
SET = utf8mb4 COMMENT = '用户表';
-- 博客表
drop table if exists java_blog_spring.blog;
CREATE TABLE java_blog_spring.blog (
`id` INT NOT NULL AUTO_INCREMENT,
`title` VARCHAR(200) NULL,
`content` TEXT NULL,
`user_id` INT(11) NULL,
`delete_flag` TINYINT(4) NULL DEFAULT 0,
`create_time` DATETIME DEFAULT now(),
`update_time` DATETIME DEFAULT now(),
PRIMARY KEY (id))
ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '博客表';
-- 新增用户信息
insert into java_blog_spring.user (user_name, password,github_url)values
("lay","107","https://www.weibo.com/u/2706896955?c=spr_qdhz_bd_360ss_weibo_mr");
insert into java_blog_spring.user (user_name, password,github_url)
values("muyierf","123456","https://gitee.com/muyierf");
insert into java_blog_spring.blog (title,content,user_id) values("第1篇博
客","lay的筑梦之旅",1);
insert into java_blog_spring.blog (title,content,user_id) values("第1篇博
客","muyierf的第一篇博客",2);
出现问题:Invalid default value for ‘create_time‘
通过搜索,发现是因为MySQL版本低
选择了删除升级版本的做法
程序配置⽂件修改
实际⼯作中, 开发环境, 测试环境以及⽣产环境的配置都是不⼀样的
⽐如mysql的⽤⼾名和密码
我们可以针对不同的环境, 设置不同的配置
多平台⽂件配置
针对不同平台创建不同的配置⽂件, 要求名字为application-XXX.yml或者application-XXX.properties
以下以application-XXX.yml为例
固定格式, 只有后⾯的字⺟可以修改
在配置⽂件⾥写不同的内容
application-dev.yml
application-prod.yml
在主配置⽂件 application.yml 中指定配置⽂件, 并删除数据库相关配置
5.3 构建项⽬并打包
在本地使⽤maven进⾏打包
1.
如果Test代码中有与环境配置相关的操作(⽐如数据库相关的操作), 打包会失败, 点击下图①处的图标, 可以跳过测试
2.
点击clean->package
5.3 上传Jar包到服务器, 并运⾏
1. 上传Jar包
直接拖动打好的jar包到xshell窗⼝即可完成⽂件的上传
java -jar demo-0.0.1-SNAPSHOT.jar
端口被占有了
看服务器端口有没有开放
1.先看本机的应用是否启动成功
curl http://127.0.0.1:9090/blog_login.html
开放的话就可以获取页面内容
有该页面就启动成功!!!
(排除服务已启动)
2.端口号的的问题
阿里云服务器开放端口的正确方式(超详细图文教程)_阿里云开放端口-CSDN博客
无法通过公网访问阿里云服务器下的tomcat部署的项目_为什么通过公网ip访问不了tomcat-CSDN博客 ps -ef|grep java 查看进程
kill -9杀死进程
部署成功!!!
重新测试,发现css加载不出来,重新clean解决问题。
经过测试,发现添加博客接口有问题,执行一次添加一篇博客操作,却添加了两条信息。
经检查接口/add有错误,执行了两次语句