CentOS 7 云服务器部署踩坑记(三):Hugo 博客部署与 Nginx 配置

背景#

博客原本部署在 Vercel,现在迁到阿里云自建服务器,同时还要部署两个 Python Web 应用(Streamlit + Flask)。一台服务器、三个站点,靠 Nginx 按域名分发。


问题一:CentOS 7 没有 snap,无法用 snap 安装 Hugo#

直接下载官方二进制文件,更简单:

cd /tmp
wget https://github.com/gohugoio/hugo/releases/download/v0.153.4/hugo_extended_0.153.4_linux-amd64.tar.gz
tar -xzf hugo_extended_0.153.4_linux-amd64.tar.gz
sudo mv hugo /usr/local/bin/
hugo version

问题二:Hugo extended 版本运行报错#

报错信息:

runtime/cgo: pthread_create failed: Operation not permitted
SIGABRT: abort

extended 版本使用 CGO 调用 libsass,在 CentOS 7 某些环境下有兼容性问题。换成普通版本:

cd /tmp
rm -f hugo_extended_*
wget https://github.com/gohugoio/hugo/releases/download/v0.153.4/hugo_0.153.4_linux-amd64.tar.gz
tar -xzf hugo_0.153.4_linux-amd64.tar.gz
sudo mv -f hugo /usr/local/bin/
hugo version

注意:如果主题使用了 SCSS/SASS,必须用 extended 版本。此时需要升级系统或改用 Docker 部署。


问题三:网站无法访问(Nginx 正常但浏览器打不开)#

排查步骤:

# 1. 检查 Nginx 状态
sudo systemctl status nginx

# 2. 检查配置语法
sudo nginx -t

# 3. 本地测试(能通说明 Nginx 正常)
curl http://127.0.0.1

# 4. 检查端口监听
netstat -tlnp | grep 80

通常是阿里云安全组未开放端口,去 ECS 控制台添加入方向规则:

端口范围 授权对象
80/80 0.0.0.0/0
443/443 0.0.0.0/0

问题四:网站能打开,但所有链接指向旧域名#

Hugo 配置文件中的 baseURL 还是 Vercel 的旧域名,修改后重新构建:

cd /var/www/blog-source
vim hugo.toml

# 修改这行
baseURL = "https://misaku.site/"

# 重新构建
hugo -d /var/www/blog

完整的 Hugo 部署流程#

1. 创建目录#

sudo mkdir -p /var/www/blog           # 静态文件
sudo mkdir -p /var/www/blog-source    # 源码
sudo chown -R $USER:$USER /var/www/

2. 部署方式#

本地构建后上传(推荐):

# 本地执行
hugo
scp -r public/* root@你的IP:/var/www/blog/

服务器上构建:

cd /var/www
git clone --recursive https://github.com/你的用户名/博客仓库.git blog-source
cd blog-source
hugo -d /var/www/blog

3. Nginx 配置#

# /etc/nginx/conf.d/sites.conf

# Hugo 博客
server {
    listen 80;
    server_name misaku.site www.misaku.site;
    root /var/www/blog;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

# Streamlit 应用
server {
    listen 80;
    server_name app1.misaku.site;

    location / {
        proxy_pass http://127.0.0.1:8501;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_read_timeout 86400;
    }
}

# Flask 应用
server {
    listen 80;
    server_name app2.misaku.site;

    location / {
        proxy_pass http://127.0.0.1:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
sudo nginx -t
sudo systemctl restart nginx

4. DNS 解析#

类型 主机记录 记录值
A @ 你的服务器 IP
A www 你的服务器 IP
A app1 你的服务器 IP
A app2 你的服务器 IP

5. HTTPS 配置(可选)#

sudo yum install -y certbot python2-certbot-nginx
sudo certbot --nginx -d misaku.site -d www.misaku.site -d app1.misaku.site -d app2.misaku.site

# 自动续期
echo "0 3 * * * root certbot renew --quiet" | sudo tee /etc/cron.d/certbot-renew

域名备案期间的临时方案#

备案还没过可以直接用 IP 访问,在 Nginx 里加一个 server 块:

server {
    listen 80;
    server_name 你的服务器IP;

    # 默认访问博客
    location / {
        root /var/www/blog;
        index index.html;
        try_files $uri $uri/ =404;
    }

    # /app1 访问 Streamlit
    location /app1/ {
        proxy_pass http://127.0.0.1:8501/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 86400;
    }

    # /app2 访问 Flask
    location /app2/ {
        proxy_pass http://127.0.0.1:5000/;
        proxy_set_header Host $host;
    }
}

博客一键更新脚本#

#!/bin/bash
# /usr/local/bin/deploy-blog.sh

echo "更新博客..."
cd /var/www/blog-source
git pull
hugo -d /var/www/blog
echo "完成!"
sudo chmod +x /usr/local/bin/deploy-blog.sh
# 以后只需执行
deploy-blog.sh

问题汇总#

问题 根因 解决耗时
snap 不可用 CentOS 7 未预装 5 分钟
Hugo extended 报错 CGO 兼容性 10 分钟
网站打不开 安全组未开放端口 5 分钟
链接指向旧域名 baseURL 未修改 3 分钟

上一篇:Python 3.11 编译与 SSL 模块配置
下一篇:Python 包安装与 GCC 版本问题