【腾讯云的1001种玩法】AMH 4.2 升级Nginx与PHP实战练习与笔记

最近对AMH的系统比较感兴趣,特拿来了AMH 4.2来尝试下对其内核版本升级一下,并做了笔记供需要的同学参考。

前几天在对张宁网进行更新改版,配置SSL的时候碰见个问题:AMH面板自带的nginx所编译的OpenSSL版本过低导致有CVE2016-2107漏洞,对服务器运维十分危险。经过先期自我修复,并上报给AMH官方对漏洞进行临时处理与预警。官方也及时解决了此OpenSSL版本过低导致的AMH系列环境软件的隐患(虽然AMH官方处理速度还可以,不过态度有点那个,早先还以为是小白把80端口Listen了俩呢)。不过对于已经停止更新的AMH 4.2,这样的问题仍然存在。

于是,今天我突发奇想,何不装一个AMH 4.2来实战一波升级配置呢。说干就干。

[TOC]

关于AMH 4.2

AMH简介

先来看看AMH的介绍:

AMH 是国内首个开源的主机面板,使用APL开源软件协议。AMH 实现平台化架构设计,高可扩展灵活性,所有功能软件可选择定制下载安装。AMH 支持用户自由弹性组建运行环境与切换环境,您可以下载安装不同版本的WEB服务器、数据库、脚本软件自由组合创建您需要的运行环境。例如,您可以创建 LNMP、LAMP、LNMH、LNGX、LNAMP等不同WEB应用环境。(PHP环境支持所有PHP版本共存,包括PHP5.2、5.3、5.4、5.5、5.6、7.0)

看上去AMH还是很牛X的嘛。不过这介绍已经仅适用于AMH 5.x版本的了。那么AMH 4.2是什么情况呢?

AMH 4.2 为独立的一套LNMP/Nginx虚拟主机面板,安装请使用纯净系统。编译安装方式 (安装时间15至25分钟) AMH4.2 编译安装支持的系统: 支持目前 CentOS、Ubuntu、Debian 以下版本: CentOS 6 x64、CentOS 6 i386、CentOS 5 x64、CentOS 5 i386、Ubuntu 12 x64、Ubuntu 12 i386、Debian 6 x64 (squeeze)、Debian 6 i386 (squeeze)

实际安装AMH 4.2之后,我们看到其所带组件的情况如下:

Nginx:

[root@localhost ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.4.7
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC)
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_gzip_static_module --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --without-http_uwsgi_module --without-http_scgi_module

PHP:

[root@localhost ~]# /usr/local/php/bin/php -v
PHP 5.3.27p1 (cli) (built: Jun 23 2016 20:25:46)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies

[root@localhost ~]# /usr/local/php/bin/php -i | grep configure
Configure Command =>  './configure'  '--prefix=/usr/local/php' '--enable-fpm' '--with-fpm-user=www' '--with-fpm-group=www' '--with-config-file-path=/etc' '--with-config-file-scan-dir=/etc/php.d' '--with-openssl' '--with-zlib' '--with-curl' '--enable-ftp' '--with-gd' '--with-jpeg-dir' '--with-png-dir' '--with-freetype-dir' '--enable-gd-native-ttf' '--enable-mbstring' '--enable-zip' '--with-iconv=/usr/local/libiconv' '--with-mysql=/usr/local/mysql' '--without-pear'

MySQL:

[root@localhost ~]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.5.34-log Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

本次任务

我们这次的目的是,将nginx升级到nginx 1.10.1,并解决OpenSSL引起的CVE2016-2107漏洞。同时将PHP升级到PHP 5.6.22。

准备工作

对yum库进行升级更新

# yum update -y

安装编译接下来几款软件时需要的依赖包

# yum -y install libxml2 libxml2-devel curl-devel openssl openssl-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel

查看OpenSSL版本

# openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013

这里,如果不是OpenSSL 1.0.2h或OpenSSL1.0.1t,则需要升级至上述版本。本服务器使用的是OpenSSL 1.0.1e,鉴于服务器情况,需要升级到OpenSSL1.0.1t。

升级/安装OpenSSL

# cd /usr/local/src/
# wget http://www.openssl.org/source/openssl-1.0.1t.tar.gz
# tar -zxvf openssl-1.0.1t.tar.gz
# cd  openssl-1.0.1t
# ./config shared zlib
# make && make install

#修改历史的OpenSSL文件设置备份
# mv /usr/bin/openssl /usr/bin/openssl.old
# mv /usr/include/openssl /usr/include/openssl.old

#设置软连接使其使用新的OpenSSL版本 刚刚安装的OpenSSL默认安装在/usr/local/ssl
# ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
# ln -s /usr/local/ssl/include/openssl /usr/include/openssl

#更新动态链接库数据
# echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
# ldconfig -v

再次检查OpenSSL版本信息.

# openssl version
OpenSSL 1.0.1t  3 May 2016

如果是OpenSSL 1.0.1t,则说明更新成功。

升级PHP

下载、编译与安装PHP 5.6.22

请先回到主目录

# cd

备份备份旧版本的php

# tar -zcvf /usr/local/php-old.tar.gz /usr/local/php/

下载php 5.6.22,并解压后进入该目录

# wget http://hk2.php.net/distributions/php-5.6.22.tar.gz
# tar -zxvf php-5.6.22.tar.gz
# cd php-5.6.22

开始配置

# ./configure  --prefix=/usr/local/php --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-config-file-path=/etc --with-openssl --with-zlib --with-curl --enable-ftp --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --enable-gd-native-ttf --enable-mbstring --enable-zip --with-iconv=/usr/local/libiconv --with-mysql=/usr/local/mysql --with-mysqli=shared,mysqlnd --with-pdo-mysql=shared,mysqlnd --without-pear --disable-fileinfo --enable-opcache

编译

# make && make install

出现如下所示内容,可判断是升级完毕:

Build complete.
Don't forget to run 'make test'.

Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/
Installing PHP CLI binary:        /usr/local/php/bin/
Installing PHP CLI man page:      /usr/local/php/php/man/man1/
Installing PHP FPM binary:        /usr/local/php/sbin/
Installing PHP FPM config:        /usr/local/php/etc/
Installing PHP FPM man page:      /usr/local/php/php/man/man8/
Installing PHP FPM status page:   /usr/local/php/php/php/fpm/
Installing PHP CGI binary:        /usr/local/php/bin/
Installing PHP CGI man page:      /usr/local/php/php/man/man1/
Installing build environment:     /usr/local/php/lib/php/build/
Installing header files:           /usr/local/php/include/php/
Installing helper programs:       /usr/local/php/bin/
  program: phpize
  program: php-config
Installing man pages:             /usr/local/php/php/man/man1/
  page: phpize.1
  page: php-config.1
/root/php-5.6.22/build/shtool install -c ext/phar/phar.phar /usr/local/php/bin
ln -s -f phar.phar /usr/local/php/bin/phar
Installing PDO headers:           /usr/local/php/include/php/ext/pdo/

测试——非必须操作

# make test

可能需要加上执行权限

# chmod +x  /etc/init.d/php-fpm

额外的配置

在php-fpm.conf、php-fpm-template.conf、amh.conf三个文件中插入如下内容:

listen.owner = www
listen.group = www
listen.mode = 0660

三个文件的路径如下:

vim /usr/local/php/etc/php-fpm.conf
vim /usr/local/php/etc/php-fpm-template.conf
vim /usr/local/php/etc/fpm/amh.conf

另外,在php.ini文件中,也需要增加一点东西:

搜索[Pdo_mysql]标签,在其下方加入如下内容:

extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/pdo_mysql.so

注意,no-debug-non-zts-20131226这个需要看安装后给的Installing shared extensions,并确保这个路径内有pdo_mysql.so文件。

使升级的PHP生效

重启php

# amh php stop
# amh php start

如上述命令无效,可以执行如下命令

# killall php-fpm && /usr/local/php/sbin/php-fpm -y=/usr/local/php/etc/php-fpm.conf -c=/usr/local/php/etc/php.ini
# amh php start
# php-fpm

查看是否启动成功

# ps -aux | grep php

查看php版本

# /usr/local/php/bin/php -v

升级nginx

下载、编译与安装nginx 1.10.1

请先回到主目录

# cd

备份现有nginx运行程序与nginx配置文件。

# cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.0622

下载nginx 1.10.1,并解压后进入该目录

# wget http://nginx.org/download/nginx-1.10.1.tar.gz
# tar -zxvf nginx-1.10.1.tar.gz
# cd nginx-1.10.1

重新编译nginx 1.10.1,这里我们参考新版AMH 5.x的configure,调整下编译的参数如下:

# ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-openssl=/usr/local/src/openssl-1.0.1t --with-http_gzip_static_module  --with-http_v2_module --with-threads --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --without-http_uwsgi_module --without-http_scgi_module

执行make,这里我们不选择make install,因为我们只需要替换执行文件。

# make

使升级的nginx生效

停止AMH相关应用:

# amh nginx stop

接下来,我们需要备份旧版本的nginx可执行文件并复制新的已经编译好的执行文件:

# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
# cp objs/nginx /usr/local/nginx/sbin/nginx

检测nginx文件版本及编译情况:

[root@localhost nginx-1.10.1]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.10.1
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC)
built with OpenSSL 1.0.1t  3 May 2016
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-openssl=/usr/local/src/openssl-1.0.1t --with-http_gzip_static_module --with-http_v2_module --with-threads --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --without-http_uwsgi_module --without-http_scgi_module

启动nginx以及AMH相关应用:

# amh nginx start
# amh start

如果显示[OK] Nginx start,则说明nginx已经启动,升级成功。

升级完成确认

可以通过AMH 4.2后台的phpinfo查看升级后的结果,如图:

可以看到,phpinfo检测到的PHP Version 为 5.6.22。

搜索相关参数,可以找到当前服务器软体版本为nginx 1.10.1。本次升级圆满完成。

小结

本来PHP想升级到7.0.7的,结果一直都不行。感觉配置上可能是php-fpm和mysql的动态链接库出问题了。不过因为最近有考试,就没再弄。

另外也是由于上述最后一个原因,时间问题,并没有尝试升级AMH 4.2的MySQL。等有兴趣了再说吧。不过看了下AMH 4.2的安装脚本,感觉Linux集成环境的配置挺好玩的,等回头有空了研究下。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

在 Golang 项目中使用 Spring Cloud Config Server 管理配置

最近用 Go 写后端写得很开心,写篇比较实用的博客总结下如何通过 Spring Cloud Config Server 管理 Go 程序中的配置。 实现并不复杂...

28540
来自专栏潇涧技术专栏

Setting Up Environments on New Mac

JAVA_HOME=/Library/Java/JavaVirtualMachines/1.7.0_51.jdk/Contents/Home

10820
来自专栏菩提树下的杨过

spring-boot 速成(1) helloworld

一、mac上安装 $ brew tap pivotal/tap $ brew install springboot 安装成功后,可在终端查看命令行 ➜  ~ s...

24650
来自专栏菩提树下的杨过

spring-boot 速成(1) helloworld

一、mac上安装 $ brew tap pivotal/tap $ brew install springboot 安装成功后,可在终端查看命令行 ➜  ~ s...

23780
来自专栏三杯水

ELKB5.2.2集群环境部署配置优化终极文档

3,logstash filter 加入urldecode支持url、reffer、agent中文显示

37820
来自专栏Jaycekon

Spring-boot:快速搭建微框架服务

前言: Spring Boot是为了简化Spring应用的创建、运行、调试、部署等而出现的,使用它可以做到专注于Spring应用的开发,而无需过多关注XML的配...

558120
来自专栏JAVA同学会

Redis分布式锁的try-with-resources实现

在当今这个时代,单体应用(standalone)已经很少了,java提供的synchronized已经不能满足需求,大家自然 而然的想到了分布式锁。谈到分布式锁...

22210
来自专栏微信公众号:Java团长

Java Web现代化开发:Spring Boot + Mybatis + Redis二级缓存

Spring-Boot因其提供了各种开箱即用的插件,使得它成为了当今最为主流的Java Web开发框架之一。Mybatis是一个十分轻量好用的ORM框架。Red...

32920
来自专栏龙首琴剑庐

Spring Session 实现分布式会话管理

1、分布式会话管理是什么? 在Web项目开发中,会话管理是一个很重要的部分,用于存储与用户相关的数据。通常是由符合session规范的容器来负责存储管理,也就是...

57190
来自专栏JAVA同学会

Redis分布式锁的try-with-resources实现

在当今这个时代,单体应用(standalone)已经很少了,java提供的synchronized已经不能满足需求,大家自然

11330

扫码关注云+社区

领取腾讯云代金券