前言
间隔上一次接触 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,咱们须要从名为 remi
或webtatic
的第三方仓库中装置它。
形式一 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.ini
,webtatic 仓库 形式装置的主配置文件寄存地位在/etc/php.ini
。
在文件中找如如下行,勾销它的行正文并将值更改为 0。
cgi.fix_pathinfo=0
保留文件并退出编辑器。
编辑 php-fpm
文件 www.conf
,remi 仓库 形式装置的配置文件寄存地位在 /etc/opt/remi/php72/php-fpm.d/www.conf
,webtatic 仓库 形式装置的配置文件寄存地位在/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.sock
,webtatic 仓库 形式装置的 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
日志,可能的状况有
/var/wwww/laravel
门路的权限不正确导致 permission denied,留神不同 laravel 版本间对子目录权限的要求/etc/nginx/conf.d/laravel.conf
配置文件 fastcgi_pass 设置有误- php-fpm 过程未失常启动
参考文章
Laravel Installation