前言

距离上一次接触 Laravel 还是 2015 年的时候,这一次基于 CentOS7 的 LNMP(Linux, Nginx, MySQL, PHP)再重新回味下当年部署的乐趣,文档里记录的是手动部署的步骤,ansible 自动化部署代码我就不放出来了,有问题可以留言咨询。

更新历史

2020 年 10 月 21 日 - 初稿

阅读原文 - https://wsgzao.github.io/post/laravel/


软件版本

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 软件包。

1
sudo yum -y install epel-release

安装 Nginx

使用 LNMP 环境下运行 Laravel。Nginx 是其中的 Web 服务器部分,可以从 EPEL 仓库安装。

1
2
3
4
5
6
7
8
9
# 安装 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 的版本。

更多仓库相关信息参考这里

安装

1
2
3
4
5
6
7
8
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 的多版本共存, 不到万不得已不建议使用卸载操作

1
2
3
4
5
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 版本的安装。

1
2
3
4
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 仓库

安装

1
2
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 就可以了。

1
2
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。

1
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 的用户和用户组一致。

1
2
3
# 用户和组保持和 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

1
2
3
4
5
# remi
listen = /run/php-fpm/remi-php72/php-fpm.sock

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

套接字文件所有者将是 “nginx” 用户,权限模式为 660,取消注释并更改所有值。

1
2
3
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

对于环境变量,取消注释这些行并设置值。

1
2
3
4
5
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

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

1
2
3
4
5
6
7
# 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 在套接字文件下运行,使用以下命令检查。

1
sudo netstat -pl | grep php-fpm.sock

安装 MySQL

可以使用 MariaDB 或 PostgreSQL 作为 Laravel 项目的数据库存储。 这里使用 MySQL 数据库服务器进行安装。 它在 CentOS 存储库中可用, 使用下面的 yum 命令安装 MySQL-server

下载并安装 MySQL5.7

1
2
3
4
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 并使其随系统启动而启动。

1
2
sudo systemctl start mysqld
sudo systemctl enable mysqld

测试 MySQL

MySQL 已经启动并在 3306 端口上运行,可以使用 netstat 命令检查。

1
2
netstat -plntu | grep 3306 # 检查端口
ps aux|grep mysqld # 检查进程

配置 MySQL

获取安装时初始化密码

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

登录并重设 root 账户密码

1
2
3
mysql -uroot -p # 回车输入上面获取到的密码

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

创建一个测试数据库和测试用户

1
2
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。

1
2
3
4
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 国内镜像

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

安装完成后,尝试使用 “composer” 命令,您将看到以下结果。

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

至此,PHP Composer 已经正常安装在了 CentOS 系统上。

NodeJS + NPM + Yarn

1
2
3
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’。

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

Laravel 提供了两种在服务器上 安装框架 的方法。可以用 Laravel 安装程序安装 Laravel,也可以用 PHP composer 安装它。在这里我将通过使用 composer 命令创建一个新项目来安装 Laravel,运行下面的命令来安装 Laravel。

1
composer create-project laravel/laravel .

等待 Laravel 安装完成。 这可能需要一些时间。

安装完成后,将 Laravel Web 根目录的所有者更改为 “nginx” 用户,并使用以下命令将存储目录的权限更改为 755。

1
2
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

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

将下面的配置粘贴到文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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 服务。

1
2
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 安装已经成功。

测试数据库和缓存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# 我修改了 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

1
2
3
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

文章目录
  1. 1. 前言
  2. 2. 更新历史
  3. 3. 软件版本
  4. 4. 升级 EPEL 仓库
  5. 5. 安装 Nginx
  6. 6. 安装 php-fpm
    1. 6.1. 方式一 remi 仓库(推荐)
    2. 6.2. 多版本安装
    3. 6.3. 方式二 webtatic 仓库
    4. 6.4. 配置 php-fpm
    5. 6.5. 检查 php-fpm
  7. 7. 安装 MySQL
    1. 7.1. 下载并安装 MySQL5.7
    2. 7.2. 启动 MySQL
    3. 7.3. 测试 MySQL
    4. 7.4. 配置 MySQL
  8. 8. 安装 PHP Composer
  9. 9. NodeJS + NPM + Yarn
  10. 10. 安装 Laravel 测试 LNMP
  11. 11. 为 Larvel 配置 Nginx 配置
    1. 11.1. 测试并重启 Nginx
    2. 11.2. 测试 Laravel
  12. 12. 测试数据库和缓存
  13. 13. 问题记录
  14. 14. 参考文章