返回首页

把个人站点部署到阿里云 ECS:Nginx + 备案全流程

从安全组放行到 403 排查,从 SELinux 到备案号挂页脚。记录一次完整的静态站上线过程。

为什么要自己部署

静态博客有一堆免费托管可以用,但我还是想自己搭一遍。 原因很简单:部署是 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,说明不是网络问题。排查顺序:

  1. 目录属主是不是 Nginx 用户 → ls -l /var/www/personal-blog
  2. 目录权限有没有 x(进入权限)→ 需要 755
  3. 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,这两个不一样,很容易写错。

备案流程

网站能访问了,就可以提交备案了。核心步骤:

  1. 登录阿里云备案系统(beian.aliyun.com)
  2. 填主体信息:个人身份证信息
  3. 填网站信息:
    • 网站名称:不能叫"博客""论坛""社区",用"个人主页""技术笔记"之类
    • 服务内容:选"个人主页"
    • 域名和服务器:选你的 ECS
  4. 上传资料:身份证正反面、核验单(打印签字后拍照)
  5. 阿里云初审:1-2 个工作日
  6. 工信部短信验证:24 小时内必须完成,否则作废重来
  7. 通管局审核: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 端口或密钥参数没传对

部署这件事的价值不在于"网站上线了",而在于你开始理解 一个请求从浏览器到磁盘文件之间,要穿过多少层。