前言
最近需要在公司服务器上部署 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
就是我们要找的配置文件,将其中的 user
和 group
修改为对应 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;
}
}
需要注意 nginx
的 fastcgi_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
,说明 nginx
和 php-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 — 文件夹权限》。除了文件夹权限相关配置,还包括 Nginx
和 php-fpm
其他配置项的调优。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。