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

前言

最近須要在公司服務器上部署 Laravel 項目,中間遇到了較多問題,特此記錄一下。php

Laravel 服務器要求

因爲使用的是 Laravel 7.3.0,因此根據文檔 《Laravel 7 中文文檔》 - Laravel China 社區,須要 PHP 版本 >= 7.2.5 以及如下擴展:html

  • 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存儲庫:mysql

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

啓用存儲庫後,安裝 PHP7.2 和一些最多見的 PHP 模塊:linux

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

驗證 PHP 安裝:nginx

php -v

安裝 PHP 擴展

首先查看 PHP 已安裝的擴展:laravel

php -m

這個指令會列出全部已安裝的 PHP 擴展,接下來只須要找到沒有的擴展而後安裝就能夠了。若是以爲一個一個找是否已安裝麻煩,能夠利用 grep 管道命令篩選,例如:git

php -m | grep bcmath

對比出未安裝的擴展後,使用 yum list 查找,例如未安裝 bcmath 擴展,只須要執行下列指令:sql

yum list | grep php | grep bcmath

獲得結果爲:centos

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 其餘配置項的調優。

相關文章
相關標籤/搜索