如何在Ubuntu22.04(LEMP)上使用Nginx安装和配置Laravel
介绍
Laravel 是一个开源 PHP 框架,它提供了一组工具和资源来构建现代 PHP 应用程序。 凭借 完整的生态系统 利用其内置功能,Laravel 的受欢迎程度在过去几年迅速增长,许多开发人员将其作为简化开发过程的首选框架。
在本指南中,您将在 Ubuntu 22.04 服务器上安装和配置一个新的 Laravel 应用程序,使用 Composer 下载和管理框架依赖项并使用 Nginx 为应用程序提供服务。 完成后,您将拥有一个功能性的 Laravel 演示应用程序,该应用程序从 MySQL 8 数据库中提取内容。
先决条件
为了完成本指南,您首先需要在 Ubuntu 22.04 服务器上执行以下任务:
- 创建一个sudo用户并启用ufw。 要进行设置,您可以按照我们的 Initial Server Setup with Ubuntu 22.04 指南进行操作。
- 使用 MySQL 8 安装 LEMP 堆栈。 如果您还没有设置,您可以按照我们关于 如何在 Ubuntu 22.04 上安装 Nginx、MySQL 和 PHP 的指南中的步骤 1 到 3 进行操作。
- 安装作曲家。 我们将使用 Composer 来安装 Laravel 及其依赖项。 您可以按照我们关于 如何在 Ubuntu 22.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 php-curl
您的系统现在已准备好通过 Composer 执行 Laravel 的安装,但在此之前,您需要为您的应用程序提供一个数据库。
第 2 步 — 为应用程序创建数据库
为了演示 Laravel 的基本安装和使用,我们将创建一个 travel list 应用程序来显示用户想去的地方列表,以及他们已经访问过的地方列表。 这可以存储在 places 表中,其中一个字段用于我们将调用 name 的位置和另一个字段将它们标记为 visited 或 not已访问,我们将其称为已访问。 此外,我们将包含一个 id 字段来唯一标识每个条目。
要从 Laravel 应用程序连接到数据库,我们将创建一个专用的 MySQL 用户,并授予该用户对 travellist
数据库的完全权限。
在撰写本文时,原生 MySQL PHP 库 mysqlnd
不支持 caching_sha2_authentication
,这是 MySQL 8 的默认身份验证方法。 我们需要使用 mysql_native_password
身份验证方法设置我们的数据库用户,以便能够从 PHP 连接到 MySQL 数据库。
首先,以 root 数据库用户身份登录 MySQL 控制台:
sudo mysql
要创建新数据库,请从 MySQL 控制台运行以下命令:
CREATE DATABASE travellist;
现在您可以创建一个新用户并授予他们对您刚刚创建的自定义数据库的完全权限。 在此示例中,我们使用密码 password
创建了一个名为 travellist_user 的用户,但您应该将其更改为您选择的安全密码:
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)
接下来,在 travellist
数据库中创建一个名为 places
的表。 在 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
您现在已准备好创建应用程序并将其配置为连接到新数据库。
第三步——创建一个新的 Laravel 应用程序
您现在将使用 composer create-project
命令创建一个新的 Laravel 应用程序。 此 Composer 命令通常用于引导基于现有框架和内容管理系统的新应用程序。
在本指南中,我们将使用 travellist
作为示例应用程序,但您可以随意将其更改为其他内容。 travellist
应用程序将显示从本地 MySQL 服务器中提取的位置列表,旨在演示 Laravel 的基本配置并确认您能够连接到数据库。
首先,转到用户的主目录:
cd ~
以下命令将创建一个新的 travellist
目录,其中包含基于默认设置的准系统 Laravel 应用程序:
composer create-project --prefer-dist laravel/laravel travellist
您将看到与此类似的输出:
OutputCreating a "laravel/laravel" project at "./travellist" Installing laravel/laravel (v9.1.5) - Installing laravel/laravel (v9.1.5): Extracting archive Created project in /home/sammy/travellist > @php -r "file_exists('.env') || copy('.env.example', '.env');" Loading composer repositories with package information Updating dependencies . . . Package manifest generated successfully. 78 packages you are using are looking for funding. Use the `composer fund` command to find out more! > @php artisan vendor:publish --tag=laravel-assets --ansi --force No publishable resources for tag [laravel-assets]. Publishing complete. > @php artisan key:generate --ansi Application key set successfully. . . .
安装完成后,访问应用程序的目录并运行 Laravel 的 artisan
命令来验证所有组件是否安装成功:
cd travellist php artisan
您将看到与此类似的输出:
OutputLaravel Framework 9.8.1 Usage: command [options] [arguments] Options: -h, --help Display help for the given command. When no command is given display help for the list command -q, --quiet Do not output any message -V, --version Display this application version --ansi|--no-ansi Force (or disable --no-ansi) 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
:用于生成盐和哈希,这个唯一键是通过 Composer 安装 Laravel 时自动创建的,所以你不需要更改它。APP_DEBUG
:是否在客户端显示调试信息。APP_URL
:应用程序的基本 URL,用于生成应用程序链接。DB_DATABASE
:数据库名称。DB_USERNAME
:连接数据库的用户名。DB_PASSWORD
:连接数据库的密码。
默认情况下,这些值是为使用 Homestead 的本地开发环境配置的,这是 Laravel 提供的一个预打包的 Vagrant 盒子。 我们将更改这些值以反映示例应用程序的当前环境设置。
如果您在 development 或 testing 环境中安装 Laravel,您可以启用 APP_DEBUG
选项,因为这将在测试应用程序时为您提供重要的调试信息从浏览器。 在这种情况下,应将 APP_ENV
变量设置为 development
或 testing
。
如果您在 production 环境中安装 Laravel,您应该禁用 APP_DEBUG
选项,因为它会向最终用户显示有关您的应用程序的敏感信息。 这种情况下的 APP_ENV
应设置为 production
。
以下 .env
文件为 development 设置了我们的示例应用程序:
注意:APP_KEY
变量包含一个唯一键,它是您通过 Composer 安装 Laravel 时自动生成的。 您无需更改此值。 如果要生成新的安全密钥,可以使用 php artisan key:generate
命令。
/var/www/travellist/.env
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
,然后使用 Y
和 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 应用程序的 recommended 设置:
/etc/nginx/sites-available/travellist
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/php8.1-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
文件中,如有必要,调整突出显示的值以与您自己的配置保持一致。 完成编辑后保存并关闭文件。
要激活新的虚拟主机配置文件,请在 sites-enabled
中创建指向 travellist
的符号链接:
sudo ln -s /etc/nginx/sites-available/travellist /etc/nginx/sites-enabled/
注意:如果您有另一个虚拟主机文件先前配置为用于 travellist
虚拟主机中的相同 server_name
,您可能需要通过删除来停用旧配置/etc/nginx/sites-enabled/
中对应的符号链接。
要确认配置不包含任何语法错误,您可以使用:
sudo nginx -t
你应该看到这样的输出:
Outputnginx: 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
该文件默认包含以下内容:
路线/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
文件,替换已经存在的代码:
路线/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
创建两个地点列表。 将此内容复制到您的新视图文件中:
资源/视图/travellist/blade.php
<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 22.04 服务器上运行。 您还自定义了默认路由以查询数据库内容并在自定义视图中显示结果。
从这里,您可以为应用程序需要的任何其他页面创建新的路由和视图。 查看官方 Laravel 文档以获取有关 routes、views 和 数据库支持 的更多信息。 如果您要部署到生产环境,您还应该查看 优化部分 以了解可以提高应用程序性能的几种不同方法。