Laravel是最流行的开源Web应用程序框架之一,旨在帮助开发人员通过简化常用的应用程序任务(如缓存和身份验证)来构建简单和复杂的应用程序。
在这个教程中,我们将部署一个简单的Laravel应用,同时牢记生产环境,这需要几个共同的步骤. 例如,应用程序应使用专用数据库用户,其访问范围仅限于必要的数据库。 文件权限应保证只有必要的目录和文件可以写出. 应当考虑应用程序设置,以确保没有向最终用户显示调试信息,这可能会暴露应用程序配置细节.
如果您想了解如何使用Laravel框架本身,Laravel自己的 Laravel from Scratch系列是开始的好地方。
前提条件
要遵循本教程,您将需要:
- 1个 Ubuntu 16.04 服务器,配备此初始服务器设置教程,包括一个sudo非root用户和一个防火墙.
- LEMP 堆栈通过跟随 Ubuntu 16.04 教程上的 [Linux, Nginx, MySQL, PHP (LEMP stack) (https://andsky.com/tech/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-in-ubuntu-16-04)而安装.
- 一个域名指向您的服务器,详见如何用数字海洋设置主机名. 该教程将始终使用`example.com'。 这是为您的网站获取 SSL 证书所必需的, 这样您就可以安全地使用 TLS 加密服务您的应用程序 。 .
步骤1 - 安装包依赖
要运行 Laravel 应用程序,您需要一些 PHP 扩展和一个名为 Composer的 PHP 依赖管理器,除了基本的 LEMP 堆栈。
首先,更新包管理器的缓存。
1sudo apt-get update
您需要的PHP扩展是用于多字节字符串支持和XML支持,您可以同时安装这些扩展、Composer和unzip(允许Composer处理 zip 文件)。
1sudo apt-get install php7.0-mbstring php7.0-xml composer unzip
现在安装了包依赖性,我们将为该应用程序创建和配置MySQL数据库和专用用户帐户。
第2步:配置MySQL
Laravel 支持各种数据库服务器. 由于本教程使用了 LEM P 堆栈,MySQL 将为应用程序存储数据。
在默认安装中,MySQL 只会创建 root 管理帐户.在网站内使用** root** 数据库用户是一种糟糕的安全实践,因为它在数据库服务器上具有无限的权限。
登录MySQLroot
管理帐户。
1mysql -u root -p
您将被提示在安装过程中为MySQL root 帐户设置的密码。
首先,创建一个名为laravel
的新数据库,这是我们将为网站使用的数据库,您可以选择不同的名称,但请确保记住它,因为您以后会需要它。
1CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
接下来,创建一个新的用户,将被允许访问这个数据库. 在这里,我们使用laraveluser
作为用户名,但你也可以定制它。
1GRANT ALL ON laravel.* TO 'laraveluser'@'localhost' IDENTIFIED BY 'password';
扫描权限以通知MySQL服务器的更改。
1FLUSH PRIVILEGES;
离开思维。
1EXIT;
您现在已经配置了一个专用数据库和使用Laravel的用户帐户,数据库组件已经准备好了,接下来,我们将设置演示应用程序。
步骤 3 – 设置演示应用程序
演示 quickstart
应用程序, 由 Laravel 在 GitHub 上分发,是一个简单的任务列表. 它允许您添加和删除任务项目,并将其任务存储在MySQL数据库中。
首先,在 Nginx Web 根中创建一个目录,其中将包含应用程序. 因为演示应用程序被命名为 quickstart
,让我们使用 /var/www/html/quickstart
。
1sudo mkdir -p /var/www/html/quickstart
接下来,将新创建的目录的所有权更改给您的用户,这样您就可以在不使用sudo
的情况下使用内部的文件。
1sudo chown sammy:sammy /var/www/html/quickstart
移动到新目录并使用 Git 克隆演示应用程序。
1cd /var/www/html/quickstart
2git clone https://github.com/laravel/quickstart-basic .
Git 将从演示应用程序存储库下载所有文件. 你会看到这样的输出:
1[secondary_label Git output]
2Cloning into '.'...
3remote: Counting objects: 263, done.
4remote: Total 263 (delta 0), reused 0 (delta 0), pack-reused 263
5Receiving objects: 100% (263/263), 92.75 KiB | 0 bytes/s, done.
6Resolving deltas: 100% (72/72), done.
7Checking connectivity... done.
接下来,我们需要安装项目依赖性。Laravel 使用 Composer 来处理依赖性管理,这使得安装所需的软件包轻松。
1composer install
较长的输出将显示所有项目依赖的安装进度:
1[secondary_label Composer output]
2Loading composer repositories with package information
3Installing dependencies (including require-dev) from lock file
4. . .
5Generating autoload files
6> php artisan clear-compiled
7> php artisan optimize
8Generating optimized class loader
应用程序本身是设置的,所以下一步是配置应用程序环境,这涉及连接应用程序和数据库,并定制一些生产设置。
第4步:配置应用环境
在此步骤中,我们将修改一些与安全相关的应用程序设置,允许应用程序连接到数据库,并准备使用数据库. 这些是所有 LEMP 支持的 Laravel 应用程序的必要步骤,而不仅仅是我们在这里使用的演示应用程序。
使用nano
或您最喜欢的文本编辑器打开 Laravel 环境配置文件。
1sudo nano /var/www/html/quickstart/.env
请确保更新位置变量,如密码
和example.com
,以相应的值。
1[label /var/www/html/quickstart/.env]
2APP_ENV=production
3APP_DEBUG=false
4APP_KEY=b809vCwvtawRbsG0BmP1tWgnlXQypSKf
5APP_URL=http://example.com
6
7DB_HOST=127.0.0.1
8DB_DATABASE=laravel
9DB_USERNAME=laraveluser
10DB_PASSWORD=password
11
12. . .
保存文件和退出。
这里有两个配置块;第一个是应用程序配置,第二个是数据库配置。
在应用程序配置部分:
- 联合国 `APP-ENV'变量表示应用程序运行的系统环境。 默认值是用于当地发展环境的 " 当地 " 值。 对于生产部署,应该像我们在这里所做的那样,改为"生产". 修改此变量控制日志动词,缓存设置,以及错误如何显示(取决于应用程序). 以"本地"设置,设置为方便开发与调试,在操作一个应用时方便,但不应该在生产设置中使用.
- 联合国
APP_DEBUG'变量是对
APP_ENV'的补充,并明确允许或禁止调试信息和动词错误显示。 在生产设置时,应将这一值设定为`虚假',以防止向用户显示调试信息。 - 联合国
APP_URL'变量指定了该站点应可访问的IP地址或域名。 我们在这里使用了
example.com'域名,但您应该用自己的域名来取而代之,网站应该使用。 .
数据库配置部分稍微简单一点:
- 'DB_DATABASE' 是数据库的名称. * 'DB_USERNAME' 是应用程序应该使用的 MySQL 用户的名称. * 'DB_PASSWORD' 是该用户的数据库密码。
接下来,我们必须运行 数据库迁移,这将填充新创建的数据库,以便演示应用程序正常运行所需的表。
1php artisan migrate
Artisan 将要求确认我们是否打算在生产模式中运行它. 回答y
到问题. 它将在之后运行必要的数据库任务。
1[secondary_label Artisan output]
2**************************************
3* Application In Production! *
4**************************************
5
6 Do you really wish to run this command? [y/N] (yes/no) [no]:
7 > y
8
9Migration table created successfully.
10Migrated: 2014_10_12_000000_create_users_table
11Migrated: 2014_10_12_100000_create_password_resets_table
12Migrated: 2015_10_27_141258_create_tasks_table
我们现在已经完全安装和配置了Laravel,接下来我们需要配置 Nginx来服务应用程序。
第5步:配置 Nginx
应用程序目录由我们的系统用户 sammy 拥有,可以读取,但不能被网页服务器编写。这对于大多数应用程序文件来说是正确的,但很少有需要特殊处理的目录。
让我们将存储
和bootstrap/cache
目录的群组所有权更改为 www-data 。
1sudo chgrp -R www-data storage bootstrap/cache
然后重复授予所有权限,包括写入和执行,给该组。
1sudo chmod -R ug+rwx storage bootstrap/cache
我们现在有所有演示应用程序文件,并具有相应的权限。接下来,我们需要更改 Nginx 配置以使其正确地与 Laravel 安装一起工作。 首先,让我们通过复制默认文件来为我们的应用程序创建一个 新服务器封锁配置文件。
1sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com
打开新创建的配置文件。
1sudo nano /etc/nginx/sites-available/example.com
有几个必要的变化,你将不得不做:
- 从
倾听
指令中删除默认_服务器
的指定, * 通过更改根
指令更新网页根, * 更新server_name
指令以正确地指向服务器的域名, * 通过更改try_files
指令更新请求URI处理。
修改的 Nginx 配置文件将看起来如下:
1[label /etc/nginx/sites-enabled/example.com]
2server {
3 listen 80;
4 listen [::]:80;
5
6 . . .
7
8 root /var/www/html/quickstart/public;
9 index index.php index.html index.htm index.nginx-debian.html;
10
11 server_name example.com www.example.com;
12
13 location / {
14 try_files $uri $uri/ /index.php?$query_string;
15 }
16
17 . . .
18}
让我们更详细地解释这些变化。
默认配置文件中的倾听
指令具有默认_服务器
选项启用,该选项规定如果没有其他服务器块是合适的,服务器块应提供请求。
Laravel 应用程序存储在 /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 应用程序文件。
完成上述更改后,您可以保存并关闭该文件,我们必须通过从该文件创建一个符号链接到网站启用
目录来启用新配置文件。
1sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
最后,重新加载 Nginx 来考虑这些变化。
1sudo systemctl reload nginx
现在 Nginx 已配置为 Laravel 演示应用程序,所有组件都已设置。
确保您的部署在这一点上工作很容易。只需访问您最喜欢的浏览器中的http://example.com。您将看到一个简单的任务应用程序的页面,您可以尝试添加或删除任务。您所做的所有更改都将保存在数据库中,并保留在后续访问网站时,您可以通过关闭浏览器并再次打开网站来验证。
在下一步和最后一步中,我们将配置 TLS 加密来通过安全连接服务应用程序。
步骤6:使用TLS保护您的应用程序
为了完成生产设置,建议通过使用TLS的安全HTTPS服务应用程序,这将确保应用程序与访问者之间的所有通信都被加密,这尤其重要,如果应用程序要求敏感信息,如登录或密码。
Let's Encrypt是一个免费的证书权威,使添加TLS到您的网站简单。 要启用HTTPS为新部署的应用程序,我们将遵循的教程 How To Secure Nginx with Let's Encrypt on Ubuntu 16.04与一些小的修改,以适应这个特定的Laravel应用程序的设置。
唯一的变化将是:
- 使用 Laravel 应用程序的位置(
/var/www/html/quickstart
)而不是默认的 Web 根 (/var/www/html
) 请求 SSL 证书时 * 修改/etc/nginx/sites-available/example.com
配置文件而不是默认的服务器封锁文件。
具体来说,获得证书的命令将是:
1sudo certbot certonly --webroot --webroot-path=/var/www/html/quickstart -d example.com -d www.example.com
最后版本的/etc/nginx/sites-available/example.com
配置文件将看起来像这样。
1[label /etc/nginx/sites-enabled/example.com]
2server {
3 listen 80;
4 listen [::]:80;
5
6 server_name example.com www.example.com;
7 return 301 https://$server_name$request_uri;
8}
9
10server {
11 listen 443 ssl http2;
12 listen [::]:443 ssl http2;
13
14 include snippets/ssl-example.com.conf;
15 include snippets/ssl-params.conf;
16
17 root /var/www/html/quickstart/public;
18
19 index index.php index.html index.htm index.nginx-debian.html;
20
21 server_name example.com www.example.com;
22
23 location / {
24 try_files $uri $uri/ /index.php?$query_string;
25 }
26
27 location ~ \.php$ {
28 include snippets/fastcgi-php.conf;
29 fastcgi_pass unix:/run/php/php7.0-fpm.sock;
30 }
31
32 location ~ /\.ht {
33 deny all;
34 }
35
36 location ~ /.well-known {
37 allow all;
38 }
39}
请确保配置中没有语法错误。
1sudo nginx -t
如果所有更改都成功,你会得到这样的结果:
1[secondary_label Output]
2nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
3nginx: configuration file /etc/nginx/nginx.conf test is successful
如果是这样的话,你可以安全地重新启动 Nginx 来实施这些更改。
1sudo systemctl restart nginx
Let's Encrypt TLS/SSL 证书将完全放置,应用程序将通过安全连接可用。 要验证一切是否按预期运行,只需访问 https://example.com
。 您应该看到与以前相同的申请表,但这次连接将完全安全。
结论
您现在已经成功部署了与 Laravel 一起发送的演示应用程序到使用 LEMP 堆栈的生产环境中。 使用真实世界的应用程序,配置任务列表可能涉及更多的步骤和应用程序特定的操作。 当您怀疑时,请始终参考您正在部署的应用程序的文档,但您也可以在 官方的 Laravel 文档中找到大量有用的信息。