如何在 Ubuntu 22.04 (LEMP) 上用 Nginx 安装和配置 Laravel

介绍

Laravel是一个开源的PHP框架,提供了一套工具和资源来构建现代PHP应用程序. 随着完整的生态系统利用其内置的功能,Laravel的普及在过去几年中迅速增长,许多开发者采用它作为他们选择的框架,以简化开发过程。

在本指南中,您将在 Ubuntu 22.04 服务器上安装和配置一个新的 Laravel 应用程序,使用 Composer来下载和管理框架依赖和 Nginx 来服务应用程序。

前提条件

要完成本指南,您首先需要在 Ubuntu 22.04 服务器上执行以下任务:

第1步:安装必要的PHP模块

在您可以安装Laravel之前,您需要安装一些PHP模块,这些模块是框架所要求的。我们将使用apt来安装php-mbstring,php-xmlphp-bcmathPHP模块。这些PHP扩展为处理字符编码、XML和精确数学提供了额外的支持。

如果这是第一次在本会话中使用apt,您应该先运行更新命令来更新包管理器缓存:

1sudo apt update

现在您可以安装所需的软件包:

1sudo apt install php-mbstring php-xml php-bcmath php-curl

您的系统现在已经准备好通过 Composer 执行 Laravel 的安装,但在此之前,您需要为您的应用程序建立一个数据库。

步骤 2 – 创建应用程序的数据库

为了展示 Laravel 的基本安装和使用,我们将创建一个 travel list 应用程序,以显示用户想要旅行的地点列表,以及他们已经访问的地点列表。

要从 Laravel 应用程序连接到数据库,我们将创建一个专用 MySQL 用户,并授予该用户对旅行者数据库的全部权限。

在本文写作时,原生MySQL PHP库mysqlnd不支持(https://www.php.net/manual/en/ref.pdo-mysql.php)`caching_sha2_authentication`,这是MySQL 8的默认身份验证方法。

要开始,请登录 MySQL 控制台作为 root 数据库用户:

1sudo mysql

若要创建新的数据库,请从您的 MySQL 控制台执行以下命令:

1CREATE DATABASE travellist;

现在您可以创建一个新用户,并在您刚刚创建的自定义数据库中授予他们完整的权限. 在本示例中,我们正在创建一个名为 travellist_user 的用户,其密码为密码,但您应该将其更改为您选择的安全密码:

1CREATE USER 'travellist_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

现在我们需要在旅行者数据库上授予此用户权限:

1GRANT ALL ON travellist.* TO 'travellist_user'@'%';

这将为travellist_user用户提供对travellist数据库的完整权限,同时阻止该用户在您的服务器上创建或修改其他数据库。

接下来,输出 MySQL 壳:

1exit

现在,您可以通过再次登录到MySQL控制台来测试新用户是否有正确的权限,这一次使用自定义用户凭证:

1mysql -u travellist_user -p

请注意这个命令中的p标志,它会提示您在创建 travellist_user 用户时使用的密码。

1SHOW DATABASES;

这将为您带来以下结果:

1[secondary_label Output]
2+--------------------+
3| Database           |
4+--------------------+
5| information_schema |
6| travellist        |
7+--------------------+
82 rows in set (0.01 sec)

接下来,在旅行者数据库中创建一个名为地点的表,从MySQL控制台运行以下陈述:

1CREATE TABLE travellist.places (
2    id INT AUTO_INCREMENT,
3    name VARCHAR(255),
4    visited BOOLEAN,
5    PRIMARY KEY(id)
6);

现在,用一些样本数据填充位置表:

 1INSERT INTO travellist.places (name, visited) 
 2VALUES ("Tokyo", false),
 3("Budapest", true),
 4("Nairobi", false),
 5("Berlin", true),
 6("Lisbon", true),
 7("Denver", false),
 8("Moscow", false),
 9("Olso", false),
10("Rio", true),
11("Cincinnati", false),
12("Helsinki", false);

若要确认数据已成功保存到表中,请运行:

1SELECT * FROM travellist.places;

您将看到类似于此的输出:

 1[secondary_label Output]
 2+----+-----------+---------+
 3| id | name      | visited |
 4+----+-----------+---------+
 5|  1 | Tokyo     |       0 |
 6|  2 | Budapest  |       1 |
 7|  3 | Nairobi   |       0 |
 8|  4 | Berlin    |       1 |
 9|  5 | Lisbon    |       1 |
10|  6 | Denver    |       0 |
11|  7 | Moscow    |       0 |
12|  8 | Oslo      |       0 |
13|  9 | Rio       |       1 |
14| 10 | Cincinnati|       0 |
15| 11 | Helsinki  |       0 |
16+----+-----------+---------+
1711 rows in set (0.00 sec)

在确认您在测试表中有有效数据后,您可以退出MySQL控制台:

1exit

您现在已经准备好创建应用程序并将其配置为连接到新数据库。

步骤 3 – 创建一个新的Laravel应用程序

您现在将使用composer create-project命令创建一个新的 Laravel 应用程序. 此 Composer 命令通常用于基于现有框架和内容管理系统启动新应用程序。

在本指南中,我们将使用travellist作为示例应用程序,但您可以自由地将其更改为其他东西。travellist应用程序将显示来自本地MySQL服务器的位置列表,旨在展示Laravel的基本配置并确认您可以连接到数据库。

首先,进入用户的家庭目录:

1cd ~

以下命令将创建一个新的旅行者目录,该目录包含基于默认设置的Laravel应用程序:

1composer create-project --prefer-dist laravel/laravel travellist

您将看到类似于此的输出:

 1[secondary_label Output]
 2Creating a "laravel/laravel" project at "./travellist"
 3Installing laravel/laravel (v9.1.5)
 4  - Installing laravel/laravel (v9.1.5): Extracting archive
 5Created project in /home/sammy/travellist
 6> @php -r "file_exists('.env') || copy('.env.example', '.env');"
 7Loading composer repositories with package information
 8Updating dependencies
 9. . .
10Package manifest generated successfully.
1178 packages you are using are looking for funding.
12Use the `composer fund` command to find out more!
13> @php artisan vendor:publish --tag=laravel-assets --ansi --force
14No publishable resources for tag [laravel-assets].
15Publishing complete.
16> @php artisan key:generate --ansi
17Application key set successfully.
18. . .

安装完成后,访问应用程序目录并运行Laravel的手工命令,以验证所有组件是否成功安装:

1cd travellist
2php artisan

你会看到类似于此的输出:

 1[secondary_label Output]
 2Laravel Framework 9.8.1
 3
 4Usage:
 5  command [options] [arguments]
 6
 7Options:
 8  -h, --help Display help for the given command. When no command is given display help for the list command
 9  -q, --quiet Do not output any message
10  -V, --version Display this application version
11      --ansi|--no-ansi Force (or disable --no-ansi) ANSI output
12  -n, --no-interaction Do not ask any interactive question
13      --env[=ENV]       The environment the command should run under
14  -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
15. . .

此输出确认应用程序文件已在位置,Laravel命令行工具正在按预期工作,但我们仍然需要配置应用程序来设置数据库和其他一些细节。

步骤 4 – 配置 Laravel

Laravel 配置文件位于应用程序的 root 目录中的一个名为config的目录中。 此外,当您与 Composer 一起安装 Laravel 时,它会创建一个 environment file。 此文件包含对应用程序正在运行的当前环境特定的设置,并将优先于位于 config 目录中的常规配置文件中设置的值。 在新的环境中,每个安装都需要一个定制的环境文件来定义数据库连接设置、调试选项、应用程序 URL 等内容,这些内容可能因应用程序正在运行的环境而有所不同。

<$>[警告] 警告 :环境配置文件包含有关您的服务器的敏感信息,包括数据库凭证和安全密钥。

我们现在将编辑.env 文件,以定制当前应用环境的配置选项。

使用您所选择的命令行编辑器打开 .env 文件. 在这里,我们将使用 nano:

1nano .env

虽然这个文件中有许多配置变量,但您不需要现在设置所有这些变量,以下列表包含需要立即关注的变量概述:

  • APP_NAME:应用名称,用于通知和消息。
  • APP_ENV:当前应用环境.
  • APP_KEY:用于生成盐和哈希,此独特的密钥在安装Laravel时自动创建,所以您不需要更改它。
  • APP_DEBUG:是否在客户端显示调试信息。
  • APP_URL:应用程序的基本URL,用于生成应用链接。

默认情况下,这些值是为使用 Homestead的本地开发环境配置的,这是由 Laravel 提供的预先包装的 Vagrant 框。

如果您在 developmenttesting 环境中安装 Laravel,您可以将APP_DEBUG选项关闭,因为在从浏览器中测试应用程序时,这将为您提供重要的调试信息。

如果您在生产环境中安装 Laravel,您应该禁用APP_DEBUG选项,因为它会向最终用户显示有关您的应用程序的敏感信息。

下面的 .env 文件为 development 设置了我们的示例应用程序:

<$>[注] :「APP_KEY」变量包含一个独特的密钥,在您通过 Composer 安装 Laravel 时自动生成,您不需要更改此值。

 1[label /var/www/travellist/.env]
 2APP_NAME=TravelList
 3APP_ENV=development
 4APP_KEY=APPLICATION_UNIQUE_KEY_DONT_COPY
 5APP_DEBUG=true
 6APP_URL=http://domain_or_IP
 7
 8LOG_CHANNEL=stack
 9
10DB_CONNECTION=mysql
11DB_HOST=127.0.0.1
12DB_PORT=3306
13DB_DATABASE=travellist
14DB_USERNAME=travellist_user
15DB_PASSWORD=password
16
17. . .

当你完成编辑时,保存并关闭文件以保留你的更改. 如果你使用nano,你可以用CTRL+X,然后YEnter来确认。

您的 Laravel 应用程序现在已设置,但我们仍然需要配置 Web 服务器,以便能够从浏览器中访问它。

步骤五:设置 Nginx

我们已经在您的远程用户主目录的本地文件夹上安装了Laravel,虽然这对本地开发环境非常有效,但对于向公共互联网开放的Web服务器来说,这不是一个建议的做法。

首先,使用mv命令将应用程序文件夹及其所有内容移动到/var/www/travellist:

1sudo mv ~/travellist /var/www/travellist

现在我们需要给网页服务器用户写入存储缓存文件夹,在那里Laravel存储应用程序生成的文件:

1sudo chown -R www-data.www-data /var/www/travellist/storage
2sudo chown -R www-data.www-data /var/www/travellist/bootstrap/cache

应用程序文件现在有序,但我们仍然需要配置 Nginx 来服务内容. 为此,我们将创建一个新的虚拟主机配置文件在 /etc/nginx/sites-available:

1sudo nano /etc/nginx/sites-available/travellist

以下配置文件包含 Nginx 上 Laravel 应用程序的 推荐设置:

 1[label /etc/nginx/sites-available/travellist]
 2server {
 3    listen 80;
 4    server_name server_domain_or_IP;
 5    root /var/www/travellist/public;
 6
 7    add_header X-Frame-Options "SAMEORIGIN";
 8    add_header X-XSS-Protection "1; mode=block";
 9    add_header X-Content-Type-Options "nosniff";
10
11    index index.html index.htm index.php;
12
13    charset utf-8;
14
15    location / {
16        try_files $uri $uri/ /index.php?$query_string;
17    }
18
19    location = /favicon.ico { access_log off; log_not_found off; }
20    location = /robots.txt  { access_log off; log_not_found off; }
21
22    error_page 404 /index.php;
23
24    location ~ \.php$ {
25        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
26        fastcgi_index index.php;
27        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
28        include fastcgi_params;
29    }
30
31    location ~ /\.(?!well-known).* {
32        deny all;
33    }
34}

将此内容复制到您的 /etc/nginx/sites-available/travellist 文件,并在需要时调整突出值以匹配您的配置。

要激活新的虚拟主机配置文件,在网站启用中创建一个符号链接到旅行者:

1sudo ln -s /etc/nginx/sites-available/travellist /etc/nginx/sites-enabled/

<$>[注意] 注意 :如果您有另一个虚拟主机文件,此前已配置为同一服务器_名称用于旅行者虚拟主机,您可能需要通过在/etc/nginx/sites-enabled/中删除相应的符号链接来禁用旧配置。

要确认配置不包含任何语法错误,您可以使用:

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 reload nginx

现在,进入您的浏览器并使用服务器的域名或IP地址访问应用程序,如您的配置文件中的server_name指令所定义:

1http://server_domain_or_IP

你会看到这样的页面:

Laravel splash page

这确认您的 Nginx 服务器已正确配置以服务 Laravel. 从此,您可以开始在默认安装提供的骨骼上构建您的应用程序。

在下一步中,我们将修改应用程序的主要路径以使用Laravel的DB面貌查询数据库中的数据。

步骤 6 – 定制主页

假设您已经遵循本指南的所有步骤,您应该有一个工作Laravel应用程序和一个名为位置的数据库表,其中包含一些样本数据。

现在我们将编辑应用程序的主要路径来查询数据库,并将内容返回应用程序的 view

打开主路线文件,‘routes/web.php’:

1nano routes/web.php

此文件默认情况下提供以下内容:

 1[label routes/web.php]
 2<?php
 3
 4/*
 5|--------------------------------------------------------------------------
 6| Web Routes
 7|--------------------------------------------------------------------------
 8|
 9| Here is where you can register web routes for your application. These
10| routes are loaded by the RouteServiceProvider within a group which
11| contains the "web" middleware group. Now create something great!
12|
13*/
14
15Route::get('/', function () {
16    return view('welcome');
17});

在此文件中,路线是使用静态方法Route::get定义的,该路径将收到一个 path 和一个 callback 函数作为参数。

以下代码取代了主要路线回调函数. 它使用访问旗帜对数据库进行 2 个查询,以过滤结果. 它将结果返回到名为travellist的视图中,我们将下次创建。

 1[label routes/web.php]
 2<?php
 3
 4use Illuminate\Support\Facades\DB;
 5
 6Route::get('/', function () {
 7  $visited = DB::select('select * from places where visited = ?', [1]);	
 8  $togo = DB::select('select * from places where visited = ?', [0]);
 9
10  return view('travellist', ['visited' => $visited, 'togo' => $togo ] );
11});

当您完成编辑时,将保存并关闭文件. 我们现在将创建将数据库结果呈现给用户的视图. 在资源/视图中创建一个新的视图文件:

1nano resources/views/travellist.blade.php

下面的模板会根据访问togo变量创建两个位置列表,将此内容复制到新视图文件中:

 1[label resources/views/travellist/blade.php]
 2<html>
 3<head>
 4    <title>Travel List</title>
 5</head>
 6
 7<body>
 8    <h1>My Travel Bucket List</h1>
 9    <h2>Places I'd Like to Visit</h2>
10    <ul>
11      @foreach ($togo as $newplace)
12    	<li>{{ $newplace->name }}</li>
13      @endforeach
14    </ul>
15
16    <h2>Places I've Already Been To</h2>
17    <ul>
18          @foreach ($visited as $place)
19                <li>{{ $place->name }}</li>
20          @endforeach
21    </ul>
22</body>
23</html>

完成后保存并关闭文件. 现在进入您的浏览器并重新加载应用程序. 您将看到这样的页面:

Demo Laravel Application

你现在有一个功能性的Laravel应用程序从MySQL数据库中提取内容。

结论

在本教程中,您已经在LEMP堆栈(Linux, Nginx,MySQL和PHP)上设置了新的Laravel应用程序,在Ubuntu 22.04服务器上运行。

从这里,您可以为您的应用程序需要的任何额外页面创建新的路径和视图。 查看官方的 Laravel 文档,以获取有关 路径, 视图数据库支持的更多信息。

Published At
Categories with 技术
comments powered by Disqus