简介
Laravel是一个开源的PHPWeb框架,旨在简化常见的Web开发任务,如身份验证、路由和缓存。Deployer是一个开放源码的php部署工具,开箱即用地支持许多流行的框架,包括Laravel、CodeIgniter、symfony和Zend框架。
Deployer通过将应用程序从Git存储库克隆到服务器、使用Composer,)安装依赖项并配置应用程序来自动化部署,这样您就不必手动执行此操作。这使您可以将更多时间花在开发上,而不是上传和配置上,并允许您更频繁地部署。
在本教程中,您将在不停机的情况下自动部署一个Laravel应用程序。为此,您需要准备本地开发环境,在该环境中部署代码,然后使用Nginx和MySQL数据库配置生产服务器来为应用程序提供服务。
前提条件
在开始阅读本指南之前,您需要具备以下条件:
- 一台Ubuntu 16.04服务器,其中非root用户具有sudo权限,如使用Ubuntu 16.04进行初始服务器设置教程中所述。
- 按照如何在Ubuntu 16.04中安装Linux,Nginx,MySQL,PHP(LEMP堆栈)教程中所述安装LEMP堆栈。
- 按照如何在Ubuntu 16.04上安装和使用Composer中的步骤1和步骤2在服务器上安装PHP、Composer和Git。
- 您的服务器上安装的
php-xml
和php-mbstring
包。通过运行:sudo apt-get install php7.0-mbstring php7.0-xml
安装这些。 - Git服务器您可以使用GitLab、Bitbucket或GitHub等服务。GitLab和Bitbucket免费提供私有仓库,GitHub提供私有仓库,每月7美元起。或者,您可以按照教程如何在VPS上设置私有Git服务器设置私有Git服务器。
- 指向服务器的域名。如何使用DigitalOcean设置主机名教程可以帮助您进行此配置。
- Composer和Git也安装在本地机器上。确切的安装方法取决于您的本地操作系统。安装Git的说明可以在Git project's Downloads page找到,你也可以直接从Composer project website下载Composer。
第一步-设置本地开发环境
由于您将从本地计算机创建和部署应用程序,因此应从配置本地开发环境开始。Deployer将从您的本地计算机控制整个部署过程,因此首先要安装它。
<$>[备注] 注意: 如果您在本地计算机上使用Windows,则应使用Bash模拟器(如Git bash)来运行所有本地命令。 <$>
在您的本机 上,打开终端,使用curl
下载Deployer安装程序:
1[environment local]
2curl -LO https://deployer.org/deployer.phar
接下来,运行一个简短的php脚本以验证安装程序是否与部署程序-下载页面.)上找到的最新安装程序的sha-1散列匹配用最新的哈希替换突出显示的值:
1[environment local]
2php -r "if (hash_file('sha1', 'deployer.phar') === '35e8dcd50cf7186502f603676b972065cb68c129') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('deployer.phar'); } echo PHP_EOL;"
1[secondary_label Output]
2[environment local]
3Installer verified
使Deployer在系统范围内可用。请注意,如果您在本地机器上运行Windows或MacOS,则可能需要先创建/usr/local/bin/des
目录,然后才能运行此命令:
1[environment local]
2sudo mv deployer.phar /usr/local/bin/dep
使其可执行:
1[environment local]
2sudo chmod +x /usr/local/bin/dep
接下来,在您的本地机器 上创建一个Laravel项目:
1[environment local]
2composer create-project --prefer-dist laravel/laravel laravel-app "5.5.*"
您已在本地计算机上安装了所有必需的软件。有了这些,我们将继续为应用程序创建一个Git存储库。
第二步-连接远程Git资源库
Deployer旨在使用户能够从任何地方部署代码。要实现此功能,它要求用户将代码推送到Internet上的存储库,然后Deployer将代码从该存储库复制到生产服务器。我们将使用开源版本控制系统Git来管理Laravel应用程序的源代码。您可以使用SSH协议连接到Git服务器,要安全地完成此操作,您需要生成SSH密钥。这比基于密码的身份验证更安全,使您可以避免在每次部署之前键入密码。
在您的本地机器 上运行以下命令以生成SSH密钥。请注意,-f
指定的是密钥文件的文件名,您可以使用自己的文件名替换gitkey。它会在~/.ssh/
文件夹中生成一个SSH密钥对(名为gitkey
和gitkey.pub
)。
1[environment local]
2ssh-keygen -t rsa -b 4096 -f ~/.ssh/gitkey
您的本地计算机上可能有更多的SSH密钥,因此请配置SSH客户端,使其知道在连接到您的Git服务器时使用哪个SSH私钥。
在本地机器上创建SSH配置文件 :
1[environment local]
2touch ~/.ssh/config
打开该文件并添加到Git服务器的快捷方式。它应该包含HostName
指令(指向您的Git服务器的主机名)和IdentityFile
指令(指向您刚刚创建的SSH密钥的文件路径):
1[label ~/.ssh/config]
2[environment local]
3Host mygitserver.com
4 HostName mygitserver.com
5 IdentityFile ~/.ssh/gitkey
保存并关闭文件,然后限制其权限:
1[environment local]
2chmod 600 ~/.ssh/config
现在,您的SSH客户端将知道使用哪个私钥连接到Git服务器。
使用以下命令显示公钥文件的内容:
1[environment local]
2cat ~/.ssh/gitkey.pub
复制输出并将公钥添加到您的Git服务器。
如果您使用Git托管服务,请参考其文档,了解如何向您的帐户添加SSH密钥:
现在,您将能够使用本地计算机连接到Git服务器。使用以下命令测试连接:
1[environment local]
2ssh -T [email protected]
如果此命令导致错误,请参考Git托管服务的文档检查您是否正确添加了SSH密钥,然后尝试再次连接。
在将应用程序推送到远程Git存储库并进行部署之前,让我们首先配置生产服务器。
第三步-配置Deployer用户
Deployer使用SSH协议在服务器上安全地执行命令。因此,我们配置生产服务器的第一步将是创建一个用户,Deployer可以使用该用户登录并通过SSH在您的服务器上执行命令。
使用sudo非root用户登录您的LEMP服务器,并使用以下命令创建一个名为**deployer**
的新用户:
1sudo adduser deployer
Laravel需要一些可写目录来存储缓存文件和上传内容,因此部署者 用户创建的目录必须是Nginx Web服务器可写的。将该用户添加到** www-data** 组,以执行以下操作:
1sudo usermod -aG www-data deployer
部署者 用户创建的文件默认权限为644
,目录默认权限为755
。这样,** 部署者** 用户将能够读写文件,而组和其他用户将能够读取它们。
将 deployer 的默认umask设置为022
:
1sudo chfn -o umask=022 deployer
我们将应用程序存储在/var/www/html/
目录中,因此将该目录的所有权更改为部署者 用户和** www-data** 组。
1sudo chown deployer:www-data /var/www/html
部署者 用户需要能够修改/var/www/html
目录下的文件和文件夹。因此,在/var/www/html
目录中创建的所有新文件和子目录都应该继承文件夹的组ID(** www-data** )。为此,请使用以下命令在此目录上设置组ID:
1sudo chmod g+s /var/www/html
部署人员将使用SSH将Git存储库克隆到生产服务器,因此您需要确保LEMP服务器和Git服务器之间的连接是安全的。我们将使用与本地计算机相同的方法,并为部署者 用户生成SSH密钥。
切换到您服务器上的部署者 用户:
1su - deployer
接下来,以部署者 用户身份生成SSH密钥对。这一次,您可以接受SSH密钥的默认文件名:
1ssh-keygen -t rsa -b 4096
显示公钥:
1cat ~/.ssh/id_rsa.pub
复制公钥并将其添加到Git服务器,就像您在上一步中所做的那样。
您的本地计算机也将使用SSH与服务器通信,因此您应该在本地计算机上为 deployer 用户生成SSH密钥,并将公钥添加到服务器。
在您的本地计算机 上运行以下命令。您可以随意使用您选择的文件名替换ployerkey:
1[environment local]
2ssh-keygen -t rsa -b 4096 -f ~/.ssh/deployerkey
复制以下命令的输出,其中包含公钥:
1[environment local]
2cat ~/.ssh/deployerkey.pub
在您的服务器 上,以** 部署者** 用户身份运行以下命令:
1nano ~/.ssh/authorized_keys
将公钥粘贴到编辑器中,按CTRL-X
、Y
、Enter
保存退出。
限制文件的权限:
1chmod 600 ~/.ssh/authorized_keys
现在切换回sudo用户:
1exit
现在,您的服务器可以连接到Git服务器,您可以在本地机器上以部署者 用户身份登录到服务器。
以部署者 用户身份从您的本地机器登录到您的服务器以测试连接:
1[environment local]
2ssh deployer@your_server_ip -i ~/.ssh/deployerkey
当您以部署人员 身份登录后,同时测试您的服务器与Git服务器之间的连接:
1ssh -T [email protected]
最后,退出服务器:
1exit
从这里开始,我们可以继续在我们的Web服务器上配置Nginx和MySQL。
第四步-配置Nginx
我们现在已经准备好配置将为应用程序提供服务的Web服务器。这将涉及配置我们将用来保存Laravel文件的文档根和目录结构。我们将设置Nginx来提供/var/www/laravel
目录中的文件。
首先,我们需要为新站点创建服务器块配置file。
以您的sudo用户身份登录到服务器并创建一个新的配置文件。记住用您自己的域名替换Example.com:
1sudo nano /etc/nginx/sites-available/example.com
在配置文件的顶部添加一个server
块:
1[label /etc/nginx/sites-available/example.com ]
2server {
3 listen 80;
4 listen [::]:80;
5
6 root /var/www/html/laravel-app/current/public;
7 index index.php index.html index.htm index.nginx-debian.html;
8
9 server_name example.com www.example.com;
10}
顶部的两个listen
指令告诉Nginx要监听哪些端口,而root
指令定义了将安装Laravel的文档根目录。根目录路径中的Current/Public
是指向应用程序最新版本的符号链接。通过添加index
指令,我们告诉Nginx在请求目录位置时,首先服务于任何index.php
文件,然后再查找它们的HTML对应文件。SERVER_NAME
指令后面应该跟您的域及其任何别名。
我们还应该修改Nginx处理请求的方式。这是通过try_files
指令完成的。我们希望它首先尝试将请求作为文件提供服务,如果它找不到具有正确名称的文件,它应该尝试为与请求匹配的目录提供默认索引文件。否则,它应该将请求作为查询参数传递给index.php
文件。
1[label /etc/nginx/sites-available/example.com ]
2server {
3 listen 80;
4 listen [::]:80;
5
6 root /var/www/html/laravel-app/current/public;
7 index index.php index.html index.htm index.nginx-debian.html;
8
9 server_name example.com www.example.com;
10
11 location / {
12 try_files $uri $uri/ /index.php?$query_string;
13 }
接下来,我们需要创建一个处理任何PHP文件的实际执行的块。这将适用于任何以.php结尾的文件。它将尝试文件本身,然后尝试将其作为参数传递给index.php
文件。
我们将设置fast cgi
指令,告诉nginx使用应用程序的实际路径(跟随符号链接后解析),而不是符号链接。如果不将这些行添加到配置中,则符号链接点将被缓存的路径,这意味着在部署之后将加载应用程序的旧版本。如果没有这些指令,您将不得不在每次部署后手动清除缓存,并且对应用程序的请求可能会失败。此外,fast cgi_pass
指令将确保nginx使用php7-fpm用于通信的套接字,并将index.php
文件用作这些操作的索引。
1[label /etc/nginx/sites-available/example.com ]
2server {
3 listen 80;
4 listen [::]:80;
5
6 root /var/www/html/laravel-app/current/public;
7 index index.php index.html index.htm index.nginx-debian.html;
8
9 server_name example.com www.example.com;
10
11 location / {
12 try_files $uri $uri/ /index.php?$query_string;
13 }
14
15 location ~ \.php$ {
16 include snippets/fastcgi-php.conf;
17
18 fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
19 fastcgi_param DOCUMENT_ROOT $realpath_root;
20
21 fastcgi_pass unix:/run/php/php7.0-fpm.sock;
22
23 }
最后,我们希望确保Nginx不允许访问任何隐藏的.htacces
文件。为此,我们将再添加一个名为Location~/\.ht
的Location块,并在该块中添加一个指定`Deny All;‘的指令。
添加最后一个位置块后,配置文件将如下所示:
1[label /etc/nginx/sites-available/example.com ]
2server {
3 listen 80;
4 listen [::]:80;
5
6 root /var/www/html/laravel-app/current/public;
7 index index.php index.html index.htm index.nginx-debian.html;
8
9 server_name example.com www.example.com;
10
11 location / {
12 try_files $uri $uri/ /index.php?$query_string;
13 }
14
15 location ~ \.php$ {
16 include snippets/fastcgi-php.conf;
17
18 fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
19 fastcgi_param DOCUMENT_ROOT $realpath_root;
20
21 fastcgi_pass unix:/run/php/php7.0-fpm.sock;
22
23 }
24
25 location ~ /\.ht {
26 deny all;
27 }
28
29}
保存并关闭文件(CTRL-X
、Y
,然后Enter
),然后通过创建指向站点启用
目录的符号链接来启用新的服务器块:
1sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
测试您的配置文件是否有语法错误:
1sudo nginx -t
如果您看到任何错误,请在继续之前返回并重新检查您的文件。
重新启动Nginx以推送必要的更改:
1sudo systemctl restart nginx
现在已经配置好了Nginx服务器。接下来,我们将配置应用程序的MySQL数据库。
第五步-配置MySQL
安装完成后,MySQL默认创建一个根用户 。不过,该用户拥有无限的权限,因此将** 根用户** 用于应用程序的数据库是一种糟糕的安全做法。相反,我们将使用专用用户为应用程序创建数据库。
以 root 身份登录MySQL控制台:
1mysql -u root -p
这将提示您输入 root 密码。
接下来,为应用程序创建一个新数据库:
1CREATE DATABASE laravel_database DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
然后,创建新的数据库用户。出于本教程的目的,我们将该用户命名为laravel_user
,密码为password
,但您应该将该密码替换为您选择的强密码。
1CREATE USER 'laravel_user'@'localhost' IDENTIFIED BY 'password';
向用户授予对数据库的权限:
1GRANT ALL ON laravel_database.* TO 'laravel_user'@'localhost';
接下来,重新加载权限:
1FLUSH PRIVILEGES;
最后,从MySQL控制台退出:
1EXIT;
您的应用程序的数据库和用户现在已经配置好,您几乎已经准备好运行您的第一次部署。
第六步-部署应用程序
到目前为止,您已经配置了Deployer运行所需的所有工具和程序。在运行第一次部署之前,剩下的工作就是完成您的Laravel应用程序和Deployer本身的配置,并初始化该应用程序并将其推送到您的远程Git存储库。
在 本地机器 上打开终端,使用以下命令将工作目录更改为应用程序的文件夹:
1[environment local]
2cd /path/to/laravel-app
在这个目录下,运行以下命令,在laravel-app
文件夹中创建一个名为deploy.php
的文件,其中包含配置信息和部署任务:
1[environment local]
2dep init -t Laravel
接下来,使用首选的文本编辑器或IDE打开ploy.php
文件。第三行包含一个PHP脚本,其中包含部署Laravel应用程序所需的任务和配置:
1[label deploy.php]
2[environment local]
3<?php
4namespace Deployer;
5
6require 'recipe/laravel.php';
7
8. . .
下面是一些您应该编辑以与您的配置保持一致的字段:
- 在
//项目名称
下,添加您的Laravel项目的名称。 - 在
//项目资源库
下,添加指向您的Git资源库的链接。 - 在
//Hosts
部分,在host()
指令中添加您的服务器的IP地址或域名,在user()
指令中添加您的Deployer用户的名称(在我们的示例中为 部署者** )。您还应该将在步骤3中创建的SSH密钥添加到标识文件()
指令中。最后,您应该添加包含应用程序的文件夹的文件路径。
当您完成编辑这些字段时,它们应该如下所示:
1[label deploy.php]
2[environment local]
3...
4// Project name
5set('application', 'laravel-app');
6
7// Project repository
8set('repository', '[email protected]:username/repository.git');
9
10. . .
11
12// Hosts
13
14host('your_server_ip')
15 ->user('deployer')
16 ->identityFile('~/.ssh/deployerkey')
17 ->set('deploy_path', '/var/www/html/laravel-app');
接下来,注释掉文件的最后一行BEFORE(‘Deploy:symlink’,‘artisan:Migrate’);
。该行指示Deployer自动运行数据库迁移,通过将其注释掉,我们将其禁用。如果不将其注释掉,部署将失败,因为此行要求服务器上有适当的数据库凭据,只能使用在第一次部署期间生成的文件添加:
1[label deploy.php]
2[environment local]
3...
4// Migrate database before symlink new release.
5
6//before('deploy:symlink', 'artisan:migrate');
在我们可以部署该项目之前,我们必须首先将其推送到远程Git存储库。
在您的本地计算机 上,将工作目录更改为您的应用程序文件夹:
1[environment local]
2cd /path/to/laravel-app
在您的laravel-app
目录中运行以下命令,以初始化项目文件夹中的Git存储库:
1[environment local]
2git init
接下来,将所有项目文件添加到存储库中:
1[environment local]
2git add .
提交更改:
1[environment local]
2git commit -m 'Initial commit for first deployment.'
使用以下命令将您的Git服务器添加到本地存储库。确保将突出显示的文本替换为您自己的远程存储库的URL:
1[environment local]
2git remote add origin [email protected]:username/repository.git
将更改推送到远程Git存储库:
1[environment local]
2git push origin master
最后,使用des
命令运行您的第一次部署:
1[environment local]
2dep deploy
如果一切顺利,您应该会看到如下所示的输出,末尾显示`Successful Deployeed!‘:
1[secondary_label Deployer's output]
2[environment local]
3✈︎ Deploying master on your_server_ip
4✔ Executing task deploy:prepare
5✔ Executing task deploy:lock
6✔ Executing task deploy:release
7➤ Executing task deploy:update_code
8✔ Ok
9✔ Executing task deploy:shared
10✔ Executing task deploy:vendors
11✔ Executing task deploy:writable
12✔ Executing task artisan:storage:link
13✔ Executing task artisan:view:clear
14✔ Executing task artisan:cache:clear
15✔ Executing task artisan:config:cache
16✔ Executing task artisan:optimize
17✔ Executing task deploy:symlink
18✔ Executing task deploy:unlock
19✔ Executing task cleanup
20Successfully deployed!
您的服务器上将在/var/www/html/laravel-app
目录中创建以下结构:
1├── .dep
2├── current -> releases/1
3├── releases
4│ └── 1
5└── shared
6 ├── .env
7 └── storage
通过在服务器上运行以下命令 **来验证这一点,该命令将列出文件夹中的文件和目录:
1ls /var/www/html/laravel-app
1[secondary_label Output]
2current .dep releases shared
以下是每个文件和目录包含的内容:
- releases目录包含Laravel应用程序的部署版本。
current
是指向最新版本的符号链接。- .dep目录包含Deployer的特殊元数据。
shared
目录包含.env
配置文件和storage
目录,它们将与每个版本符号链接。
但是,由于.env
文件为空,应用程序暂时无法运行。该文件用于保存重要的配置,如应用程序密钥-用于加密的随机字符串。如果未设置,您的用户会话和其他加密数据将不安全。该应用程序在您的本地计算机 上有一个.env
文件,但Laravel的.gitignore
文件将其排除在Git资源库之外,因为将密码等敏感数据存储在Git存储库并不是一个好主意,而且,该应用程序需要在您的服务器上进行不同的设置。.env
文件也包含数据库连接设置,这就是为什么我们在第一次部署时禁用了数据库迁移。
让我们在您的服务器上配置应用程序。
以部署者 用户身份登录您的服务器:
1[environment local]
2ssh deployer@your_server_ip -i ~/.ssh/deployerkey
在您的服务器上运行以下命令 **,将您本地的.env
文件复制粘贴到编辑器中:
1nano /var/www/html/laravel-app/shared/.env
在保存之前,您需要进行一些更改。将APP_ENV
设置为production
,将APP_DEBUG
设置为false
,将APP_DEBUG_LEVEL
设置为error
,不要忘记将数据库、数据库用户和密码替换为您自己的。你也应该用你自己的域名替换example.com:
1[label /var/www/html/laravel-app/shared/.env]
2APP_NAME=Laravel
3APP_ENV=production
4APP_KEY=base64:cA1hATAgR4BjdHJqI8aOj8jEjaaOM8gMNHXIP8d5IQg=
5APP_DEBUG=false
6APP_LOG_LEVEL=error
7APP_URL=http://example.com
8
9DB_CONNECTION=mysql
10DB_HOST=127.0.0.1
11DB_PORT=3306
12DB_DATABASE=laravel_database
13DB_USERNAME=laravel_user
14DB_PASSWORD=password
15
16BROADCAST_DRIVER=log
17CACHE_DRIVER=file
18SESSION_DRIVER=file
19QUEUE_DRIVER=sync
20
21REDIS_HOST=127.0.0.1
22REDIS_PASSWORD=null
23REDIS_PORT=6379
保存文件并关闭编辑器。
现在在本地机器上取消注释deploy.php
文件的最后一行:
1[label deploy.php]
2[environment local]
3...
4// Migrate database before symlink new release.
5
6before('deploy:symlink', 'artisan:migrate');
<$>[警告] 警告: 这将导致您的数据库迁移在每个部署上自动运行。这将使您避免手动迁移数据库,但不要忘记在部署之前备份数据库。 <$>
要检查此配置是否正常工作,请再次部署应用程序。在本地机器上运行以下命令 :
1[environment local]
2dep deploy
现在,您的应用程序将正常工作。如果您访问服务器的域名(http://example.com)),您将看到以下登录页面:
在所有部署之前,您不必编辑服务器上的.env
文件。典型的部署不像第一个部署那么复杂,只需要几个命令就可以完成。
Step 7 -典型部署
作为最后一步,本节将介绍一个简单的部署流程,您可以每天使用它。
在再次部署之前,首先修改应用程序。例如,您可以在routes/web.php
文件中添加新的路由:
1[label /routes/web.php]
2[environment local]
3<?php
4
5. . .
6
7Route::get('/', function () {
8 return view('welcome');
9});
10
11Route::get('/greeting', function(){
12 return 'Welcome!';
13});
提交以下更改:
1[environment local]
2git commit -am 'Your commit message.'
将更改推送到远程Git存储库:
1[environment local]
2git push origin master
最后,部署应用程序:
1[environment local]
2dep deploy
您已成功地将应用程序部署到您的服务器。<!--BPH:也许应该再加一点,告诉我们再次检查,点击新的路线,以确保它在那里。->
结论
您已经配置了本地计算机和服务器,以便轻松部署您的Laravel应用程序,而无需停机。本文只介绍了Deployer的基础知识,它有很多有用的功能。您可以一次部署到多个服务器并创建任务;例如,您可以在迁移之前指定备份数据库的任务。如果您想了解有关Deployer功能的更多信息,可以在Deployer documentation.]中找到更多信息