zzxworld

从零配置一台阿里云 ECS Linux 服务器

最近在 BF 上刷到好几位博主入手了阿里云 99 元一年的服务器,我的服务器刚好还有一个多月到期,配置跟这款 99 元的差不多,但续费要 918 元。这价格差距怎么看都没必要再续费旧服务器,于是立马入手了一台。

友情提示:99 元入手后,还可以以 99 元的价格再续费一年。相当于是用 198 元的价格买 2 年,阿里云难得大气了一回。说来惭愧,作为多年的阿里云老用户,第一次见识到这么优惠的折扣,下单后还反复确认了几次,生怕其中「暗藏玄机」。这实在不像我印象中阿里云对待老用户的风格。

担心归担心,既然已经下单,还是要放心的去用。面对一台新服务器,自然少不了要从零开始搭建线上服务环境。快一年左右没折腾线上环境,手艺有些生疏,趁着这次机会就顺便记录一下相关过程。

首先在下单选择系统环节,我选择了 Alibaba Cloud Linux 系统,这是继 CentOS 宣布要停止服务后我在阿里云上比较青睐的选择。原因有两方面,一是阿里云自家维护的系统,出问题解决起来会更加有效率;第二是这个系统每个主版本的维护时间长达 10 年,作为线上环境,维护时间自然是越久越好,可以减少一些折腾基础环境的事情。Debian 是另外一个我比较青睐的选择,不过在阿里云,它是我的第二选择。

服务器启动后,可以使用 root 账号通过公网 IP 以 SSH 的方式登录系统。如果在下单时没有设置 root 密码,可以进入购买的服务器详情页面重置 root 登录密码。

登录进入系统后,要做的第一件事是把系统安全补丁更新到最新。命令如下:

dnf upgrade-minimal --security

然后开始服务器的账号登录安全配置,首先创建一个日常使用的普通账号:

useradd -m -G wheel zzxworld

上面使用 useradd 命令创建一个名为 zzxworld 的普通用户,复制使用上面的命令记得改成自己的命名-m 参数表示在 /home 目录下创建和账号同名的主目录;-G wheel 表示把用户加入 wheel 用户组。这是在大部分 Linux 系统中比较特殊的一个用户组,加入此用户组的用户可以使用 sudo 命令来执行提权操作,从而避免使用 root 账号。

接下来给新增的用户设置密码:

passwd zzxworld

zzxworld 是用户名,复制以上命令记得替换成自己的。

完成普通用户添加后,可以把 root 账号打入冷宫了。退出当前的 root 账号,然后使用刚刚创建的用户登录,继续安全配置事项。接下来要做的是调整 SSH 远程登录配置,首先要把默认的 22 端口改了,太多的恶意软件每天会不分昼夜的扫描这个端口并尝试暴力破解登录账号和密码。有兴趣可以去看看自己服务器上的 /var/log/secure 文件内容,一定会震撼到你。

使用顺手的编辑工具打开 /etc/ssh/sshd_config 文件,我习惯使用 vi,命令如下:

sudo vi /etc/ssh/sshd_config

找到其中的 #Port 22 这行,取消注释符号,把后面的 22 随便自定义一个数字。当然也别太随意,有两个规则:

  1. 别和系统保留端口号冲突,所以尽量别低于 1024。
  2. 别超过 65535。

改完后重启 SSH 服务使新端口生效:

sudo systemctl restart sshd

然后退出账号重新登录,正常情况下会登录不上,说明新端口生效了。使用自己定义的端口再连接试试,应该还是会连接不上,因为还有阿里云的一层安全策略,需要登录阿里云后台,进入服务器的详情界面,找到安全组配置,需要把自定义的端口加入到「入规则」里面去。顺便可以把 22 端口的规则删了,已经不在需要;加上 443 端口,网站加密证书访问用得上。

再次尝试 SSH 连接,一切无误的话就可以连接上服务器。仅凭改端口还无法很好的保障 SSH 账号安全,更进一步是进行证书免密登录。配置过程参考我之前分享的一篇文章,此处不再赘述:

配置完证书登录,并确认无需密码就能登录上服务器后,再次编辑一下 /etc/ssh/sshd_config 文件,并修改以下两项配置:

PermitRootLogin no
PasswordAuthentication no

上面两行配置第一行是禁止 root 账号远程登录;第二行是关闭密码登录认证;这样一来,基本可以杜绝 SSH 账号被暴力破解的风险。

完成了登录账号的安全配置,接下来只需要根据项目需求配置相关的服务。比如运行网站少不了的 Nginx:

sudo dnf install nginx

让 Nginx 启动自动运行,并立马启动 Nginx 服务:

sudo systemctl enable nginx
sudo systemctl start nginx

此时通过服务器的 IP 访问,应该可以看到 Nginx 默认的欢迎页面。

另外部署项目,少不了需要拉取源码,Git 自然必不可少,一条命令装上:

sudo dnf install git

至于 PHP,Python 等这种编程语言运行环境,托 Docker 的福,直接拉取镜像就能运行起来。不过考虑到我这服务器只有 2G 内存,为了节约点硬件资源,我选择了不需要后台服务的容器引擎 Podman:

sudo dnf install podman

Podman 的命令使用和 Docker 高度类似,所以用起来也没什么不适。只是在镜像打包上和 Docker 有些区别。我的选择是先在本地打包好线上项目的容器镜像,然后把镜像导出为文件,命令格式如下:

docker save -o bf-v1.tar zzxworld/bf:1.0

然后把生成的 bf-v1.tar 文件上传到服务器上,再用 Podman 命令导入镜像:

podman load -i bf-v1.tar 

这样就能让本地 Docker 和线上 Podman 互通有无,且不用考虑 Podman 与 Docker 打包的差异问题。不过这里要注意一点,我本地环境是 M1 ARM 类型处理器,默认打包的镜像无法在 X86 上运行。所以需要在打包线上版本时指定运行平台:

docker build --platform=linux/amd64 ...

另外,由于 Podman 是无服务的运行模式,项目容器不会像 Docker 那样随着启动就可以自动运行。所以需要借助 Linux 系统的启动管理服务。好在 Podman 很贴心的提供了生成 system 服务配置的命令,使用命令如下:

podman generate systemd --new bf:1.0 > bf.service

以上命令会生成 bf.service 文件,把这个文件复制到 system 的配置目录,然后就能使用 systemctl 命令像管理其他系统服务一样来操作项目容器服务的启动:

systemctl enable bf
systemctl start bf

这台新服务器根据我的用途折腾到这,基本上算是告一段落,总体来看好像也就 SSH 安全和 Podman 这两大块内容。主要还是目前的项目都还比较简单,也没使用到太复杂的架构和服务。至于这台 99 元的服务器,目前还不太好评价。需要看后续实际的使用情况,到时碰到问题再来吐槽。

5 条评论

  1. 皇家元林
    阿里云我用了这么多年,还是很稳定的。 另外这个podman我觉得挺好的,回头试试。
    • zzxworld
      阿里云的稳定性没得说,就是对老用户太「铁」了 😂。对于硬件资源有限的服务器要使用容器环境,我非常推荐 Podman。
  2. Kitebin
    Podman没用过 另外这个dnf包管理是阿里巴巴Linux特有的包管理器么👀
    • zzxworld
      dnf 是 Redhat 系列 Linux 都有的命令,用来代替 yum 命令。Podman 我在线上用了好几年了,表现还行,适合内存不太充裕的服务器环境。
  3. Kitebin
    原来是这样 我只使用Debain系列的Ubuntu还有 Centos,dnf还是接触较少哈哈