全栈开发技术随笔

Git | Node.js | Redis | Nginx | Linux | MySQL 学习笔记

警告
本文最后更新于 2025-06-16,文中内容可能已过时。

💡 本文档说明
汇集了全栈开发必备的核心技术栈笔记,包含实用命令、最佳实践和常见问题解决方案。


📚 目录


🗂️ Git版本控制

安装并配置环境变量

官网:https://git-scm.com/

镜像:speed-git-for-windows

图13

安装Git,选择安装目录,然后一直点击next,直到出现install,点击install,安装完成后点击finish完成。


检查是否安装成功

1
2
# 查看命令
git --version

配置用户名和邮箱

在桌面任意位置右键,点击 Git bash here,在弹出界面中输入

1
2
git config --global user.name "xxx"
git config --global user.email xxx@xx

如果使用了 –global 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情, Git 都会使用这些信息。 当想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有 –global 选项的命令来配置。

使用 git config –global –list 命令,检查配置好没有

1
2
3
4
git config --global --list

user.name=xxx
user.email=xxx@xx

环境变量

win+r 输入 cmd 打开,输入命令行 where git 并回车,复制返回的地址。

1
2
C:\Users\Admin>where git
C:\Program Files\Git\cmd\git.exe

图14

配置好环境变量后,win+r 输入 cmd 打开,输入 git ,会弹出以下界面,说明安装配置成功。

图15

阿里云效

在 Windows 系统的标准命令提示符(cmd)中,波浪线 ~符号无法被正确识别为用户主目录的缩写。

解决方法:在 Windows 搜索栏中输入 Git Bash 并打开它,在 Git Bash 中进行以下操作。

第 1 步:生成 SSH 密钥对

  1. 执行密钥生成命令

使用更现代的 ed25519 算法生成密钥

1
ssh-keygen -t ed25519 -C "your_work_email@example.com" -f ~/.ssh/codeup_work

命令解释:

  • ssh-keygen:用于生成、管理和转换 SSH 认证密钥的工具。
  • -t ed25519:指定生成密钥的算法类型为 ed25519,这是一种既安全又高效的算法。
  • -C “your_work_email@example.com”:在密钥中添加注释,通常填写你的工作邮箱。这个注释会出现在生成的公钥文件末尾,用于标识这个密钥的所有者。
  • -f ~/.ssh/codeup_work:指定生成的密钥文件的路径和名称。这里我们自定义为 codeup_work,以便与可能存在的其他密钥(如 GitHub 的)区分开。

  1. 设置密钥口令

执行命令后,命令行会交互式地提示你:

1
2
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

命令解释:你可以为私钥设置一个口令(passphrase)。这相当于为私钥再加一把锁,即使私钥文件意外泄露,没有口令也无法使用。如果直接按回车,则表示不设置口令。


执行成功后,你会在 ~/.ssh/ 目录下得到两个文件:

  • codeup_work:这是你的 私钥,必须严格保密,绝不能泄露给他人。
  • codeup_work.pub:这是你的 公钥,需要上传到阿里云效。

第 2 步:添加公钥到阿里云效

  1. 查看并复制公钥内容
1
cat ~/.ssh/codeup_work.pub

  1. 在云效平台添加公钥
  • 登录阿里云效(https://codeup.aliyun.com/)。
  • 点击页面右上角个人头像,进入 「个人设置」​ -> 「SSH 公钥」。
  • 点击 「添加 SSH 公钥」。
  • 在 「公钥内容」​ 文本框中,粘贴你刚才复制的整个公钥内容(通常以 ssh-ed25519 …开头,以你的邮箱注释结尾)。
  • 为公钥起一个易于识别的 「公钥标题」,比如“我的工作电脑”。
  • 设置公钥的 「作用范围」(读写或只读)和 「过期时间」,然后点击添加。

第 3 步:配置 SSH 客户端

为了让你的 SSH 客户端在访问阿里云效时能自动识别并使用正确的私钥,需要创建或修改 SSH 的配置文件。

  1. 创建或编辑配置文件

在终端中,使用文本编辑器(如 vim、nano或 code)打开 ~/.ssh/config文件。如果文件不存在,编辑器会新建一个。

1
nano ~/.ssh/config

  1. 添加云效配置

在文件中添加以下内容:

1
2
3
4
5
6
# 阿里云效工作账号
Host codeup.aliyun.com
  HostName codeup.aliyun.com
  IdentityFile ~/.ssh/codeup_work
  PreferredAuthentications publickey
  IdentitiesOnly yes

配置解释:

  • Host codeup.aliyun.com:定义一个主机别名。当你在命令行中访问 git@codeup.aliyun.com时,就会应用此配置块的规则。
  • HostName codeup.aliyun.com:指定真实的主机名。
  • IdentityFile ~/.ssh/codeup_work:这是最关键的一行,它明确指定了在连接到此主机时使用的私钥文件路径,即我们刚刚生成的 codeup_work。
  • PreferredAuthentications publickey:优先使用公钥认证。
  • IdentitiesOnly yes:只使用配置文件中指定的密钥进行身份验证,避免 SSH 客户端尝试其他不相关的密钥。

第 4 步:测试连接配置

配置完成后,最好测试一下是否成功。

执行以下命令来验证连接:

1
ssh -T git@codeup.aliyun.com

命令解释:

  • -T:这个选项表示不分配伪终端(PTY),因为我们只是测试认证是否通过,不需要真正的 Shell 交互。
  • 如果配置正确,你会看到一条欢迎信息,内容可能包含你的云效用户名,这表明你已经成功通过 SSH 密钥认证。

第 5 步:在 Git 项目中使用

现在,你可以在克隆项目或修改远程仓库地址时使用 SSH 协议了。

  1. 克隆项目:复制项目提供的 SSH 地址(格式为 git@codeup.aliyun.com:…),直接使用 git clone命令即可。因为我们已经配置了 config文件,它会自动使用正确的密钥。
1
git clone git@codeup.aliyun.com:your_namespace/your_project.git

  1. 修改现有项目的远程地址:如果你的项目之前使用的是 HTTPS 协议,可以修改为 SSH。
1
git remote set-url origin git@codeup.aliyun.com:your_namespace/your_project.git

GitHub

第 1 步:生成 SSH 密钥对

在 Git Bash 中执行以下命令:

1
ssh-keygen -t ed25519 -C "your_email" -f ~/.ssh/github_key

参数解释:

  • -t ed25519:使用高效的加密算法
  • -C “your_email@163.com”:替换为您的 GitHub 注册邮箱
  • -f ~/.ssh/github_key:指定密钥文件名(与阿里云效的不同)

第 2 步:查看并复制公钥

生成成功后,查看公钥内容:

1
cat ~/.ssh/github_key.pub

选中显示的全部内容(以 ssh-ed25519开头,邮箱结尾)并复制。


第 4 步:将公钥添加到 GitHub

  1. 登录 GitHub → 点击头像 → Settings
  2. 左侧菜单选择 SSH and GPG keys
  3. 点击 New SSH key
  4. 填写标题(如 “My Windows PC”),粘贴公钥内容
  5. 点击 Add SSH key

第 5 步:配置 SSH 客户端

编辑 SSH 配置文件,确保连接 GitHub 时使用正确的密钥:

1
2
# 打开配置文件
notepad ~/.ssh/config

添加以下内容(如果文件已存在,追加在末尾):

1
2
3
4
5
6
# GitHub 配置
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/github_key
  IdentitiesOnly yes

第 6 步:测试连接

1
ssh -T git@github.com

如果看到 “You’ve successfully authenticated…” 的欢迎信息,说明配置成功!


多账号管理技巧

如果您同时需要连接阿里云效和 GitHub,完整的 ~/.ssh/config文件应该这样配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 阿里云效配置
Host codeup.aliyun.com
  HostName codeup.aliyun.com
  User git
  IdentityFile ~/.ssh/codeup_work

# GitHub 配置
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/github_key

这样系统就会根据您访问的域名自动选择对应的密钥进行认证。

关键提醒:​始终使用 Git Bash 而不是 cmd 来执行 SSH 和 Git 相关命令,这样可以避免很多路径识别问题。

config位置C:\Users\用户名\.ssh

常见场景处理

Zip下载项目同步最新代码

场景描述: 从GitHub下载压缩包解压使用,需要同步项目最新更新

解决方案:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 1. 初始化Git仓库
git init

# 2. 添加远程仓库
git remote add origin https://github.com/用户名/项目名.git

# 3. 验证远程仓库
git remote -v

# 4. 拉取最新代码
git pull origin main

常见问题处理:

  • 未跟踪文件冲突

    1
    2
    
    git status  # 查看状态
    # 按提示手动处理冲突文件
  • 完全覆盖本地更改

    1
    2
    
    git fetch origin
    git reset --hard origin/main

⚠️ 警告: 强制覆盖会丢失所有本地更改,请谨慎使用

网络连接问题

OpenSSL SSL连接错误解决方案:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 查看当前代理配置
git config --global --get http.proxy
git config --global --get https.proxy

# 清理代理配置
git config --global --unset http.proxy
git config --global --unset https.proxy

# 设置代理(根据实际情况调整端口)
git config --global http.proxy '127.0.0.1:8000'
git config --global https.proxy '127.0.0.1:8000'

# 为特定远程仓库添加代理例外
git config --global --add remote.origin.proxy ""

⚡ Node.js后端开发

基础配置

环境介绍

Node.js核心特性:

  • 基于Chrome V8引擎的JavaScript运行环境
  • 事件驱动、非阻塞式I/O模型
  • 轻量高效的后端解决方案
  • npm作为全球最大的开源库生态系统

安装配置

Node.js核心特性:

  • 基于Chrome V8引擎的JavaScript运行环境
  • 事件驱动、非阻塞式I/O模型
  • 轻量高效的后端解决方案
  • npm作为全球最大的开源库生态系统

安装流程:

  1. 访问官网下载:Node.js官网

    /images/posts/技术随笔整合/1.png
    图1: Node.js官方下载页面
  2. 下载后启动安装程序,一直点击 next 即可

  3. DOS 窗口中,输入命令查看是否安装成功

    /images/posts/技术随笔整合/2.png
    图2: 验证Node.js和npm安装成功

    说明:新版的 Node.js 已自带 npm,安装 Node.js 时会一起安装,npm 的作用就是对 Node.js 依赖的包进行管理,也可以理解为用来安装/卸载 Node.js 需要装的东西。

🎯 环境优化配置详解

背景说明:这里的环境配置主要配置的是 npm 安装的全局模块所在的路径,以及缓存 cache 的路径。之所以要配置,是因为执行类似 npm install express [-g]-g 代表 global 全局安装)的安装语句时,npm 会将安装的模块默认安装到 C:\Users\用户名\AppData\Roaming\npm 路径中,长期使用会占用系统C盘空间。

配置目标: 将全局模块和缓存目录重定向到Node.js安装目录

步骤一:创建专用目录

  1. 在Node.js安装文件夹 D:\Program Files\nodejs 下创建两个文件夹:

    • node_global - 用于存放全局npm模块
    • node_cache - 用于存放npm缓存
    /images/posts/技术随笔整合/3.png
    图3: 创建node_global和node_cache文件夹

    重要提醒:这两个文件夹需要打开修改权限,否则会报错没有权限(右键 → 属性 → 安全 → 编辑 → 给予完全控制权限)

步骤二:配置npm路径

  1. 打开 CMD 命令窗口,输入以下命令:

    1
    2
    
    npm config set prefix "D:\Program Files\nodejs\node_global"
    npm config set cache "D:\Program Files\nodejs\node_cache"
    /images/posts/技术随笔整合/4.png
    图4: 配置npm全局模块和缓存路径

步骤三:设置系统环境变量

  1. 右键 我的电脑属性高级系统设置高级环境变量

  2. 系统变量 部分新建以下变量:

    • NODE_PATH = D:\Program Files\nodejs\node_global\node_modules
    • Path 变量中添加:D:\Program Files\nodejs\node_global
    /images/posts/技术随笔整合/5.png
    图5: 新建NODE_PATH系统变量
    /images/posts/技术随笔整合/6.png
    图6: 在Path中添加node_global路径

步骤四:功能测试

  1. 全局安装常用模块测试:

    1
    
    npm install -g express
    /images/posts/技术随笔整合/7.png
    图7: 全局安装express模块
  2. 再次安装其他模块验证:

    1
    
    npm install -g vue
  3. 验证安装结果:

    /images/posts/技术随笔整合/8.png
    图8: 验证全局模块已安装到指定目录

    成功标志:可以看到全局包 vueexpress 已经正确安装到我们设置的自定义目录 D:\Program Files\nodejs\node_global 中,而不是默认的C盘路径。

文件操作详解

四种文件读取方式对比

方法 类型 特点 适用场景
fs.readFile 异步回调 非阻塞 简单异步操作
fs.readFileSync 同步 阻塞主线程 脚本初始化
fs.promises.readFile Promise 现代异步 需要链式调用
fs.createReadStream 流式 内存友好 大文件处理

代码示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// 1. 异步回调方式
const fs = require('fs');
fs.readFile('example.txt', 'utf8', (err, data) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(data);
});

// 2. 同步方式
const fs = require('fs');
try {
  const data = fs.readFileSync('example.txt', 'utf8');
  console.log(data);
} catch (err) {
  console.error(err);
}

// 3. Promise方式(推荐)
const fs = require('fs').promises;
async function readFile() {
  try {
    const data = await fs.readFile('example.txt', 'utf8');
    console.log(data);
  } catch (err) {
    console.error(err);
  }
}

// 4. 流式方式(适合大文件)
const fs = require('fs');
const stream = fs.createReadStream('example.txt', { encoding: 'utf8' });

stream.on('data', (chunk) => {
  console.log('Received chunk:', chunk);
});

stream.on('end', () => {
  console.log('File reading completed');
});

stream.on('error', (err) => {
  console.error('Error reading file:', err);
});

📝 提示: 不指定编码时,数据以Buffer形式返回


🚀 Redis缓存系统

Redis Stream消息队列

Redis Stream是Redis 5.0引入的强大消息队列功能,支持消费者组、消息持久化等高级特性。

基础操作

1
2
3
4
5
6
7
8
# 进入Redis容器
docker exec -it redis /bin/bash

# 连接Redis服务器
redis-cli

# 清空当前数据库
127.0.0.1:6379> flushdb

消息所有权转移

在消费者组内转移消息所有权:

1
XCLAIM <key> <group> <new-consumer> <min-idle-time> <ID-1> [<ID-2> ...]

参数说明:

  • <key>: 流的键名(如:user)
  • <group>: 消费者组名称(如:deepseek_group)
  • <new-consumer>: 新的消费者名称
  • <min-idle-time>: 最小空闲时间(毫秒)
  • <ID-1>: 要转移的消息ID

消息状态查询

查看待处理消息详情:

1
XPENDING key group [start end count] [consumer]

示例返回:

1) (integer) 1        # 总待处理消息数
2) "1760073567441-0"  # 最小消息ID
3) "1760073567441-0"  # 最大消息ID
4) 1) 1) "xxx"        # 消费者名称
      2) "1"          # 该消费者待处理消息数

查看消息重试次数:

1
XPENDING <key> <group> 1761900913514-0 1761900913514-0 1

返回信息解析:

1) 1) "1761900913514-0"    # 消息ID
   2) "xxx"                # 当前持有者
   3) (integer) 189763455  # 空闲时间(毫秒)
   4) (integer) 1          # 重试次数

消息确认

1
XACK <key> <group> <ID-1> [<ID-2> ...]

🌐 Nginx服务器

常用管理命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 检查配置文件语法
/usr/local/nginx/sbin/nginx -t

# 重启服务
/usr/local/nginx/sbin/nginx -s reload

# 启动服务
/usr/local/nginx/sbin/nginx

# 停止服务
/usr/local/nginx/sbin/nginx -s stop

💡 最佳实践: 每次修改配置后,先用-t检查语法,再进行重启操作


🐧 Linux系统管理

文件传输

Docker镜像传输

1
2
3
4
5
6
7
8
# 保存镜像
docker save -o xiaozhi-esp32-server.tar xiaozhi-esp32-server:server_latest

# 传输到远程服务器
scp xiaozhi-esp32-server.tar user@remote-ip:/data/

# 在目标服务器加载镜像
docker load -i /path/to/xiaozhi-esp32-server.tar

防火墙管理

IP访问控制

1
2
3
4
5
6
7
8
# 添加信任IP(永久生效)
sudo firewall-cmd --permanent --add-source=xxx.xxx.xxx.xxx

# 重载配置
sudo firewall-cmd --reload

# 查看已添加的IP
sudo firewall-cmd --list-sources

端口管理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 查看当前开放端口
sudo firewall-cmd --list-all

# 添加端口
sudo firewall-cmd --add-port=30800/tcp --permanent
sudo firewall-cmd --reload

# 移除端口
sudo firewall-cmd --remove-port=30800/tcp --permanent
sudo firewall-cmd --reload

Docker容器管理

常用命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# 容器操作
docker exec -it container_name /bin/bash

# 服务管理
docker compose up -d           # 后台启动
docker compose up -d --build --force-recreate  # 强制重建
docker compose up -d web db    # 指定服务启动
docker compose stop            # 停止服务
docker compose start           # 启动服务
docker compose down            # 停止并删除
docker compose down -v         # 完全清理(含数据卷)

# 监控调试
docker compose ps              # 查看状态
docker compose logs -f         # 实时日志
docker compose config --services  # 查看服务列表
docker logs -f container_id    # 查看容器日志

# 文件操作
docker cp [OPTIONS] /宿主机/源/路径/文件 容器名称或ID:容器内/目标/路径/   # 从宿主机复制到容器
docker cp [OPTIONS] 容器名称或ID:容器内/源/路径/文件 /宿主机/目标/路径/   # 从容器复制到宿主机

数据卷挂载

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
services:
  sillytavern:
    image: ghcr.io/sillytavern/sillytavern:latest
    ports:
      - "8000:8000"
    volumes:
      - "./config:/home/node/app/config"
      - "./data:/home/node/app/data"
      - "./plugins:/home/node/app/plugins"
      - "./extensions:/home/node/app/public/scripts/extensions/third-party"
    restart: unless-stopped

挂载说明:

  • 左侧为主机路径,右侧为容器内路径
  • 数据持久化存储在主机,确保容器删除后数据不丢失

权限管理

1
2
# 递归设置文件夹权限
chmod -R 777 /path/to/directory/

🗄️ MySQL数据库

🔧 远程连接配置

🌍 启用局域网访问

在开发和生产环境中,经常需要从其他机器访问MySQL数据库。默认情况下,MySQL只允许本地连接,需要进行相应配置才能启用远程访问。

问题场景: 局域网内MySQL连接被拒绝

解决方案: 通过修改用户权限配置允许远程连接

📋 详细配置步骤

步骤一:连接数据库服务器

  1. 使用 Navicat for MySQL 或其他数据库管理工具连接MySQL服务器
  2. 输入正确的连接信息(主机、端口、用户名、密码)

步骤二:访问系统数据库

  1. 在连接成功后,在连接列表中找到并双击 mysql 系统数据库
  2. 该数据库包含MySQL服务器的系统信息和用户权限数据

步骤三:修改用户权限配置

  1. mysql 数据库中找到 user 数据表并打开

  2. 定位需要用于远程连接的目标用户记录

  3. 找到 host 字段,将其值从 localhost 修改为 %

    /images/posts/技术随笔整合/9.png
    图9: 在user表中修改host字段为%

    说明: % 是通配符,表示允许该用户从任何主机连接数据库

步骤四:应用权限变更

  1. 完成修改后,需要刷新MySQL的权限缓存

  2. 执行以下SQL命令使配置立即生效:

    1
    
    FLUSH PRIVILEGES;
    /images/posts/技术随笔整合/10.png
    图10: 执行FLUSH PRIVILEGES命令刷新权限

步骤五:验证配置

  1. 在远程机器上尝试连接数据库
  2. 确认连接成功且具有相应权限

⚠️ 安全提醒: 修改前请确认该用户的权限范围符合安全要求,过于宽泛的权限可能带来安全风险

🛡️ 安全最佳实践

  • 限制IP范围: 生产环境建议将 % 改为具体的IP地址或IP段
  • 最小权限原则: 只授予必要的权限给远程用户
  • 强密码策略: 确保远程连接使用强密码
  • 定期审计: 定期检查和清理不必要的用户权限

🔍 查看用户信息

在数据库管理过程中,有时需要查看MySQL的用户信息和认证字符串。

📊 查看所有用户详情

SQL查询语句:

1
2
SELECT HOST, USER, authentication_string
FROM mysql.USER;

执行查询:

/images/posts/技术随笔整合/11.png
图11: 执行SQL查询查看用户信息

查询结果说明:

  • HOST:用户允许连接的主机地址
  • USER:用户名
  • authentication_string:密码的MD5加密字符串

🔓 密码解密方法

由于MySQL将密码存储为MD5加密字符串,有时需要解密查看原始密码:

在线解密网站:

  • 主要推荐:https://md5.cc
  • 备选方案:可搜索"MD5在线解密"找到其他可靠网站

解密操作步骤:

  1. 复制查询结果中的 authentication_string
  2. 访问MD5解密网站
  3. 在搜索框中输入加密字符串
  4. 点击解密按钮获取原始密码
/images/posts/技术随笔整合/12.png
图12: 使用在线工具解密MD5密码

💡 使用场景: 密码解密常用于数据库迁移、系统维护或忘记密码时的情况

⚠️ 注意事项:

  • MD5加密不可逆,解密成功率取决于密码复杂度
  • 对于安全性要求较高的环境,应优先考虑重置密码而不是解密

🔄 重置用户密码(推荐)

如果解密失败或为了提高安全性,建议直接重置密码:

1
2
3
4
5
6
7
8
-- 重置用户密码(MySQL 5.7+)
ALTER USER '用户名'@'主机' IDENTIFIED BY '新密码';

-- 或使用旧语法(向下兼容)
UPDATE mysql.USER SET authentication_string = PASSWORD('新密码') WHERE USER = '用户名' AND HOST = '主机';

-- 刷新权限
FLUSH PRIVILEGES;

💡 最佳实践: 在生产环境中,建议使用更安全的认证方式,如 mysql_native_passwordcaching_sha2_password



0%