第 1 讲:服务器初始化
这一讲的任务是让一台刚买到的云服务器能被自己安全地登录和操作。我在阿里云上购买了一台华东1(杭州)的 ECS,系统选的是 Rocky Linux 9,配置 2 核 2GiB,公网 IP 是 47.111.128.195。
做了什么
- 用 ssh-keygen 生成了自己的 ed25519 密钥对,把公钥绑定到 ECS 实例上,实现密钥登录;
- 创建日常使用的普通用户
study,并授予 sudo 权限,避免一直用 root 干活; - 在阿里云安全组里只放行了 22、80、443 端口,其余端口默认拒绝。
关键命令
ssh -i ~/.ssh/id_ed25519 root@47.111.128.195 # 用私钥以 root 身份登录服务器 adduser study # 创建普通用户 study passwd study # 给 study 设置密码 usermod -aG wheel study # 把 study 加入 wheel 组,获得 sudo 权限 su - study # 切换到 study 用户验证权限
遇到的问题和解决
第一次用密码登录时总是担心暴力破解,后来改用密钥登录并了解可以在 /etc/ssh/sshd_config 里把 PasswordAuthentication 设为 no,只保留密钥方式,安全性提高了很多。
第 2 讲:Nginx 安装与第一个网站
这一讲在服务器上安装 Nginx,并把第一个网站(主站)跑起来。核心体会是:浏览器请求里携带的域名(Host 请求头)决定了用户看到哪个网站。
做了什么
- 用 dnf 安装并启动 Nginx,设置开机自启;
- 建立主站目录
/var/www/mysite,写好第一个index.html; - 在
/etc/nginx/conf.d/mysite.conf里写 server 块,把hebinhao.icu指向主站目录; - 做了两个实验:用 IP 访问看到系统默认页、用域名访问看到主页;故意把网页文件权限改错,复现了 403。
关键命令
sudo dnf install -y nginx # 安装 Nginx sudo systemctl enable --now nginx # 启动并设置开机自启 sudo mkdir -p /var/www/mysite # 创建主站目录 sudo chown -R study:study /var/www/mysite # 目录交给 study 用户管理 sudo chmod 755 /var/www/mysite # 755 权限让 nginx 工作进程能进入读取 sudo nginx -t # 检查配置文件语法 sudo systemctl reload nginx # 平滑重载配置,不中断服务
遇到的问题和解决
403 实验让我印象最深:网页文件存在却访问不了,原因是 Nginx 的工作进程以 nginx 用户身份读文件,目录或文件对"其他人"没有读权限时就会返回 403。用 ls -l 核对权限,把目录恢复成 755、文件恢复成 644 就正常了。这让我理解了"进程用户 ≠ 我登录的用户"。
第 3 讲:主站 HTTPS 与证书
这一讲给主站加上 HTTPS:用 Let's Encrypt 的免费证书,通过 certbot 申请,并配置 80 端口自动跳转 443。
做了什么
- 用 certbot 的 webroot 方式为主站申请证书,验证文件放在主站目录下;
- 80 端口的 server 块只负责两件事:放行
/.well-known/acme-challenge/验证路径、其余请求 301 跳转 HTTPS; - 443 端口配置 ssl_certificate,并启用了 certbot 自动续期定时器。
关键命令
sudo dnf install -y certbot python3-certbot-nginx # 安装 certbot 及其 nginx 插件 sudo certbot certonly --webroot -w /var/www/mysite \ -d hebinhao.icu -d www.hebinhao.icu --dry-run # 先演练一遍,验证流程无误 sudo certbot certonly --webroot -w /var/www/mysite \ -d hebinhao.icu -d www.hebinhao.icu # 正式申请主站证书 sudo certbot certificates # 查看本机已有的证书列表 sudo certbot renew --dry-run # 模拟续期,确认自动续期可用
遇到的问题和解决
先演练(--dry-run)再正式申请这个习惯很有用:演练通过了正式申请几乎一次成功。另外体会到 301 跳转的配置里,location /.well-known/acme-challenge/ 必须写在 location / 旁边且路径更具体,因为 Nginx 普通前缀匹配取最长的,这样续期验证文件才不会被 301 跳走。
第 4 讲预告:在同一台服务器上增加第二个网站 notes 子域名站点,一站一文件、一站一日志、一站一证书。