作者选择了 Diversity in Tech Fund以作为 Write for Donations计划的一部分接受捐款。
介绍
[Jekyll] (https://jekyllrb.com/)是一个静态站点生成器,它提供了内容管理系统(CMS)的一些好处,同时避免了这类由数据库驱动站点带来的性能和安全问题. 它具有"博客意识",并包含处理日期组织内容的特殊功能,尽管它的有用性并不限于博客网站. Jekyll非常适合需要离线工作的人,更喜欢轻量级编辑器而不是用于内容维护的网络表格,并想使用版本控制来跟踪其网站的更改.
在本教程中,我们将配置一个生产环境以使用 Nginx 来托管 Jekyll 网站,以及 Git 来跟踪变化并在您将更改推送到网站存储库时重建网站。
前提条件
要遵循本教程,您将需要:
- 1个Ubuntu 16.04服务器用于生产,配置方式是遵循初始服务器设置与Ubuntu 16.04教程,包括:
- Nginx,通过遵循[如何在Ubuntu 16.04 教程上安装 Nginx (https://andsky.com/tech/tutorials/how-to-install-nginx-on-ubuntu-16-04)的前两步而安装.
- Jekyll,通过跟踪如何在Ubuntu 16.04安装。
- 一款开发机,有[Git已安装 (https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)和由跟随如何在Ubuntu 16.04上设置一个Jekyll开发站点所创建的Jekyll站点.
- 联合国 可以选择,如果你想更多地了解Jekyll,你可以检查这两个教程:
第1步:创建一个Git用户帐户
出于安全目的,我们将首先创建一个用户帐户,该帐户将为Jekyll网站托管Git存储库,该用户将执行Githooks脚本,我们将创建该脚本,以便在收到更改时重新创建该网站。
1sudo adduser git
您将被要求输入并重复密码,然后输入有关用户的非强制性基本信息。
1[secondary_label Output]
2Adding user `git' ...
3Adding new group `git' (1001) ...
4Adding new user `git' (1001) with group `git' ...
5Creating home directory `/home/git' ...
6Copying files from `/etc/skel' ...
7Enter new UNIX password:
8Retype new UNIX password:
9passwd: password updated successfully
10Changing the user information for git
11Enter the new value, or press ENTER for the default
12 Full Name []:
13 Room Number []:
14 Work Phone []:
15 Home Phone []:
16 Other []:
17Is the information correct? [Y/n]
我们还将准备 Web 根,以保持生成的网站. 首先,从 /var/www/html
目录中删除默认 Web 页面:
1sudo rm /var/www/html/index.nginx-debian.html
现在,将目录的所有权设置为 git 用户,这样这个用户可以在收到更改时更新网站的内容,并将群组所有权设置为www-data
组,这组确保网络服务器可以访问和管理位于/var/www/html
中的文件:
1sudo chown git:www-data /var/www/html
在继续本教程之前,请将 SSH 密钥复制到您新创建的 git 用户,这样您就可以使用 Git 安全地访问您的生产服务器。您可以通过遵循 Ubuntu 16.04 初始服务器设置的四个步骤))来完成此操作)。
现在,让我们为您的 Jekyll 网站创建一个 Git 存储库,然后配置 Git 绑架器以在更新时重建它。
第2步:设置一个Git存储库
您的 Git 存储库将包含有关您的 Git 网站的数据,包括更改和承诺的历史。
存储库将位于 git 用户的主目录中,所以如果您在上一个步骤后退出该用户帐户,请使用su
命令来切换角色:
1su - git
在主目录中,创建一个包含您的 Git 存储库的文件夹,需要该目录在主目录中并使用repo-name.git
格式命名,因此git
命令可以发现它。通常,repo-name
应该是您的网站的名称,因此git
可以轻松识别网站和存储库。我们将我们的网站称为sammy-blog
:
1mkdir ~/sammy-blog.git
切换到目录并使用git init
命令初始化Git存储库.--bare
旗帜将存储库设置为在服务器上托管,并允许多个用户之间的协作:
1cd ~/sammy-blog.git
2git init --bare
输出包含成功初始化的存储库信息:
1[secondary_label Output]
2Initialized empty Git repository in /home/git/sammy-blog.git
如果您看不到此类输出,请遵循屏幕日志来解决问题,然后继续本教程。
我们创建的文件夹包含托管库所需的目录和文件,您可以通过输入以下内容检查其内容:
1ls
1[secondary_label Output]
2branches config description HEAD hooks info objects refs
如果您看不到此类型的输出,请确保您已切换到适当的目录并成功执行git init
。
该 hooks 目录包含用于 Git hooks 的脚本. 默认情况下,它包含每个类型的 Git hook 的示例文件,因此您可以轻松开始。
在hooks
目录中创建名为post-receive
的文件,并在您选择的文本编辑器中打开它:
1nano ~/sammy-blog.git/hooks/post-receive
我们将配置链接来克隆临时目录的最新更改,然后再生它并将生成的网站保存到 /var/www/html
,以便您可以轻松访问它。
将以下内容复制到文件中:
1[label ~/sammy-blog.git/hooks/post-receive]
2#!/usr/bin/env bash
3
4GIT_REPO=$HOME/sammy-blog.git
5TMP_GIT_CLONE=/tmp/sammy-blog
6PUBLIC_WWW=/var/www/html
7
8git clone $GIT_REPO $TMP_GIT_CLONE
9pushd $TMP_GIT_CLONE
10bundle exec jekyll build -d $PUBLIC_WWW
11popd
12rm -rf $TMP_GIT_CLONE
13
14exit
一旦完成,保存文件并关闭文本编辑器。
确保脚本是可执行的,以便用户在收到更改时可以执行它:
1chmod +x ~/sammy-blog.git/hooks/post-receive
在此时,我们有一个完全配置的Git存储库和一个Git接收后链接来更新您的网站,当收到更改之前,我们将通过配置git-shell
来保护我们的生产服务器,这是一种交互式壳,在用户通过SSH连接时可以为用户提供各种Git命令。
步骤 3 – 配置 Git Shell 以禁用交互式登录
用户可以通过以下方式实现git-shell
:作为一个交互式壳,在通过SSH连接时为他们提供各种命令,使他们能够创建新的存储库或添加新的SSH密钥,或者作为一个非交互式壳,禁用通过SSH访问服务器的控制台,但允许他们使用git
命令来管理现有的存储库。
如果您与任何人共享 git 用户的 SSH 密钥,他们将能够通过 SSH 访问交互式 Bash 会话,这是一个安全威胁,因为用户可以访问其他非网站相关的数据。
请确保您已登录为 git 用户. 如果您在上一个步骤后退出会话,您可以使用与之前相同的命令再次登录:
1su - git
开始创建一个git-shell-command
目录,需要git-shell
工作:
1mkdir ~/git-shell-commands
如果您不希望允许互动壳访问,则用于定义行为的非互动壳
文件,因此请在您选择的文本编辑器中打开它:
1nano ~/git-shell-commands/no-interactive-login
将下列内容复制到文件中,如果您尝试通过 SSH 登录,将显示欢迎消息:
1[label ~/git-shell-commnads/no-interactive-login]
2#!/usr/bin/env bash
3
4printf '%s\n' "You've successfully authenticated to the server as $USER user, but interactive sessions are disabled."
5
6exit 128
一旦完成,保存文件并关闭文本编辑器。
我们需要确保该文件是可执行的,所以‘git-shell’可以执行它:
1chmod +x ~/git-shell-commands/no-interactive-login
返回您的非 root sudo 用户,这样您就可以更改我们的 git 用户的属性。
1exit
最后,我们需要将 git 用户的壳改为git-shell
:
1sudo usermod -s $(which git-shell) git
請確定您無法從開發機器執行 SSH 來存取互動 shell:
1[environment local]
2ssh git@production_server_ip
如果你没有,请确保你有适当的SSH密钥,并追踪上面的步骤来解决问题,然后继续教程。
1[environment local]
2[secondary_label Output]
3Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-109-generic x86_64)
4...
5You've successfully authenticated to the server as git user, but interactive sessions are disabled.
6Connection to production_server_ip closed.
接下来,您将配置本地开发机器以使用该 Git 存储库,然后我们将将您的网站推到存储库。
步骤 4 — 将更改推向存储库
我们现在已经在生产服务器上初始化并配置了 Git 存储库,在开发机器上,我们需要初始化一个包含有关远程存储库和本地存储库所做的更改的本地存储库的数据的本地存储库。
在您的开发机器上,导航到包含该网站的目录:
1[environment local]
2cd ~/www
我们需要在网站的根目录中初始化一个Git存储库,这样我们就可以将内容推到远程存储库:
1[environment local]
2git init
输出包含成功存储初始化的消息:
1[environment local]
2[secondary_label Output]
3Initialized empty Git repository in /home/sammy/www
如果您没有看到此类输出,请按照屏幕上的消息来解决问题,然后继续。
现在,创建一个远程对象,它代表了用于跟踪您所工作的远程存储库和分支的 Git 对象. 通常,默认的远程被称为 origin ,因此我们将用于本教程的目的。
下列命令将创建一个 origin 远程,它将使用** git** 用户在生产服务器上跟踪** sammy-blog** 存储库:
1[environment local]
2git remote add origin git@production_server_ip:sammy-blog.git
没有输出表示操作成功. 如果您看到错误消息,请确保在继续下一步之前解决它。
每次你要将更改推到远程存储库时,你需要将更改推到远程存储库,然后将更改推到远程存储库。
承诺用于跟踪您所做的更改. 它们包含一个命令消息,用于描述该命令中所做的更改. 建议保持短暂但简要的消息,包括有关命令中所做的最重要的更改的详细信息。
在进行更改之前,我们需要选择要执行的文件,以下命令标记所有文件:
1[environment local]
2git add .
没有输出表示成功执行命令. 如果您看到任何错误,请确保在继续之前解决这些错误。
接下来,使用-m
标志进行所有更改,其中将包括 commit 消息. 因为这是我们的第一个 commit,我们将称之为 初始 commit
:
1[environment local]
2git commit -m "Initial commit."
输出包含在该 commit 中更改的目录和文件的列表:
1[environment local]
2[secondary_label Commit output]
3 10 files changed, 212 insertions(+)
4 create mode 100644 .gitignore
5 create mode 100644 404.html
6 create mode 100644 Gemfile
7 create mode 100644 Gemfile.lock
8 create mode 100644 _config.yml
9 create mode 100644 _posts/2017-09-04-link-test.md
10 create mode 100644 about.md
11 create mode 100644 assets/postcard.jpg
12 create mode 100644 contact.md
13 create mode 100644 index.md
如果您看到任何错误,请确保在继续教程之前解决它们。
最后,使用以下命令将承诺的更改推到远程存储库:
1[environment local]
2git push origin master
输出将包含有关推动的进度的信息. 完成后,您将看到如下信息:
1[environment local]
2[secondary_label Push output]
3Counting objects: 14, done.
4Delta compression using up to 4 threads.
5Compressing objects: 100% (12/12), done.
6Writing objects: 100% (14/14), 110.80 KiB | 0 bytes/s, done.
7Total 14 (delta 0), reused 0 (delta 0)
8remote: Cloning into '/tmp/sammy-blog'...
9remote: done.
10remote: /tmp/sammy-blog ~/sammy-blog.git
11remote: Configuration file: /tmp/sammy-blog/_config.yml
12remote: Source: /tmp/sammy-blog
13remote: Destination: /var/www/html
14remote: Incremental build: disabled. Enable with --incremental
15remote: Generating...
16remote: done in 0.403 seconds.
17remote: Auto-regeneration: disabled. Use --watch to enable.
18remote: ~/sammy-blog.git
19To git@188.166.57.145:sammy-blog.git
20 * [new branch] master -> master
如果您没有,请遵循屏幕日志来解决问题,然后继续教程。
在此时,您的网站将被上传到服务器,并在短时间后将被再生。 导航您的网页浏览器到 http://production_server_ip
. 您应该看到您的网站正在运行。 如果您没有,请重新执行前面的步骤,以确保您按计划完成了一切。
为了在更改某些内容时重建您的网站,您需要将文件添加到委托,委托它们,然后推更改,就像您最初的委托一样。
一旦您对文件进行了更改,请使用下列命令将所有更改的文件添加到 commit. 如果您创建了新文件,您还需要将其添加到git add,就像我们在初始 commit一样。
1[environment local]
2git commit -am "updated files"
最后,将更改推到远程存储库。
1[environment local]
2git push origin master
输出将看起来类似于您在最初的推力中看到的:
1[environment local]
2[secondary_label Push output]
3Counting objects: 14, done.
4Delta compression using up to 4 threads.
5Compressing objects: 100% (12/12), done.
6Writing objects: 100% (14/14), 110.80 KiB | 0 bytes/s, done.
7Total 14 (delta 0), reused 0 (delta 0)
8remote: Cloning into '/tmp/sammy-blog'...
9remote: done.
10remote: /tmp/sammy-blog ~/sammy-blog.git
11remote: Configuration file: /tmp/sammy-blog/_config.yml
12remote: Source: /tmp/sammy-blog
13remote: Destination: /var/www/html
14remote: Incremental build: disabled. Enable with --incremental
15remote: Generating...
16remote: done in 0.403 seconds.
17remote: Auto-regeneration: disabled. Use --watch to enable.
18remote: ~/sammy-blog.git
19To git@188.166.57.145:sammy-blog.git
20 * [new branch] master -> master
此时,您的网站新生成,最新的更改已经到位。
结论
在本教程中,您了解如何在推到 Git 存储库的更改后部署您的网站. 如果您想了解更多关于 Git 的信息,请查看我们的 Git 教程系列。
如果您想了解更多关于其他 Git 绑架的信息,请参阅 如何使用 Git 绑架来自动化开发和部署任务。