|
| 1 | +--- |
| 2 | +title: GithubPage智能DNS解析 |
| 3 | +date: 2025-8-30 |
| 4 | +authors: jiangmiemie |
| 5 | +tags: [GithubPage智能DNS解析] |
| 6 | +keywords: [智能DNS解析,GithubPage] |
| 7 | +description: GithubPage智能DNS解析 |
| 8 | +--- |
| 9 | + |
| 10 | +好久不见,今天分享一下我的网站是如何做智能DNS解析的案例。 |
| 11 | + |
| 12 | +现在看到到这个网站被部署在一个github仓库,我域名解析指向了github,因此可以通过域名直接访问这个网站。 |
| 13 | + |
| 14 | +但是目前在中国大陆访问比较慢,于是我采购了一台中国大陆的服务器。目标: |
| 15 | +- 在大陆的IP地址访问,解析到大陆服务器。 |
| 16 | +- 在境外访问,解析到github。 |
| 17 | + |
| 18 | +项目原本的增量更新逻辑不变:即通过`githubworkflow`,每次变更自动更新不一致的文件。 |
| 19 | + |
| 20 | +实现这个需求的关键在于使用**智能DNS解析**,也就是根据访问者的地理位置将域名解析到不同的IP地址。 |
| 21 | + |
| 22 | +## 域名解析修改 |
| 23 | + |
| 24 | +在阿里云服务选择`云解析 DNS`。相关配置如下: |
| 25 | + |
| 26 | +| 主机记录 | 记录类型 | 解析线路 | 记录值 | |
| 27 | +|----------|----------|----------|--------| |
| 28 | +| www | CNAME | 境外 | 你的Github用户ID.github.io | |
| 29 | +| @ | CNAME | 境外 | 你的Github用户ID.github.io | |
| 30 | +| www | A | 中国地区 | 我的服务器IP | |
| 31 | +| @ | A | 中国地区 | 我的服务器IP | |
| 32 | + |
| 33 | +## 服务器配置 |
| 34 | + |
| 35 | +在服务器上,需要部署一个**Web服务器**(如Nginx或Apache),并配置它来服务项目静态文件。大部分服务器都是开箱既有。我用的宝塔面板,添加`PHP项目`,简单的配置了一下域名和`SSL`证书。找到项目指向的文件夹`/www/wwwroot/jiangmiemie.com`,后续将Github生成的静态资源传输到这里即可。 |
| 36 | + |
| 37 | +如何将项目文件**同步**到这台服务器上。这里计划使用`rsync`增量同步,使用`ssh`链接,。 |
| 38 | + |
| 39 | +### rsync |
| 40 | + |
| 41 | +`rsync`比 `scp` 更适合同步大量文件,因为它可以只传输有变化的部分。 |
| 42 | + |
| 43 | +我的这台服务器是阿里云系统(不是Ubuntu),需要使用:`yum install -y rsync`安装一下。 |
| 44 | + |
| 45 | +### ssh |
| 46 | + |
| 47 | +需要打开的防火墙端口:`22`、`80`、`443` |
| 48 | + |
| 49 | +:::info |
| 50 | +虽然我们可以直接通过账号密码登录ssh,但是账号密码权限太高,因此设置一个仅用于登录的ssh密码。 |
| 51 | +::: |
| 52 | + |
| 53 | +```bash showLineNumbers |
| 54 | +# 生成密钥对(在服务器上) |
| 55 | +ssh-keygen -t rsa -b 4096 -f ~/.ssh/github_deploy_key -N "" |
| 56 | + |
| 57 | +# 查看生成的文件 |
| 58 | +ls -la ~/.ssh/ |
| 59 | +# 会看到: |
| 60 | +# github_deploy_key (私钥) |
| 61 | +# github_deploy_key.pub (公钥) |
| 62 | + |
| 63 | +# 将公钥添加到authorized_keys |
| 64 | +cat ~/.ssh/github_deploy_key.pub >> ~/.ssh/authorized_keys |
| 65 | + |
| 66 | +# 设置正确权限(过低没有权限,过高ssh会认为文件不安全) |
| 67 | +chmod 700 ~/.ssh |
| 68 | +chmod 600 ~/.ssh/authorized_keys |
| 69 | +chmod 600 ~/.ssh/github_deploy_key |
| 70 | + |
| 71 | +# 测试密钥是否工作(在服务器上)应该能直接连接,不需要密码 |
| 72 | +ssh -i ~/.ssh/github_deploy_key root@localhost |
| 73 | + |
| 74 | +# 显示私钥内容(复制到GitHub Secrets) |
| 75 | +cat ~/.ssh/github_deploy_key |
| 76 | +``` |
| 77 | + |
| 78 | +## GitHub Workflow修改 |
| 79 | + |
| 80 | +完整内容如下,变更的内容为`Setup SSH`和`Deploy to server`。 |
| 81 | + |
| 82 | +因为`GitHub Workflow`是所有人都能看到的,因此为了安全,你需要把服务器IP地址、链接密码等配置为密钥变量。下面代码中`${{ secrets.SSH_PRIVATE_KEY }}`这样格式的都是密钥变量。 |
| 83 | + |
| 84 | +把你的ip地址和刚刚终端显示的`私钥`复制到GitHub Secrets。 |
| 85 | + |
| 86 | +:::info |
| 87 | +在你的GitHub仓库页面,进入 `Settings` -> `Secrets and variables` -> `Actions`。 |
| 88 | + |
| 89 | +点击 `New repository secret`。 |
| 90 | + |
| 91 | +Name 填写一个有意义的名称,比如我设置的是`SSH_PRIVATE_KEY`和`IP`。 |
| 92 | + |
| 93 | +- `IP`的 Secret 框中,仅粘贴你的ip地址。例如:`192.168.10.11` |
| 94 | + |
| 95 | +- `SSH_PRIVATE_KEY`的 Secret 框中,粘贴从`-----BEGIN OPENSSH PRIVATE KEY-----`到`-----END OPENSSH PRIVATE KEY-----`完整内容。 |
| 96 | + |
| 97 | +::: |
| 98 | + |
| 99 | +```yml showLineNumbers {21-33} |
| 100 | +name: Build HTML |
| 101 | +on: push |
| 102 | +jobs: |
| 103 | + build-and-deploy: |
| 104 | + runs-on: ubuntu-latest |
| 105 | + permissions: |
| 106 | + contents: write |
| 107 | + steps: |
| 108 | + - uses: actions/checkout@v3 |
| 109 | + - uses: actions/setup-node@v3 |
| 110 | + with: |
| 111 | + node-version: 18 |
| 112 | + - run: | |
| 113 | + npm install |
| 114 | + npm run build |
| 115 | + - uses: peaceiris/actions-gh-pages@v3 |
| 116 | + if: github.ref == 'refs/heads/main' |
| 117 | + with: |
| 118 | + github_token: ${{ secrets.GITHUB_TOKEN }} |
| 119 | + publish_dir: ./build |
| 120 | + - name: Setup SSH |
| 121 | + uses: webfactory/[email protected] |
| 122 | + with: |
| 123 | + ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} |
| 124 | + |
| 125 | + - name: Deploy to server |
| 126 | + run: | |
| 127 | + mkdir -p ~/.ssh |
| 128 | + ssh-keyscan -H ${{ secrets.IP }} >> ~/.ssh/known_hosts |
| 129 | + rsync -avz --exclude='.user.ini' ./build/ root@${{ secrets.IP }}:/www/wwwroot/jiangmiemie.com |
| 130 | + env: |
| 131 | + SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} |
| 132 | + SERVER_IP: ${{ secrets.IP }} |
| 133 | +``` |
| 134 | +
|
| 135 | +- `ssh-keyscan -H ${{ secrets.IP }} >> ~/.ssh/known_hosts` |
| 136 | + |
| 137 | +表示将服务器的公钥添加到 known_hosts 文件中。 |
| 138 | + |
| 139 | + |
| 140 | +- `rsync -avz --exclude='.user.ini' ./build/ root@${{ secrets.IP }}:/www/wwwroot/jiangmiemie.com` |
| 141 | + |
| 142 | +表示将`./build/`文件夹同步到`/www/wwwroot/jiangmiemie.com`文件夹。 |
| 143 | + |
| 144 | +| 参数 | 作用 | 详细说明 | |
| 145 | +|------|------|----------| |
| 146 | +| `rsync` | 远程同步工具 | 比scp更智能,只传输变化的部分 | |
| 147 | +| `-a` | 归档模式 | 保留文件权限、时间戳、符号链接等所有属性 | |
| 148 | +| `-v` | 详细输出 | 显示传输过程的详细信息 | |
| 149 | +| `-z` | 压缩传输 | 传输时压缩数据,减少网络带宽 | |
| 150 | +| `--exclude='.user.ini'` | 排除文件 | 跳过服务器自动生成的系统文件 | |
| 151 | +| `./build/` | 源目录 | 本地构建好的静态文件目录 | |
| 152 | +| `root@IP:/path/` | 目标地址 | 服务器上的部署目录 | |
| 153 | + |
| 154 | +每次你推送代码到GitHub,工作流会自动构建并将变化同步到服务器,实现真正的**持续部署**! |
0 commit comments