背景#
博客原本部署在 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: abortextended 版本使用 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/blog3. 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 nginx4. 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 分钟 |