Deployer 是一个了不起的工具,用于部署网站(因此得名)。我看过其他工具,但因为 Deployer 是使用 PHP 构建和运行的,所以使用它来部署 PHP 站点是有意义的。这也意味着我不必弄清楚复杂的 XML 文档或学习 Ruby 只是为了了解部署正在做什么。
我已经使用 Deployer 部署我自己的站点有一段时间了,但我一直在使用 root 用户来完成部署以解决任何权限问题。当我与工作中的开发人员坐下来讨论时,我们研究了如何设置服务器,以便可以在不让工具不受限制地访问服务器的情况下运行部署。为此,我们制定了一个计划,在我们的服务器上创建一个“部署者”用户,该用户将是部署者用来部署站点的用户。
收集信息
在我们开始设置用户之前,我们需要收集几个变量。本质上,我们需要知道 Apache 使用什么用户来为网站提供服务。此信息稍后用于将部署者用户添加到 Apache 所在的组中。
Centos下使用一组名为阿帕奇和被叫用户的Apache,您可以使用以下命令确认这一点。
cat /etc/httpd/conf/httpd.conf | grep "^[Group|User]"
Ubuntu使用一个名为www数据和被叫用户WWW的数据,可以使用以下命令确认这一点。
cat /etc/apache2/envvars
要查看系统上当前的用户列表,您可以运行:
getent passwd
要查看系统上所有组的列表,您可以运行:
getent group
配置用户和组权限
有了这些信息,我们现在可以看看创建我们的部署者用户并将他们分配给正确的组。
创建部署者用户。
sudo useradd deployer
为部署者用户添加密码。
sudo passwd deployer
将部署者用户添加到 Apache 组。
usermod -a -G apache deployer
接下来,我们需要允许部署者访问才能运行 sudo 命令。这通常只是重启服务之类的事情。这是通过将用户添加到正确的组来完成的。
在 Centos 上,允许用户访问 sudo 命令的组称为wheel。
usermod -a -G wheel deployer
在 Ubuntu 上,这个组被称为sudo。
usermod -a -G sudo deployer
为确保部署者用户具有我们需要的访问权限,请使用以下命令。
getent group | grep deployer
尽管您已经为该用户创建了密码,但最好设置一个 ssh 密钥,而不是分发密码或(甚至更糟)将其提交到您的代码库。
确保对部署目录的写访问
现在我们已经创建了用户,我们需要确保用户可以访问我们要将网站部署到的目录。假设我们在 /var/www/html/your-website 中创建了一个目录,部署者将在该目录下进行我们的部署,权限设置如下。
首先,我们将整个目录设置为属于 Apache 组和用户。
sudo chown -R apache:apache /var/www/html/your-website
接下来,我们使用 chmod 工具运行一些命令,在该目录上正确设置权限。接下来的几个命令将通过首先限制访问然后添加我们想要的访问来设置适当的权限。
要做的第一件事是确保除了 Apache 用户的成员之外没有其他人可以访问该目录。我们使用“go”选项(意思是“组”和“其他”),然后是“-rwx”,这意味着我们将从这个目录中删除读、写和执行权限。我们还包括 -R 选项以递归地对所有子目录执行此操作。
chmod -R go-rwx /var/www/html/your-website
接下来,我们允许同一组(和 'other')的用户再次使用 'go' 选项访问该目录,然后是 '+x',它只提供对该目录的执行访问权限。
chmod go+x /var/www/html/your-website
我们现在可以开始授予用户和组访问此目录和所有子目录的权限。这是使用'g'选项完成的,然后是选项'+rwx',它为同一组的成员提供对该目录的读、写和执行访问权限。
chmod -R g+rwx /var/www/html/your-website
全部完成后,目录应该可以使用了。
访问权限
所有这一切的最后一步是确保用户有权从 git 存储库下载代码。实现此目的的最佳方法是使用部署密钥。这是一个允许只读访问 git repo 的密钥,这对用户来说是完美的。有许多教程详细介绍了如何执行此操作,但在服务器端,您需要创建运行类似内容的 ssh 密钥。
ssh-keygen -t rsa -b 4096
由于我们正在创建一条自动路线,因此您不应为此密钥创建密码。
接下来,复制密钥的公共部分并将其上传到您的 git 存储库。
cat ~/.ssh/id_rsa.pub
最后,使用您创建的 deloyer 用户登录并使用 ssh 尝试访问 git repo 主机。例如,如果您使用的是 bitbucket,则可以使用以下内容。
ssh git@bitbucket.org
这将告诉您您已通过部署密钥进行身份验证,并告诉您 shell 访问已被禁用。在开始设置部署程序接收之前,检查您是否具有所需的访问权限很有用。