头图

大家好啊,最近言哥的新小册——NestJS项目实战上线了,我也在小册群潜伏了一段时间,但是注意到很多前端同学在实战的过程中对配置 Linux 相关环境这件事上,遇到了不同程度的问题,所以我就想着出一篇教程帮助大家快速的掌握 Linux 上的常用命令,以及相关中间件的安装。

看到这,熟悉后端的同学也别急着划走,说不定正文部分就能了解到一些你不知道的知识呢,尤其是 Mysql安装、Systemctl 和 ufw 命令。

好了,本文大纲如下:

虽然从理论上来说,我应该先讲命令,后讲具体的中间件环境,但是从我个人的角度来体验,先实践,之后弄懂相关命令的意思就有一种恍然大悟的感觉,所以本文将按照上文的顺序进行行文。

大家可能注意到了,上图的命令中并没有基础命令,我认为基础命令扫一眼就行,没必要特殊记忆,我常用的基础命令如下:

  1. top:查看系统进程情况。
  2. cd:切换目录。
  3. vim:修改文件。
  4. mkdir:创建文件夹。

或许是我场景有限,自己玩服务器的话基础命令除了这四个以外别的基本没用过,所以我建议大家也没必要在这方面花费太多时间,尤其是前端同学。

最后,本文的 Linux 环境版本为:Ubuntn 20 LTS,强烈建议大家使用 Ubuntn(确实比较好用),并且希望大家养成点赞后看的好习惯😁😁😁。

注:文本安装中间件都将以官方源进行安装,拒绝使用包管理器的源,和官方保持统一。

Nginx

原来我一直是用源码编译的方式进行安装 Nginx,现在觉得使用包管理器进行安装 + systemctl 管理更方便一些。

进入正题,使用官方源进行安装大致可以分为四步:

  1. 安装依赖。
  2. 生成 / 导入 key。
  3. 设置 Nginx 源。
  4. 安装。
# 安装依赖
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,三个常用命令如下:

  1. Nginx -s reload:重载配置文件。
  2. Nginx -s stop:快速关机。
  3. 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

安装之后的有两个文件路径需要知道:

  1. 启动脚本路径:/usr/bin/redis-server
  2. 配置文件路径:/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 安装完了之后有几个常用目录需要知道:

  1. 配置文件:/etc/mongod.conf。
  2. 数据目录:/var/lib/mongodb。
  3. 日志目录:/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 的安装一般也是两种方法:

  1. 通过使用 MySQL apt 存储库安装(注意:这不是设置官方源的方式)。
  2. 通过 Linux apt 包管理器安装。

由于官网文档中对这两种方案都做了介绍,这代表着这两种方案都可以进行安装,那么我们直接通过 Ubuntu 自带的 apt 包管理器会非常的方便:

sudo apt-get install mysql-server

注意,这条命令会帮你安装最新的 MySQL,在现在这个时间点安装的是 MySQL8,我也强烈建议不要再使用 8 以下的版本了,MySQL 8 带来的性能提升真的非常巨大。

这里需要额外提到一件事,就是 MySQL 的数据目录初始化,如果我们是使用安装程序和包管理器进行安装,一般都会自动进行数据目录初始化,如果非这种方式则需要手动进行数据目录初始化,否则将无法启动 MySQL。

由于我们是使用 apt 方式进行安装,所以无需关心数据目录初始化的事儿,但是仍有一些东西需要我们关注:

默认目录

  1. 数据目录:/var/lib/mysql。
  2. 日志目录:/var/log/mysql。
  3. 配置文件目录:/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 的初始化密码根据安装方式不同默认密码也不同,一般有三种方式:

  1. 安装过程中提示你设置。
  2. 空。
  3. 随机密码。

如果你已经配置了密码可以跳过此节,下面着重说一下没有配置密码的情况,当你没有配置密码时可以使用使用 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 稍微多一些功能,但是总体功能上是差不多的,主要的亮点在于:

  1. 有进度条。
  2. 某些命令显示包的时候带有颜色。
  3. 命令更短。

命令更短这点是我最喜欢的,接下来看一下几个常用命令,命令这方面我不再对比 apt-get,只要记忆 apt 相关命令即可:

  1. Apt search:用来搜索某个包,如:apt search jdk。
  2. Apt install:用来安装某个包,如:apt install nginx。
  3. Apt remove:用来删除某个包,如 apt remove nginx。
  4. Apt purge:用来删除某个包并清除配置,如 apt purge nginx。
  5. Apt show:用来显示某个包的具体信息,如 apt show nginx。
  6. Apt list --installed:列出所有已经安装的包。
  7. Apt autoremove:删除不再使用的库文件和依赖。

简单记忆以上几个命令,一般就够使用了\~

Systemctl

Systemctl 是系统服务管理命令,在旧一点的 Linux 发行版上服务管理一般是 service 命令,而较新的系统上则基本都是 Systemctl,Systemctl 兼容了 service 命令并具有更强大的功能。

不过对于 Systemctl 我觉得我们一般开发者无需了解太多,因为和 Systemctl 配套的都是 Linux 服务相关的知识了,我们只需要了解五个常用命令会用即可:

  1. systemctl enable 服务名:用来设置服务的开机自启,这个大赞,因为更语义化同时命令也更短。
  2. systemctl disable 服务名:用来关闭服务的开机自启。
  3. systemctl start 服务名:启动服务。
  4. systemctl stop 服务名:关闭服务。
  5. systemctl restart 服务名:重启服务。
  6. 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 是个庞大的操作系统,里面随便一点拎出来都能写一本书了,所以希望大家在前期还是以实用为目的进行学习,不要局限在细节里。

好了,不知道大家看完本文之后有没有什么收获,希望大家多为本文点赞,让更多的读者看到好的内容。


和耳朵
763 声望5.4k 粉丝