lnmp编译安装

说明:
此文章主要讲解lnmp的编译安装。这里的操作系统是CentOS release 5.8 (Final) 64位

实现:
一.获取相关开源程序,yum安装相应库文件

# yum -y install 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 bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers

 
二.下载程序源码包

# cd /usr/local/src  //将以下内容添加到lnmp.txt。通过wget -i lnmp.txt批量下载文件,就不需要一个个下载
dl.gaingreat.com/nginx-1.2.4.tar.gz
dl.gaingreat.com/php-5.3.6.tar.gz
dl.gaingreat.com/mysql-5.1.38.tar.gz
dl.gaingreat.com/libiconv-1.13.tar.gz
dl.gaingreat.com/libmcrypt-2.5.8.tar.gz
dl.gaingreat.com/mcrypt-2.6.8.tar.gz
dl.gaingreat.com/memcache-2.2.5.tgz
dl.gaingreat.com/mhash-0.9.9.9.tar.gz
dl.gaingreat.com/pcre-8.10.tar.gz
dl.gaingreat.com/PDO_MYSQL-1.0.2.tgz
dl.gaingreat.com/eaccelerator-0.9.6.1.tar.bz2
dl.gaingreat.com/imagick-3.0.1.tgz

 
三.编译安装PHP5.3.6(FastCGI模式)所需的支持库
1.libiconv用于加强系统对支持字符编码转换的功能

# tar zxvf libiconv-1.13.1.tar.gz
# cd libiconv-1.13.1/
# ./configure --prefix=/usr/local
# make && make install
# cd ../

 
2.libmcrypt是加密算法库,php扩展mcrypt功能对此库有依耐关系,要使用mcrypt必须先安装此库

# tar zxvf libmcrypt-2.5.8.tar.gz
# cd libmcrypt-2.5.8/
# ./configure
# make && make install
# /sbin/ldconfig
# cd libltdl/
# ./configure --enable-ltdl-install
# make && make install
# cd ../../

 
3.mhash是hash加密算法库,mcrypt功能对此库有依耐关系

# tar zxvf mhash-0.9.9.9.tar.gz
# cd mhash-0.9.9.9/
# ./configure
# make && make install
# cd ../

 
4.为库添加软链接
64位系统,系统是32位还是64位可以通过getconf LONG_BIT查看位数,32为23位,64则为64位

# ln -sf /usr/local/lib/libmcrypt.la /usr/lib64/libmcrypt.la
# ln -sf /usr/local/lib/libmcrypt.so /usr/lib64/libmcrypt.so
# ln -sf /usr/local/lib/libmcrypt.so.4 /usr/lib64/libmcrypt.so.4
# ln -sf /usr/local/lib/libmcrypt.so.4.4.8 /usr/lib64/libmcrypt.so.4.4.8
# ln -sf /usr/local/bin/libmcrypt-config /usr/bin/libmcrypt-config
# ln -sf /usr/local/lib/libiconv.so.2 /usr/lib64/libiconv.so.2
# ln -sf /usr/local/lib/libmhash.a /usr/lib64/libmhash.a
# ln -sf /usr/local/lib/libmhash.la /usr/lib64/libmhash.la
# ln -sf /usr/local/lib/libmhash.so /usr/lib64/libmhash.so
# ln -sf /usr/local/lib/libmhash.so.2 /usr/lib64/libmhash.so.2
# ln -sf /usr/local/lib/libmhash.so.2.0.1 /usr/lib64/libmhash.so.2.0.1
# /sbin/ldconfig

 
32位系统

# ln -s /usr/local/lib/libmcrypt.la /usr/lib/libmcrypt.la
# ln -s /usr/local/lib/libmcrypt.so /usr/lib/libmcrypt.so
# ln -s /usr/local/lib/libmcrypt.so.4 /usr/lib/libmcrypt.so.4
# ln -s /usr/local/lib/libmcrypt.so.4.4.8 /usr/lib/libmcrypt.so.4.4.8
# ln -s /usr/local/lib/libmhash.a /usr/lib/libmhash.a
# ln -s /usr/local/lib/libmhash.la /usr/lib/libmhash.la
# ln -s /usr/local/lib/libmhash.so /usr/lib/libmhash.so
# ln -s /usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2
# ln -s /usr/local/lib/libmhash.so.2.0.1 /usr/lib/libmhash.so.2.0.1
# ln -s /usr/local/bin/libmcrypt-config /usr/bin/libmcrypt-config
# /sbin/ldconfig

 
5.mcrypt编译

# tar zxvf mcrypt-2.6.8.tar.gz
# cd mcrypt-2.6.8/
# ./configure
# make && make install
# cd ../

 
6.pcre编译

# tar zxvf pcre-8.10.tar.gz
# cd pcre-8.10
# ./configure
# make && make install
# cd ../

 
四.编译安装mysql 5.1.38

# groupadd mysql
# useradd -s /sbin/nologin -M -g mysql mysql
# mkdir -p /home/mysql  //创建目录,存放data和pid
# chown -R mysql:mysql /home/mysql/
# tar zxvf mysql-5.1.38.tar.gz
# cd mysql-5.1.38/
# ./configure --prefix=/usr/local/mysql/ --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client --with-big-tables --with-readline --with-ssl --with-embedded-server --enable-local-infile --with-plugins=partition,innobase,myisammrg
make && make install
cd ../

mysql更多详细配置与使用,请移步:mysql 5.1 编译安装

五.1编译安装PHP(FastCGI模式)

# tar zxvf php-5.3.6.tar.gz
# cd php-5.3.6
# ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-iconv-dir=/usr/local --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-discard-path --enable-safe-mode --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --with-curlwrappers --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets  --with-xmlrpc --enable-zip --enable-soap --with-pdo-mysql=/usr/local/mysql/ --with-mysql-sock=/tmp/mysql.sock
# make ZEND_EXTRA_LIBS= '-liconv '
# make install
# cp php.ini-production /usr/local/php/etc/php.ini
# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm  #因为php5.3开始自带fpm,使用自带的管理脚本
# chmod +x /etc/init.d/php-fpm
# chkconfig php-fpm on  #设置开机自启动
# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf

修改php-fpm.conf,将pid改成以下,并将user和group改成www
pid = run/php-fpm.pid
user = www
group = www

 
五.2编译安装PHP5扩展模块

# tar zxvf memcache-2.2.5.tgz
# cd memcache-2.2.5
# /usr/local/php/bin/phpize
# ./configure --with-php-config=/usr/local/php/bin/php-config
# make && make install
# cd ../

# tar zxvf PDO_MYSQL-1.0.2.tgz
# cd PDO_MYSQL-1.0.2
# /usr/local/php/bin/phpize
# ./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-mysql=/usr/local/mysql
# make && make install
# cd ..

# tar zxvf ImageMagick.tar.gz
# cd ImageMagick-6.5.1-2/
# ./configure
# make && make install
# cd ..

# tar zxvf imagick-3.0.1.tgz
# cd imagick-3.0.1
# /usr/local/php/bin/phpize
# ./configure --with-php-config=/usr/local/php/bin/php-config
# make && make install
# cd ..

# tar jxvf eaccelerator-0.9.6.1.tar.bz2
# cd eaccelerator-0.9.6.1
# /usr/local/php/bin/phpize
# ./configure --enable-eaccelerator=shared --with-php-config=/usr/local/php/bin/php-config
# make && make install
# cd ../

 
五.3修改php.ini文件,添加扩展模块

# mkdir -p /usr/local/eaccelerator_cache  //添加eAccelerator加速目录,为php加速
# vim /usr/local/php/etc/php.ini  //修改其中的extension_dir = "./"为extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/",并在此行后增加以下内容
  extension = "memcache.so"
  extension = "pdo_mysql.so"
  extension = "imagick.so"

  查找output_buffering = Off
  修改为output_buffering = On

  查找; cgi.fix_pathinfo=0
  修改为cgi.fix_pathinfo=0,防止Nginx文件类型错误解析漏洞。

shift+g跳至文章末尾,在文章末尾添加eAccelerator配置
[eaccelerator]
zend_extension="/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/eaccelerator.so"
eaccelerator.shm_size="64"
eaccelerator.cache_dir="/usr/local/eaccelerator_cache"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="3600"
eaccelerator.shm_prune_period="3600"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"

 
五.4修改php-fpm.conf

# vim /usr/local/php/etc/php-fpm.conf  //去掉内容前面的;
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35

现在还不能通过/etc/init.d/php-fpm启动php,还缺少www用户

六.1编译安装nginx

# groupadd www
# useradd -s /sbin/nologin -M -g www www #www用户不能login
# mkdir -p /home/www/data #此路径是用于存放各域名的root路径
# chmod +w /home/www/data
# mkdir -p /home/www/logs
# chmod 755 /home/www/logs
# chown -R www:www /home/www

# tar zxvf nginx-1.2.4.tar.gz
# cd nginx-1.2.4
# ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module
# make && make install
# mkdir /usr/local/nginx/conf/vhosts/ //用于配置各域名

 

六.2修改nginx的配置文件nginx.conf,vhosts/test.conf

# vim /usr/local/webserver/nginx/conf/nginx.conf  //添加以下内容
user  www www;
worker_processes 8;
error_log  /home/www/logs/nginx_error.log  crit;
pid        /usr/local/nginx/logs/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 51200;
events
{
    use epoll;
    worker_connections 51200;
}
http
{
    include       mime.types;
    default_type  application/octet-stream;
    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 8m;
    sendfile on;
    tcp_nopush     on;
    keepalive_timeout 60;
    tcp_nodelay on;
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 256k;
    gzip on;
    gzip_min_length  1k;
    gzip_buffers     4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types       text/plain application/x-javascript text/css application/xml;
    gzip_vary on;
    #limit_zone  crawler  $binary_remote_addr  10m;
    #log format
    log_format  access   '$remote_addr - $remote_user [$time_local] "$request"  '
     '$status $body_bytes_sent $request_body "$http_referer"  '
     '"$http_user_agent" $http_x_forwarded_for ';
    include vhosts/*.conf;  //这里,记得跟六.1的mkdir /usr/local/nginx/conf/vhosts/一样
}

 
六.3修改域名配置文件test.conf

# vim /usr/local/nginx/conf/test.conf,添加以下内容
server
{
    listen       80;
    server_name www.test.com test.com;
    index index.html index.htm index.php default.html default.htm default.php;
    root  /home/www/data/test;
    location ~ .*.(php|php5)?$
    {
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
    location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
    }
    location ~ .*.(js|css)?$
    {
        expires      12h;
    }
    access_log  off;
}

 
六.4新建nginx管理脚本,因此nginx默认没有管理脚本

# vi /etc/init.d/nginx  //输入以下内容
#! /bin/sh
# chkconfig: 2345 55 25
# Description: Startup script for nginx webserver on Debian. Place in /etc/init.d and
# run  'update-rc.d -f nginx defaults ', or use the appropriate command on your
# distro. For CentOS/Redhat run:  'chkconfig --add nginx '
### BEGIN INIT INFO
# Provides:          nginx
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the nginx web server
# Description:       starts nginx using start-stop-daemon
### END INIT INFO
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="nginx daemon"
NAME=nginx
DAEMON=/usr/local/nginx/sbin/$NAME
CONFIGFILE=/usr/local/nginx/conf/$NAME.conf
PIDFILE=/usr/local/nginx/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
set -e
[ -x "$DAEMON" ] || exit 0
do_start() {
$DAEMON -c $CONFIGFILE || echo -n "nginx already running"
}
do_stop() {
kill -INT `cat $PIDFILE` || echo -n "nginx not running"
}
do_reload() {
kill -HUP `cat $PIDFILE` || echo -n "nginx can 't reload"
}
case "$1" in
start)
echo -n "Starting $DESC: $NAME"
do_start
echo "."
;;
stop)
echo -n "Stopping $DESC: $NAME"
do_stop
echo "."
;;
reload|graceful)
echo -n "Reloading $DESC configuration..."
do_reload
echo "."
;;
restart)
echo -n "Restarting $DESC: $NAME"
do_stop
do_start
echo "."
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|reload|restart}" >&2
exit 3
;;
esac
exit 0

为该文件增加执行权限,并设置为自启动
chmod +x /etc/init.d/nginx
chkconfig nginx on

 

七.启动nginx,mysql,php

# /etc/init.d/nginx start|stop|restart
# /etc/init.d/mysqld start|stop|restart
# /etc/init.d/php-fpm start|stop|restart

 
附录:
1.make install mysql时,一直停留在Leaving directory `/mysql-test’
make[2]: Entering directory `/usr/local/src/mysql-5.1.38/mysql-test’
make[3]: Entering directory `/usr/local/src/mysql-5.1.38/mysql-test’
make[3]: Nothing to be done for `install-exec-am’.
make INSTALL_TO_DIR=”/usr/local/mysql/mysql-test” install_test_files
make[4]: Entering directory `/usr/local/src/mysql-5.1.38/mysql-test’
make[4]: Leaving directory `/usr/local/src/mysql-5.1.38/mysql-test’
mysql安装到这里卡了很久,是不是你觉得认为死机,程序安装错误了?聪明的你可能发现了,实际mysql已经安装成功了,它这步过段时间就会好了,但你知道是什么原因吗?哈哈告诉你吧“这是mysql在自我编译测试造成的“。只能等mysql自己完成,但mysql自编译是什么?
我这边是先top,看install进程是不是有变动,确定不是进程卡了的问题后,我把虚拟机关了,将原来的内存512提高到1024,明显快了很多。试的时候,可用free -m查看可用内存是不是充足。虽然mysql卡在Leaving directory `/mysql-test只能等mysql自己完成,但内存设置大点,还是会减少等待时间。

2.PHP 5.3.*编译安装时出现undefined reference to `libiconv’
手动编译PHP安装时遇到如下错误
/usr/local/src/php-5.3.10/ext/xmlrpc/libxmlrpc/encodings.c:73: undefined reference to `libiconv_open’ /usr/local/src/php-5.3.10/ext/xmlrpc/libxmlrpc/encodings.c:81: undefined reference to `libiconv’ /usr/local/src/php-5.3.10/ext/xmlrpc/libxmlrpc/encodings.c:101: undefined reference to `libiconv_close’ collect2: ld returned 1 exit status make: *** [sapi/fpm/php-fpm] 错误
1 表面看,是libiconv安装问题,重装libiconv之后问题依旧,网上看有人舍弃libiconv,使用 –without-iconv,我觉的不可取,这样是回避问题。 找了n久,终于找到bug所在: 在执行完 ./configure … 之后,修改下 Makefile,找到其中的
EXTRA_LIBS = -lcrypt -lz -lcrypt -lrt -lmysqlclient -lmcrypt -lldap -llber -lfreetype -lpng -lz -ljpeg -lcurl -lz -lrt -lm -ldl -lnsl -lrt -lxml2 -lz -lm -lssl -lcrypto -ldl -lz -lcurl -ldl -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lidn -lssl -lcrypto -lz -lxml2 -lz -lm -lssl -lcrypto -ldl -lz -lxml2 -lz -lm -lxml2 -lz -lm -lcrypt -lxml2 -lz -lm -lxml2 -lz -lm -lxml2 -lz -lm -lxml2 -lz -lm -lcrypt
在最后面添加 -liconv ,修改后如下
EXTRA_LIBS = -lcrypt -lz -lcrypt -lrt -lmysqlclient -lmcrypt -lldap -llber -lfreetype -lpng -lz -ljpeg -lcurl -lz -lrt -lm -ldl -lnsl -lrt -lxml2 -lz -lm -lssl -lcrypto -ldl -lz -lcurl -ldl -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lidn -lssl -lcrypto -lz -lxml2 -lz -lm -lssl -lcrypto -ldl -lz -lxml2 -lz -lm -lxml2 -lz -lm -lcrypt -lxml2 -lz -lm -lxml2 -lz -lm -lxml2 -lz -lm -lxml2 -lz -lm -lcrypt -liconv

原文参考
Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器(第6版)[原创] 
http://solf.me/compile-nginx-php-mysql-on-centos-lnmp/

发表评论

邮箱地址不会被公开。 必填项已用*标注