Skip to content
Home
Go back

上手配置一台新的服务器(四):部署博客与 HTTPS

Updated:

前三篇完成了安全加固、终端环境配置和运行环境安装,这一篇把博客真正跑起来。

设置博客域名

astro-paper.config.ts 里的 SITE.url 设置成自己的域名:

// astro-paper.config.ts
site: {
  url: "https://blog.huazaiki.com",  // 改成实际域名
  // ...
}

构建

pnpm install --frozen-lockfile
pnpm build

pnpm build 做了三件事:类型检查、Astro 静态生成、Pagefind 搜索索引。完成后 dist/ 目录里就是完整的静态网站。

Nginx 站点配置

Nginx 需要把 http://blog.huazaiki.com/ 的请求指向构建的 dist/ 目录。在 /etc/nginx/conf.d 文件夹下创建 Nginx 配置文件:

sudo vim /etc/nginx/conf.d/blog.huazaiki.com.conf   # 如果是自己部署,修改成自己的域名.conf
server {

    listen 80;
    listen [::]:80;

    server_name blog.huazaiki.com;

    access_log /var/log/nginx/blog.access.log;
    error_log  /var/log/nginx/blog.error.log;

    root /var/www/blog/dist;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html

        proxy_http_version 1.1;

        proxy_set_header Host              $host;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }
}

验证配置并重载:

sudo nginx -t   # 先验证语法
sudo systemctl reload nginx

此时访问 http://blog.huazaiki.com/(或暂时用 IP),应该能看到博客首页。

DNS 解析

在域名管理后台(阿里云 DNS / Cloudflare 等)添加 A 记录:

类型主机记录记录值
Ablog服务器公网 IP

生效时间取决于 TTL 设置,通常几分钟到几小时不等。用 dig 你的域名.comnslookup 查看是否已解析。

在国内云购买服务器和域名,如果想使用域名解析服务,需要进行网站备案

HTTPS:Let’s Encrypt + Certbot

有了域名 + DNS 解析,我们还需要为网站添加 SSL 证书以实现安全加密访问。

Ubuntu 下安装 certbot 及其 Nginx 插件:

sudo apt install -y certbot python3-certbot-nginx

--nginx 插件能自动读取 Nginx 配置中的 server_name,自动完成证书申请和配置:

sudo certbot --nginx -d 你的域名.com 

过程中会问几个问题:

选 no 的原因是因为 certbot 的自动重定向会把 80 端口的 server 块替换成一个纯跳转块(return 301 https://...),原有 location 配置丢失。选 no 保留我们手写的 80 端口配置,后面手动加上重定向更可控。

申请成功后,certbot 会在配置文件中追加 443 端口的 SSL server 块,但不会自动放行 443 端口。需要手动操作:

# UFW 放行 HTTPS
sudo ufw allow 443/tcp

# 阿里云安全组也要添加 443 端口入方向规则

然后手动在 80 端口的 server 块末尾加上 HTTPS 重定向——把原来博客配置底部的 80 server 块改成:

server {
    listen 80;
    server_name huazaiki.com www.huazaiki.com;
    return 301 https://$host$request_uri;
}

最终的 blog.conf 是两块 server(443 放内容、80 跳 HTTPS)。完整配置参考:

# == HTTPS server(certbot 自动生成的 443 块,手动保留内容 location)==
server {

    server_name blog.huazaiki.com;

    access_log /var/log/nginx/blog.access.log;
    error_log  /var/log/nginx/blog.error.log;

    root /var/www/blog/dist;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html

        proxy_http_version 1.1;

        proxy_set_header Host              $host;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/blog.huazaiki.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/blog.huazaiki.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
# == HTTP server:全部跳转 HTTPS ==
server {
    if ($host = blog.huazaiki.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    listen [::]:80;

    server_name blog.huazaiki.com;
    return 404; # managed by Certbot
}

重载配置:

sudo nginx -t && sudo systemctl reload nginx

使用以下命令验证自动续期是否正常:

sudo certbot renew --dry-run

如果输出 “Congratulations, all simulated renewals succeeded”,就没问题。certbot 默认通过 systemd timer 每天检查一次,证书到期前 30 天自动续期。

收尾

博客部署之后,日常更新文章的流程将在下一篇文章中讲述,涉及使用 Github Actions、配置 Webhook 等。



Previous Post
上手配置一台新的服务器(五):配置日常更新工作流
Next Post
Spring Cloud 从概念开始:JD 里要求的微服务到底是什么