博客 / 詳情

返回

CentOS7基於LNMP安裝配置Laravel

前言

距離上一次接觸Laravel還是2015年的時候,這一次基於CentOS7的LNMP(Linux, Nginx, MySQL, PHP)再重新回味下當年部署的樂趣,文檔裏記錄的是手動部署的步驟,ansible自動化部署代碼我就不放出來了,有問題可以留言諮詢。

更新歷史

2020年10月21日 - 初稿

閲讀原文 - https://wsgzao.github.io/post...


軟件版本

php版本各位可以選擇7.3以上,我自己選擇了7.2的最新版
  • CentOS Linux release 7.x
  • nginx 1.16.x
  • MySQL 5.7.x
  • php-fpm 7.2.x
  • Composer 1.x
  • laravel 7.x
  • nodejs v6.x
  • npm 3.x
  • yarn 1.x

升級EPEL倉庫

EPEL (Extra Packages for Enterprise Linux,企業版Linux的額外軟件包) 是Fedora小組維護的一個軟件倉庫項目,為RHEL/CentOS提供他們默認不提供的軟件包。這個源兼容RHEL及像CentOS和Scientific Linux這樣的衍生版本。

更多詳細介紹查看這裏:EPEl

我們需要Nginx安裝的EPEL倉庫,因為官方CentOS倉庫中不存在Nginx軟件包。

sudo yum -y install epel-release

安裝Nginx

使用LNMP環境下運行Laravel。Nginx是其中的Web服務器部分,可以從EPEL倉庫安裝。

# 安裝Nginx
sudo yum -y install nginx

# 安裝完成後,啓動Nginx並將其添加到系統自啓動
sudo systemctl start nginx
sudo systemctl enable nginx

# Nginx默認運行在80端口,使用下面的netstat命令檢查。
netstat -plntu | grep 80

安裝php-fpm

在CentOS基礎庫中不存在PHP 7.2,我們需要從名為remiwebtatic的第三方倉庫中安裝它。

方式一 remi倉庫(推薦)

之所以推薦它是因為它非常方便切換PHP的版本。

更多倉庫相關信息參考這裏。

安裝

sudo rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
sudo rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
sudo yum-config-manager --enable remi-php72 # 默認remi倉庫禁用的,在實際需要的時候啓用
sudo yum update
# sudo yum search php72 | more
sudo yum install -y php72 php72-php-fpm php72-php-gd php72-php-json php72-php-mbstring php72-php-mysqlnd php72-php-xml php72-php-xmlrpc php72-php-opcache php72-php-pecl-zip
sudo mkdir -p /run/php-fpm/remi-php72 # 創建一個sock存放的目錄
sudo ln -s  `which php72` /usr/local/sbin/php # 建立軟連接方便命令行使用

執行完上面的命令後,CentOS系統上已經安裝了PHP 7.2, 安裝好的php72目錄在/etc/opt/remi/php72, 也可以參考這個鏈接查看更多操作詳情。

卸載

remi倉庫支持PHP的多版本共存,不到萬不得已不建議使用卸載操作

sudo yum-config-manager --disable remi-php72 # 禁用remi-php72倉庫
sudo systemctl stop php72-php-fpm.service
yum remove php72 php72-php-fpm php72-php-gd php72-php-json php72-php-mbstring php72-php-mysqlnd php72-php-xml php72-php-xmlrpc php72-php-opcache
sudo rmdir /run/php-fpm/remi-php72
sudo rm -rf /etc/opt/remi/remi-php72 # 刪除前記得備份配置

至此,使用remi倉庫安裝的PHP已經成功卸載。

多版本安裝

再安裝一個PHP7.3版本為例,執行下面的操作即可完成PHP7.3版本的安裝。

sudo yum-config-manager --enable remi-php73
sudo yum install php73 php73-php-fpm php73-php-gd php73-php-json php73-php-mbstring php73-php-mysqlnd php73-php-xml php73-php-xmlrpc php73-php-opcache
sudo mkdir -p /run/php-fpm/remi-php73 # 創建一個sock存放的目錄
sudo ln -s  `which php73` /usr/local/sbin/php # 建立軟連接方便命令行使用

方式二 webtatic倉庫

安裝

rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
sudo yum install -y php72w php72w-gd php72w-curl php72w-common php72w-cli php72w-mysql php72w-mbstring php72w-fpm php72w-xml php72w-pdo php72w-zip

其他版本下載可以查看這裏:webtatic倉庫。

如果執行上面的命令一直報錯curl: (35) Encountered end of file,可以嘗試將上面的https協議改成http協議獲取rpm源。

執行完上面的命令後,CentOS系統上已經安裝了PHP 7.2, 安裝好的php72w目錄在/etc/php下。

卸載

注意: 如果想更換到php5.6或7.1版本, 直接把上面yum命令裏面的關鍵字php72w換成php56w或者 php71w就可以了。
sudo systemctl stop php-fpm
yum remove php72w php72w-curl php72w-common php72w-cli php72w-mysql php72w-mbstring php72w-fpm php72w-xml php72w-pdo php72w-zip

至此,使用webtatic倉庫安裝的PHP已經成功卸載。

配置php-fpm

通過使用vim編輯配置文件php.ini來配置PHP,remi倉庫方式安裝的主配置文件存放位置在/etc/opt/remi/php72/php.iniwebtatic倉庫方式安裝的主配置文件存放位置在/etc/php.ini

在文件中找如如下行,取消它的行註釋並將值更改為0。

cgi.fix_pathinfo=0

保存文件並退出編輯器。

編輯php-fpm文件www.confremi倉庫方式安裝的配置文件存放位置在/etc/opt/remi/php72/php-fpm.d/www.confwebtatic倉庫方式安裝的配置文件存放位置在/etc/php-fpm.d/www.conf

php-fpm將在用户和組nginx下運行,將下面兩行的值更改為nginx,這裏用户和用户組請保持與Nginx的用户和用户組一致。

# 用户和組保持和Nginx一致,使用命令 egrep '^(user|group)' /etc/nginx/nginx.conf 查看nginx進程的用户
user = nginx
group = nginx

php-fpm將在套接字文件下運行,而不是使用服務器端口,remi倉庫方式安裝的PHP可以將值改為/run/php-fpm/remi-php72/php-fpm.sockwebtatic倉庫方式安裝的PHP請將'listen'值更改為路徑/run/php-fpm/php-fpm.sock

# remi
listen = /run/php-fpm/remi-php72/php-fpm.sock

# webtatic
listen = /run/php-fpm/php-fpm.sock

套接字文件所有者將是“nginx”用户,權限模式為660,取消註釋並更改所有值。

listen.owner = nginx
listen.group = nginx
listen.mode  = 0660

對於環境變量,取消註釋這些行並設置值。

env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

保存文件並退出vim編輯,然後啓動php-fpm並使其在啓動時運行。

# remi
sudo systemctl start php72-php-fpm.service
sudo systemctl enable php72-php-fpm.service

# webtatic
sudo systemctl start php-fpm
sudo systemctl enable php-fpm
使用remi倉庫的時候啓動的時候可能會報錯,由於php-fpm.sock文件目錄不存在,執行命令:sudo mkdir -p /run/php-fpm/remi-php72後在啓動就沒有問題了。

檢查php-fpm

php-fpm在套接字文件下運行,使用以下命令檢查。

sudo netstat -pl | grep php-fpm.sock

安裝MySQL

可以使用MariaDB或PostgreSQL作為Laravel項目的數據庫存儲。 這裏使用MySQL數據庫服務器進行安裝。 它在CentOS存儲庫中可用, 使用下面的yum命令安裝MySQL-server。

下載並安裝MySQL5.7

wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
rpm -ivh mysql57-community-release-el7-11.noarch.rpm
sudo yum update
sudo yum install -y mysql-server
執行上面的命令進行MySQL的安裝,在安裝的過程中兩次按Y鍵,在同意後安裝完成。

啓動MySQL

使用下面的命令啓動mysql並使其隨系統啓動而啓動。

sudo systemctl start mysqld
sudo systemctl enable mysqld

測試MySQL

MySQL已經啓動並在3306端口上運行,可以使用netstat命令檢查。

netstat -plntu | grep 3306 # 檢查端口
ps aux|grep mysqld # 檢查進程

配置MySQL

獲取安裝時初始化密碼

sudo grep 'temporary password' /var/log/mysqld.log

登錄並重設root賬户密碼

mysql -uroot -p # 回車輸入上面獲取到的密碼

ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPassword1!';

創建一個測試數據庫和測試用户

CREATE DATABASE laravel; -- 創建一個laravel數據庫
GRANT ALL PRIVILEGES ON laravel.* TO laravel@localhost IDENTIFIED BY "LaravelPassword1!"; -- 創建一個對應的用户

至此,MySQL的安裝和配置已經完成。

安裝PHP Composer

PHP composer是PHP語言的包管理器。 它創建於2011年,靈感來自於Node.js的“npm”和Ruby的“bundler”安裝程序。 使用curl命令安裝composer。

php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
sudo mv composer.phar /usr/local/bin/composer

配置Packagist國內鏡像

composer config -g repo.packagist composer https://packagist.phpcomposer.com

安裝完成後,嘗試使用“composer”命令,您將看到以下結果。

composer
composer config -g repo.packagist -l # 查看配置的Packagist國內鏡像

至此,PHP Composer已經正常安裝在了CentOS系統上。

NodeJS + NPM + Yarn

sudo yum -y install nodejs npm
curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
sudo yum install -y yarn

安裝Laravel測試LNMP

現在進入到 laravel 的根目錄'/var/www/laravel'。

sudo mkdir -p /var/www/laravel && cd /var/www/laravel

Laravel提供了兩種在服務器上安裝框架的方法。可以用Laravel安裝程序安裝Laravel,也可以用PHP composer安裝它。在這裏我將通過使用composer命令創建一個新項目來安裝Laravel,運行下面的命令來安裝Laravel。

composer create-project laravel/laravel .

等待Laravel安裝完成。 這可能需要一些時間。

安裝完成後,將Laravel Web根目錄的所有者更改為“nginx”用户,並使用以下命令將存儲目錄的權限更改為755。

chown -R nginx:root /var/www/laravel
chmod 755 -R /var/www/laravel/storage

至此,Laravel安裝已經完成。

為Larvel配置Nginx配置

在這個步驟中,將為 Laravel 項目創建 Nginx 虛擬主機配置。 我們需要為此 Laravel 定義web根目錄/var/www/laravel/public

接下來,cd到 Nginx 目錄,並在conf.d目錄中創建一個新的虛擬主機配置文件laravel.conf

cd /etc/nginx
vim conf.d/laravel.conf

將下面的配置粘貼到文件中:

server {
    listen 80;

    # Log files for Debugging
    access_log /var/log/nginx/laravel-access.log;
    error_log /var/log/nginx/laravel-error.log;

    # Webroot Directory for Laravel project
    root /var/www/laravel/public;
    index index.php index.html index.htm;

    # Your Domain Name
    server_name laravel.domain.io;

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

    # PHP-FPM Configuration Nginx
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        # fastcgi_pass unix:/run/php-fpm/php-fpm.sock; # webtatic
        fastcgi_pass unix:/run/php-fpm/remi-php72/php-fpm.sock; # remi
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

保存文件並退出vim編輯器。

測試並重啓Nginx

測試nginx配置,確保沒有錯誤,然後重新啓動nginx服務。

nginx -t # 測試配置是否正確
sudo systemctl restart nginx # 重啓Nginx

至此,Laravel的nginx虛擬主機配置已經完成。

測試Laravel

打開瀏覽器並輸入服務器配置的Laravel URL,在Nginx虛擬主機文件中定義了Laravel的域名。 我的是laravel.domain.io

訪問域名時,您將看到Laravel框架的首頁。

CentOS 7上的Nginx、PHP-FPM、MySQL、Composer、NodeJS、Yarn和Laravel安裝已經成功。

測試數據庫和緩存

# 我修改了REDIS_CLIENT=predis,需要先執行以下命令安裝依賴包
composer require predis/predis

# 生成並修改.env,重點是DB和REDIS部分
/data/www/laravel/.env

APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:6+QhPUSBPIjI7LZi93aHdHKNWDWVmrI4mtQ3UnVLMV0=
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=LaravelPassword1!

BROADCAST_DRIVER=log
#CACHE_DRIVER=file
CACHE_DRIVER=redis
QUEUE_CONNECTION=sync
#SESSION_DRIVER=file
SESSION_DRIVER=redis
SESSION_LIFETIME=120

REDIS_CLIENT=predis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME="${APP_NAME}"

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=

PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1

MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

# 修改後需要測試mysql和redis時分別執行以下兩個命令完成驗證
php artisan migrate
php artisan cache:clear

問題記錄

執行composer create-project laravel/laravel .出現“proc_open(): fork failed - Cannot allocate memory”

原因通常是禁用了swap且內存太小導致,比較快速的解決方案是增加swap

dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
mkswap /var/swap.1
swapon /var/swap.1

訪問laravel.domain.io出現502 error code

原因建議優先檢查/var/log/nginx/laravel-error.log日誌,可能的情況有

  1. /var/wwww/laravel路徑的權限不正確導致permission denied,注意不同laravel版本間對子目錄權限的要求
  2. /etc/nginx/conf.d/laravel.conf 配置文件fastcgi_pass設置有誤
  3. php-fpm進程未正常啓動

參考文章

Laravel Installation

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.