如何在Ubuntu 18.04上使用LEMP安装和配置Laravel

Laravel是一个开源PHP框架,它提供了一组工具和资源来构建现代PHP应用程序。在本指南中,您将在Ubuntu 18.04服务器上安装和配置新的Laravel应用程序,使用Composer下载和管理框架依赖项。完成后,您将拥有一个功能强大的Laravel演示应用程序,可以从MySQL数据库中提取内容。

介绍

Laravel是一个开源PHP框架,它提供了一组工具和资源来构建现代PHP应用程序。 凭借其完整的生态系统利用其内置功能,Laravel在过去几年中的受欢迎程度迅速增长,许多开发人员将其作为简化开发流程的首选框架。

在本指南中,您将在Ubuntu 18.04服务器上安装和配置新的Laravel应用程序,使用Composer下载和管理框架依赖项。 完成后,您将拥有一个功能强大的Laravel演示应用程序,可以从MySQL数据库中提取内容。

先决条件

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

第1步 - 安装必需的PHP模块

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

如果这是第一次在此会话中使用apt ,则应首先运行update命令以更新程序包管理器缓存:

sudo apt update

现在您可以使用以下命令安装所需的包:

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

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

第2步 - 为应用程序创建数据库

为了演示Laravel的基本安装和使用,我们将创建一个示例旅行列表应用程序,以显示用户想要前往的地点列表,以及他们已经访问过的地点列表。 这可以存储在一个简单的地方表中,其中包含我们称之为名称的位置字段和另一个字段,用于将其标记为已访问或未访问过 ,我们将其称为已访问过的 此外,我们将包含一个id字段来唯一标识每个条目。

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

要开始使用,请以root用户身份登录MySQL控制台:

sudo mysql

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

CREATE DATABASE travel_list;

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

GRANT ALL ON travel_list.* TO 'travel_user'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

这将为travel_user用户提供travel_list数据库的完全权限,同时阻止此用户在您的服务器上创建或修改其他数据库。

在此之后,退出MySQL shell:

exit

您现在可以通过再次登录MySQL控制台来测试新用户是否具有适当的权限,这次使用自定义用户凭据:

mysql -u travel_user -p

请注意此命令中的-p标志,它将提示您输入创建travel_user用户时使用的密码。 登录MySQL控制台后,确认您有权访问travel_list数据库:

SHOW DATABASES;

这将为您提供以下输出:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| travel_list        |
+--------------------+
2 rows in set (0.01 sec)

接下来,在travel_list数据库中创建一个名为places的表。 在MySQL控制台中,运行以下语句:

CREATE TABLE travel_list.places (
    id INT AUTO_INCREMENT,
    name VARCHAR(255),
    visited BOOLEAN,
    PRIMARY KEY(id)
);

现在,使用一些示例数据填充places表:

INSERT INTO travel_list.places (name, visited) 
VALUES ("Tokyo", false),
("Budapest", true),
("Nairobi", false),
("Berlin", true),
("Lisbon", true),
("Denver", false),
("Moscow", false),
("Olso", false),
("Rio", true),
("Cincinati", false),

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

SELECT * FROM travel_list.places;

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

+----+-----------+---------+
| 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 | Cincinati |       0 |
+----+-----------+---------+
10 rows in set (0.00 sec)

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

exit

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

第3步 - 创建一个新的Laravel应用程序

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

在本指南中,我们将使用travel_list作为示例应用程序,但您可以将其更改为其他内容。 travel_list应用程序将显示从本地MySQL服务器提取的位置列表,用于演示Laravel的基本配置并确认您能够连接到数据库。

首先,转到用户的主目录:

cd ~

以下命令将创建一个新的travel_list目录,其中包含基于默认设置的准系统Laravel应用程序:

composer create-project --prefer-dist laravel/laravel travel_list

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

Installing laravel/laravel (v5.8.17)
  - Installing laravel/laravel (v5.8.17): Downloading (100%)         
Created project in travel_list
> @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 travel_list
php artisan

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

Laravel Framework 5.8.29

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 :用于生成salt和hashes,通过Composer安装Laravel时会自动创建此唯一键,因此您无需更改它。
  • APP_DEBUG :是否在客户端显示调试信息。
  • APP_URL :应用程序的基本URL,用于生成应用程序链接。
  • DB_DATABASE :数据库名称。
  • DB_USERNAME :用于连接数据库的用户名。
  • DB_PASSWORD :连接数据库的密码。

默认情况下,这些值是为使用Homestead的本地开发环境配置的, Homestead是Laravel提供的预先打包的Vagrant框。 我们将更改这些值以反映示例应用程序的当前环境设置。

如果您在开发测试环境中安装Laravel,则可以启用APP_DEBUG选项,因为这将在从浏览器测试应用程序时为您提供重要的调试信息。 在这种情况下, APP_ENV变量应设置为developmenttesting

如果要在生产环境中安装Laravel,则应禁用APP_DEBUG选项,因为它会向最终用户显示有关应用程序的敏感信息。 在这种情况下, APP_ENV应设置为production

以下.env文件设置了我们的开发示例应用程序:

注意APP_KEY变量包含通过Composer安装Laravel时自动生成的唯一键。 您无需更改此值。 如果要生成新的安全密钥,可以使用php artisan key:generate命令。

/var/www/travel_list/.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=travel_list
DB_USERNAME=travel_user
DB_PASSWORD=password

...

相应地调整变量。 完成编辑后,保存并关闭文件以保留更改。 如果您正在使用nano ,则可以使用CTRL+X ,然后使用YEnter来确认。

您的Laravel应用程序现已设置,但我们仍需要配置Web服务器才能从浏览器访问它。 在下一步中,我们将配置Nginx以服务您的Laravel应用程序。

第5步 - 设置Nginx

我们已经在远程用户主目录的本地文件夹上安装了Laravel,虽然这适用于本地开发环境,但对于对公共互联网开放的Web服务器不建议这样做。 我们将应用程序文件夹移动到/var/www ,这是在Nginx上运行的Web应用程序的常用位置。

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

sudo mv ~/travel_list /var/www/travel_list

现在我们需要为Web服务器用户提供对storagecache文件夹的写访问权限,Laravel存储应用程序生成的文件:

sudo chown -R www-data.www-data /var/www/travel_list/storage
sudo chown -R www-data.www-data /var/www/travel_list/bootstrap/cache

应用程序文件现在已按顺序排列,但我们仍需要配置Nginx来提供内容。 为此,我们将在/etc/nginx/sites-available创建一个新的虚拟主机配置文件:

sudo nano /etc/nginx/sites-available/travel_list

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

在/ etc / nginx的/网站可用/ travel_list
server {
    listen 80;
    server_name server_domain_or_IP;
    root /var/www/travel_list/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.2-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/ travel_list文件中,如有必要,调整突出显示的值以与您自己的配置保持一致。 完成编辑后保存并关闭文件。

要激活新的虚拟主机配置文件, travel_listsites-enabled创建travel_list的符号链接:

sudo ln -s /etc/nginx/sites-available/travel_list /etc/nginx/sites-enabled/

注意 :如果您有另一个先前为travel_list虚拟主机中使用的相同server_name配置的虚拟主机文件,则可能需要通过删除/etc/nginx/sites-enabled/的相应符号链接来停用旧配置。

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

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

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

http://server_domain_or_IP

您将看到如下页面:

Laravel启动页面

这证实您的Nginx服务器已正确配置为Laravel服务。 从这一点开始,您可以在默认安装提供的框架之上开始构建应用程序。

在下一步中,我们将使用Laravel的DB facade修改应用程序的主要路径以查询数据库中的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在此文件中定义Route::get ,该方法接收路径回调函数作为参数。

以下代码替换主路由回调函数。 它使用visited标志对数据库进行2次查询以过滤结果。 它将结果返回到名为travel_list的视图,我们将在下一步创建该视图。 将此内容复制到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('travel_list', ['visited' => $visited, 'togo' => $togo ] );
});

完成编辑后保存并关闭文件。 我们现在将创建将数据库结果呈现给用户的视图。 resources/views创建一个新的视图文件:

nano resources/views/travel_list.blade.php

以下模板根据visitedtogo的变量创建两个场所列表。 将此内容复制到新的视图文件:

资源/视图/ travel_list / 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应用程序

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

结论

在本教程中,您已经在Ubuntu 18.04服务器上运行的LEMP(Linux,Nginx,MySQL和PHP)之上设置了一个新的Laravel应用程序。 您还自定义了查询数据库内容的默认路由,并在自定义视图中显示结果。

从这里,您可以为应用程序所需的任何其他页面创建新的路径和视图。 有关路由视图数据库支持的更多信息,请查看Laravel官方文档。 如果要部署到生产环境,还应该检查优化部分,了解几种不同的方法,以提高应用程序的性能。

为了提高安全性,您应该考虑为服务器安装TLS / SSL证书,允许它通过HTTPS提供内容。 为此,您可以按照我们的指南, 了解如何使用Ubuntu 18.04上的Let's Encrypt来保护您的Nginx安装