介绍
Laravel是一个开源 PHP 框架,它提供了一组工具和资源来构建现代 PHP 应用程序。凭借利用其内置功能的完整生态系统,Laravel 的受欢迎程度在过去几年中迅速增长,许多开发人员采用它作为简化开发过程的首选框架。
在本指南中,您将在 Ubuntu 20.04 服务器上安装和配置一个新的 Laravel 应用程序,使用Composer下载和管理框架依赖项,使用 Nginx 为应用程序提供服务。完成后,您将拥有一个功能强大的 Laravel 演示应用程序,可从 MySQL 8 数据库中提取内容。
先决条件
为了完成本指南,您首先需要在 Ubuntu 20.04 服务器上执行以下任务:
- 创建
sudo
用户并启用ufw
. 要进行设置,您可以按照我们的Ubuntu 20.04 初始服务器设置指南进行操作。 - 使用 MySQL 8 安装 LEMP 堆栈。如果您还没有进行设置,您可以按照我们关于如何在 Ubuntu 20.04 上安装 Nginx、MySQL 和 PHP 的指南的步骤 1 到 3 进行操作。
- 安装作曲家。我们将使用Composer安装 Laravel 及其依赖项。您可以按照我们关于如何在 Ubuntu 20.04 上安装 Composer 的指南来安装 Composer。
第 1 步 – 安装所需的 PHP 模块
在安装 Laravel 之前,您需要安装一些框架所需的 PHP 模块。我们将用于apt
安装php-mbstring
,php-xml
和php-bcmath
PHP 模块。这些 PHP 扩展为处理字符编码、XML 和精确数学提供了额外的支持。
如果这是第一次apt
在此会话中使用,您应该首先运行update
命令来更新包管理器缓存:
- sudo apt update
现在您可以使用以下命令安装所需的软件包:
- sudo apt install php-mbstring php-xml php-bcmath
您的系统现在已准备好通过 Composer 执行 Laravel 的安装,但在此之前,您的应用程序需要一个数据库。
步骤 2 — 为应用程序创建数据库
为了演示 Laravel 的基本安装和使用,我们将创建一个旅行列表应用程序来显示用户想要旅行的地方列表以及他们已经访问过的地方列表。这可以存储在一个places表中,其中一个位置字段我们称之为name,另一个字段将它们标记为visited或notvisited,我们称之为visited。此外,我们将包含一个id字段来唯一标识每个条目。
为了从 Laravel 应用程序连接到数据库,我们将创建一个专用的 MySQL 用户,并授予该用户对travellist
数据库的完全权限。
在撰写本文时,本机 MySQL PHP 库mysqlnd
不支持 caching_sha2_authentication
MySQL 8 的默认身份验证方法。我们需要使用mysql_native_password
身份验证方法设置我们的数据库用户,以便能够连接到 MySQL 数据库来自 PHP。
首先,以root数据库用户身份登录 MySQL 控制台:
- sudo mysql
要创建新数据库,请从 MySQL 控制台运行以下命令:
- CREATE DATABASE travellist;
现在您可以创建一个新用户并授予他们对您刚刚创建的自定义数据库的完全权限。在此示例中,我们使用密码创建了一个名为travellist_user的用户password
,但您应该将其更改为您选择的安全密码:
- CREATE USER 'travellist_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
现在我们需要授予此用户对travellist
数据库的权限:
- GRANT ALL ON travellist.* TO 'travellist_user'@'%';
这将赋予travellist_user用户对该travellist
数据库的完全权限,同时防止该用户在您的服务器上创建或修改其他数据库。
在此之后,退出 MySQL shell:
- exit
您现在可以通过再次登录 MySQL 控制台来测试新用户是否具有适当的权限,这次使用自定义用户凭据:
- mysql -u travellist_user -p
请注意-p
此命令中的标志,它会提示您输入创建travellist_user用户时使用的密码。登录MySQL控制台后,确认您可以访问travellist
数据库:
- SHOW DATABASES;
这将为您提供以下输出:
Output+--------------------+
| Database |
+--------------------+
| information_schema |
| travellist |
+--------------------+
2 rows in set (0.01 sec)
接下来,创建一个places
在travellist
数据库中命名的表。从 MySQL 控制台,运行以下语句:
- CREATE TABLE travellist.places (
- id INT AUTO_INCREMENT,
- name VARCHAR(255),
- visited BOOLEAN,
- PRIMARY KEY(id)
- );
现在,places
用一些示例数据填充表:
- INSERT INTO travellist.places (name, visited)
- VALUES ("Tokyo", false),
- ("Budapest", true),
- ("Nairobi", false),
- ("Berlin", true),
- ("Lisbon", true),
- ("Denver", false),
- ("Moscow", false),
- ("Olso", false),
- ("Rio", true),
- ("Cincinnati", false),
- ("Helsinki", false);
要确认数据已成功保存到您的表中,请运行:
- SELECT * FROM travellist.places;
您将看到与此类似的输出:
Output+----+-----------+---------+
| id | name | visited |
+----+-----------+---------+
| 1 | Tokyo | 0 |
| 2 | Budapest | 1 |
| 3 | Nairobi | 0 |
| 4 | Berlin | 1 |
| 5 | Lisbon | 1 |
| 6 | Denver | 0 |
| 7 | Moscow | 0 |
| 8 | Oslo | 0 |
| 9 | Rio | 1 |
| 10 | Cincinnati| 0 |
| 11 | Helsinki | 0 |
+----+-----------+---------+
11 rows in set (0.00 sec)
在确认您的测试表中有有效数据后,您可以退出 MySQL 控制台:
- exit
您现在已准备好创建应用程序并将其配置为连接到新数据库。
第 3 步 – 创建一个新的 Laravel 应用程序
您现在将使用该composer create-project
命令创建一个新的 Laravel 应用程序。此 Composer 命令通常用于引导基于现有框架和内容管理系统的新应用程序。
在本指南中,我们将travellist
用作示例应用程序,但您可以随意将其更改为其他内容。该travellist
应用程序将显示从本地 MySQL 服务器中提取的位置列表,旨在演示 Laravel 的基本配置并确认您能够连接到数据库。
首先,转到您用户的主目录:
- cd ~
以下命令将travellist
根据默认设置创建一个包含准系统 Laravel 应用程序的新目录:
- composer create-project --prefer-dist laravel/laravel travellist
您将看到与此类似的输出:
OutputInstalling laravel/laravel (v5.8.17)
- Installing laravel/laravel (v5.8.17): Downloading (100%)
Created project in travellist
> @php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 80 installs, 0 updates, 0 removals
- Installing symfony/polyfill-ctype (v1.11.0): Downloading (100%)
- Installing phpoption/phpoption (1.5.0): Downloading (100%)
- Installing vlucas/phpdotenv (v3.4.0): Downloading (100%)
- Installing symfony/css-selector (v4.3.2): Downloading (100%)
...
安装完成后,访问应用程序的目录并运行 Laravel 的artisan
命令以验证所有组件是否已成功安装:
- cd travellist
- php artisan
你会看到类似这样的输出:
OutputLaravel Framework 7.11.0
Usage:
command [options] [arguments]
Options:
-h, --help Display this help message
-q, --quiet Do not output any message
-V, --version Display this application version
--ansi Force ANSI output
--no-ansi Disable ANSI output
-n, --no-interaction Do not ask any interactive question
--env[=ENV] The environment the command should run under
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
...
此输出确认应用程序文件已就位,并且 Laravel 命令行工具按预期工作。但是,我们仍然需要配置应用程序来设置数据库和其他一些细节。
第 4 步 – 配置 Laravel
Laravel 配置文件位于config
应用程序根目录中名为的目录中。此外,当您使用 Composer 安装 Laravel 时,它会创建一个环境文件. 此文件包含特定于应用程序正在运行的当前环境的设置,并将优先于位于config
目录中的常规配置文件中设置的值。在新环境中的每个安装都需要一个定制的环境文件来定义诸如数据库连接设置、调试选项、应用程序 URL 等项目,这些项目可能因应用程序运行的环境而异。
警告:环境配置文件包含有关您的服务器的敏感信息,包括数据库凭据和安全密钥。因此,您永远不应公开共享此文件。
我们现在将编辑该.env
文件以自定义当前应用程序环境的配置选项。
.env
使用您选择的命令行编辑器打开文件。在这里我们将使用nano
:
- nano .env
即使此文件中有许多配置变量,您现在也不需要设置所有这些变量。以下列表包含需要立即注意的变量的概述:
APP_NAME
:应用名称,用于通知和消息。APP_ENV
: 当前的应用环境。APP_KEY
: 用于生成salts和hash,这个唯一的key是在通过Composer安装Laravel的时候自动创建的,所以不需要修改。APP_DEBUG
: 是否在客户端显示调试信息。APP_URL
:应用程序的基本 URL,用于生成应用程序链接。DB_DATABASE
: 数据库名称。DB_USERNAME
: 连接数据库的用户名。DB_PASSWORD
: 连接数据库的密码。
默认情况下,这些值是为使用Homestead的本地开发环境配置的,Homestead是 Laravel 提供的预打包 Vagrant 框。我们将更改这些值以反映示例应用程序的当前环境设置。
如果您在开发 或测试环境中安装 Laravel ,您可以APP_DEBUG
启用该选项,因为这将在从浏览器测试应用程序时为您提供重要的调试信息。在这种情况下,APP_ENV
变量应设置为development
或testing
。
如果您在生产环境中安装 Laravel ,您应该禁用该APP_DEBUG
选项,因为它会向最终用户显示有关您的应用程序的敏感信息。在APP_ENV
这种情况下应设置为production
。
以下.env
文件设置了我们的开发示例应用程序:
注意:该APP_KEY
变量包含一个唯一的密钥,该密钥是您通过 Composer 安装 Laravel 时自动生成的。您不需要更改此值。如果要生成新的安全密钥,可以使用该php artisan key:generate
命令。
APP_NAME=TravelList
APP_ENV=development
APP_KEY=APPLICATION_UNIQUE_KEY_DONT_COPY
APP_DEBUG=true
APP_URL=http://domain_or_IP
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=travellist
DB_USERNAME=travellist_user
DB_PASSWORD=password
...
相应地调整您的变量。完成编辑后,保存并关闭文件以保留更改。如果您正在使用nano
,则可以使用CTRL+X
, thenY
和Enter
来确认。
你的 Laravel 应用程序现在已经设置好了,但我们仍然需要配置 web 服务器以便能够从浏览器访问它。在下一步中,我们将配置 Nginx 来为您的 Laravel 应用程序提供服务。
第 5 步 – 设置 Nginx
我们已将 Laravel 安装在远程用户主目录的本地文件夹中,虽然这适用于本地开发环境,但对于对公共 Internet 开放的 Web 服务器,这不是推荐的做法。我们将应用程序文件夹移动到/var/www
,这是在 Nginx 上运行的 Web 应用程序的常用位置。
首先,使用mv
命令将应用程序文件夹及其所有内容移动到/var/www/travellist
:
- sudo mv ~/travellist /var/www/travellist
现在我们需要授予 Web 服务器用户对storage
和cache
文件夹的写访问权限,Laravel 存储应用程序生成的文件的位置:
- sudo chown -R www-data.www-data /var/www/travellist/storage
- sudo chown -R www-data.www-data /var/www/travellist/bootstrap/cache
应用程序文件现在是有序的,但我们仍然需要配置 Nginx 来提供内容。为此,我们将在以下位置创建一个新的虚拟主机配置文件/etc/nginx/sites-available
:
- sudo nano /etc/nginx/sites-available/travellist
以下配置文件包含Nginx 上 Laravel 应用程序的推荐设置:
server {
listen 80;
server_name server_domain_or_IP;
root /var/www/travellist/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.html index.htm index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
将此内容复制到您的文件中,如有必要,调整突出显示的值以与您自己的配置保持一致。完成编辑后保存并关闭文件。/etc/nginx/sites-available/travellist
要激活新的虚拟主机配置文件,请创建指向travellist
in的符号链接sites-enabled
:
- sudo ln -s /etc/nginx/sites-available/travellist /etc/nginx/sites-enabled/
注意:如果您有另一个虚拟主机文件,之前为虚拟主机中server_name
使用的相同文件配置过travellist
,您可能需要通过删除/etc/nginx/sites-enabled/
.
要确认配置不包含任何语法错误,您可以使用:
- sudo nginx -t
你应该看到这样的输出:
Output- nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
- nginx: configuration file /etc/nginx/nginx.conf test is successful
要应用更改,请使用以下命令重新加载 Nginx:
- sudo systemctl reload nginx
现在转到您的浏览器并使用服务器的域名或 IP 地址访问应用程序,如server_name
配置文件中的指令所定义 :
http://server_domain_or_IP
你会看到一个这样的页面:
这确认您的 Nginx 服务器已正确配置为服务 Laravel。从这一点开始,您可以开始在默认安装提供的框架之上构建您的应用程序。
在下一步中,我们将修改应用程序的主路由,以使用 Laravel 的DB
外观查询数据库中的数据。
第 6 步 – 自定义主页
假设您已经按照本指南中的所有步骤进行了操作,您应该有一个可运行的 Laravel 应用程序和一个places
包含一些示例数据的名为的数据库表。
我们现在将编辑主应用程序路由以查询数据库并将内容返回到应用程序的视图。
打开主路由文件,routes/web.php
:
- nano routes/web.php
该文件默认包含以下内容:
<?php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
路由使用静态方法在此文件中定义,该方法Route::get
接收路径和回调函数作为参数。
以下代码替换了主路由回调函数。它使用该visited
标志对数据库进行 2 次查询以过滤结果。它将结果返回到名为 的视图travellist
,我们接下来将创建该视图。将此内容复制到您的routes/web.php
文件中,替换已有的代码:
<?php
use Illuminate\Support\Facades\DB;
Route::get('/', function () {
$visited = DB::select('select * from places where visited = ?', [1]);
$togo = DB::select('select * from places where visited = ?', [0]);
return view('travellist', ['visited' => $visited, 'togo' => $togo ] );
});
完成编辑后保存并关闭文件。我们现在将创建将向用户呈现数据库结果的视图。在里面创建一个新的视图文件resources/views
:
- nano resources/views/travellist.blade.php
以下模板基于变量visited
和 来创建两个地点列表togo
。将此内容复制到您的新视图文件中:
<html>
<head>
<title>Travel List</title>
</head>
<body>
<h1>My Travel Bucket List</h1>
<h2>Places I'd Like to Visit</h2>
<ul>
@foreach ($togo as $newplace)
<li>{{ $newplace->name }}</li>
@endforeach
</ul>
<h2>Places I've Already Been To</h2>
<ul>
@foreach ($visited as $place)
<li>{{ $place->name }}</li>
@endforeach
</ul>
</body>
</html>
完成后保存并关闭文件。现在转到您的浏览器并重新加载应用程序。你会看到一个这样的页面:
您现在有一个功能强大的 Laravel 应用程序,可以从 MySQL 数据库中提取内容。
结论
在本教程中,您已经在 LEMP 堆栈(Linux、Nginx、MySQL 和 PHP)之上设置了一个新的 Laravel 应用程序,并在 Ubuntu 20.04 服务器上运行。您还自定义了用于查询数据库内容并在自定义视图中显示结果的默认路由。
从这里,您可以为应用程序需要的任何其他页面创建新的路由和视图。查看官方 Laravel 文档以获取有关路由、视图和数据库支持的更多信息。如果您要部署到生产环境,您还应该查看优化部分,了解可以提高应用程序性能的几种不同方式。