Laravel 项目部署,php-fpm 及 nginx 配置

贾蘅
• 阅读 9310

前言

最近需要在公司服务器上部署 Laravel 项目,中间遇到了较多问题,特此记录一下。

Laravel 服务器要求

由于使用的是 Laravel 7.3.0,所以根据文档 《Laravel 7 中文文档》 - Laravel China 社区,需要 PHP 版本 >= 7.2.5 以及以下扩展:

  • BCMath PHP 拓展
  • Ctype PHP 拓展
  • Fileinfo PHP 拓展
  • JSON PHP 拓展
  • Mbstring PHP 拓展
  • OpenSSL PHP 拓展
  • PDO PHP 拓展
  • Tokenizer PHP 拓展
  • XML PHP 拓展

安装符合版本的 PHP

首先安装符合版本的 PHP,这里我安装的是 php7.2.9,如果需要安装其他版本可以参考 《在 CentOS7 上安装 PHP7》
首先启用PHP 7.2 Remi存储库:

sudo yum-config-manager --enable remi-php72

启用存储库后,安装 PHP7.2 和一些最常见的 PHP 模块:

sudo yum install php php-common php-opcache php-mcrypt php-cli php-gd php-curl php-mysqlnd

验证 PHP 安装:

php -v

安装 PHP 扩展

首先查看 PHP 已安装的扩展:

php -m

这个指令会列出所有已安装的 PHP 扩展,接下来只需要找到没有的扩展然后安装就可以了。如果觉得一个一个找是否已安装麻烦,可以利用 grep 管道命令筛选,例如:

php -m | grep bcmath

对比出未安装的扩展后,使用 yum list 查找,例如未安装 bcmath 扩展,只需要执行下列指令:

yum list | grep php | grep bcmath

得到结果为:

php-bcmath.x86_64                       7.2.29-1.el7.remi             @remi-php72
php54-php-bcmath.x86_64                 5.4.45-18.el7.remi            remi-safe 
php55-php-bcmath.x86_64                 5.5.38-12.el7.remi            remi-safe 
php56-php-bcmath.x86_64                 5.6.40-19.el7.remi            remi-safe 
php70-php-bcmath.x86_64                 7.0.33-19.el7.remi            remi-safe 
php71-php-bcmath.x86_64                 7.1.33-6.el7.remi             remi-safe 
php72-php-bcmath.x86_64                 7.2.29-1.el7.remi             remi-safe 
php73-php-bcmath.x86_64                 7.3.16-1.el7.remi             remi-safe 
php74-php-bcmath.x86_64                 7.4.4-1.el7.remi              remi-safe 
php80-php-bcmath.x86_64                 8.0.0~DEV.20200409-1.el7.remi remi-safe

从中选择符合 PHP 版本的 bcmath 扩展,然后安装即可:

yum install php-bcmath.x86_64

然后只需重复以上步骤,把所有所需的扩展成功安装就好啦。

安装 PHP-FPM

接下来安装对应 PHP 版本的 PHP-FPM:

# 查找 php-fpm 的 rpm 包
yum list | grep php-fpm
# 找到对应版本安装即可
yum install php72-php-fpm.x86_64

安装之后,需要对 php-fpm 运行用户进行设置。先找到刚刚安装的 rpm 包:

rpm -qa | grep php-fpm

输出内容为:

php72-php-fpm-7.2.29-1.el7.remi.x86_64

显示刚刚安装的包的所有文件路径,也可以直接搭配 grep 命令找到配置文件:

rpm -ql php72-php-fpm-7.2.29-1.el7.remi.x86_64 | grep config

输出为:

/etc/opt/remi/php72/php-fpm.conf
/etc/opt/remi/php72/php-fpm.d/www.conf
/etc/opt/remi/php72/sysconfig/php-fpm
/opt/remi/php72/root/usr/share/doc/php72-php-fpm-7.2.29/php-fpm.conf.default
/opt/remi/php72/root/usr/share/doc/php72-php-fpm-7.2.29/www.conf.default

其中 /etc/opt/remi/php72/php-fpm.d/www.conf 就是我们要找的配置文件,将其中的 usergroup 修改为对应 nginx.conf 的用户组即可,因为我们服务器上 nginx 的设置为 user www www,因此我这里设置为 www

vi /etc/opt/remi/php72/php-fpm.d/www.conf
·
·
·
# 将 user 和 group 改为 www
user = www
group = www

这里是由于我们服务器上已经安装了 nginx,如果没有安装,可以参考这篇文章并配置:《nginx 和 php-fpm安装配置》 - Nginx 中文官方文档

配置 Nginx 站点配置

官方文档 《Laravel7.x 部署方式》 中有推荐的 Nginx 配置,我们只需要根据稍微调整就好。

server {
    listen 80;
    server_name example.com;
    root /example.com/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;
    }
}

需要注意 nginxfastcgi_pass 配置项,需要和 php-fpm 配置文件中 listen 配置项对应。
例如我 /etc/opt/remi/php72/php-fpm.d/www.conf 中配置项为 listen = /tmp/php-cgi.sock,所以需要把上面的配置改为:

location ~ \.php$ {
    fastcgi_pass unix:/tmp/php-cgi.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
    include fastcgi_params;
}

如果 listen 项为 127.0.0.1:9000,说明 nginxphp-fpm 之间的通信方式为 tcp socket 通信,则 nginx 配置需要改为:

location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
    include fastcgi_params;
}

详细可以参考 《浅析 Laravel 官方文档推荐的 Nginx 配置》- Laravel China 社区 这篇文章。

配置完成后,需要重新加载 nginx 配置:

# 检查 nginx 配置的语法
nginx -t
# 平滑重新加载配置文件
nginx -s reload

如果出现访问域名会自动下载首页代码的情况,说明上面的 location ~ \.php$ 配置项配置有问题,检查一下配置是否生效,以及清理一下浏览器缓存,别问我怎么知道的。

修改文件夹权限

laravel 部署后,若权限不正确可能会导致应用异常,抛出:

PHP Fatal error:  Uncaught ErrorException: file_put_contents(path/storage/framework/views/xxx.php): failed to open stream: Permission denied

更改 storage 文件夹权限:

sudo  chmod -R 0755 storage

更改 storage 文件夹拥有者与 php-fpm 配置文件中设置的运行用户一致,这里为上文的 www:

sudo  chown -R www:www storage

当然也可以直接给 storage 文件夹 777 权限,但是这里不推荐。可以参考 《Laravel 社区 Wiki — 文件夹权限》。除了文件夹权限相关配置,还包括 Nginxphp-fpm 其他配置项的调优。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
4年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
4年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这