你知道这个博客是怎么搭的吗?!

1252 字
6 分钟
你知道这个博客是怎么搭的吗?!

首先声明,这是博客搭建的一小部分,且本人小菜鸡,本文就纯纯写写玩玩,难免漏洞百出🙂

配置Nginx#

web服务器软件,可以让别人通过网址访问服务器上的网站、接口、文件。nginx轻量,占有内存少,并发能力强,在负载均衡和反向代理领域表现出众,处理静态资源也更👍

理解反向代理与负载均衡#

与正向代理(梯子)相反——代理客户端的,隐藏了客户端;反向代理是代理服务端的,隐藏了服务端。通俗讲就是,访问一个网站时,请求并没有直接打到真正的业务服务器上,而是先到了一台中间服务器。 我们能感受到的:一个域名承载整个网站的所有服务、网站高并发下依然流畅、隐藏了内部架构,提升安全性(做 HTTPS 证书管理,后端内部用 HTTP 通信简单高效)等

负载均衡是把访问流量分摊到多台服务器上,我暂时用不上

具体配置#

针对我这个博客,先不管主配置/etc/nginx/nginx.conf,因为它有include /etc/nginx/sites-enabled/*;所以主要是修改它的子配置 在sites-available下增加了bloggitea两个配置文件,gitea配的是反向代理,虽然这样意义不大(可以有完全自己的代码托管,包括cicd绑定的也完全是自己域名下的仓库,但我服务器性能不行,现在把它停掉了,用的是gitea官方的托管)但也算是把学的知识运用一下,理解了一下反向代理

server {
listen 80;
server_name git.marvinhers.site; # 把gitea服务暴露出来
location / {
proxy_pass http://127.0.0.1:3000; # 转发的后端服务地址
proxy_set_header Host $host; # 客户端访问的真实域名
proxy_set_header X-Real-IP $remote_addr; # 真实客户IP
}
}

实现负载均衡示例

server{
listen 80;
server_name marvinhers.site;
location / {
proxy_pass http://backend_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
upstream backend_servers{
server 192.168.1.12:8080 weight=3; # 服务器内网地址
server 192.168.1.11:8080 weight=1;
}

因为我们当下只是在/etc/nginx/sites-available下创的文件,而实际生效是在sites-enabled/,上线服务就软链接一下👍

Terminal window
# 软链接启用配置
ln -s /etc/nginx/sites-available/blog /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/gitea /etc/nginx/sites-enabled/
# 测试配置无误
nginx -t
nginx -s reload

负载均衡可参考 Nginx 服务器安装及配置文件详解 | 菜鸟教程

先用certbot简单配一下吧,以后使用泛域名证书再改用acme.sh

Terminal window
certbot --nginx -d marvinhers.site -d git.marvinhers.site
# 验证你对域名的所有权 签发免费的 SSL/TLS 证书 修改 Nginx 配置,让网站支持 HTTPS 设置证书自动续期,避免过期。

预留一下acme.sh,然后还有很多知识如 DDNS VPN 内网穿透 Cloudflare Tunnel 虚拟组网 还没学

在Gitea上实现CICD#

其实我在怀疑有没有必要,GithubActions肯定更简单,gitea虽然轻量但要自己装runner。就像Gemini说的 “技术是用来服务生活的,不是用来折腾自己的。”

开启actions功能#

服务器里我是以docker形式部署的gitea

Terminal window
docker exec -it gitea bash
vim /data/gitea/conf/app.ini
# 添加以下然后退出容器
# [actions]
# ENABLED=true
docker restart gitea

开启act runner(与服务器绑定)#

Act Runner是一个独立的小程序,它从 Gitea 那里领任务(比如“有人推送代码了,去执行 .gitea/workflows/deploy.yml 文件里的命令”),然后在服务器上执行这些命令。 推荐是在docker里运行的,这里建议看官方文档是如何注册运行的。

# 这里展示一下 /root/runner/docker-compose.yml
# 关于令牌,建议参考官方文档
services:
runner:
image: gitea/act_runner:nightly
environment:
CONFIG_FILE: /config.yaml
GITEA_INSTANCE_URL: "https://gitea.com"
GITEA_RUNNER_REGISTRATION_TOKEN: "{Token}"
GITEA_RUNNER_NAME: "marvin-runner"
GITEA_RUNNER_LABELS: "ubuntu-latest,self-hosted"
volumes: # 实现 服务器 和 Act Runner容器 之间的文件互通
- ./config.yaml:/config.yaml
- ./data:/data
- /var/run/docker.sock:/var/run/docker.sock
- /var/www/blog:/var/www/blog

令牌(Token)是一个注册认证,绑定runner到你的Gitea实例,连接gitea服务器,有不同级别,可复用,可重置。在仓库页面可获取仓库级别token。 然后 docker compose up -d docker compose logs -f 看到Runner registered successfully代表这个runner和gitea仓库对上了。

终于workflows(与服务器绑定+1)#

具体deploy.yml长啥样不展示了,这里讲一下我踩的坑。 因为服务器性能无比一般,所以构建博客都十分耗内存,采用

on:
  push:
    branches: [ master ]
    paths:
      - 'dist/**'   # 只在 dist 目录下的文件发生变化时触发

是的,这要求每次都先在本地pnpm run build构建后再git提交,虽然这某种程度违背了cicd…但也避免了OOM,是服务器性能拉的无奈之举

同步到服务器

- name: 同步到服务器
uses: appleboy/scp-action@master
with:
host: ${{ secrets.SERVER_IP }}
username: ${{ secrets.SERVER_USER }}
port: ${{ secrets.SERVER_PORT }}
key: ${{ secrets.SERVER_SSH_KEY }}
source: "dist/"
target: "/var/www/blog/"
overwrite: true
strip_components: 1

secrets.SERVER_SSH_KEY来自服务器上的生成密钥

Terminal window
cd ~/.ssh
ssh-keygen -t rsa -f id_rsa -N ""
cat id_rsa.pub >> authorized_keys
chmod 600 authorized_keys
chmod 700 ~/.ssh

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
你知道这个博客是怎么搭的吗?!
https://marvinhers.site/posts/buildblog/
作者
Marvin
发布于
2026-05-19
许可协议
未授权
随机文章 随机推荐

评论区

Profile Image of the Author
Marvin
Hello from the other side!!!
公告
太懒了博客好久没更新了(被期末考试吓哭了🤮
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
2
分类
2
标签
8
总字数
2,500
运行时长
0
最后活动
0 天前

文章目录