前言

间隔上一次接触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仓库装置。

# 装置Nginxsudo yum -y install nginx# 装置实现后,启动Nginx并将其增加到零碎自启动sudo systemctl start nginxsudo 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-remisudo rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpmsudo yum-config-manager --enable remi-php72 # 默认remi仓库禁用的,在理论须要的时候启用sudo yum update# sudo yum search php72 | moresudo 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-zipsudo 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.serviceyum 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-opcachesudo rmdir /run/php-fpm/remi-php72sudo rm -rf /etc/opt/remi/remi-php72 # 删除前记得备份配置

至此,应用remi仓库装置的PHP曾经胜利卸载。

多版本装置

再装置一个PHP7.3版本为例,执行上面的操作即可实现PHP7.3版本的装置。

sudo yum-config-manager --enable remi-php73sudo 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-opcachesudo 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.rpmsudo 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-fpmyum 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 = nginxgroup = nginx

php-fpm将在套接字文件下运行,而不是应用服务器端口,remi仓库形式装置的PHP能够将值改为/run/php-fpm/remi-php72/php-fpm.sockwebtatic仓库形式装置的PHP请将'listen'值更改为门路/run/php-fpm/php-fpm.sock

# remilisten = /run/php-fpm/remi-php72/php-fpm.sock# webtaticlisten = /run/php-fpm/php-fpm.sock

套接字文件所有者将是“nginx”用户,权限模式为660,勾销正文并更改所有值。

listen.owner = nginxlisten.group = nginxlisten.mode  = 0660

对于环境变量,勾销正文这些行并设置值。

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

保留文件并退出vim编辑,而后启动php-fpm并使其在启动时运行。

# remisudo systemctl start php72-php-fpm.servicesudo systemctl enable php72-php-fpm.service# webtaticsudo systemctl start php-fpmsudo 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.rpmrpm -ivh mysql57-community-release-el7-11.noarch.rpmsudo yum updatesudo yum install -y mysql-server
执行下面的命令进行MySQL的装置,在装置的过程中两次按Y键,在批准后装置实现。

启动MySQL

应用上面的命令启动mysql并使其随系统启动而启动。

sudo systemctl start mysqldsudo 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.phpphp -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”命令,您将看到以下后果。

composercomposer config -g repo.packagist -l # 查看配置的Packagist国内镜像

至此,PHP Composer曾经失常装置在了CentOS零碎上。

NodeJS + NPM + Yarn

sudo yum -y install nodejs npmcurl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.reposudo 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/laravelchmod 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/nginxvim 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/.envAPP_NAME=LaravelAPP_ENV=localAPP_KEY=base64:6+QhPUSBPIjI7LZi93aHdHKNWDWVmrI4mtQ3UnVLMV0=APP_DEBUG=trueAPP_URL=http://localhostLOG_CHANNEL=stackDB_CONNECTION=mysqlDB_HOST=127.0.0.1DB_PORT=3306DB_DATABASE=laravelDB_USERNAME=laravelDB_PASSWORD=LaravelPassword1!BROADCAST_DRIVER=log#CACHE_DRIVER=fileCACHE_DRIVER=redisQUEUE_CONNECTION=sync#SESSION_DRIVER=fileSESSION_DRIVER=redisSESSION_LIFETIME=120REDIS_CLIENT=predisREDIS_HOST=127.0.0.1REDIS_PASSWORD=nullREDIS_PORT=6379MAIL_MAILER=smtpMAIL_HOST=smtp.mailtrap.ioMAIL_PORT=2525MAIL_USERNAME=nullMAIL_PASSWORD=nullMAIL_ENCRYPTION=nullMAIL_FROM_ADDRESS=nullMAIL_FROM_NAME="${APP_NAME}"AWS_ACCESS_KEY_ID=AWS_SECRET_ACCESS_KEY=AWS_DEFAULT_REGION=us-east-1AWS_BUCKET=PUSHER_APP_ID=PUSHER_APP_KEY=PUSHER_APP_SECRET=PUSHER_APP_CLUSTER=mt1MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"# 批改后须要测试mysql和redis时别离执行以下两个命令实现验证php artisan migratephp 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=1024mkswap /var/swap.1swapon /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