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

介绍

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

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

前提条件

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

要验证您的服务器当前使用的 PHP 版本,请运行:

1php -v
1[secondary_label output]
2PHP 7.4.22 (cli) (built: Jul 30 2021 13:07:59) ( NTS )
3Copyright (c) The PHP Group
4Zend Engine v3.4.0, Copyright (c) Zend Technologies
5    with Zend OPcache v7.4.22, Copyright (c), by Zend Technologies

检查输出,以确保您的服务器安装了 PHP 7.4 或更高版本,因为这是最新的 PHP 稳定版本。

步骤 1 — 安装 PHP-FPM 和必要的 PHP 模块

在您可以安装 Laravel 之前,您需要安装一些框架所要求的 PHP 模块,您还需要安装 PHP-FPM,如果您尚未设置此功能。

Laravel 需要php-mbstring,php-xmlphp-bcmath的 PHP 模块,这些 PHP 扩展为处理字符编码、XML 和精密数学提供了额外的支持,您还需要php-mysql来通过 PHP 代码连接到数据库。

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

1sudo apt update

您可能被要求提供您的用户密码以验证您的sudo权限. 更新完成后,您可以安装所需的软件包:

1sudo apt install php7.4-fpm php7.4-mysql php7.4-mbstring php7.4-xml php7.4-bcmath

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

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

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

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

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

1sudo mysql

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

1CREATE DATABASE travel_list;

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

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

这将给用户完全的权利,在数据库travel_list,同时阻止该用户创建或修改您的服务器上的其他数据库。

接下来,输出 MySQL 壳:

1exit

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

1mysql -u travel_user -p

请注意这个命令中的p标志,它会提示您在创建 travel_user 用户时使用的密码。登录到MySQL控制台后,确认您可以访问travel_list数据库:

1SHOW DATABASES;

这将为您带来以下结果:

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

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

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

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

 1INSERT INTO travel_list.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 travel_list.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 命令通常用于基于现有框架和内容管理系统启动新应用程序。

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

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

1cd ~

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

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

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

 1[secondary_label Output]
 2Creating a "laravel/laravel" project at "./travel_list"
 3Installing laravel/laravel (v8.5.22)
 4  - Installing laravel/laravel (v8.5.22): Extracting archive
 5Created project in /home/sammy/travel_list
 6> @php -r "file_exists('.env') || copy('.env.example', '.env');"
 7Loading composer repositories with package information
 8Updating dependencies
 9Lock file operations: 109 installs, 0 updates, 0 removals
10  - Locking asm89/stack-cors (v2.0.3)
11  - Locking brick/math (0.9.2)
12  - Locking dflydev/dot-access-data (v3.0.0)
13  - Locking doctrine/inflector (2.0.3)
14  - Locking doctrine/instantiator (1.4.0)
15  - Locking doctrine/lexer (1.2.1)   
16
17Package manifest generated successfully.
1875 packages you are using are looking for funding.
19Use the `composer fund` command to find out more!
20> @php artisan key:generate --ansi
21Application key set successfully.

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

1cd travel_list
2php artisan

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

 1[secondary_label Output]
 2Laravel Framework 8.52.0
 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 框。

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

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

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

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

 1[label /var/www/travel_list/.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=travel_list
14DB_USERNAME=travel_user
15DB_PASSWORD=password
16
17...

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

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

步骤五:设置 Nginx

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

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

1sudo mv ~/travel_list /var/www/travel_list

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

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

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

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

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

 1[label /etc/nginx/sites-available/travel_list]
 2server {
 3    listen 80;
 4    server_name server_domain_or_IP;
 5    root /var/www/travel_list/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/php7.4-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/travel_list 文件,并在需要时调整突出值以匹配您的配置。

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

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

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

1sudo rm -f /etc/nginx/sites-enabled/default

美元

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

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 个查询,以过滤结果. 它将结果返回到名为travel_list的视图中,我们将下一步创建。

 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('travel_list', ['visited' => $visited, 'togo' => $togo ] );
11});

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

1nano resources/views/travel_list.blade.php

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

 1[label resources/views/travel_list/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 18.04服务器上运行。

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

为了提高安全性,您应该考虑为您的服务器安装一个 TLS/SSL 证书,允许它通过 HTTPS 提供内容。 为此,您可以遵循我们的指南(如何在 Ubuntu 18.04 上使用 Let's Encrypt 保护您的 Nginx 安装)(https://andsky.com/tech/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-18-04)。

查看我们的 Laravel 标签页面 有关该框架的更多学习材料,包括技术演讲和教程系列。

Published At
Categories with 技术
comments powered by Disqus