编译搭建Lamp服务器

Lamp 是目前倍受欢迎的一种网站服务器。其主要有linux+apache+mysql+php 组成。由于其组成成员都是开源免费的产品,所以被作为中小型网站服务器的选择。
LZ之前在学校学linux的时候搭建过一次PHP。那时只知道Lamp是由什么组成的,却不知道其中的联系,最后在搭建lamp的时候,用rpm的方式安装,几个模块之间相互独立,根本就达不到服务器的效果,后来尝试用yun搭建,成功了,却不明其原理。
这篇文章,是LZ理清思路,用源码编译安装Lamp之后的笔记。

首先,理清思路。Lamp的组成,其实也是我们网站开发初期所需要考虑的四大要素:系统、环境、数据库、开发语言。而在搭建这的个环境的过程中,有两点是需要提到的。一、在apache 刚安装的时候,它是不支持PHP的。Apache 要支持PHP需要加载PHP指定的模块,这个模块,是不会默认加载的,所以如果源码编译的话,后期是要手动加载模块的。二、PHP在安装的时候,不仅要安装PHP本身,还要安装相应的库文件,否则很多功能会得不到实现或者制约。同时,PHP在安装的过程中,需要产生支持apache 的模块文件,同时还有mysql。所以PHP的安装,是整个Lamp安装的最重要的一个环节。

因为是源码编译,所以有些环境需要体检准备。Linux下的源码,大都是用c编写的,所以在编译的时候,需要查看是否安装了gcc编译环境。
Linux 下 控制台输入 gcc -v 如果出现以下结果,就说明已经安装了gcc 了

   使用内建 specs。
   COLLECT_GCC=gcc
   COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-linux-gnu/4.7/lto-wrapper
   目标:i686-linux-gnu
   配置为:../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.7.3-1ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs --enable-languages=c,c++,go,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.7 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.7 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --with-system-zlib --enable-objc-gc --enable-targets=all --with-cloog --enable-cloog-backend=ppl --disable-cloog-version-check --disable-ppl-version-check --enable-multiarch --disable-werror --with-arch-32=i686 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu
   线程模型:posix
gcc 版本 4.7.3 (Ubuntu/Linaro 4.7.3-1ubuntu1) 

 
大部分情况下linux会默认带有gcc的,如果没有,需要自行下载安装

接下来,需要卸载已经安装的低版本的PHP,Mysql,Apache,以免在安装过程中出现冲突。

Redhat 版本的linux 可以如下卸载:
查询是否安装 :rpm -qa|grep -i httpd ·「 mysql,php」
停止服务:service httpd 「 mysql,php」 stop 
卸载软件包:rpm -e 查询到的软件包名 --nodep

Debian 版本的linux 可以如下卸载:
显示软件信息 :apt-cache show 软件名 或者dpkg -l |grep -i "软件包名" 
卸载软件包: apt-get remove 软件包 或者dpkg -r 卸载软件包

建议卸载之后,查看配置文件或者文件夹是否存在,并一并删除,免得干扰
   
卸载完成后,接下来下载所需要的安装包。以下是所需要的源码包,其中包括安装PHP 时需要的库文件和主要的安装包
PHP所需要的库文件,需要先安装,安装的顺序建议按排序安装
libxml2-2.9.0 
libmcrypt-2.5.8
zlib-1.2.7
libpng-1.5.14
jpegsrc.v8b
freetype-2.4.10
autoconf-2.69
gd-2.0.35
主要安装包
httpd-2.4.3
mysql-5.0.41
php-5.4.11
phpMyAdmin-3.5.6-all-languages
额外代码包:
apr-1.4.6
apr-util-1.5.1
m4-1.4.9
pcre 
以上安装包都可以从开源网站下载,以下是网上找到的比较全的安装包下载地址:http://pan.baidu.com/share/link?shareid=1389731276&uk=437486341

下载完安装包后,建议将安装包存放在统一的目录(如/usr/local )下,然后将其解压。以上面给出的资源为例:

Unzip Lamp_All_file.zip -d /usr/local/src //将文件解压到指定目录
cd /usr/local/src  
ls *.tar.gz |xargs -n1 tar xzvf //解压该目录下所有的tar.gz 包。(有点占内存)

解压完成后,开始对源代码进行配置与安装。


Linux 下源代码的配置与安装大体都是使用 ./configure 、make 和 make install命令
在源码包的目录下,首先./configure 配置相应的路径,如:
./configure --prefix=/usr/local/lamp/libxml2
然后就运行make 命令 在运行make install 进行安装,make和make install 安装可以同时进行,如:
make && make install

 顺序安装源码包:
libxml2-2.9.0
./configure --prefix=/usr/local/lamp/libxml2-2.9.0
make && make install
libmcrypt-2.5.8
./configure --prefix=/usr/local/lamp/libmcrypt-2.5.8
make && make install

zlib-1.2.7
./configure --prefix=/usr/local/lamp/zlib-1.2.7
make && make install

libpng-1.5.14
./configure --prefix=/usr/local/lamp/libpng-1.5.14
make && make install

jpegsrc.v8b(注意;jpeg 源码包安装的时候是不会自动生成目录的,所以需要在安装之前先创建相应的目录。同时需要将其设置成共享库和静态库,因为接下来gd安装的时候需要用到jpeg库,如果没有设置的话,最后检测的时候会检测不到jpeg库的)

mkdir /usr/local/lamp/jpeg
mkdir /usr/local/lamp/jpeg/bin
mkdir /usr/local/lamp/jpeg/lib
mkdir /usr/local/lamp/jpeg/include
mkdir /usr/local/lamp/jpeg/man
mkdir /usr/local/lamp/jpeg/man/man1
./configure --prefix=/usr/local/lamp/jpeg/ --enable-shared --enable-static
make && make install

freetype-2.4.10
./configure --prefix=/usr/local/lamp/freetype
make && make install
autoconf-2.69(autoconf 安装的时候,可能会提示找不到M4,如果出现这样的情况的话,需要下载M4 的源文件并安装)
./configure --prefix=/usr/local/lamp/autoconf
make && make install

gd-2.0.35(gd库在安装的时候,除了需要配置安装路径,还需要将前面安装jpeg库和freetype库的路径也给附上)

./configure --prefix=/usr/local/lamp/gd2 --with-jpeg=/usr/local/lamp/jpeg8/ --with-freetype=/usr/local/lamp/freetype/
make && make install

以上是PHP所需的库文件的安装过程,接下来需要安装主要的代码包:
Apache (在安装apache 之前,为了保证成功,建议配置apr和apr-util,主要是将下载原来的源代码包放到apache 的源代码包的指定目录中去。同时还要编译安装pcre 包)

cp -r apr httpd-2.4.3/srclib/apr
cp -r apr-util httpd-2.4.3/srclib/apr-util

进入pcre目录
./configure --prefix=/usr/local/pcre
make && make install
进入apache目录
./configure --prefix=/usr/local/lamp/httpd/ --sysconfdir=/etc/httpd --with-included-apr --disable-userdir --enable-so --enable-deflate=shared --enable-expires=shared --enable-rewrite=shared --enable-static-support --with-pcre=/usr/local/pcre/
make && make install

mysql数据库的安装在http://www.cnblogs.com/Seanit/p/3706238.html  中已经说过,在此不做赘述。接下来便是安装PHP

./configure 
--prefix=/usr/local/lamp/php/
--with-config-file-path=/usr/local/lamp/php/etc/ --with-apxs2=/usr/local/lamp/httpd/bin/apxs
--with-mysql=/usr/local/lamp/mysql/
--with-libxml-dir=/usr/local/lamp/libxml2/
--with-jpeg-dir=/usr/local/lamp/jpeg/
--with-freetype-dir=/usr/local/lamp/freetype/
--with-gd=/usr/local/lamp/gd2/
--with-mcrypt=/usr/local/lamp/libmcrypt/ --with-mysqli=/usr/local/lamp/mysql/bin/mysql_config
--enable-soap --enable-mbstring=all --enable-sockets

make && make install(此处可能会出错)

安装完成后,需要拷贝php.ini 文件到php的安装目录下
cp php.ini-dist(php.ini-production) /usr/local/lamp/php/etc/php.ini
   
最后,整合lamp 环境。Apache 和PHP安装完成之后,其实并没有相互关联,apache并没有加载PHP模块,所以并不能打开php。因此,接下来需要配置apache 加载php模块。
vi /etc/httpd/httpd.conf
在文件中加入如下语句:
AddType application/x-httpd-php .php .phtml
重启apache 服务器
/usr/local/lamp/apache2/bin/apachectl restart(注意,httpd 默认情况下开启的是80端口,可是linux默认情况下开启1024以内端口号,需要用到root权限,所以此处如果用普通账户可能会报bind错误。)
   
至此,Lamp的开发环境就搭建成功了
后期配置:
配置默认首页(在DirectoryIndex 中加入index.php):
vi /etc/httpd/httpd.conf
DirectoryIndex index.php index.Html index.html

   

以下是LZ 安装时曾经遇到过的错误以及解决方案:
1、安装php时出错:
   

In file included from /usr/local/src/php-5.4.6/ext/gd/gd.c:103:
   /usr/local/src/php-5.4.6/ext/gd/gd_ctx.c: 在函数‘_php_image_stream_putc’中:
   /usr/local/src/php-5.4.6/ext/gd/gd_ctx.c:51: 错误:‘struct gdIOCtx’没有名为‘data’的成员
   /usr/local/src/php-5.4.6/ext/gd/gd_ctx.c: 在函数‘_php_image_stream_putbuf’中:
   /usr/local/src/php-5.4.6/ext/gd/gd_ctx.c:58: 错误:‘struct gdIOCtx’没有名为‘data’的成员
   /usr/local/src/php-5.4.6/ext/gd/gd_ctx.c: 在函数‘_php_image_stream_ctxfree’中:
   /usr/local/src/php-5.4.6/ext/gd/gd_ctx.c:67: 错误:‘struct gdIOCtx’没有名为‘data’的成员
   /usr/local/src/php-5.4.6/ext/gd/gd_ctx.c:68: 错误:‘struct gdIOCtx’没有名为‘data’的成员
   /usr/local/src/php-5.4.6/ext/gd/gd_ctx.c:69: 错误:‘struct gdIOCtx’没有名为‘data’的成员
   In file included from /usr/local/src/php-5.4.6/ext/gd/gd.c:103:
   /usr/local/src/php-5.4.6/ext/gd/gd_ctx.c: 在函数‘_php_image_output_ctx’中:
   /usr/local/src/php-5.4.6/ext/gd/gd_ctx.c:153: 错误:‘gdIOCtx’没有名为‘data’的成员
   make: *** [ext/gd/gd.lo] 错误 1

 
这个是php5.4的一个bug,需要修改gd的一个文件
解决方法:
   

vi /usr/local/gd2/include/gd_io.h
    typedef struct gdIOCtx
  
  {
   int (*getC) (struct gdIOCtx *);
  
   int (*getBuf) (struct gdIOCtx *, void *, int);
  
   void (*putC) (struct gdIOCtx *, int);
  
   int (*putBuf) (struct gdIOCtx *, const void *, int);
  
   int (*seek) (struct gdIOCtx *, const int);
  
   long (*tell) (struct gdIOCtx *);
   void (*gd_free) (struct gdIOCtx *);
  
   void (*data);
  
  }
  
  gdIOCtx;
  

在该文件中加入红色字体的语句,在重新make即可
   

2、httpd 启动时错误
   

(98)Address already in use: make_sock: could not bind to address [::]:80 
   (98)Address already in use: make_sock: could not bind to address 0.0.0.0:80 
   no listening sockets available, shutting down 
   Unable to open logs


解决方案:
此处显示的是80端口已被调用,需要kill掉进程即可
   
3、访问php 文件时打开下载窗口显示下载该PHP页面
这种情况是PHP模块未被加载的原因造成的
解决方案:
在httpd.conf 中查看是否存在以下语句:
LoadModule php5_module modules/libphp5.so
如果不存在,则添加,然后重启
   
4、http 无法加载模块错误
Httpd 启动的时候提示
Cannot load /usr/local/apache/modules/libphp5.so
这个显示的是httpd 无法加载libphp5.so模块,libphp5.so是php安装的时候生成的。
解决方案:
查看modules/libphp5.so 文件是否存在,如果不存在,既有可能是在配置php的时候出错了,可能在--with-apxs2=/usr/local/lamp/apache2/bin/apxs 上面出错,重新配置一下,在make 就能产生libphp5.so文件了。
     
5、编译PHP 时出现libtool 错误
libtool: link: `ext/date/lib/astro.lo' is not a valid libtool object
 解决方案:重新安装libtool 然后make clean 再 make 即可
  
本文是在LZ参考了网络上的一些博文和视频之后实践后写的,主要参考了Lamp兄弟连视频教程和http://www.cnblogs.com/hanganglin/articles/3328223.html这篇文章,在此进行声明与感谢

原文地址:https://www.cnblogs.com/Seanit/p/3749168.html