本文将指导使用 xcaddy 自定义编译 Caddy。

PS:本文同时适用于 Debian 10 Buster 以及 Ubuntu 20.04 Focal

xcaddy 是 Caddy 官方制作的用于自定义编译 Caddy 的工具,它可以帮助我们快速的编译出符合自己需求的 Caddy。

安装 xcaddy

我们按照官方的安装方法,首先,安装一些必要的软件包:

apt update
apt upgrade -y
apt install curl vim wget gnupg dpkg apt-transport-https lsb-release ca-certificates

然后按照官方教程安装 Go:

wget https://go.dev/dl/go1.19.5.linux-amd64.tar.gz
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.19.5.linux-amd64.tar.gz

然后把 go 加入系统环境变量:

echo "export PATH=\$PATH:/usr/local/go/bin" >> /etc/profile

然后加入 Caddy 的 GPG 公钥和 apt 源:

curl -sSL https://dl.cloudsmith.io/public/caddy/xcaddy/gpg.key | gpg --dearmor > /usr/share/keyrings/xcaddy.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/xcaddy.gpg] https://dl.cloudsmith.io/public/caddy/xcaddy/deb/debian any-version main" > /etc/apt/sources.list.d/xcaddy.list

然后更新系统后即可安装 xcaddy:

apt update
apt install xcaddy

重启打开 SSH 后检查一下 go 和 xcaddy 的版本:

root@debian ~ # go version
go version go1.19.5 linux/amd64

root@debian ~ # xcaddy version
v0.3.1 h1:XKmnGnGTeB53hLUgnGr/R4JbTNSxh8IBAFcJkrtycso=

自定义编译 Caddy

我们可以选择一些自己喜欢的模块,比如缓存模块和 Brotli 压缩模块:

xcaddy build \
    --with github.com/caddyserver/cache-handler \
	--with github.com/ueffel/caddy-brotli

经过一段时间的编译以后,我们就可以在当前目录下看到一个名为 caddy 的二进制文件,这就是我们自定义编译的 Caddy 了。

自定义 Caddy 和系统 Caddy 共存

如果我们想要自定义 Caddy 和系统 Caddy 共存,可以使用官方的教程

首先,按照我们的教程安装 Caddy,安装完毕后,先停止 Caddy 服务:

systemctl stop caddy

然后使用 dpkg-divert 命令将系统 Caddy 的二进制文件移动到 /usr/bin/caddy.default 并做软链接:

dpkg-divert --divert /usr/bin/caddy.default --rename /usr/bin/caddy

然后把我们自己编译好的 Caddy 二进制文件移动到 /usr/bin/caddy.custom

mv ./caddy /usr/bin/caddy.custom

然后设置优先级,让我们的自定义 Caddy 优先启动:

update-alternatives --install /usr/bin/caddy caddy /usr/bin/caddy.default 10
update-alternatives --install /usr/bin/caddy caddy /usr/bin/caddy.custom 50

此时我们可以看到默认的 /usr/bin/caddy 已经是我们自定义的 Caddy 了:

root@debian ~ # ls -l /usr/bin/caddy
lrwxrwxrwx 1 root root 23 Jan 22 10:52 /usr/bin/caddy -> /etc/alternatives/caddy*

root@debian ~ # ls -l /etc/alternatives/caddy
lrwxrwxrwx 1 root root 21 Jan 22 10:52 /etc/alternatives/caddy -> /usr/bin/caddy.custom

我们也可以使用 update-alternatives --config caddy 命令来切换系统安装的 Caddy 和自定义的 Caddy:

root@be ~ # update-alternatives --config caddy
There are 2 choices for the alternative caddy (providing /usr/bin/caddy).

  Selection    Path                    Priority   Status
------------------------------------------------------------
* 0            /usr/bin/caddy.custom    50        auto mode
  1            /usr/bin/caddy.custom    50        manual mode
  2            /usr/bin/caddy.default   10        manual mode

Press <enter> to keep the current choice[*], or type selection number:

我们可以看到默认的 Caddy 二进制文件是我们自定义的,你可以输入 0(按照优先级自动) 1(手工切换自定义 Caddy) 或 2(使用系统默认 Caddy)来修改并切换默认的 Caddy 版本。

要将 Rocky Linux 更换为国内源,您可以按照以下步骤进行操作:

1. 备份当前源文件

在更改之前,最好备份一下当前的源文件,以防万一。可以使用以下命令将当前的源文件备份到 /etc/yum.repos.d/ 目录中:

sudo cp /etc/yum.repos.d/Rocky-*.repo /etc/yum.repos.d/Rocky-*.repo.backup

2. 下载新的源文件

您可以使用以下命令下载中国科技大学(USTC)的 Rocky Linux 源文件,并将其放置在 /etc/yum.repos.d/ 目录中:

sudo curl -o /etc/yum.repos.d/Rocky-BaseOS.repo http://mirrors.ustc.edu.cn/rocky/8/BaseOS/x86_64/os/Rocky-BaseOS.repo
sudo curl -o /etc/yum.repos.d/Rocky-AppStream.repo http://mirrors.ustc.edu.cn/rocky/8/AppStream/x86_64/os/Rocky-AppStream.repo

3. 清除缓存并更新

完成更改后,可以使用以下命令清除缓存,并使用新的源更新软件包:

sudo yum clean all
sudo yum update

完成这些步骤后,Rocky Linux 环境就成功更换为国内源了。

要更换Ubuntu 22的国内源,可以按照以下步骤操作:

1.打开终端,进入 /etc/apt/ 目录

cd /etc/apt/

2.备份原有的 sources.list 文件

sudo cp sources.list sources.list.backup

3.编辑 sources.list 文件

sudo nano sources.list

4.将文件内容替换为以下内容,这是清华大学镜像源的例子,可以根据自己的需要来修改

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ hirsute main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ hirsute main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ hirsute-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ hirsute-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ hirsute-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ hirsute-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ hirsute-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ hirsute-security main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ hirsute-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ hirsute-proposed main restricted universe multiverse

5.保存并退出编辑器,运行以下命令更新软件包列表

sudo apt update

这样,Ubuntu 22 就已经成功更换了国内源。

该错误表示系统中没有找到可执行sudo命令。sudo是Linux和Unix系统中的特权命令,允许普通用户以超级用户(也称为root用户)的身份执行操作。

如果正在使用MacOS系统,则可以尝试通过在终端中输入以下命令来安装sudo:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

如果正在使用Ubuntu或Debian系统,则可以使用以下命令安装sudo:

apt-get update
apt-get install sudo

如果您正在使用其他Linux或Unix系统,请参考相关文档以了解如何安装sudo或联系系统管理员。

该错误通常是因为正在使用不支持apt-cache命令的操作系统或发行版。apt-cache命令通常用于Debian及其衍生发行版中,如Ubuntu。

如果您在Debian或Ubuntu上使用该命令,请尝试更新包管理器,使用以下命令:

sudo apt-get update

如果使用的是不同的操作系统或发行版,请尝试使用相应的包管理器来更新软件包。例如,如果使用的是CentOS或Fedora,请使用以下命令更新软件包:

sudo yum update

如果仍然遇到问题,请检查PATH环境变量是否正确设置,以确保可以访问系统上的正确命令。

-bash: tcping: command not found“是因为系统中没有安装tcping命令。

要解决这个问题,需要在系统上安装tcping命令。以下是一些常用操作系统的安装方式:

1. 对于Debian/Ubuntu系统,可以使用apt-get命令安装tcping:

sudo apt-get update
sudo apt-get install tcping

2. 对于CentOS/RHEL系统,您可以使用yum命令安装tcping:

sudo yum update
sudo yum install tcping

3. 对于MacOS系统,您可以使用brew命令安装tcping:

brew install tcping

安装完成后,您应该能够在终端中运行tcping命令了。

这个错误通常是因为你的系统上没有安装Vim编辑器导致的。

如果你使用的是Linux或MacOS操作系统,可以尝试以下方法来安装Vim:

1. 使用包管理器安装Vim,例如在Ubuntu上使用以下命令:

sudo apt-get install vim

或者在Mac上使用Homebrew包管理器:

brew install vim

2. 如果你无法使用包管理器,则可以从Vim的官方网站(https://www.vim.org/download.php)下载Vim二进制文件。

3. 或者你也可以使用另一个编辑器代替Vim,例如Emacs或Nano等。

安装完成之后,输入vim命令应该就可以打开Vim编辑器了。

要在 Linux 上解压 RAR 文件,需要先安装一个支持 RAR 格式的解压缩程序。以下是在 Debian 或 Ubuntu 上安装的步骤:

1. 打开终端窗口
2. 运行以下命令以更新软件包列表:

sudo apt-get update   

3. 运行以下命令以安装 unrar:

sudo apt-get install unrar   

4. 运行以下命令以解压缩 RAR 文件(将 <file.rar> 替换为实际的文件名):

unrar x <file.rar>   

该命令将解压缩 RAR 文件并将其放置在当前目录下。

现象描述

日志中出现报错信息 “fork:Cannot allocate memory”。如下图所示:

可能原因

可能是进程数超限导致。系统内部的总进程数达到了 pid_max 时,再创建新进程时会报 “fork:Cannot allocate memory” 错。

解决思路

  1. 参考 处理步骤,查看实例内存使用率是否过高。
  2. 核实总进程数是否超限,并修改总进程数 pid_max 配置。

处理步骤

1、执行以下命令,查看系统 pid_max 值。

sysctl  -a | grep pid_max

根据返回结果,进行对应操作:

1.1、返回结果如下图所示,pid_max 默认值为32768,请执行下一步。

1.2、返回报错信息 “fork:Cannot allocate memory”,则需执行以下命令,临时调大 pid_max

echo 42768 > /proc/sys/kernel/pid_max

您可再次执行命令,查看系统 pid_max 值。

2、执行以下命令,查看系统内部总进程数。

pstree -p | wc -l

若总进程数达到了 pid_max,则系统在创建新进程时会报 “fork Cannot allocate memory” 错。

您可执行 ps -efL 命令,定位启动进程较多的程序。

3、将 /etc/sysctl.conf 配置文件中的 kernel.pid_max 值修改为65535,以增加进程数。修改完成后如下图所示:

4、执行以下命令,使配置立即生效。

sysctl -p

现象描述

Linux 云服务器在内存使用率未占满的情况下触发了 OOM(Out Of Memory)。如下图所示:

可能原因

可能是由系统可用内存低于 min_free_kbytes 值导致。min_free_kbytes 值表示强制 Linux 系统最低保留的空闲内存(Kbytes),如果系统可用内存低于设定的 min_free_kbytes 值,则默认系统启动 oom-killer 或强制重启。具体行为由内核参数 vm.panic_on_oom 值决定:

  • 若 vm.panic_on_oom=0,则系统会提示 OOM,并启动 oom-killer 杀掉占用最高内存的进程。
  • 若 vm.panic_on_oom =1,则系统会自动重启。

解决思路

  1. 参考处理步骤进行排查,查看实例内存使用率是否过高及总进程数是否受限。
  2. 核实 min_free_kbytes 值设置,并修改为正确配置。

处理步骤

1、登录云服务器,执行以下命令查看 min_free_kbytes 值

sysctl -a | grep min_free

min_free_kbytes 值单位为 kbytes,下图所示 min_free_kbytes = 1024000 即为1GB。

2、执行以下命令,使用 VIM 编辑器打开 /etc/sysctl.conf 配置文件。

vim /etc/sysctl.conf

3、按 i 进入编辑模式,修改 vm.min_free_kbytes 配置项。若该配置项不存在,则直接在配置文件中增加即可。

*建议修改 vm.min_free_kbytes 值为不超过总内存的1%即可。

4、按 Esc 并输入 :wq 后,按 Enter 保存并退出 VIM 编辑器。

5、执行以下命令,使配置生效即可。

sysctl -p