| 
	前段时间换VPS,在选择系统的时候,抛弃掉了Ubuntu Server而选择最新的CentOS 6.0 64bit。选择之后自然就涉及到安装环境的问题了。自己有点不想用LAMP环境了,于是大胆的选择了LNMP。 
	然而yum源里默认是没有nginx的,要安装LNMP就只有两个选择:要么添加第三方源来实现,要么自己编译。 
	对于Linux环境下的编译感兴趣的我,决定使用最新的LNMP环境,于是就选择了后者——自己编译。 
	经过几次尝试之后,把发现的各类问题和总结都基本归纳好了,于是写了这么一篇总结性的文章,以便今后参考。 
	需要注意的是:64位里面有些软链接的操作是32位系统不需要或者不相同的,因此这里请注意文章里的描述,以免出现问题。 
	(一)准备必要的组件
	这一步将安装系统里缺失的组件,以便后面的编译过程顺利。VPS由于都是精简过的系统,因此大部分的组件都有缺失,因此这一步是相当重要的。 
	这步操作可以通过yum源来完成,简单方便。在控制台里敲入下面的命令: 
	
		yum 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 libtool  libtool-libs libevent-devel libevent openldap openldap-devel nss_ldap openldap-clients openldap-servers libtool-ltdl libtool-ltdl-devel bison 
	然后让系统自己安装就好了。 
	(二)准备必要的软件源码包
	接下来我们要准备各个软件的源码包,以便编译安装。 
	首先我们创建下载目录: 
	
		mkdir -p /data0/softwarecd /data0/software
 
	接下来使用wget依次将以下软件包下载好: 
	
		wget http://nginx.org/download/nginx-1.0.6.tar.gzwget http://au2.php.net/get/php-5.3.8.tar.gz/from/de.php.net/mirror
 wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.15.tar.gz/from/http://mysql.easynet.be/
 wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz
 wget “http://downloads.sourceforge.net/mcrypt/libmcrypt-2.5.8.tar.gz?modtime=1171868460&big_mirror=0″
 wget “http://downloads.sourceforge.net/mcrypt/mcrypt-2.6.8.tar.gz?modtime=1194463373&big_mirror=0″
 wget http://pecl.php.net/get/memcache-2.2.6.tgz
 wget “http://downloads.sourceforge.net/mhash/mhash-0.9.9.9.tar.gz?modtime=1175740843&big_mirror=0″
 wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.12.tar.gz
 wget http://acelnmp.googlecode.com/files/eaccelerator-0.9.6.1.tar.bz2
 wget http://www.cmake.org/files/v2.8/cmake-2.8.5.tar.gz
 
	这样源码包的准备工作就结束了。 
	(三)安装CMake
	由于最新的MySQL使用CMake编译,因此我们首先要把CMake编译安装好: 
	
		tar zxvf cmake-2.8.5.tar.gzcd cmake-2.8.5
 ./configure –prefix=/usr
 make
 make install
 cd ..
 
	(四)安装MySQL
	首先我们建立mysql用户组和用户: 
	
		groupadd mysqluseradd -g mysql mysql
 
	然后解包并编译安装MySQL: 
	
		tar xvf mysql-5.5.15.tar.gzcd mysql-5.5.15
 cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/webserver/mysql/ -DMYSQL_DATADIR=/data0/mysql/data -DMYSQL_UNIX_ADDR=/data0/mysql/mysqld.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 -DENABLED_LOCAL_INFILE=1 -DMYSQL_TCP_PORT=3306 -DWITH_EXTRA_CHARSETS:STRING=utf8,gbk -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DMYSQL_UNIX_ADDR=/data0/mysql/mysql.sock -DWITH_DEBUG=0 -DWITH_READLINE=1 -DWITH_SSL=yes -DSYSCONFDIR=/data0/mysql
 make
 make install
 
	接下来给MySQL的目录赋予权限: 
	
		chmod +w /usr/local/webserver/mysqlchown -R mysql:mysql /usr/local/webserver/mysql
 
	创建一系列的MySQL需要用到的目录: 
	
		mkdir -p /data0/mysql/data/mkdir -p /data0/mysql/binlog/
 mkdir -p /data0/mysql/relaylog/
 chown -R mysql:mysql /data0/mysql/
 
	接着我们以mysql帐号身份建立数据库: 
	
		/usr/local/webserver/mysql/scripts/mysql_install_db –basedir=/usr/local/webserver/mysql –datadir=/data0/mysql/data –user=mysql 
	然后我们复制mysql的启动脚本到/etc/init.d/目录方便启动: 
	
		cd support-filescp mysql.server /etc/init.d/mysqld
 chmod +x /etc/init.d/mysqld
 
	然后我们将my.cnf复制到正确的地方: 
	
		cp my-medium.cnf /data0/mysql/my.cnfcd ../../
 
	注意这里根据自己服务器的应用需要,选择support-files下对应的预设配置文件替换掉上面命令中蓝色的部分。我这里选择的是中等压力的配置文件my-medium.cnf。 
	接下来我们编辑下MySQL的配置文件,做些设置: 
	
		vim /data0/mysql/my.cnf 
	然后在“[mysqld]”这一节的最后添加下面的内容: 
	
		basedir = /usr/local/webserver/mysqldatadir = /data0/mysql/data
 log-error = /data0/mysql/mysql_error.log
 pid-file = /data0/mysql/mysql.pid
 relay-log-index = /data0/mysql/relaylog/relaylog
 relay-log-info-file = /data0/mysql/relaylog/relaylog
 relay-log = /data0/mysql/relaylog/relaylog
 log-slow-queries = /data0/mysql/slow.log
 
	然后我们启动MySQL服务: 
	
		/etc/init.d/mysqld start 
	如果无问题的话应该显示SUCCESS的提示。 
	然后我们设置下root的密码,安装后默认root是空密码,这样很不安全: 
	
		/usr/local/webserver/mysql/bin/mysql -u rootGRANT ALL PRIVILEGES ON *.* TO ‘root’@'localhost’ IDENTIFIED BY ‘000000‘;
 GRANT ALL PRIVILEGES ON *.* TO ‘root’@’127.0.0.1′ IDENTIFIED BY ‘000000‘;
 
	注意把蓝色部分替换为你要设置的密码。 
	接下来我们创建libmysqlclient的软链接,以免编译其它依赖Mysql软件时出现libmysqlclient.so.18: cannot open shared object file的错误: 
	
		ln -s /usr/local/webserver/mysql/lib/libmysqlclient.so.18 /usr/lib64/libmysqlclient.so.18 (64位系统使用)ln -s /usr/local/webserver/mysql/lib/libmysqlclient.so.18 /usr/lib/libmysqlclient.so.18 (32位系统使用)
 
	就此MySQL编译安装工作结束。 
	(五)安装PHP所需要的一些库
	接下来为了后面编译PHP的顺利进行,先需要将一些必要的库编译安装好。 
	首先是libiconv库的编译安装: 
	
		tar zxvf libiconv-1.13.1.tar.gzcd libiconv-1.13.1/
 ./configure –prefix=/usr/local
 make
 make install
 cd ..
 
	然后是libmcrypt库的编译安装: 
	
		tar zxvf libmcrypt-2.5.8.tar.gzcd libmcrypt-2.5.8
 ./configure
 make
 make install
 /sbin/ldconfig
 
		cd libltdl/./configure –enable-ltdl-install
 make
 make install
 cd ../../
 
	接下来我们要建立libmcrypt库的软链接: 
	
		#64位系统使用 
		ln -sf /usr/local/lib/libmcrypt.la /usr/lib64/libmcrypt.laln -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
 ldconfig
 
		#32位系统使用 
		ln -sf /usr/local/lib/libmcrypt.la /usr/lib/libmcrypt.laln -sf /usr/local/lib/libmcrypt.so /usr/lib/libmcrypt.so
 ln -sf /usr/local/lib/libmcrypt.so.4 /usr/lib/libmcrypt.so.4
 ln -sf /usr/local/lib/libmcrypt.so.4.4.8 /usr/lib/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/lib/libiconv.so.2
 ldconfig
 
	接下来编译安装mhash: 
	
		tar zxvf mhash-0.9.9.9.tar.gzcd mhash-0.9.9.9
 ./configure
 make
 make install
 cd ..
 
	建立libmhash相关的软链接: 
	
		#64位系统使用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
 ldconfig
 
		#32位系统使用ln -sf /usr/local/lib/libmhash.a /usr/lib/libmhash.a
 ln -sf /usr/local/lib/libmhash.la /usr/lib/libmhash.la
 ln -sf /usr/local/lib/libmhash.so /usr/lib/libmhash.so
 ln -sf /usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2
 ln -sf /usr/local/lib/libmhash.so.2.0.1 /usr/lib/libmhash.so.2.0.1
 ldconfig
 
	接下来编译安装mcrypt: 
	
		tar zxvf mcrypt-2.6.8.tar.gzcd mcrypt-2.6.8/
 /sbin/ldconfig
 ./configure
 make
 make install
 cd ..
 
	这样PHP编译所依赖的一些库就准备好了。 
	(六)安装PHP
	首先我们再做几个软链接,这些软链接只是64位系统需要,32位系统不需要做: 
	
		ln -s /usr/lib64/libjpeg.so /usr/lib/libjpeg.soln -s /usr/lib64/libldap.so /usr/lib/libldap.so
 ln -s /usr/lib64/libpng.so /usr/lib/libpng.so
 
	然后我们开始解包PHP并以FastCGI模式(PHP-FPM)编译安装: 
	
		tar xvf php-5.3.8.tar.gzcd php-5.3.8
 
		./configure –prefix=/usr/local/webserver/php –with-config-file-path=/usr/local/webserver/php/etc –with-mysql=/usr/local/webserver/mysql –with-mysqli=/usr/local/webserver/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-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-ldap –with-ldap-sasl –with-xmlrpc –enable-zip –enable-soap –without-pear 
		make ZEND_EXTRA_LIBS=’-liconv’make install
 
	创建PHP的配置文件: 
	
		cp -f php.ini-production /usr/local/webserver/php/etc/php.inicd ..
 
	由于刚才安装的时候试用了without-pear参数没有安装PEAR(因为直接安装会报错),现在我们再来补上: 
	
		wget http://pear.php.net/go-pear.phar/usr/local/webserver/php/bin/php go-pear.phar
 
	至此PHP的编译安装完毕。 
	(七)安装PHP的扩展模块及配置PHP
	接下来我们安装一些PHP常用的模块来优化系统: 
	首先是memcache的编译安装: 
	
		tar xvf memcache-2.2.6.tgzcd memcache-2.2.6
 /usr/local/webserver/php/bin/phpize
 ./configure –with-php-config=/usr/local/webserver/php/bin/php-config
 make
 make install
 cd ..
 
	然后我们编译安装eAccelerator加速器: 
	
		tar jxvf eaccelerator-0.9.6.1.tar.bz2cd eaccelerator-0.9.6.1/
 /usr/local/webserver/php/bin/phpize
 ./configure –enable-eaccelerator=shared –with-php-config=/usr/local/webserver/php/bin/php-config
 make
 make install
 cd ..
 
	然后我们将编译好的这两个扩展模块添加到PHP配置文件中: 
	
		sed -i ‘s#; extension_dir = “./”#extension_dir = “/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20090626/”\nextension = “memcache.so”\n#’ /usr/local/webserver/php/etc/php.inised -i “s#;always_populate_raw_post_data = On#always_populate_raw_post_data = On#g” /usr/local/webserver/php/etc/php.ini
 sed -i “s#;cgi.fix_pathinfo=1#cgi.fix_pathinfo=0#g” /usr/local/webserver/php/etc/php.ini
 
	创建eAccelerator所需的缓存目录: 
	
		mkdir -p /usr/local/webserver/eaccelerator_cache 
	然后我们到php.ini中配置eaccelerator加速器: 
	
		vim /usr/local/webserver/php/etc/php.ini 
	然后到文件的最后添加下面的内容: 
	
		[eaccelerator]zend_extension=”/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20090626/eaccelerator.so”
 eaccelerator.shm_size=”32″
 eaccelerator.cache_dir=”/usr/local/webserver/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″
 
	然后我们建立PHP存放日志的目录: 
	
		mkdir -p /usr/local/webserver/php/logs 
	然后我们建立php-fpm的配置文件: 
	
		vim /usr/local/webserver/php/etc/php-fpm.conf 
	然后在里面写入下面的内容: 
	
		[global]pid = /usr/local/webserver/php/logs/php-fpm.pid
 error_log = /usr/local/webserver/php/logs/php-fpm.log
 log_level = notice
 emergency_restart_threshold = 10
 emergency_restart_interval = 1m
 process_control_timeout = 5s
 daemonize = yes
 [www]
 listen = 127.0.0.1:9000
 listen.backlog = -1
 listen.allowed_clients = 127.0.0.1
 user = www
 group = www
 listen.mode=0666
 pm = static
 pm.max_children = 64
 pm.start_servers = 20
 pm.min_spare_servers = 5
 pm.max_spare_servers = 35
 pm.max_requests = 1024
 
		request_terminate_timeout = 0srequest_slowlog_timeout = 0s
 slowlog = logs/slow.log
 rlimit_files = 65535
 rlimit_core = 0
 chroot =
 chdir =
 catch_workers_output = yes
 env[HOSTNAME] = $HOSTNAME
 env[PATH] = /usr/local/bin:/usr/bin:/bin
 env[TMP] = /tmp
 env[TMPDIR] = /tmp
 env[TEMP] = /tmp
 
		php_flag[display_errors] = off 
	然后我们添加www用户组和帐号信息,以便后面的php-fpm和nginx能够正常工作: 
	
		groupadd wwwuseradd -g www www
 
	接下来,让我们测试下php-fpm配置文件是否正确: 
	
		/usr/local/webserver/php/sbin/php-fpm -t 
	如果出现“NOTICE: configuration file /usr/local/webserver/php/etc/php-fpm.conf test is successful”字样则表示配置正确。否则需要检查配置文件。 
	(八)安装Nginx
	首先我们创建网页存放的根目录: 
	
		mkdir -p /var/www 
	这里可以根据需要建立你自己喜欢的Web根目录地址,不过注意后面的配置文件相应地方需要做修改。第一次进行编译操作或者初学者建议保持这里的配置不改动,以便顺利完成编译安装工作。 
	然后创建Nginx所需的日志目录并分配权限: 
	
		mkdir -p /var/log/nginxchmod +w /var/log/nginx
 chown -R www:www /var/log/nginx
 
	然后编译安装Nginx所需的pcre库: 
	
		tar zxvf pcre-8.12.tar.gzcd pcre-8.12/
 ./configure
 make
 make install
 cd ..
 
	接下来,编译安装Nginx: 
	
		tar xvf nginx-1.0.6.tar.gzcd nginx-1.0.6/
 ./configure –user=www –group=www –prefix=/usr/local/webserver/nginx –with-http_stub_status_module –with-http_ssl_module
 make
 make install
 cd ..
 
	然后编辑Nginx的配置文件: 
	
		vim /usr/local/webserver/nginx/conf/nginx.conf 
	将对应的内容改为如下: 
	
		user www www;worker_processes 2;
 
		error_log /var/log/nginx/error.log; 
	注意蓝色文字部分根据服务器的配置选择不同的值。512M以下内存为1~2;1G内存4;2G内存8;4G内存16,以此类推。 
	然后在配置文件的“http {”这节里面增加下面的内容以便优化: 
	
		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 128k;
 
	接下来我们运行下面的命令测试Nginx的配置文件是否正确: 
	
		/usr/local/webserver/nginx/sbin/nginx -t 
	如果出现下面提示的一种则表示配置文件无误,否则需要做进一步修改: 
	
		nginx: the configuration file /usr/local/webserver/nginx/conf/nginx.conf syntax is oknginx: configuration file /usr/local/webserver/nginx/conf/nginx.conf test is successf
 
	这样Nginx的安装与配置也就完成。 
	(九)设置开机启动
	我们编译好了的软件默认是不会开机自动启动的,我们需要处理下以便实现开机自启动。 
	首先是MySQL: 
	
		chkconfig –add mysqldchkconfig –level 345 mysqld on
 
	然后php-fpm和Nginx的启动我们放到/etc/rc.local启动文件中: 
	
		vim /etc/rc.local 
	在文件的末尾增加下面的内容: 
	
		ulimit -SHn 65535/usr/local/webserver/php/sbin/php-fpm
 /usr/local/webserver/nginx/sbin/nginx
 
	保存退出后即可。 
	至此,所有的编译安装工作都结束。让我们启动php-fpm和Nginx来做测试吧!(MySQL在上面已经启动了)在控制台里面输入下面命令: 
	
		ulimit -SHn 65535/usr/local/webserver/php/sbin/php-fpm
 /usr/local/webserver/nginx/sbin/nginx
 
	即可启动php-fpm和nginx。 
	(十)各项服务的启动与停止
	1、MySQL: 
	
		启动:/etc/init.d/mysqld start停止:/etc/init.d/mysqld stop
 重启:/etc/init.d/mysqld restart
 
	2、php-fpm: 
	
		启动: /usr/local/webserver/php/sbin/php-fpm停止:killall php-fpm
 
	3、Nginx: 
	
		启动: /usr/local/webserver/nginx/sbin/nginx停止:killall nginx
 
	如果你有更多的Linux知识,可以考虑将php-fpm和Nginx的启动做成启动脚本放在/etc/init.d/下。 
	(十一)遇到的问题
	在我编译安装的时候,Nginx在启动之后报错: 
	
		[emerg] 1552#2780: could not build the server_names_hash, you should increase server_names_hash_bucket_size: 32 
	网上查了一下资料,这个错误表示无法构建server_names_hash,应该增加server_names_hash_bucket_size的值。 
	解决办法很简单,在Nginx的配置文件的“http {”这一节加上下面的内容即可: 
	
		server_names_hash_bucket_size 64; 
	至此,全部的安装和配置工作结束。 
	事实上,经过我几次实战,编译安装也不是什么深不可测的操作。只要耐心,以及按照步骤来操作,基本会一路顺畅的走下来。只是编译的过程会比较枯燥,机器配置不好要等很久,而且涉及到的命令也挺多。因为系统各种不同可能会碰到各种怪异的问题,需要有一定处理问题和查询问题解决方案的能力。 
	通过这次安装实践,我对Linux的了解会更深一些吧!(责任编辑:IT) |