为什么要自己部署
静态博客有一堆免费托管可以用,但我还是想自己搭一遍。 原因很简单:部署是 Agent 工程师绕不开的技能。 以后你要把 Agent 服务暴露出去,要处理反向代理、端口、HTTPS、备案, 这些都是同一套知识。
这篇记录我完整的踩坑过程,按时间顺序。
准备阶段
买好 ECS 之后,有三件事必须先确认:
- 地域必须是中国大陆——香港和海外节点不需要备案,但国内访问速度不同
- 安全组——这是阿里云层面的防火墙,和系统防火墙是两回事
- 登录方式——密钥还是密码,以及 SSH 端口是不是改过
备案未通过前,80 和 443 端口会被运营商拦截。 所以测试阶段要用一个别的端口(我用的 8080),备案通过后再切回 80。
第一步:安装并确认 Nginx
# Ubuntu / Debian
sudo apt update && sudo apt install -y nginx
# CentOS / Alibaba Cloud Linux
sudo yum install -y nginx && sudo systemctl enable --now nginx
装完先确认运行用户——这一点非常关键,用错了后面一定 403:
ps aux | grep -E '[n]ginx: worker' | awk '{print $1}' | sort -u
Ubuntu 系输出 www-data,CentOS 系输出 nginx。
记住它,下一步要用。
第二步:放文件
sudo mkdir -p /var/www/personal-blog
# 用 MobaXterm / scp 把文件传上来后归位
sudo mv /root/blog/* /var/www/personal-blog/
# 属主改成 Nginx 用户(把 www-data 换成上一步查到的)
sudo chown -R www-data:www-data /var/www/personal-blog
sudo chmod -R 755 /var/www/personal-blog
第三步:写站点配置
sudo tee /etc/nginx/conf.d/blog.conf > /dev/null <<'EOF'
server {
listen 8080;
server_name _;
root /var/www/personal-blog;
index index.html;
location / {
try_files $uri $uri/ =404;
}
# 静态资源缓存
location ~* \.(css|js|png|jpg|svg|woff2?)$ {
expires 7d;
add_header Cache-Control "public";
}
}
EOF
注意 conf.d/ 目录下的 .conf 文件会被主配置自动加载,
不需要改 nginx.conf。
第四步:测试并重载
sudo nginx -t && sudo systemctl reload nginx
nginx -t 必须输出 syntax is ok 和 test is successful。
配置有语法错误时千万不要 reload,先把错误改掉。
第五步:本机自测
先绕开所有网络因素,验证 Nginx 本身没问题:
curl -I http://127.0.0.1:8080
期望看到 HTTP/1.1 200 OK。如果这里是 403,往下看排查部分。
第六步:两层防火墙
这是最容易卡住的地方——阿里云安全组和系统防火墙是两个独立的东西,都要开。
# 系统防火墙
# CentOS / Alibaba Cloud Linux
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports
# Ubuntu
sudo ufw allow 8080/tcp
sudo ufw status
然后去阿里云控制台:实例 → 安全组 → 配置规则 → 入方向 → 添加:
- 协议类型:
TCP - 端口范围:
8080/8080 - 授权对象:
0.0.0.0/0
我踩的四个坑
坑一:403 Forbidden
本机 curl 就返回 403,说明不是网络问题。排查顺序:
- 目录属主是不是 Nginx 用户 →
ls -l /var/www/personal-blog - 目录权限有没有
x(进入权限)→ 需要 755 - SELinux 有没有拦
坑二:SELinux
阿里云的 CentOS / Alibaba Cloud Linux 镜像默认开启 SELinux。 它会让 Nginx 即使文件权限完全正确也无法读取:
getenforce
# Enforcing → 需要处理
# Disabled / Permissive → 跳过
# 给网站目录打上正确的 SELinux 标签
sudo chcon -R -t httpd_sys_content_t /var/www/personal-blog
这个坑最坑的地方在于:ls -l 看起来一切正常,权限也没问题,
但就是 403。因为 SELinux 是内核层面的强制访问控制,
普通权限检查通过了它还会再拦一道。
坑三:安全组没放行
本机 curl 是 200,但浏览器打不开。这就是典型的安全组问题。 我一开始只配了系统防火墙,忘了阿里云控制台那层。
坑四:SSH 端口改过导致部署脚本连不上
我把 SSH 端口从 22 改成了别的,结果原来写好的 scp 脚本全部失败。
修的时候注意:ssh 用小写 -p,
scp 用大写 -P,这两个不一样,很容易写错。
备案流程
网站能访问了,就可以提交备案了。核心步骤:
- 登录阿里云备案系统(beian.aliyun.com)
- 填主体信息:个人身份证信息
- 填网站信息:
- 网站名称:不能叫"博客""论坛""社区",用"个人主页""技术笔记"之类
- 服务内容:选"个人主页"
- 域名和服务器:选你的 ECS
- 上传资料:身份证正反面、核验单(打印签字后拍照)
- 阿里云初审:1-2 个工作日
- 工信部短信验证:24 小时内必须完成,否则作废重来
- 通管局审核:5-20 个工作日
备案通过后
三件事:
# 1. 把配置从 8080 换成 80 端口 + 真实域名
# 2. 重载 Nginx
sudo nginx -t && sudo systemctl reload nginx
3. 把备案号挂到页脚,并且必须能点进工信部网站。 这是硬性要求,不挂或者挂了假号会被注销备案。
<a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener">
京ICP备12345678号-1
</a>
然后在阿里云 DNS 添加解析:A 记录,
主机记录 @ 和 www,记录值填公网 IP。
小结
| 现象 | 最可能的原因 |
|---|---|
| 本机 curl 403 | 目录属主不对 / SELinux |
| 本机 200,外网打不开 | 阿里云安全组没放行 |
| 80 端口国内打不开 | 备案未通过,被运营商拦截 |
| 改了配置没生效 | 忘了 systemctl reload nginx |
| 部署脚本连不上 | SSH 端口或密钥参数没传对 |
部署这件事的价值不在于"网站上线了",而在于你开始理解 一个请求从浏览器到磁盘文件之间,要穿过多少层。