脱网安装PHP应用

前言

自从上次那个从零开始构建PHP应用,已经过去一个月了,admin系统开发还算顺利。初版几乎可以投入测试和使用了,那么就面临着要部署到公司服务器的问题。一了解才发现,原来他们使用的服务器都是脱网环境的,而且没有PHP环境。准备开始新的一轮折腾,所以今天的主题是如何脱网安装PHP应用。

在脱网的情况,我们就不能用yum安装。要么使用rpm进行源码安装,要么使用make进行编译安装。我们下面会视情况而定。除了安装方式的改变之外,我们还要解决各种依赖问题。

准备知识

RPM

RPM 全名是『 RedHat Package Manager 』简称则为 RPM。RPM 是以一种数据库记录的方式来将你所需要的套件安装到你的 Linux 主机的一套管理程序。他最大的特点就是将您要安装的套件先编译过( 如果需要的话 )并且打包好了,透过包装好的套件里头预设的数据库记录, 记录这个套件要安装的时候必须要的相依属性模块( 就是你的 Linux 主机需要先存在的几个必须的套件 ),当安装在你的 Linux 主机时, RPM 会先依照套件里头的纪录数据查询 Linux 主机的相依属性套件是否满足, 若满足则予以安装,若不满足则不予安装。那么安装的时候就将该套件的信息整个写入 RPM 的数据库中,以便未来的查询、验证与反安装!

优点:

  • 由于已经编译完成并且打包完毕,所以安装上很方便( 不需要再重新编译 )。
  • 由于套件的信息都已经记录在 Linux 主机的数据库上,很方便查询、升级与反安装。

缺点:

  • 安装的环境必须与打包时的环境需求一致或相当;
  • 需要满足套件的相依属性需求;
  • 反安装时需要特别小心,最底层的套件不可先移除,否则可能造成整个系统的问题!

基本使用:

  • rpm -qa //查询系统中已经安装的软件
  • rpm -ivh rpm文件 //安装(一般需要加–nodeps)
  • rpm -Uvh rpm文件 //更新
  • rpm -e 套件名称 //删除

RPM包的命名规则:

以”libcurl-7.19.7-52.el6.x86_64”为例
libcurl:软件包名称
7.19.7:版本
el6:软件包发行商版本
x86_64:使用的硬件平台

  • e16指的是RHEL6.x/CentOS 6.x,如果你的Linux安装是参考之前的博文,那么这里选择e16。
  • devel:表示这个包是软件的开发包。
  • noarch:说明该包不受平台和硬件限制。
make

这里泛指使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤。make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。而makefile文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。

流程:

  • 下载软件包,解压进入软件包目录
  • ./configure 检测你的安装平台的目的特征,可以配置选项,会生成makefile文件
  • make 编译
  • make install 安装
下载

提供两个比较靠谱的linux软件包下载地址
http://rpmfind.net
https://sourceforge.net
也可以使用yumdownloader在可以上网的centos下载

安装流程

  • PHP使用make安装方式进行安装。
  • 到PHP官网下载PHP安装包,或者到之前lnmp的src目录找一个。(要好好利用lnmp的src目录下的安装包)
  • 解压进入软件包目录
  • ./configure ./configure –prefix=$php_root –with-config-file-path=/etc –with-mysql=$mysql_root –with-pdo-mysql=$mysql_root/bin/mysql_config –with-mysqli=$mysql_root/bin/mysql_config –with-iconv-dir=/usr/local –with-freetype-dir –with-jpeg-dir –with-png-dir –enable-gd-native-ttf –enable-zip –with-zlib –with-gd –disable-rpath –enable-bcmath –enable-shmop –enable-sysvsem –with-curl –enable-mbstring –with-mcrypt –disable-ipv6 –enable-static –enable-maintainer-zts –enable-sockets –enable-soap –with-openssl –without-pdo-sqlite –enable-fpm
  • make -j 4 && make install
  • 进行php-fpm配置
  • 进行php.ini配置

你以为这样就轻松装完了?当然如果你系统各种依赖都完整,当然就一次性通过了。但是通常我们都会进行./configure这一步,都是收到不少错误提示,下面把我安装时遇到的问题列举一下。

遇到问题

  1. error: xml2-config not found
    yum install libxml2
    yum install libxml2-devel
    或者
    下载libxml2 与 libxml2-devel 的RPM源码包进行安装

  2. error: Please reinstall the libcurl distribution
    yum install curl
    yum install curl-devel
    或者
    下载curl 与 curl-devel 的RPM源码包进行安装

  3. error: mcrypt.h not found.
    centos源不能安装libmcrypt-devel,由于版权的原因没有自带mcrypt的包。
    所以只能下载安装包安装了
    wget http://softlayer.dl.sourceforge.net/sourceforge/mcrypt/libmcrypt-2.5.8.tar.gz (也可以到lnmp/src下面获取)
    tar -zxvf libmcrypt-2.5.8.tar.gz
    cd /usr/local/src/libmcrypt-2.5.8
    ./configure –prefix=/usr/local
    make && make install

  4. 在寻找各种依赖的过程,发现了前辈总结得比较好的一篇博文,如果你遇到比我还要奇葩的问题,可以参考
    http://yanue.net/post-127.html

  5. error: Don’t know how to define struct flock on this system, set –enable-opcache=no
    基本原因就是找不到mysql的so之类的。
    cd /etc/ld.so.conf.d
    vi mysql-x86_64.conf # 编辑库文件
    /usr/local/mysql/lib # 添加该行
    :wq # 保存退出
    ldconfig -v # 使之生效

  6. 脱网情况下SSH连接慢
    使用ssh -vv 192.168.48.128的方式测试一下慢出现在什么地方。
    截取其中一段出来:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    debug1: Authentications that can continue: publickey,gssapi-with-mic,password
    debug1: Next authentication method: gssapi-with-mic
    Address 192.168.48.128 maps to localhost, but this does not map back to ……
    debug1: Unspecified GSS failure. Minor code may provide more information
    No credentials cache found
    debug1: Unspecified GSS failure. Minor code may provide more information
    No credentials cache found
    debug1: Unspecified GSS failure. Minor code may provide more information
    No credentials cache found
    debug2: we did not send a packet, disable method
    debug1: Next authentication method: publickey

    当机器出现GSS导致慢的问题的时候会看到

    从以上的输出可以看到耗时最长的就是Unspecified GSS failure的地方,这是因为验证的时候启用的GSSAPIAuthentication验证方式导致的。

    那我们只要关闭就可以了,这个时候有两个地方是需要设置的,sshd_config里面设置的是服务端,ssh_config里面设置的是客户端的。两台相互连接的机器只要把一方设置为no即可。但是服务端一定要设置sshd_config,客户端设置ssh_config。

罐头很懒 (⊙v⊙)<br><br>工作日日常 :<br>do {<br>&nbsp;&nbsp;打代码<br>} while ( 发呆 || 吃饭 )<br><br>周末日常 :<br>( 鱼罐头 || 午餐肉 || 炸鸡块 ) +<br>( 罐可乐 || 瓶啤酒 ) +<br>( 盒仔饭 || 艇仔粥 || 即食面 ) +<br>( 轻音乐 || 肥皂剧 || 热网综 ) +<br>( 水果糖 || 甜布丁 )