大家好啊,最近言哥的新小册——NestJS项目实战上线了,我也在小册群潜伏了一段时间,但是注意到很多前端同学在实战的过程中对配置 Linux 相关环境这件事上,遇到了不同程度的问题,所以我就想着出一篇教程帮助大家快速的掌握 Linux 上的常用命令,以及相关中间件的安装。
看到这,熟悉后端的同学也别急着划走,说不定正文部分就能了解到一些你不知道的知识呢,尤其是 Mysql安装、Systemctl 和 ufw 命令。
好了,本文大纲如下:
虽然从理论上来说,我应该先讲命令,后讲具体的中间件环境,但是从我个人的角度来体验,先实践,之后弄懂相关命令的意思就有一种恍然大悟的感觉,所以本文将按照上文的顺序进行行文。
大家可能注意到了,上图的命令中并没有基础命令,我认为基础命令扫一眼就行,没必要特殊记忆,我常用的基础命令如下:
- top:查看系统进程情况。
- cd:切换目录。
- vim:修改文件。
- mkdir:创建文件夹。
或许是我场景有限,自己玩服务器的话基础命令除了这四个以外别的基本没用过,所以我建议大家也没必要在这方面花费太多时间,尤其是前端同学。
最后,本文的 Linux 环境版本为:Ubuntn 20 LTS,强烈建议大家使用 Ubuntn(确实比较好用),并且希望大家养成点赞后看的好习惯。
注:文本安装中间件都将以官方源进行安装,拒绝使用包管理器的源,和官方保持统一。
Nginx
原来我一直是用源码编译的方式进行安装 Nginx,现在觉得使用包管理器进行安装 + systemctl
管理更方便一些。
进入正题,使用官方源进行安装大致可以分为四步:
- 安装依赖。
- 生成 / 导入 key。
- 设置 Nginx 源。
- 安装。
# 安装依赖
sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
# 生成key
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
# 设置 Nginx 源
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
# 更新 && 安装
sudo apt update
sudo apt install nginx
安装完成后我们可以使用 systemctl start nginx
命令启动 Nginx,Nginx 一般来说我们只需要了解两部分就够了:配置文件和常用命令。
Nginx 的配置文件在:/etc/nginx/nginx.cnf
,三个常用命令如下:
- Nginx -s reload:重载配置文件。
- Nginx -s stop:快速关机。
- Nginx -s quit:优雅关机。
最后,可以使用 curl -I 127.0.0.1
测试一下 Nginx 是否正常,看到如下响应的就是 OK:
HTTP/1.1 200 OK
Server: nginx/1.22.0
Date: Sat, 09 Jul 2022 08:25:06 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Mon, 23 May 2022 23:59:19 GMT
Connection: keep-alive
ETag: "628c1fd7-267"
Accept-Ranges: bytes
Nginx 安装比较简单,接下来会慢慢复杂起来。
Node
Node 安装和其他的有所不同,Node 高版本居然会和 Linux 版本有些不兼容,以我目前的 Ubuntn 20 LTS 举例,在 20 版本之下的比如 19 / 18 版本是不支持 Node18+ 的,具体的兼容列表可以在其 Github 上面找到:https://github.com/nodesource/distributions/blob/master/README.md。
除去版本问题之外,Node 使用包管理器安装也是非常简单的:
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
一行命令即可,其中 setup\_18.x 可以替换为 setup\_17.x 或者 setup\_16.x,根据你想要的版本来即可,如果你想要一个每次都安装最新版本的命令则可以将其替换为:setup\_current.x。
接着输入 node -v
来查看安装的版本:
root@hecs-5778:~ node -v
v18.4.0
Node 这种语言环境一般都不需要配置开机自启,直接通过环境变量即可调用,所以这里就不展示配置开机自启的步骤了\~
JDK / JRE
话说这里为什么出现 Java?因为如果前端想做一些 CICD 环境的话必不可少的会用到 Jenkins,而 Jenkins 则需要 Java 运行时环境。
JDK / JRE 的安装一般都比较简单,一行命令就可以搞定,不过需要注意的是在当你在 Linux 的包管理器上搜索 JDK / JRE 时通常会出现一个 handleless 版本:
root@hecs-5778:~ sudo apt-cache search jdk-17
openjdk-17-jdk - OpenJDK Development Kit (JDK)
openjdk-17-jdk-headless - OpenJDK Development Kit (JDK) (headless)
openjdk-17-jre - OpenJDK Java runtime, using Hotspot JIT
openjdk-17-jre-headless - OpenJDK Java runtime, using Hotspot JIT (headless)
openjdk-17-source - OpenJDK Development Kit (JDK) source files
headless 版本是不支持图形化接口以及人机交互设备 (鼠标、键盘) 的版本,它通常被用于服务器端,所以如果你部署的项目就是常规的 Web 应用那可以直接安装 handless 版本进行使用,它相比标准版引入的依赖更少,占用的资源也更少。
说完了版本,接下来说安装,如果你在 Linux 上面安装软件懒得去搜索命令可以直接敲击对应的命令,大概率 Linux 的包管理工具会提示你进行安装:
root@hecs-5778:~ java
Command 'java' not found, but can be installed with:
apt install openjdk-11-jre-headless # version 11.0.15+10-0ubuntu0.20.04.1, or
apt install default-jre # version 2:1.11-72
apt install openjdk-16-jre-headless # version 16.0.1+9-1~20.04
apt install openjdk-17-jre-headless # version 17.0.3+7-0ubuntu0.20.04.1
apt install openjdk-8-jre-headless # version 8u312-b07-0ubuntu1~20.04
apt install openjdk-13-jre-headless # version 13.0.7+5-0ubuntu1~20.04
接下来直接执行:apt install openjdk-17-jre-headless
进行安装。
当然并不建议所有软件都用这种方式进行安装,因为包管理器给你推荐的并不一定是官方源,除了这种编程语言环境,其他服务端大型软件我更推荐根据其官网文档进行安装,比如在 MongoDB 文档上面就写明了 Ubuntu 自带的源中的 MongoDB安装包不是官方源安装包。
由于编程语言的相关命令一般都会加入环境变量,所以 JDK / JRE 就没必要配置开机自启之类的东西了,直接使用即可。
Redis
Redis 作为一个老牌缓存中间件,现在越来越多的前端也知道它了,高性能 + 高可用就是它的优势\~
Redis 安装一般是分为两步:更新 Redis 源和 apt 安装,命令如下:
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt-get update
sudo apt-get install redis
安装之后的有两个文件路径需要知道:
- 启动脚本路径:
/usr/bin/redis-server
。 - 配置文件路径:
/etc/redis/redis.conf
。
在正式启动 Redis 之前,我们一般会去修改一下它的配置文件,因为默认的 Redis 配置是不支持远程访问和无密码的,所以我们需要 vim /etc/redis/redis.conf
一下,将如下两个配置进行修改:
bind 0.0.0.0 ::1
requirepass yourpassword
保存之后可以使用: systemctl start redis-server
启动 Redis 服务。
如果需要开机自启动可以通过命令:systemctl enable redis-server
进行设置。
这样 Redis 就可以自启动了,对了,Redis 默认使用 6379 端口\~
参考文档:https://redis.io/docs/getting-started/installation/install-redis-on-linux/
MongoDB
听说前端选数据库第一选择就是MongoDB,MongoDB 相比老牌关系型数据库——MySQL 确实更轻量级,性能方面简单使用还要比 MySQL 强上不少,我一个后端也喜欢上 MongoDB 了现在。
MongoDB 的安装一般分为两步:更新 MongoDB 源和 apt 安装,命令如下:
wget -qO - https://www.mongodb.org/static/pgp/server-5.0.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/5.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-5.0.list
sudo apt-get update
sudo apt-get install -y mongodb-org
MongDB 安装完了之后有几个常用目录需要知道:
- 配置文件:/etc/mongod.conf。
- 数据目录:/var/lib/mongodb。
- 日志目录:/var/log/mongodb。
之后我们还需要修改一下配置文件,因为默认的 MongoDB 不支持远程访问,使用 vim 打开配置文件之后,修改 bind 属性即可:
net:
port: 27017
bindIp: 0.0.0.0
修改完成之后就可以启动 MongoDB 了,使用 sudo systemctl start mongod
进行启动,如果提示你 Failed to start mongod.service: Unit mongod.service not found.
可以先使用 sudo systemctl daemon-reload
然后再次运行上面的启动命令即可。
如果需要开机自启动可以通过命令:systemctl enable mongod
进行设置。
这样 MongoDB 就可以自启动了,MongoDB 默认使用 27017 端口\~
对了数据库这种玩意我强烈不建议使用 Docker,一是麻烦二是没必要,吃力不讨好。
参考文档:https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-ubuntu/
MySQL
MySQL 安装比较复杂,除了配置文件外还要处理 ROOT 权限。
MySQL 的安装一般也是两种方法:
- 通过使用 MySQL apt 存储库安装(注意:这不是设置官方源的方式)。
- 通过 Linux apt 包管理器安装。
由于官网文档中对这两种方案都做了介绍,这代表着这两种方案都可以进行安装,那么我们直接通过 Ubuntu 自带的 apt 包管理器会非常的方便:
sudo apt-get install mysql-server
注意,这条命令会帮你安装最新的 MySQL,在现在这个时间点安装的是 MySQL8,我也强烈建议不要再使用 8 以下的版本了,MySQL 8 带来的性能提升真的非常巨大。
这里需要额外提到一件事,就是 MySQL 的数据目录初始化,如果我们是使用安装程序和包管理器进行安装,一般都会自动进行数据目录初始化,如果非这种方式则需要手动进行数据目录初始化,否则将无法启动 MySQL。
由于我们是使用 apt 方式进行安装,所以无需关心数据目录初始化的事儿,但是仍有一些东西需要我们关注:
默认目录
- 数据目录:/var/lib/mysql。
- 日志目录:/var/log/mysql。
- 配置文件目录:/etc/mysql/mysql.conf.d。
远程访问
远程访问需要修改两处:配置文件和用户权限,配置文件一般在使用如下命令进行修改:
vim /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 0.0.0.0
MySQL 的默认配置文件一般在 /etc/mysql/mysql.conf.d/mysqld.cnf
,修改用户权限则是需要登陆 MySQL 中去修改数据库:
mysql -u root -p
use mysql;
update user set host='%' where user='root';
flush privileges;
ROOT 密码:
MySQL 的初始化密码根据安装方式不同默认密码也不同,一般有三种方式:
- 安装过程中提示你设置。
- 空。
- 随机密码。
如果你已经配置了密码可以跳过此节,下面着重说一下没有配置密码的情况,当你没有配置密码时可以使用使用 mysql -u root -p
用空密码进行登录验证,如果空不是你的初始化密码,那就需要在 MySQL 的错误日志里面找到你的初始化随机密码,错误日志文件地址一般是:/var/log/mysql/error.log
,之后重新使用 mysql -u root -p
进行登录验证。
登录之后使用如下命令查看你的 root 用户验证方式:
use mysql;
select user, host, authentication_string, plugin from user where user = 'root'
效果一般是这样的:
+------+------+-----------------------+-------------+
| user | host | authentication_string | plugin |
+------+------+-----------------------+-------------+
| root | % | | auth_socket |
+------+------+-----------------------+-------------+
1 row in set (0.00 sec)
Host 的 % 代表支持远程访问,接下来需要将密码修改为我们的自定义密码,这个时候要注意打印中的 plugin 是什么,如果是 auth\_socket 方式则代表它使用 Unix 套接字进行无密码验证,需要将其替换掉,不然无法使用密码进行验证。
接下来就可以直接使用一行命令进行密码修改了:
ALTER USER 'root'@'%' IDENTIFIED with caching_sha2_password BY 'your_password';
由于 MySQL 8.0 之后默认使用 caching\_sha2\_password 方式进行密码验证,所以我这里也和官方保持一致。
最后再使用一行命令将 MySQL 加入开机自启列表,MySQL 默认使用 3306端口:
systemctl enable mysql
参考文档:https://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/
Apt
了解 apt 之前需要先知道 Ubuntu 系统的包管理工具是什么,Ubuntu 系统作为 Debian 系的发行版,它和 Debian 用了同样的包管理工具:dpkg,而 apt 则是 dpkg 的命令行前端,它的作用是用来操作 dbkg 包管理器,在 Debian 系中除了 apt 这个命令行前端还有一个叫做 apt-get 的命令行前端,它比 apt 更加的古老。
apt-get 在 1998 年发布,后来逐渐被 apt 取代,apt 在 Debian8 里面成为标准,在 Ubuntu16 之后开始逐渐流行,目前大量开源项目的安装示例都是以 apt 为命令行前端。
Apt 要比 apt-get 稍微多一些功能,但是总体功能上是差不多的,主要的亮点在于:
- 有进度条。
- 某些命令显示包的时候带有颜色。
- 命令更短。
命令更短这点是我最喜欢的,接下来看一下几个常用命令,命令这方面我不再对比 apt-get,只要记忆 apt 相关命令即可:
- Apt search:用来搜索某个包,如:apt search jdk。
- Apt install:用来安装某个包,如:apt install nginx。
- Apt remove:用来删除某个包,如 apt remove nginx。
- Apt purge:用来删除某个包并清除配置,如 apt purge nginx。
- Apt show:用来显示某个包的具体信息,如 apt show nginx。
- Apt list --installed:列出所有已经安装的包。
- Apt autoremove:删除不再使用的库文件和依赖。
简单记忆以上几个命令,一般就够使用了\~
Systemctl
Systemctl 是系统服务管理命令,在旧一点的 Linux 发行版上服务管理一般是 service 命令,而较新的系统上则基本都是 Systemctl,Systemctl 兼容了 service 命令并具有更强大的功能。
不过对于 Systemctl 我觉得我们一般开发者无需了解太多,因为和 Systemctl 配套的都是 Linux 服务相关的知识了,我们只需要了解五个常用命令会用即可:
- systemctl enable 服务名:用来设置服务的开机自启,这个大赞,因为更语义化同时命令也更短。
- systemctl disable 服务名:用来关闭服务的开机自启。
- systemctl start 服务名:启动服务。
- systemctl stop 服务名:关闭服务。
- systemctl restart 服务名:重启服务。
- systemctl status 服务名:查看服务的状态。
在上文中,我们见到了好几次 systemctl 命令出现,现在大家可以再通过这几个命令试试服务开启 / 关闭的效果,加深记忆。
ufw
UFW 是 Uncomplicated FireWall 的简称,通过这个名字大家也可以看出来这是一个防火墙命令,大家在网上搜索放开某端口的时候一般都是出现的 iptables 命令,而 UFW 就是为了替代它而生,目前已经成为 Debian 系的默认防火墙管理命令。
UFW 这种新生代命令最大的好处就是易用易上手,尤其是对我们这种非专业运维来说,记住几个常用命令就足够我们使用了。
UFW 默认在 Ubutun 是关闭状态,你可以通过如下命令查看状态,incative 是关闭而 active 则是开启(由于 UFW 这个命令一般都是在管理员权限下才能使用,所以下文我将忽略 sudo 前缀):
root@hecs-5778:~ ufw status verbose
Status: inactive
接下来可以通过 enable 命令进行开启:
root@hecs-5778:~ ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
UFW 第一次开启之后会直接关闭所有端口,这样你下次就不能通过 SSH 连上云服务器了,所以开启之后你必须立即放开 SSH 端口:
root@hecs-5778:~ ufw allow ssh
Rule added
Rule added (v6)
ufw allwo 这个命令是专为打开端口使用的,其中内置了一些服务到端口的映射,比如上面的 ufw allow ssh
其实就是对应了 ssh 对应了 22端口,还有一些常用的例如 http 对应 80,https 对应 443,具体的规则文件在 /etc/services
文件下。
如果有些端口没有在预设文件中,你直接添加也可,比如我们放开 Redis 的默认端口 6379:
root@hecs-5778:~ ufw allow 6379
Rule added
Rule added (v6)
最后,如果我们的服务器是自己玩的情况下,我不建议打开防火墙,因为比较麻烦,你可以使用 disable 命令进行关闭:
root@hecs-5778:~ ufw disable
Firewall stopped and disabled on system startup
写在最后
写在最后,讲真,本文的部分内容还是非常详细实用的,比如 MySQL -ROOT密码那里,我写的时候也看了网上大量相关的文章,但是基本都说不到点上,尤其是用最新的加密方式的文章则是一个也没见到,相信大家看完本文之后应该会对这些东西了然于胸。
Linux 是个庞大的操作系统,里面随便一点拎出来都能写一本书了,所以希望大家在前期还是以实用为目的进行学习,不要局限在细节里。
好了,不知道大家看完本文之后有没有什么收获,希望大家多为本文点赞,让更多的读者看到好的内容。