文档章节

CentOS7-Minimal模式下编译搭建 LAMP / LNMP环境

麦拂沙
 麦拂沙
发布于 2015/11/08 13:30
字数 2760
阅读 82
收藏 0
点赞 0
评论 0

编译安装的目的主要基于以下几点

  1. 特定版本的软件包安装
  2. 包的精简及参数调优

这里希望通过编译安装方式来实现对PHP运行环境的个性化定制,具体的会按名称缩写中的顺序来编译安装所需的各个组件 apache/nginx -> mysql -> php

编译过程中排错时, 可以从以下三个维度分析:

  1. 编译过程中的实时报错信息
  2. 相关程序的运行日志、访问日志、报错日志
  3. 查看 systemd 产生的系统日志,常用命令 journalctl -xn

基础依赖安装

这些都是在 lamp / lnmp 编译过程中报错提示最低要求必须依赖的包,在此预先准备好

sudo yum install gcc gcc-c++ cmake kernel-devel openssl-devel git ncurses-devel bison wget

关闭安全系统 - 避免各种服务被屏蔽

sudo service firewalld stop  # 关闭防火墙(centos6.5下是iptables服务)
sudo chkconfig firewalld off  # 关闭防火墙的开机启动
sudo setenforce 0  # 关闭selinux服务
sudo sed -i 's|SELINUX=enforcing|SELINUX=disabled|g' /etc/selinux/config  # 关闭selinux的开机启动

准备源码存放目录

mkdir /tmp/source
cd /tmp/source

Apache编译安装 - 以mod-php方式同php协作

163源下默认提供2.4.6版本。这里我们仍然采用手工编译方式来安装apache

# 安装pcre依赖 - 提供url-rewrite支持
cd /tmp/source
wget http://nchc.dl.sourceforge.net/project/pcre/pcre/8.39/pcre-8.39.tar.gz
tar -zxvf pcre-8.39.tar.gz
cd pcre-8.39/
./configure --prefix=/usr/local/pcre
make 
sudo make install

# 安装zlib依赖 - 提供gzip压缩支持
cd /tmp/source
wget http://zlib.net/zlib-1.2.8.tar.gz
tar -zxvf zlib-1.2.8.tar.gz
cd zlib-1.2.8/
./configure --prefix=/usr/local/zlib
make
sudo make install

cd /tmp/source
wget http://mirror.bit.edu.cn/apache//apr/apr-1.5.2.tar.gz  # 下载apr依赖 - Apache可移植运行库
wget http://mirror.bit.edu.cn/apache//apr/apr-util-1.5.4.tar.gz  # 下载apr-util依赖 - 基于apr提供了一系列有用的抽象封装
wget http://mirrors.tuna.tsinghua.edu.cn/apache//httpd/httpd-2.4.23.tar.gz  # 下载apache源码
tar -zxvf apr-1.5.2.tar.gz
tar -zxvf apr-util-1.5.4.tar.gz
tar -zxvf httpd-2.4.23.tar.gz

# 补全apr系列依赖到httpd的源码库中
mv apr-1.5.2 httpd-2.4.23/srclib/apr
mv apr-util-1.5.4 httpd-2.4.23/srclib/apr-util

# 编译安装httpd
cd httpd-2.4.23
./configure --prefix=/usr/local/httpd --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc/httpd/conf --enable-so --enable-rewrite --enable-ssl --enable-proxy --with-included-apr --with-pcre=/usr/local/pcre --with-z=/usr/local/zlib
make
sudo make install

# 将httpd注册为服务以便于通过service命令管理
sudo cp build/rpm/httpd.init /etc/init.d/httpd
sudo chmod 755 /etc/init.d/httpd
sudo sed -i '2a # chkconfig: - 80 90\n# description: httpd service' /etc/init.d/httpd # 在第二行后追加两行服务注解(必须)
sudo chkconfig --add httpd  # 编入服务
sudo chkconfig httpd on  # 服务开机启动

# 调整服务配置文件
cd /etc/httpd/conf
sudo sed -i '/<IfModule mime_module>/a\    Addtype application/x-httpd-php .php' httpd.conf  # 添加php的minetype
sudo sed -i 's|DirectoryIndex index.html|DirectoryIndex index.php index.html index.htm|g' httpd.conf  # 默认页配置
sudo sed -i 's|#LoadModule rewrite_module|LoadModule rewrite_module|g' httpd.conf  # 启用url重写模块
sudo sed -i 's|#Include /etc/httpd/conf/extra/httpd-vhosts.conf|Include /etc/httpd/conf/extra/httpd-vhosts.conf|g' httpd.conf  # 启用虚拟主机配置文件
sudo sed -i '/^ServerRoot/a\PidFile /var/run/httpd.pid' httpd.conf  # 更改服务进程pid文件写入路径(解决路径报错)
sudo sed -i '/<VirtualHost \*:80>/,$s|^|#|' extra/httpd-vhosts.conf  # 注释掉预置的测试站点(解决测试站点不存在报错)
sudo mkdir /var/log/httpd
sudo chown httpd:httpd /var/log/httpd
sudo sed -i 's|CustomLog "logs/access_log" common|CustomLog "/var/log/httpd/access_log" common|g' httpd.conf  # 更改访问日志目录
sudo sed -i 's|ErrorLog "logs/error_log"|ErrorLog "/var/log/httpd/error_log"|g' httpd.conf  # 更改报错日志目录

# httpd用户组管理
sudo useradd -s /sbin/nologin -r httpd # 创建系统账户类型的非登录账户
sudo sed -i 's|User daemon|User httpd|g' /etc/httpd/httpd.conf  # 设定服务启动账户
sudo sed -i 's|Group daemon|Group httpd|g' /etc/httpd/httpd.conf  # 设定服务启动用户组

Nginx编译安装 - 以fastcgi方式同php协作

epel源下已有最新稳定版1.10.1。但这里我们仍然采用手工编译方式来安装nginx

cd /tmp/source
wget http://nchc.dl.sourceforge.net/project/pcre/pcre/8.39/pcre-8.39.tar.gz  # 下载pcre依赖 - 提供url-rewrite支持
wget http://zlib.net/zlib-1.2.8.tar.gz  # 下载zlib依赖 - 提供gzip压缩支持
wget https://www.openssl.org/source/openssl-1.0.2j.tar.gz  # 下载openssl依赖
wget http://nginx.org/download/nginx-1.10.1.tar.gz  # 下载nginx源码
tar -zxvf pcre-8.39.tar.gz
tar -zxvf zlib-1.2.8.tar.gz
tar -zxvf openssl-1.0.2j.tar.gz
tar -zxvf nginx-1.10.1.tar.gz
cd nginx-1.10.1

./configure --prefix=/usr/local/nginxd --conf-path=/etc/nginx/nginx.conf --sbin-path=/usr/sbin/nginx --with-http_ssl_module --with-http_realip_module --without-http_uwsgi_module --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --without-http_autoindex_module --with-http_stub_status_module --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/run/nginx/nginx.lock --error-log-path=/var/log/nginxd/error.log --http-log-path=/var/log/nginxd/access.log --with-pcre=/tmp/source/pcre-8.39 --with-zlib=/tmp/source/zlib-1.2.8 --with-openssl=/tmp/source/openssl-1.0.2j

make
sudo make install

# 将nginxd注册为服务以便于通过service命令管理
# 首先创建/etc/init.d/nginxd文件为 `https://www.nginx.com/resources/wiki/start/topics/examples/redhatnginxinit/` 页面内容
cd /etc/init.d/
sudo sed -i 's|/var/run/nginx.pid|/var/run/nginx/nginx.pid|g' nginxd
sudo sed -i 's|/var/lock/subsys/nginx|/var/run/nginx/nginx.lock|g' nginxd
sudo chmod 755 nginxd
sudo chkconfig --add httpd  # 编入服务
sudo chkconfig nginxd on  # 服务开机启动

# nginxd用户组管理
sudo useradd -s /sbin/nologin -r nginxd # 创建系统账户类型的非登录账户
sudo sed -i 's|#user  nobody;|user  nginxd;|g' /etc/nginx/nginx.conf  # 设定服务启动账户

sudo chown nginxd:nginxd /var/run/nginxd
sudo chown nginxd:nginxd /var/log/nginxd
sudo sed -i 's|/scripts$fastcgi_script_name|$document_root$fastcgi_script_name|g' /etc/nginx/nginx.conf  # 修复一个变量配置报错

Mysql编译安装

mysql官方对发行包有着极好的支持,基本上大多数版本都提供了对应预编译好的rpm包,我们可以直接下载安装。另外,较新的几个版本还提供了yum源。但这里,我们依然是采用手工编译。 留意,163源下默认提供5.5.50版本的MariaDB数据库

cd /tmp/source
wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.13.tar.gz  # 下载mysql源码
tar -zxvf mysql-5.7.13.tar.gz
cd mysql-5.7.13

# cmake编译配置,你也能通过`sudo ccmake .`命令来人性化交互式配置
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DINSTALL_BINDIR=/usr/bin -DINSTALL_SBINDIR=/usr/sbin -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/tmp/source -DWITH_DEBUG=OFF -DENABLE_DEBUG_SYNC=OFF -DWITH_UNIT_TESTS=OFF  -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci

make # 这一步时间很长,虚机配置3g内存、两核四中心 跑了50分钟
sudo make install

# mysqld用户组管理
sudo useradd -s /sbin/nologin -r mysqld  # 新增mysqld用户
sudo mkdir /srv/mysql
sudo chown mysqld:mysqld /srv/mysql
sudo mysqld --initialize --user=mysqld --datadir=/srv/mysql  # MySQL 5.7.6+初始化操作并生成my.cnf配置。!!这一步务必记录下回显信息最后一行给出的mysql管理员初始密码,如`root@localhost: PFUtsbtpf5+N`!!

sudo mkdir /var/log/mariadb /var/run/mariadb
sudo chown mysqld:mysqld /var/log/mariadb /var/run/mariadb
sudo sed -i 's|datadir=/var/lib/mysql|datadir=/srv/mysql|g' /etc/my.cnf  # 修正配置文件中的数据目录
sudo sed -i 's|socket=/var/lib/mysql/mysql.sock|socket=/var/run/mariadb/mysql.sock|g' /etc/my.cnf  # 修正配置文件中的套接字文件路径
sudo sed -i '/\[mysqld\]/a\pid-file=/var/run/mariadb/mysqld.pid' /etc/my.cnf  # 指定pid文件路径
sudo sed -i '/\[mysqld\]/a\user=mysqld' /etc/my.cnf  # 指定服务启动账号
sudo mysql_ssl_rsa_setup  # MySQL 5.7.6+链路加密配置初始化

# 将mysqld注册为服务以便于通过service命令管理
sudo cp support-files/mysql.server /etc/init.d/mysqld
sudo sed -i 's|/var/lock/subsys|/var/run/mariadb|g' /etc/init.d/mysqld  # 修正lock文件目录错误
sudo sed -i 's|$lockdir/mysql|$lockdir/mysql.lock|g' /etc/init.d/mysqld  # 修正lock文件路径错误
sudo chmod 755 /etc/init.d/mysqld
sudo chkconfig --add /etc/init.d/mysqld 
sudo chkconfig mysqld on  # 服务开机启动

# mysql初始化
mysql -uroot -p  #利用上面记录的root密码登入mysql终端,并执行下面一条sql操作语句
set Password=PASSWORD('1qaz2wsx3edc');  #首次安装mysql强制要求你更新密码才能运行
flush privileges;

PHP编译安装

163源下默认提供5.4.16版本。这里我们仍然采用手工编译方式来安装php

关于这里的php编译安装, 需要了解这些

  • 这种方式下,php拓展是静态编译入php的,编译导出的是 .o 静态链接库文件。
  • 通过 yum包 及 phpize 方式安装的php拓展,则是动态编译入php的,编译导出的文件是 .so 动态链接库文件,并安装在 extension_dir 目录下。
  • 如果要静态编译入php拓展,必须对php全量编译。而后期的增加拓展,则只能是动态编译出 链接库 并载入到php中。

关于iconv库的几点说明

  • Centos7最小化安装 已默认在/usr/local/lib下安装有一份libiconv库,我们无需像网上教程说的那样特意去下载安装libiconv库
  • 不做特殊处理,则我们在 configuresudo make 后会产生iconv相关报错。
    **原因:**本来make编译时符号表里的iconv相关函数符号默认是连接到linux自带的libc标准库(libc标准库支持iconv实现)而不是libiconv库,可是头文件 /usr/local/include/iconv.h 中将iconv相关函数篡改加了lib前缀,导致libc标准库不识别符号表中的个别lib前缀的iconv函数。
    **解决办法:**通过 configure 时添加 LIBS="-liconv" 连接提示来明确告诉连接器应该链接libiconv库(支持lib前缀的iconv函数)而不是libc标准库。
    **不可取解决办法:**许多网上教程是通过 ZEND_EXTRA_LIBS='-liconv' 参数来解决php编译安装过程中的iconv报错,但这种处理的思路是提示编译器不安装iconv库。这其实是创造了新的问题,而不是解决问题。因为日常开发中iconv函数还是比较常用的,所以iconv库是有必要安装上的。
cd /tmp/source
wget http://cn2.php.net/distributions/php-5.6.24.tar.gz #下载php源码
tar -zxvf php-5.6.24.tar.gz
cd php-5.6.24

# 编译安装php,这里启用的php拓展模块都是我们日常开发中经常用到的
# 其中 `--with-apxs2=/usr/local/httpd/bin/apxs` 参数仅在安装了apache服务器时才使用
./configure --prefix=/usr/local/php --enable-fpm --enable-pdo --enable-xml --enable-zip --enable-opcache --enable-sockets --enable-mbstring --enable-gd-native-ttf --with-mysql --with-mysqli --with-pdo-mysql --with-mysql-sock --with-gd --with-curl --with-zlib --with-openssl --with-gettext --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-apxs2=/usr/local/httpd/bin/apxs --with-libxml-dir=/usr/lib64 --with-mcrypt=/usr/lib64 --with-freetype-dir=/usr/lib64 --with-jpeg-dir=/usr/lib64 --with-png-dir=/usr/lib64 --with-iconv-dir=/usr/local/lib  LIBS="-liconv"

make
sudo make install

# 启用配置文件
sudo mkdir /etc/php.d
sudo chmod 777 /etc/php.d
sudo cp /tmp/source/php-5.6.24/php.ini-production /etc/php.ini  # 启用生产环境模式下的php配置文件
sudo cp /usr/local/etc/php-fpm.conf.default /usr/local/etc/php-fpm.conf  # 启用fpm默认配置文件
sudo ln -s /usr/local/etc/php-fpm.conf /etc/php-fpm.conf

# 启用opcache拓展(即便是静态编译安装php,opcache也是以动态链接库载入到php的,所以这里需要手工配置其启用)
sudo sed -i '/\[opcache\]/a\zend_extension=opcache.so' /etc/php.ini

# 将php-fpm注册为服务以便于通过service命令管理
sudo cp /tmp/source/php-5.6.24/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
cd /etc/init.d/
sudo chmod 755 php-fpm
sudo sed -i '2a # chkconfig: - 80 90\n# description: php-fpm service' php-fpm  # 在第二行后追加两行服务注解(必须)
sudo chkconfig --add php-fpm  # 编入服务
sudo chkconfig php-fpm on  # 服务开机启动

# php-fpm服务用户组管理
sudo useradd -s /sbin/nologin -Mr phpfpm  #新增phpfpm用户
sudo sed -i 's|user = nobody|user = phpfpm|g' /etc/php-fpm.conf
sudo sed -i 's|group = nobody|group = phpfpm|g' /etc/php-fpm.conf

PHP后期增加拓展

# 以安装phpredis拓展为例
cd /tmp/source
git clone https://github.com/phpredis/phpredis.git  # 下载phpredis源码
cd phpredis/
phpize
./configure
sudo make
sudo make install
sudo cp rpm/redis.ini /etc/php.d/redis.ini

清理下载的源码

sudo rm -rf /tmp/source

© 著作权归作者所有

共有 人打赏支持
麦拂沙
粉丝 21
博文 104
码字总数 97310
作品 1
海淀
高级程序员
25 个简单干净的 WordPress 主题

Good Space – Responsive Minimal WP Theme Spotlight – Clean & Minimal WordPress Template March – Responsive Clean Business WordPress Theme Cleanr: Responsive, Minimal & Beauti......

小编辑
2012/05/02
0
0
由于数据库 Blob字段太多,导致从库进行binlog不能正常进行的处理方法

由于数据库 Blob字段太多,导致从库进行binlog不能正常进行的处理方法 binlogformat为row格式的时候记录的不是简单的sql,而是实际变更的行,一些大的DML操作,会导致binlog量增加很大,消耗...

holy2009
06/28
0
0
参数binlog_row_image设置MINIMAL,你今天被坑了吗?

今天网友"芬达"跟我讨论一个参数binlogrowimage,在什么场景下设置为MINIMAL,我觉得这个案例很有意义,尤其是在生产环境中,要慎重设置这个参数。 首先这个MINIMAL,只会在binlog里记录被影...

hcymysql
昨天
0
0
吴雪/minimal-mistakes

Minimal Mistakes Jekyll Theme Minimal Mistakes is a flexible two-column Jekyll theme. Perfect for hosting your personal site, blog, or portfolio on GitHub or self-hosting on you......

吴雪
06/20
0
0
[centos]Centos minimal 初始化安装

centos6.5: 网络配置:http://www.jb51.net/os/RedHat/189963.html 修改防火墙: -A INPUT -m state --state NEW -m tcp -p tcp --dport 5901 -j ACCEPT 3,阿里云镜像安装: 因minimal只有最小......

skanda
2015/08/08
0
0
优化的内存访问 TCMalloc

TCMalloc(Thread-Caching Malloc)是google-perftools工具中的一个,与标准的glibc库的malloc相 比,TCMalloc在内存的分配上效率和速度要高得多,可以提高Mysql服 务器在高并发情况下的性能...

企图穿越
2010/02/22
0
0
Windows中在安全模式下启动其他服务

在安全模式下,有一个windows安装程序(MySql)的服务,如果您尝试手动启动它,此时,会得到一个错误提示“Windows无法启动Windows Installer服务在本地计算机上。 错误1084:此服务无法启动安...

城邑耕夫
2013/10/25
0
0
TCMalloc优化MySQL、Nginx、Redis内存管理

TCMalloc(Thread-Caching Malloc)与标准glibc库的malloc实现一样的功能,但是TCMalloc在效率和速度效率都比标准malloc高很多。TCMalloc是 google-perftools工具中的一个(gperftools四个工具...

lj2007331
2013/09/02
0
0
grails团队的新框架:micronaut

http://micronaut.io/ 体积更小,内存占用更小,性能更优?同时支持java,groovy,kotlin三种编程语言。grails框架我用过,做过若干个项目,确实比较方便,脚手架快速生成页面(当然结合ieda来...

swingcoder
05/24
0
0
安装centos minimal后必装的工具setup

安装centos minimal很多工具都没有,setup这个命令挺强大的,可以配置防火墙,开启关闭系统的服务,设置网络,配置验证模式 yum install setuptool #安装setuptoolyum install ntsysv syste...

huangyanxiong
2015/01/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

TextView设置行间距、字体间距

一、设置行间距 1、设置行间距:android:lineSpacingExtra,取值范围:正数、负数和0,正数表示增加相应的大小,负数表示减少相应的大小,0表示无变化 2、设置行间距的倍数:android:lineSpa...

王先森oO
7分钟前
0
0
适配器模式

适配器模式(Adapter):将一个类的接口转换成客户端希望的另外一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 适配器用于连接两种不同种类的对象,使其毫...

阿元
7分钟前
0
0
CoreText进阶(四)-文字行数限制和显示更多

CoreText进阶(四)-文字行数限制和显示更多 用例和效果 Demo:CoreTextDemo 效果图: 默认的截断标识和自定义的截断标识符效果图  点击查看更多之后的效果图  为了可以设置显示的行数以...

aron1992
10分钟前
0
0
nginx的五种负载算法

nginx的五种负载算法 2017年04月26日 15:01:11 阅读数:1297 1.round robin(默认) 轮询方式,依次将请求分配到各个后台服务器中,默认的负载均衡方式。 适用于后台机器性能一致的情况。 挂...

linjin200
12分钟前
0
0
Android RecyclerView快速上手

RecyclerView mainMenu = findViewById(R.id.fragmentMain); mainMenu.setLayoutManager(new GridLayoutManager(getActivity(),4)); mainMenu.setAdapter(new MainAdapter......

燕归南
14分钟前
0
0
RabbitMQ实战:理解消息通信 

应用RabbitMQ的5种队列 一、简单队列 P:消息的生产者 C:消息的消费者 红色:队列 简单队列的生产者和消费者关系一对一 但有时我们的需求,需要一个生产者,对应多个消费者,那就可以采用第...

spinachgit
15分钟前
0
0
Linux的使用技巧:到底要不要会用?[图]

Linux的使用技巧:到底要不要会用?[图] 最近有个项目接近了尾声,要进入到调试测试阶段。这是一个使用Springboot框架为后台程序,mpvue构建的小程序项目。服务器我最终仍旧选择了Linux操作系...

原创小博客
16分钟前
0
0
记elasticdump 备份数据导出导入

版本: elasticsearch 5.5.2 elasticdump 2.2 系统 CentOS7.3 因项目需求 从生产导出一份索引到测试 帮助文档 https://github.com/taskrabbit/elasticsearch-dump?utm_source=dbweekly&utm_m......

雁南飞丶
17分钟前
0
0
saltstack配置目录管理

1.服务端配置 -接着编辑之前的 top.sls 文件 #vim /srv/salt/top.sls //修改为如下 base: 'slaver.test.com': - filedir -新建 filedir.sls 文件 # vim /srv/salt/filedir.sls file-dir: fi......

硅谷课堂
17分钟前
0
0
python日期时间

日期和时间 Python内建的datetime模块提供了datetime、date和time类型。datetime类型结合了date和time,是最常使用的: In [102]: from datetime import datetime, date, timeIn [103]:...

火力全開
24分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部