第 1 讲 · 云服务器与 SSH 远程登录
做了什么:购买并初始化阿里云 ECS(Rocky Linux 9),创建日常使用的
study 普通用户,配置 SSH 密钥登录,并按要求关闭 root 的 SSH 直接登录。
关键命令
# 本地生成 Ed25519 密钥对
ssh-keygen -t ed25519
# 把公钥传到服务器,实现免密登录
ssh-copy-id -i ~/.ssh/id_ed25519.pub study@服务器IP
# 服务器上禁用 root 直接 SSH 登录
sudo vi /etc/ssh/sshd_config
# PermitRootLogin no
sudo systemctl restart sshd
# 在 ~/.ssh/config 里写好别名,之后 ssh aliyun-ecs-study 一条命令直连
Host aliyun-ecs-study
HostName 47.111.130.121
User study
IdentityFile ~/.ssh/id_ed25519
遇到的问题:改完 sshd_config 重启后担心把自己锁在门外。
解决:保持原有会话不断开,另开一个新终端先验证 study 用户能正常登录、sudo 可提权,确认无误才退出旧会话。
第 2 讲 · 部署第一个网站与 Nginx 排错
做了什么:安装 Nginx,理解 master / worker 进程模型,部署第一个静态页面; 通过实验搞清楚了「为什么用 IP 访问是默认页、403 是怎么来的」。
关键命令
# 安装并启动
sudo dnf install -y nginx
sudo systemctl enable --now nginx
# 看进程模型:1 个 master(root)+ 与 CPU 核数相同的 worker(nginx 用户)
ps -ef | grep [n]ginx
nproc
# 403 实验的关键结论:Nginx 工作进程以 nginx 用户读取网页文件,
# 目录必须 755、文件必须 644,否则读不到就报 403 Forbidden
ls -ld /var/www/mysite
sudo systemctl reload nginx
遇到的问题:用 IP 访问看到的是 Nginx 自带默认页,不是自己的网站。
解决:明白了请求靠 Host 请求头区分站点——没有域名匹配时落到 default_server 的系统默认站点;
这正是第 4 讲多站点原理的伏笔。
第 3 讲 · 域名解析、HTTPS 证书与主站上线
做了什么:注册域名并完成备案,添加 A 记录解析到服务器公网 IP; 用 Let's Encrypt(certbot)给主站签发免费证书,配置 HTTP 自动跳转 HTTPS,并启用自动续期。
关键命令
# certbot 通过 webroot 方式验证域名并签发证书
sudo dnf install -y certbot python3-certbot-nginx
sudo certbot certonly --webroot -w /var/www/mysite \
-d huanghaowei.icu -d www.huanghaowei.icu
# 80 端口只负责证书验证和跳转,443 提供内容(见 mysite.conf)
location /.well-known/acme-challenge/ { root /var/www/mysite; }
location / { return 301 https://$host$request_uri; }
# 每次改配置前先检查语法,再平滑重载
sudo nginx -t
sudo systemctl reload nginx
# 启用自动续期定时器,并演练验证
sudo systemctl enable --now certbot-renew.timer
sudo certbot renew --dry-run
遇到的问题:备份 Nginx 配置时直接复制成了
mysite.conf.bak 没出问题,
但意识到如果备份文件以 .conf 结尾放在 conf.d 里,会被 include 一起加载导致重复的 server_name 报错。
解决:备份统一加 .bak 后缀,并记住 conf.d 目录「只有 .conf 会被加载」这一规则。第 4 讲 · 多站点:本页面的由来
你正在看的这个 notes.huanghaowei.icu 就是第 4 讲的成果:在同一台服务器上,
Nginx 通过 server 块按域名分发请求,让一个 IP 同时承载主站和本笔记站,
子站点拥有独立的证书和日志——「一站一文件、一站一日志、一站一证书」。