Laravel 是一个使用 PHP 编写的最受欢迎的开源 Web 应用程序框架之一。它旨在帮助开发人员通过简化常用应用程序任务(如缓存和身份验证)来构建简单和复杂的应用程序。
在本教程中,我们将以生产环境为目标部署一个简单的 Laravel 应用程序,这需要一些常见的步骤。例如,应用程序应该使用专用的数据库用户,其访问权限仅限于必要的数据库。文件权限应该保证只有必要的目录和文件可写。应用程序设置应该考虑到确保不向最终用户显示任何调试信息,这可能会暴露应用程序配置细节。
本教程是关于部署现有应用程序的。如果您想了解如何使用 Laravel 框架本身,Laravel 的 Laravel 从零开始系列是一个很好的起点。
先决条件
要按照本教程操作,您需要:
- 一个安装了初始服务器设置教程的 Ubuntu 16.04 服务器,包括一个 sudo 非根用户和防火墙。
- 通过按照 Ubuntu 16.04 上的 Linux、Nginx、MySQL、PHP(LEMP 栈)教程安装了 LEMP 栈。
- 一个指向您的服务器的域名,如在《如何在 DigitalOcean 上设置主机名》中描述的那样。本教程将始终使用
example.com
。这是为了获得您网站的 SSL 证书,以便您可以通过 TLS 加密安全地提供您的应用程序。
步骤 1 — 安装软件包依赖项
要运行 Laravel 应用程序,您需要一些 PHP 扩展和一个名为 Composer 的 PHP 依赖管理器,以及基本的 LEMP 栈。
首先更新软件包管理器缓存。
sudo apt-get update
您将需要的 PHP 扩展是用于多字节字符串支持和 XML 支持。您可以同时安装这些扩展、Composer 和 unzip
(允许 Composer 处理 zip 文件)。
sudo apt-get install php7.0-mbstring php7.0-xml composer unzip
现在软件包依赖项已安装,我们将创建并配置一个 MySQL 数据库和专用用户帐户供应用程序使用。
步骤 2 — 配置 MySQL
Laravel 支持各种数据库服务器。因为本教程使用 LEMP 栈,MySQL 将存储应用程序的数据。
在默认安装中,MySQL 只创建了 root 管理帐户。在网站中使用 root 数据库用户是一个不好的安全实践,因为它在数据库服务器上拥有无限权限。相反,让我们为 Laravel 应用程序创建一个专用的数据库用户,并允许访问一个新的数据库。
登录到 MySQL root
管理帐户。
mysql -u root -p
您将被提示输入在安装过程中为 MySQL root 帐户设置的密码。
首先创建一个名为 laravel
的新数据库,这是我们将用于网站的数据库。您可以选择不同的名称,但请确保记住它,因为稍后您会需要它。
CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
接下来,创建一个新用户,该用户将被允许访问此数据库。在这里,我们使用 laraveluser
作为用户名,但您也可以自定义。请记得将以下行中的 password
替换为一个强大和安全的密码。
GRANT ALL ON laravel.* TO 'laraveluser'@'localhost' IDENTIFIED BY 'password';
刷新权限以通知 MySQL 服务器更改。
FLUSH PRIVILEGES;
然后退出 MySQL。
EXIT;
您现在已经为 Laravel 配置了一个专用数据库和用户帐户。数据库组件已准备就绪,接下来我们将设置演示应用程序。
步骤 3 — 设置演示应用程序
Laravel 在 GitHub 上发布的演示 quickstart
应用程序是一个简单的任务列表。它允许您添加和删除待办事项,并将其任务存储在 MySQL 数据库中。
首先,在 Nginx web 根目录内创建一个目录,用于保存应用程序。因为演示应用程序名为 quickstart
,让我们使用 /var/www/html/quickstart
。
sudo mkdir -p /var/www/html/quickstart
接下来,更改新创建的目录的所有者为您的用户,这样您就可以在其中使用文件而无需使用 sudo
。
sudo chown sammy:sammy /var/www/html/quickstart
转到新目录并使用 Git 克隆演示应用程序。
cd /var/www/html/quickstart git clone https://github.com/laravel/quickstart-basic .
Git 将从演示应用程序存储库下载所有文件。您将看到如下输出:
[secondary_label Git output] Cloning into '.'... remote: Counting objects: 263, done. remote: Total 263 (delta 0), reused 0 (delta 0), pack-reused 263 Receiving objects: 100% (263/263), 92.75 KiB | 0 bytes/s, done. Resolving deltas: 100% (72/72), done. Checking connectivity... done.
接下来,我们需要安装项目依赖项。Laravel 利用 Composer 处理依赖管理,这使得一次性安装必要的软件包变得很容易。
composer install
稍长的输出将显示所有项目依赖项的安装进度:
[secondary_label Composer output] Loading composer repositories with package information Installing dependencies (including require-dev) from lock file . . . Generating autoload files > php artisan clear-compiled > php artisan optimize Generating optimized class loader
应用程序本身已经设置好了,接下来是配置应用程序环境。这涉及连接应用程序和数据库,并为生产环境自定义一些设置。
## 步骤 4 —— 配置应用环境 在这一步中,我们将修改一些与安全相关的应用程序设置,允许应用程序连接到数据库,并准备数据库以供使用。这些步骤对于所有基于LEMP的Laravel应用程序都是必需的,不仅仅是我们在这里使用的演示应用程序。 使用 `nano` 或您喜欢的文本编辑器打开Laravel环境配置文件。 ```command sudo nano /var/www/html/quickstart/.env
您需要对文件进行以下更改。确保更新占位符变量,如 password
和 example.com
,使用适当的值进行更新。
APP_ENV=production APP_DEBUG=false APP_KEY=b809vCwvtawRbsG0BmP1tWgnlXQypSKf APP_URL=http://example.com DB_HOST=127.0.0.1 DB_DATABASE=laravel DB_USERNAME=laraveluser DB_PASSWORD=password . . .
保存文件并退出。
让我们更详细地了解这些更改。这里有两个配置块;第一个是应用程序配置,第二个是数据库配置。
在应用程序配置部分:
APP_ENV
变量表示应用程序运行的系统环境。默认值是local
,用于本地开发环境。对于生产部署,应将其更改为production
,就像我们在这里所做的那样。
更改此变量可以控制日志详细程度、缓存设置以及如何显示错误(取决于应用程序)。使用local
设置,它被设置为便于开发和调试,这在开发应用程序时很方便,但不应在生产设置中使用。APP_DEBUG
变量补充了APP_ENV
,明确启用或禁用调试信息和详细错误显示。在生产设置中,此值应设置为false
,以防止向用户显示调试信息。APP_URL
变量指定站点应该访问的IP地址或域名。我们在这里使用了example.com
域名,但您应该用您自己的域名替换它。
数据库配置部分更为直接:
DB_DATABASE
是数据库的名称。DB_USERNAME
是应用程序应该使用的MySQL用户的名称。DB_PASSWORD
是该用户的数据库密码。
接下来,我们需要运行数据库迁移,这将使用必要的表填充新创建的数据库,以便演示应用程序能够正常运行。
php artisan migrate
Artisan 将询问我们是否打算以生产模式运行它。回答问题时选择 y
。之后它将运行必要的数据库任务。
[secondary_label Artisan output] ************************************** * Application In Production! * ************************************** Do you really wish to run this command? [y/N] (yes/no) [no]: > y Migration table created successfully. Migrated: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_100000_create_password_resets_table Migrated: 2015_10_27_141258_create_tasks_table
现在,Laravel已经完全安装和配置。接下来,我们需要配置Nginx来提供应用程序。
步骤 5 —— 配置Nginx
应用程序目录由我们的系统用户 sammy 拥有,并且可读但不可写。这对于大多数应用程序文件来说是正确的,但有一些目录需要特殊处理。特别是,无论是Laravel存储上传的媒体还是缓存数据,Web服务器都必须能够访问它们,并且能够向它们写入文件。
让我们将 storage
和 bootstrap/cache
目录的组所有权更改为 www-data。
sudo chgrp -R www-data storage bootstrap/cache
然后递归地授予组所有权限,包括写入和执行。
sudo chmod -R ug+rwx storage bootstrap/cache
现在,我们已经将所有演示应用程序文件放置在适当的权限下。接下来,我们需要修改Nginx配置,使其正确地与Laravel安装配合工作。首先,让我们通过复制默认文件来为我们的应用程序创建一个新的服务器块配置文件。
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com
打开新创建的配置文件。
sudo nano /etc/nginx/sites-available/example.com
您需要进行一些必要的更改:
- 从
listen
指令中删除default_server
指定, - 通过更改
root
指令来更新Web根目录, - 通过更改
server_name
指令来正确指向服务器的域名, - 通过更改
try_files
指令来更新请求URI处理。
修改后的Nginx配置文件将如下所示:
server { listen 80; listen [::]:80; . . . root /var/www/html/quickstart/public; index index.php index.html index.htm index.nginx-debian.html; server_name example.com www.example.com; location / { try_files $uri $uri/ /index.php?$query_string; } . . . }
让我们更详细地解释这些更改。
默认配置文件中的 listen
指令启用了 default_server
选项,指定如果没有其他适合的服务器块,则该服务器块应提供请求。只能有一个启用了此选项的服务器块。因为我们保留了默认服务器块,我们将从第二个配置文件中删除 default_server
指定。
root
指令指定应用程序文件的存储位置。Laravel应用程序存储在 /var/www/html/quickstart
中,但只有 /public
子目录应该向互联网公开;所有其他应用程序文件根本不应该通过浏览器访问。为了符合这些最佳实践,我们将Web根目录设置为 /var/www/html/quickstart/public
。
server_name
指令指定服务器块将响应的域名列表。我们在这里使用了 example.com
和 www.example.com
,但您应该用您想要用于您的网站的域名替换它们。
我们还更改了请求URI处理。默认设置告诉Web服务器查找现有文件,然后查找现有目录,或者最终抛出404 Not Found错误(使用内置的 =404
设置)。为了使Laravel正常工作,所有请求必须路由到Laravel本身。这意味着我们删除了Nginx的默认404错误处理程序,并将其设置为 /index.php?$query_string
,这将请求查询传递给 index.php
文件,这是Laravel应用程序的主要文件。
当您进行了上述更改后,您可以保存并关闭文件。我们必须通过创建符号链接从此文件到 sites-enabled
目录来启用新的配置文件。
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
最后重新加载Nginx以使更改生效。
sudo systemctl reload nginx
现在,Nginx已配置为提供演示Laravel应用程序,所有组件都已设置好。
确保在此时您的部署正常工作非常容易。只需在您喜欢的浏览器中访问 http://example.com
。您将看到一个带有简单任务应用程序的页面,您可以尝试添加或删除任务。您所做的所有更改都将保存到数据库中,并在随后访问网站时保留,您可以通过关闭浏览器并再次打开网站来验证这一点。
在下一个也是最后一个步骤中,我们将配置TLS加密以通过安全连接提供应用程序。
第六步 — 使用 TLS 保护你的应用程序
为了完成生产环境的设置,建议使用 TLS 通过安全的 HTTPS 提供应用程序。这将确保应用程序和访问者之间的所有通信都将被加密,特别是当应用程序请求敏感信息如登录或密码时,这一点尤为重要。
Let’s Encrypt 是一个免费的证书颁发机构,它使得为你的网站添加 TLS 变得简单直接。为了为新部署的应用程序启用 HTTPS,我们将遵循《在 Ubuntu 16.04 上使用 Let’s Encrypt 保护 Nginx 的教程》,并对其进行一些小的修改以适应这个特定的 Laravel 应用程序的设置。
唯一的更改将是:
- 在请求 SSL 证书时,使用 Laravel 应用程序的位置 (
/var/www/html/quickstart
),而不是默认的网站根目录 (/var/www/html
)。 - 修改
/etc/nginx/sites-available/example.com
配置文件,而不是默认的服务器块文件。
具体来说,获取证书的命令将是:
sudo certbot certonly --webroot --webroot-path=/var/www/html/quickstart -d example.com -d www.example.com
/etc/nginx/sites-available/example.com
配置文件的最终版本将如下所示:
server { listen 80; listen [::]:80; server_name example.com www.example.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; include snippets/ssl-example.com.conf; include snippets/ssl-params.conf; root /var/www/html/quickstart/public; index index.php index.html index.htm index.nginx-debian.html; server_name example.com www.example.com; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.0-fpm.sock; } location ~ /\.ht { deny all; } location ~ /.well-known { allow all; } }
确保检查配置中没有语法错误。
sudo nginx -t
如果所有更改都成功,你将得到如下结果:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
如果是这种情况,你可以安全地重新启动 Nginx 以使更改生效。
sudo systemctl restart nginx
Let’s Encrypt 的 TLS/SSL 证书将完全生效,应用程序将通过安全连接可用。要验证一切是否按预期工作,只需访问 https://example.com
。你应该看到与之前相同的应用程序表单,但这次连接将完全受到保护。
结论
你已成功将一个带有 Laravel 的演示应用程序部署到了使用 LEMP 栈的生产环境中。对于真实的应用程序,配置任务的列表可能涉及更多步骤和特定于应用程序的操作。当有疑问时,始终参考你正在部署的应用程序的文档,但你也可以在官方 Laravel 文档中找到许多有用的信息。