如何在Ubuntu 16.04上使用Nginx部署Laravel应用程序

Laravel是用PHP编写的最流行的开源Web应用程序框架之一。它旨在通过使经常使用的应用程序任务(如缓存和身份验证)更容易,帮助开发人员构建简单和复杂的应用程序。 在本教程中,我们将介绍一个简单的Laravel应用程序,并考虑生产环境。

Laravel是用PHP编写的最流行的开源Web应用程序框架之一。 它旨在通过使经常使用的应用程序任务(如缓存和身份验证)更容易,帮助开发人员构建简单和复杂的应用程序。

在本教程中,我们将介绍一个简单的Laravel应用程序,其中包含生产环境,这需要一些常见的步骤。 例如,应用程序应该使用专门的数据库用户,访问仅限于必要的数据库。 文件权限应该保证只有必要的目录和文件是可写的。 应考虑应用程序设置,以确保最终用户没有显示调试信息,这可能会暴露应用程序配置详细信息。

本教程是关于部署现有应用程序。 如果您想了解如何使用Laravel框架本身,Laravel自己的Laravel从Scratch系列是一个很好的开始。

先决条件

要遵循本教程,您将需要:

第1步 - 安装软件包依赖关系

要运行Laravel应用程序,除了基本的LEMP之外,还需要一些PHP扩展和一个名为Composer的PHP依赖管理器。

从更新包管理器缓存开始。

sudo apt-get update

您需要的PHP扩展是多字节字符串支持和XML支持。 您可以同时安装这些扩展名,Composer和unzip (允许Composer处理zip文件)。

sudo apt-get install php7.0-mbstring php7.0-xml composer unzip

现在安装了软件包依赖关系,我们将为应用程序创建和配置MySQL数据库和专用用户帐户。

第2步 - 配置MySQL

Laravel支持各种数据库服务器。 由于本教程使用LE M P,MySQL将存储应用程序的数据。

在默认安装中,MySQL只创建管理帐户。 在网站中使用数据库用户是一种不好的安全措施,因为它具有数据库服务器上的无限权限。 相反,让我们创建一个用于Laravel应用程序的专用数据库用户,以及Laravel用户将被允许访问的新数据库。

登录MySQL root管理帐号。

mysql -u root -p

系统将提示您在安装期间为MySQL 帐户设置的密码。

首先创建一个名为laravel的新数据库,这是我们将用于网站的。 您可以选择不同的名称,但请务必记住,因为您以后需要它。

CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

接下来,创建一个允许访问此数据库的新用户。 这里我们使用laraveluser作为用户名,但也可以自定义。 请记住使用强大而安全的密码替换以下行中的密码。

GRANT ALL ON laravel.* TO 'laraveluser'@'localhost' IDENTIFIED BY 'password';

刷新权限以通知MySQL服务器的更改。

FLUSH PRIVILEGES;

并退出MySQL。

EXIT;

您现在已经配置了一个专用数据库和Laravel使用的用户帐户。 数据库组件已准备好,接下来,我们将设置演示应用程序。

第3步 - 设置演示应用程序

由Laravel在GitHub上发布的演示quickstart启动应用程序是一个简单的任务列表。 它允许您添加和删除待办事项并将其任务存储在MySQL数据库中。

首先,创建一个保存应用程序的目录。 因为演示应用程序命名为quickstart ,所以我们使用/var/www/quickstart

sudo mkdir -p /var/www/html/quickstart

接下来,将新创建的目录的所有权更改为用户,以便您可以在内部使用文件,而无需使用sudo

sudo chown sammy:sammy /var/www/html/quickstart

移动到新目录并使用Gi​​t克隆演示应用程序。

cd /var/www/html/quickstart
git clone https://github.com/laravel/quickstart-basic .

Git将从演示应用程序存储库中下载所有文件。 你会看到如下输出:

Cloning into '.'...
remote: Counting objects: 263, done.
remote: Total 263 (delta 0), reused 0 (delta 0), pack-reused 263
Receiving objects: 100% (263/263), 92.75 KiB | 0 bytes/s, done.
Resolving deltas: 100% (72/72), done.
Checking connectivity... done.

接下来,我们需要安装项目依赖关系。 Laravel利用Composer来处理依赖关系管理,这样一来就可以轻松安装所需的包。

composer install

稍长的输出将显示所有项目依赖关系的安装进度:

Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
. . .
Generating autoload files
> php artisan clear-compiled
> php artisan optimize
Generating optimized class loader

该应用程序本身已设置,因此下一步是配置应用程序环境。 这涉及连接应用程序和数据库,并定制一些生产设置。

第4步 - 配置应用环境

在此步骤中,我们将修改一些与安全相关的应用程序设置,允许应用程序连接到数据库,并准备数据库以供使用。 这些是所有LEMP支持的Laravel应用程序的必要步骤,而不仅仅是我们在这里使用的演示应用程序。

使用nano或您喜欢的文本编辑器打开Laravel环境配置文件。

sudo nano /var/www/html/quickstart/.env

您需要对文件进行以下更改。 确保使用适当的值更新占位符变量,如passwordexample.com

/var/www/html/quickstart/.env
APP_ENV=production
APP_DEBUG=false
APP_KEY=b809vCwvtawRbsG0BmP1tWgnlXQypSKf
APP_URL=http://example.com

DB_HOST=127.0.0.1
DB_DATABASE=laravel
DB_USERNAME=laraveluser
DB_PASSWORD=password

. . .

保存文件并退出。

让我们更详细地了解这些变化。 这里有两个配置块 第一个是应用程序配置,第二个是用于数据库配置。

在应用程序配置部分:

  • APP_ENV变量表示运行应用程序的系统环境。 默认值为local ,用于本地开发环境。 对于生产部署,应该将其更改为production ,就像我们在这里所做的那样。
    更改此变量可控制日志冗长度,缓存设置以及错误的显示方式(具体取决于应用程序)。 使用local设置,它的设置是为了简化开发和调试,这在工作在应用程序上是方便的,但不应该在生产设置中使用。

  • APP_DEBUG变量补充APP_ENV并显式启用或禁用调试信息和详细错误显示。 在生产设置中,此值应设置为false ,以防止向用户显示调试信息。

  • APP_URL变量指定可访问该站点的IP地址或域名。 我们在这里使用example.com域名,但是您应该用自己的域名来替换该网站。

数据库配置部分更简单:

  • DB_DATABASE是数据库的名称。
  • DB_USERNAME是应用程序应该使用的MySQL用户的名称。
  • DB_PASSWORD是该用户的数据库密码。

接下来,我们必须运行数据库迁移 ,这将使用必要的表填充新创建的数据库,以使演示应用程序正常运行。

php artisan migrate

工匠会要求确认是否打算以生产方式运行。 回答y的问题。 之后它将运行必要的数据库任务。

**************************************
*     Application In Production!     *
**************************************

 Do you really wish to run this command? [y/N] (yes/no) [no]:
 > y

Migration table created successfully.
Migrated: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_100000_create_password_resets_table
Migrated: 2015_10_27_141258_create_tasks_table

我们现在有Laravel完全安装和配置。 接下来,我们需要配置Nginx来为应用程序提供服务。

第5步 - 配置Nginx

应用程序目录由我们的系统用户拥有, sammy ,并且是可读的,但不能由Web服务器写入。 这对于大多数应用程序文件是正确的,但是很少有需要特殊处理的目录。 具体来说,无论Laravel存储上传媒体和缓存数据,Web服务器都不仅可以访问它们,还可以向其中写入文件。

我们将storagebootstrap/cache目录的组所有权更改为www-data

sudo chgrp -R www-data storage bootstrap/cache

然后递归地将所有权限(包括写入和执行)授予组。

sudo chmod -R ug+rwx storage bootstrap/cache

我们现在拥有适当权限的所有演示应用程序文件。 接下来,我们需要更改Nginx配置,使其正确使用Laravel安装。 首先,我们通过复制默认文件为我们的应用程序创建一个新的服务器块配置文件。

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com

打开新创建的配置文件。

sudo nano /etc/nginx/sites-enabled/example.com

您不得不进行必要的更改:

  • listen指令中删除default_server指定,
  • 通过更改root指令来更新Web根root
  • 更新server_name指令以正确指向服务器的域名,
  • 通过更改try_files指令来更新请求URI处理。

修改后的Nginx配置文件将如下所示:

/etc/nginx/sites-enabled/example.com
server {
    listen 80;
    listen [::]:80;

    . . .

    root /var/www/html/quickstart/public;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name example.com www.example.com;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    . . .
}

让我们更详细地解释这些变化。

默认配置文件中的default_server选项已启用,它指定如果没有其他服务器块合适,服务器块应该提供请求。 只有一个启用的服务器块可以启用此选项。 因为我们离开了默认的服务器块,我们将从第二个配置文件中删除default_server的名称。

root指令指定应用程序文件的存储位置。 Laravel应用程序存储在/var/www/html/ quickstart ,但只有/public子目录应该暴露给互联网; 所有其他应用程序文件不能通过浏览器访问。 为了遵守这些最佳做法,我们将Web根设置为/var/www/html/ quickstart /public

server_name指令指定服务器块将响应的域名列表。 我们使用example.comwww. example.com www. example.com在这里,但您应该用您想要用于您的网站的域名替换。

我们还更改了请求URI处理。 默认设置告诉Web服务器找到一个现有文件,然后找到一个现有的目录,或者最后抛出一个404 Not Found错误(使用内置=404设置)。 为了使Laravel能够正常工作,所有请求必须路由到Laravel本身。 这意味着我们删除了Nginx的默认404错误处理程序,并将其设置为/index.php?$query_string ,该请求将请求查询传递给主要Laravel应用程序文件index.php文件。

进行上述更改后,可以保存并关闭文件。 我们必须通过创建从该文件到sites-enabled目录的符号链接来启用新的配置文件。

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

最后重新加载Nginx来考虑更改。

sudo systemctl reload nginx

现在,Nginx配置为演示Laravel应用程序,所有组件都已设置。

确保您的部署在这一点上很容易。 只需访问您最喜欢的浏览器中的http:// example.com 您将看到一个包含简单任务应用程序的页面,您可以尝试添加或删除任务。 您所做的所有更改将保存到数据库中,并保留以供后续访问网站,您可以通过关闭浏览器并再次打开网站来验证。

在下一步和最后一步中,我们将配置TLS加密,以通过安全连接为应用程序提供服务。

第6步 - 使用TLS保护您的应用程序

要完成生产设置,建议通过使用TLS的安全HTTPS来提供应用程序。 这将确保应用程序与其访问者之间的所有通信都将被加密,这在应用程序要求敏感信息(如登录名或密码)时尤为重要。

让我们加密是一个免费的认证机构,使您的网站直接添加TLS。 要为新部署的应用程序启用HTTPS,我们将在使用Ubuntu 16.04教程加密Nginx的方法进行一些小的修改,以适应这个特定的Laravel应用程序的设置。

唯一的变化是:

  • 在请求SSL证书时,使用Laravel应用程序的位置( /var/www/html/ quickstart )而不是默认的Web根目录( /var/www/html )。
  • 修改/etc/nginx/sites-available/ example.com配置文件,而不是默认的服务器块文件。

具体来说,获得证书的命令将是:

sudo certbot certonly --webroot --webroot-path=/var/www/html/quickstart -d example.com -d www.example.com

/etc/nginx/sites-available/example.com配置文件的最终版本将如下所示

/etc/nginx/sites-enabled/example.com
server {
        listen 80;
        listen [::]:80;

        server_name example.com www.example.com;
        return 301 https://$server_name$request_uri;
}

server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        include snippets/ssl-example.com.conf;
        include snippets/ssl-params.conf;

        root /var/www/html/quickstart/public;

        index index.php index.html index.htm index.nginx-debian.html;

        server_name example.com www.example.com;

        location / {
                try_files $uri $uri/ /index.php?$query_string;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        }

        location ~ /\.ht {
                deny all;
        }

        location ~ /.well-known {
                allow all;
        }
}

确保检查配置中是否没有语法错误。

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

我们加密TLS / SSL证书将完全到位,应用程序将通过安全连接提供。 要验证一切是否符合预期,只需访问https :// example.com 您应该看到与以前相同的申请表,但这次连接将被完全保护。

结论

现在,您已经将Laravel附带的演示应用程序成功部署到使用LEMP的生产环境中。 使用现实世界的应用程序,配置任务列表可能涉及更多步骤和特定于应用程序的操作。 如有疑问,请务必参考您正在部署的应用程序的文档,但您也可以在官方Laravel文档中找到许多有用的信息