blog
blog copied to clipboard
划词翻译服务器操作记录
三年前,在某某云的活动下,我买了一台服务器,吃灰两年后居然派上了用场。最近我重装了这台服务器,在网上查了一下,国内似乎用 Centos 的比较多,于是装了 Centos 8.0 系统(但是我最近关注到 Centos 8.0 再过两年就不维护了……算了先装上去再说),然后放了一个星期,今天再 ssh 登录上去的时候,看到了这条消息:
There were 5600 failed login attempts since the last successful login.
也就是从这条消息开始,我的运维生涯开始了……
配置 ssh
出现这条消息的原因是我在安装系统的时候用了 root 用户 + 密码登录的方式,所以有人一直在尝试暴力破解我的密码。虽然可能没有被猜中密码,但我还是重装了服务器。我仍然用了 Centos 8.0 系统,但是我默认使用了密匙登陆的方式,并关闭了密码登录方式。
在 Windows 系统下使用 Bash
虽然云服务器提供商支持使用网页的方式登录到服务器,但是还是用电脑的终端更方便一些。我使用的是 Windows 系统,好在 Windows 现在已经支持 Linux 子系统了。在 PowerShell 中输入 wsl 就可以切换到 Linux 子系统的终端,然后就可以使用 Bash 连接到服务器了。
现在 WSL 已经是版本 2 了,但是我安装的时候还是版本 1。在 PowerShell 运行 wsl -l -v 的时候会看到我的 Ubuntu 运行的是 WSL 1:
> wsl -l -v
NAME STATE VERSION
* Ubuntu Stopped 1
可以去这里下载内核更新包:https://docs.microsoft.com/zh-cn/windows/wsl/install-win10#step-4---download-the-linux-kernel-update-package
安装完成后运行下面的命令进行升级:
> wsl --set-version Ubuntu 2
正在进行转换,这可能需要几分钟时间...
有关与 WSL 2 的主要区别的信息,请访问 https://aka.ms/wsl2
转换完成。
安装 Docker 和 Docker Componse
我的应用是用 Docker 和 Docker Componse 开发的,部署我也决定用这一套。
在 Centos 安装 Docker 的步骤:https://docs.docker.com/engine/install/centos/
安装 Docker Compose 的步骤:https://docs.docker.com/compose/install/
按照文档的步骤来就行。
使用 acme.sh 生成 https 证书
为了让应用支持使用 https 的方式访问,我还需要给 limingkai.cn 创建一个泛域名证书。我使用了 acme.sh 来创建证书,另外,acme.sh 还提供了 Docker 镜像的使用方式。
我一开始本来打算将这个镜像集成到我应用的 compose.yaml 里,但是在看了文档 Deploy certs from a container to another container 之后,我发现即使集成到了 compose.yaml 里,还是要运行几个 docker exec 命令进行创建操作,所以我打算将 acme.sh 作为一个单独的容器来维护,我的应用只需要从它的 volume 里读取生成好的证书就可以了。
首先,按照 Run acme.sh as a docker daemon 的方式创建 acme.sh 的容器:
docker run --rm -itd \
-v acme:/acme.sh \
--net=host \
--name=acme.sh \
neilpang/acme.sh daemon
简单解读一下这条命令:Docker 基于镜像 neilpang/acmesh 创建了一个名为 acme.sh 的容器,这个容器将生成的证书文件夹保存在了名为 acme 的 volume 当中。
运行成功后,可以看到容器已经在运行了:
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1d609a8b0a9d neilpang/acme.sh "/entry.sh daemon" 7 seconds ago Up 6 seconds acme.sh
名为 acme 的 volume 也自动创建了:
$ docker volume inspect acme
[
{
"CreatedAt": "2020-12-22T18:21:41Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/acme/_data",
"Name": "acme",
"Options": null,
"Scope": "local"
}
]
然后,运行下面的命令在这个容器中生成证书:
docker exec \
-e DP_Id=xxx \
-e DP_Key=xxx \
acme.sh --issue --dns dns_dp -d *.limingkai.cn
最后,修改应用的 compose.yaml,用于从名为 acme 的 volume 当中读取证书文件:
services:
app:
volumes:
- type: volume
source: acme
target: /app/acme
volumes:
acme:
external: true
用 docker-compose 运行应用之后,我们就可以在 app 这个容器里看到证书了:
$ docker-compose exec app ls acme/*.limingkai.cn
*.limingkai.cn.cer
*.limingkai.cn.conf
*.limingkai.cn.csr
*.limingkai.cn.csr.conf
*.limingkai.cn.key
ca.cer
fullchain.cer
这样,当应用启动时,只需要在这个文件夹下找到证书就可以了。
这种方式有一个不好的问题就是:当 acme.sh 自动给证书续期后,我的应用不会自动重启。但目前我不需要考虑这一点,毕竟我应该不可能 90 天都不更新我的应用。