手动编译PHP开发环境

这是一篇来自深夜加班的手稿

问题复盘

你有没有遇到过这样的情况,部署了集成环境,每次添加扩展的时候,总是需要找一堆的配置文件的位置(其实很多人都能熟练使用集成环境)

你有没有遇到过这样的情况,去面试,面试官问你:有没有自己手动编译过环境? 你却回答 我一般都使用集成环境

你有没有遇到过这样的问题,本来自己的服务器配置就很low(有的甚至使用的是vps)基本上使用lnmp或者bt或者其他等等集成环境 但是他们的优缺点十分明显

这可能就是我现在需要手动编译环境的理由吧

部署环境及配置

linux centos 7.3

阿里云香港轻量级应用服务器 34/月

购买推荐链接:https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=4jm8fecv

目标环境

php 7.2

mysql 5.7.2

nginx 1.1.8

安装部署环境开始

考虑到纯净安装. 所以首先我们需要一台干净的服务器(为了这个 我把博客的全部东西干掉了直接导致服务器停运24小时)

首先我们确定安装目录

我是在根目录部署了www目录直接使用命令

mkdir -p /www/{lnmp,web,source} `

这里创建的 www

/lnmp存放安装软件

/web 存放程序代码

/source 存放安装软件

首先安装PHP

PHP下载网址:http://am1.php.net/distributions/php-7.2.1.tar.gz

所有的操作全部在 我们自己建立的www/lnmp 下

一、更换yum源

这对我们很重要,因为centos 内部的源一般都是国外的站点,我使用的是阿里云的服务器 所以这里我也是用阿里云的yum源

yum源的地址在

/etc/yum.repos.d/

将下面的默认Centos-Base.repo 进行备份

mv /etc/yum.repos.d/Centos-Base.repo.bak

进入阿里云的镜像地址:http://mirrors.aliyun.com/

在阿里云的镜像地址找到自己对应的版本然后使用wget 进行下载

没有wget的,提前使用yum 安装一个

然后依次执行以下命令

yum clean all
yum makecache
yum update

然后在裸机上面安装必要的扩展


yum -y install wget vim pcre pcre-devel openssl openssl-devel libicu-devel gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel ncurses ncurses-devel curl curl-devel krb5-devel libidn libidn-devel openldap openldap-devel nss_ldap jemalloc-devel cmake boost-devel bison automake libevent libevent-devel gd gd-devel libtool* libmcrypt libmcrypt-devel mcrypt mhash libxslt libxslt-devel readline readline-devel gmp gmp-devel libcurl libcurl-devel openjpeg-devel

上面安装的都是必要的一些扩展

我们还可以使用yum 对系统的内核进行更新

yum install epel-release -y // 此步骤可以省略

安装PHP

首先切换到我们的www/lnmp目录下

然后使用tar -zxvf php-7.2.1.tar.gz 进行解压

解压完毕之后 我们进入 解压过的目录

设置变量并开始源码编译:

cp -frp /usr/lib64/libldap* /usr/lib/

这里我们使用的是自定义的目录所以编译配置也需要改变

./configure --prefix=/www/source/php \
--with-config-file-path=/www/source/php/etc \
--enable-fpm \
--with-fpm-user=www \
--with-fpm-group=www \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--enable-mysqlnd-compression-support \
--with-iconv-dir \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-openssl \
--with-libxml-dir \
--enable-xml \
--disable-rpath \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--with-curl \
--enable-mbregex \
--enable-mbstring \
--enable-intl \
--with-libmbfl \
--enable-ftp \
--with-gd \
--enable-gd-jis-conv \
--with-openssl \
--with-mhash \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--enable-zip \
--enable-soap \
--with-gettext \
--disable-fileinfo \
--enable-opcache \
--with-pear \
--enable-maintainer-zts \
--with-ldap=shared \
--without-gdbm

此处重点要考

php7.2 去掉了很多原先php5 - php7.0的扩展 如之前的加密扩展

mcrypt 还有很多 这里我就不一一举例了

编译完毕之后,我们进行下一步

make -j 4 && make install

接下来需要等待大约10-20分钟 这个根据我们的服务器而定 如果觉得慢我们可以使用

make -j 8 && make install

上面两条命令都可以使用

接下来配置php.ini 文件:

cp php.ini-development /www/source/php/ect/php.ini

cp /www/source/php/etc/php-fpm.conf.default /www/source/php/etc/php-fpm.conf

cp /www/source/php/etc/php-fpm.d/www.conf.default /www/source/php/etc/php-fpm.d/www.conf

上述是我的配置文件地址,如果你出现错误 或者找不到文件位置,请按照你自己配置的文件安装目录进行查询

也可以使用 find 查询

配置php.ini

我直接贴出我修改的一些配置 仅供参考 可以根据个人情况进行调整

expose_php = Off
short_open_tag = ON
max_execution_time = 30
date.timezone = Asia/Shanghai
extension= /www/source/php/lib/php/extensions/no-debug-zts-20170718/ldap.so
zend_extension = /www/source/php/lib/php/extensions/no-debug-zts-20170718/opcache.so
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
disable_functions = passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru

配置www.conf (此处为配置php-fpm 可略)

到了这一步的时候 我们需要建立对应的用户www

groupadd www
useradd -g www www

然后创建存放 php-cgi.sock 的目录

mkdir /var/run/www/
chown -R www:www /var/run/www

然后配置www.conf文件

 vim /www/source/php/etc/php-fpm.d/www.conf

配置详解

slowlog = var/log/slow.log
listen = /var/run/www/php-cgi.sock

其他的都不需要改变

然后配置php-fpm.conf

pid = /usr/local/php/var/run/php-fpm.pid

至此php7已经安装完成。说明:禁用php函数,如果程序需要这些函数,可以取消禁止,新手建议忽略此步骤。

创建system系统单元文件php-fpm启动脚本:
vim /usr/lib/systemd/system/php-fpm.service

直接 编写

[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target [Service]
Type=simple
PIDFile=/usr/local/php/var/run/php-fpm.pid
ExecStart=/www/source/php/bin/php-fpm --nodaemonize --fpm-config /www/source/php/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID [Install]
WantedBy=multi-user.target

将php-fpm服务启动并加入开机自启动

systemctl enable php-fpm.service
systemctl restart php-fpm.service

配置全局变量

接下来我们就已经配置完毕了试一试php-v

是不是突然报错 , 没有php 不要慌

这是因为我们没有把PHP 加入全局变量的原因

vim /etc/profile
// 最后一行加入
PATH=$PAHT:/www/source/php/bin
// 保存退出
source /etc/profile

再次执行 php -v

我们会显示

PHP 7.2.1 (cli) (built: Jul 26 2019 10:50:53) ( ZTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies
with Zend OPcache v7.2.1, Copyright (c) 1999-2017, by Zend Technologies

安装mysql

实现我们需要安装mysql 安装的一些依赖 这个大多都是使用yum安装 可以直接百度

// 我这边直接使用

yum install -y gcc gcc-c++ make sudo autoconf libtool-ltdl-devel gd-devel \
freetype-devel libxml2-devel libjpeg-devel libpng-devel \
openssl-devel curl-devel patch libmcrypt-devel \
libmhash-devel ncurses-devel bzip2 \
libcap-devel ntp sysklogd diffutils sendmail iptables unzip cmake

接下来创建mysql的用户组和用户

groupadd mysql
useradd -r mysql -g mysql

下载必要的包

安装mysql5.6的时候就已经使用cmake了 我们这里使用mysql 5.7

还需要安装一个boost的包


wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.20.tar.gz wget --no-check-certificate http://sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz

然后解压mysql 5.7

进入mysql5.7目录

然后将 我们下载的 boots 包 移动到 解压完毕的mysql文件夹内部

然后我们新建一个 configure 文件夹 接下来我们将在该文件夹内 完成整套编译工作

然后贴出我的配置

cmake .. -DBUILD_CONFIG=mysql_release \
-DINSTALL_LAYOUT=STANDALONE \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DENABLE_DTRACE=OFF \
-DWITH_EMBEDDED_SERVER=OFF \
-DWITH_INNODB_MEMCACHED=ON \
-DWITH_SSL=bundled \
-DWITH_ZLIB=system \
-DCMAKE_INSTALL_PREFIX=/www/source/mysql/ \
-DINSTALL_PLUGINDIR="/www/source/mysql/lib/plugin" \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EDITLINE=bundled \
-DFEATURE_SET=community \
-DCOMPILATION_COMMENT="MySQL Server (GPL)" \
-DWITH_DEBUG=OFF \
-DWITH_BOOST=..

关于这些配置命令的名称 网络上都有介绍 我就不过多的讲述了

如果出现编译失败 那么 一定要删除当前目录下的

rm -rf CMakeCache.txt 文件

当我们编译完成之后 执行

make && make install

接下来就是耐心等待20分钟左右

初始化数据库

新建数据库文件夹以及日志文件夹,并更改用户为mysql:
mkdir /www/source/mysql/mysql_data
mkdir /www/source/mysql/log
chown -R mysql:mysql /www/source/mysql/mysql_data
chown -R mysql:mysql /www/source/mysql/log
// 在日志文件中建立 error.log 文件
// 赋权限整个目录及其文件夹
chmod -R 777 /www/source/mysql/log
修改配置文件
# vim /etc/my.cnf
[mysqld]
port=3306
datadir=/www/source/mysql/mysql_data
log_error=/www/source/mysql/log/error.log
basedir=/www/source/mysql/
// 注意:my.cnf文件有以下配置
socket=/www/source/mysql/mysql_data/mysql.sock
// 需要手动建立mysql.sock,并赋值读写执行权限
chmod -R 777 mysql.sock
初始化数据库
/var/mysql/bin/mysqld  --initialize --user=mysql

去查看刚刚创建的文件夹内 是否存在生成的文件

配置启动文件及环境变更

配置启动文件
cp /var/mysql/support-files/mysql.server /etc/init.d/mysqld
修改启动文件
vim /etc/init.d/mysqld

# 找到如下二行:
basedir=
datadir=
# 修改为:
basedir=/www/source/mysql/
datadir=/www/source/mysql/mysql_data/

启动mysql

/etc/init.d/mysqld start

可以看到提示,已经成功启动。当然你也可以使用systemctl来启动MySQL,但执行后,不会有任何提示。

systemctl start mysqld

然后我们将mysql 加入全局变量

这次我试了很多方式 但是没有成功 所以 我直接建立了一个软链

当我们执行某命令的时候 服务器首先去看/user/bin这个文件夹

ln -s /www/source/mysql/bin /usr/bin

修改mysql 密码

从mysql5.7开始 mysql不在支持空密码登录 所以我们直接查看密码

cat /www/source/mysql/log/error.log |grep 'A temporary password'
2019-07-13T06:28:23.096812Z 1 [Note] A temporary password is generated for root@localhost: wa&sk371_,US

后面的就是我们的mysql 密码了

然后我们直接使用mysql登录进去

mysql> alter user 'root'@'localhost' identified by 'your_password';

ok!!!!

安装nginx

准备工作

安装nginx 的时候 我们首先还需要安装3个依赖包

pcre:在使用 nginx 的 rewrite 模块的时候,需要有pcre库的支持

openssl:在使用ssl功能时,需要有 openssl库的支持

zlib:在使用gzip模块时,需要有zlib库的支持。

而这三个模块都是我们常用的,所以这3个依赖包还是要安装的。

1、安装pcre

首先下载这个包

wget https://jaist.dl.sourceforge.net/project/pcre/pcre/8.36/pcre-8.36.tar.gz
tar -zxvf pcre-8.36.tar.gz
cd pcre-8.36
./configure
make && make install
2、安装 openssl
wget https://www.openssl.org/source/openssl-1.1.0k.tar.gz
tar -zxvf openssl-1.1.0k.tar.gz
cd openssl-1.1.0k
./config
make && make install
3、安装zlib
wget https://zlib.net/zlib-1.2.11.tar.gz
tar -zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11
CFLAGS="-O3 -fPIC" ./configure
make && make install

编译nginx

因为nginx的命令有很多 我们可以使用

./configure --help

这里我推荐使用

./configure --user=www --group=www --prefix=/www/source/nginx --with-pcre=/www/lnmp/pcre-8.36 --with-zlib=/www/lnmp/zlib-1.2.11 --with-openssl=/www/lnmp/openssl-1.1.0k

上面的命令是和我们下载的pcre以及openssl and zlib要关联上的 具体看你的配置

执行完毕之后 我们执行

make && make install
// 然后
ll /www/source/

下面存在nginx 说明我们安装成功

然后我们使用

cd /www/source/nginx/conf

到这里的时候我们基本上已经安装完毕

本次手动编译nginx+php+mysql 就到这里

关于nginx的配置 和 php的问题

请继续关注我的博客

手动编译PHP开发环境的更多相关文章

  1. 手动编译部署LNMP环境(CentOS7.5+Nginx-1.18.0+MySQL-5.7.30+PHP-7.4.14)

    在平时运维工作中,经常需要用到LNMP应用框架.LNMP环境是指在Linux系统下,由Nginx + MySQL + PHP组成的网站服务器架构. 可参考前面的文章: 如何在CentOS 7上搭建LA ...

  2. win10 + VS2010 + OpenCV2.4.10重编译OpenCV开发环境搭建

    win10 + VS2010 + OpenCV2.4.10重编译OpenCV开发环境搭建 重编译的优点:能够调试的时候看OpenCV的源码. 重编译要得到的东西:Debug版本号和Release版本号 ...

  3. FFmpeg开发笔记(三):ffmpeg介绍、windows编译以及开发环境搭建

    前言   本篇章是对之前windows环境的补充,之前windows的是无需进行编译的,此篇使用源码进行编译,版本就使用3.4.8.   FFmpeg简介   FFmpeg是领先的多媒体框架,能够解码 ...

  4. Windows10 + Visual Studio 2017 + CMake +OpenCV编译、开发环境配置及测试

    由于最近需要使用OpenCV,本人需要在自己的PC上使用OpenCV,因此最近一直在研究如何使用Visual Studio编译OpenCV源代码并搭建开发环境,折腾了很长时间,查阅了很多相关资料,终于 ...

  5. Ubuntu 16.04.5下FFmpeg编译与开发环境搭建

    PC环境: Ubuntu 18.04 上面只要安装下面的提示安装即可,基本上不必再下载依赖库的源代码进行编译和安装 编译步骤: 1, 安装相关工具: sudo apt  install -y auto ...

  6. 手动编译安装docker环境,以及偶尔出现的bug

    总结安装过程如下: 前提:安装git,go,make, docker(docker中编译docker) git clone https://git@github.com/docker/docker c ...

  7. 在Windows上手动安装php开发环境

    安装MySQL 使用官方提供提供的安装包一键安装即可. 打开 mysql,选择Windows,MSI Installer点击下载.附:最新版mysql5.7.18下载地址 点击installer安装, ...

  8. [php]手动搭建php开发环境(排错)

    前提:针对自己的系统下载相应的php.apache.mysql,安装完毕后按照以下去配置httpd.conf和php.ini 本人用的是php5.6.4和apache2.4.4 一.Apache : ...

  9. 使用ECLIPSE+MINGW搭建C/C++开发环境

    有个朋友要我帮忙跑一个C程序而我现在主要用java,电脑上也就没有C语言的编译和开发环境,在学习java的这段期间,接触到了Eclipse这个强大的IDE,用惯了.就为调试一个程序,去安装一个VS觉得 ...

随机推荐

  1. Ruby字符串(1):String基本用法

    String字符串 字符串由String类提供,除了直接使用单双引号或其它字面量创建字符串,也可以使用String.new()方法来创建. a = "hello" b = Stri ...

  2. R语言实战(第2版)PDF完整版带书签目录

    <R语言实战2>PDF+源代码 下载:https://pan.baidu.com/s/1gP_16Xq9eVmLJ1yOsWD9FA 提取码:l8dx 分享更多python数据分析相关电子 ...

  3. RABC权限控制(二级菜单实现)

    目前大部分系统由于用户体验,基本上菜单不会做的很深,以二级菜单为例,做了一个简单的权限控制实现,可精确到按钮级别(基于django),下面具体看看实现 1.表结构的设计 无论开发什么都需要先梳理清楚需 ...

  4. 设计模式-桥接模式(Bridge)

    桥接模式是构造型模式之一.把抽象(Abstraction)与行为实现(Implementor)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展. 角色和职责: 1.抽象类(Abstracti ...

  5. 个人博客小案例(纯Django搭建)

    在看这篇文章的时候,必须有django基础,如果没有点击访问 一.环境配置 新建项目并做配置项目创建,创建APP并注册 创建模板并配置相应的路径,点击下载模板,配置方法点击访问 创建静态文件并配置,点 ...

  6. POI自动调整列宽支持中文

    /** * @Description:表格自适应宽度(中文支持) * @Author: * @param sheet sheet * @param columnLength 列数 */ private ...

  7. CRM 总结

    目录 一. CRM客户关系管理系统 1. CRM是什么? 里面都有哪些功能(业务)? 2. 什么是公户?什么是私户?为什么要做这个区分? 3. 请列举出CRM系统中的表 4. 通过ORM操作对数据库的 ...

  8. 事务的隔离级别,mysql默认的隔离级别是什么?

    读未提交(Read uncommitted),一个事务可以读取另一个未提交事务的数据,最低级别,任何情况都无法保证. (1)所有事务都可以看到其他未提交事务的执行结果 (2)本隔离级别很少用于实际应用 ...

  9. Modbus 指令

    本节内容: 一.S7-1200 作为Modbus RTU 主站 二.S7-1200 作为Modbus RTU 从站 三.S7-1200 作为Modbus RTU 主站 S7-1200 作为Modbus ...

  10. 学习 Vue ,从入门到放弃

    最近项目刚完成,手上工作稍微轻松些,准备储备下技术,为未来挑战做好准备. 之前项目用的较多的是angulajs,不过版本较老,还停留在1.5x系,虽然结合了webpack,es2015等前沿技术,但理 ...