之前自己一直用apt-get在Ubuntu上搭环境,实在是很方便,自动的解决了很多的依赖问题,可以说是真是很省心。用VPS的时候有时候也用比如EZHTTP这样的LAMP/LNMP一键安装包。不过老用这些方便的东西做自己就觉得有些问题,比如自己不能控制Apache、PHP、MySQL的安装位置,在需要进入这些软件的安装位置的时候,就得用dpkg -L来找到这些软件的安装位置。完全全自动的安装感觉自己也不能了解到更多的细节。
此外还有个很头疼的情况是Windows下对于一些软件的使用实在是很折腾,比如上个星期使用npm安装几个包,结果因为需要重新编译node,折腾了好长时间,各种花费时间成本,而在Linux下这些工作难度就会降低不少(相对的……)。在开发的时候经常需要部署代码到开发机上,然而在有跳板机的情况下,不能使用IDE直连开发环境,配Samba不知道是否可以,但是感觉上这样做不够安全。回家之后想要测点东西,开发机也难连上。最后还是决定在自己的PC上安装虚拟机的方式进行部署环境了。此外个人觉得在Linux下安装PHP扩展比在Win下安装方便好多,完全没有Win下那么的让人困惑。因为在自己工作中,目前只是需要一套LAMP的环境即可,发行版就用了自己用的比较多的Ubuntu。除了安装Apache、MySQL、PHP之外,还需要安装了memcached和Redis。
Apache、MySQL、PHP的安装过程基本上和自己接触过的一些Linux软件安装过程相似,都是
| 
					 1 2 3  | 
						configure make sudo make install  | 
					
这几个步骤,个人觉得关键的部分就在于configure这个地方。
安装顺序自己选择了Apache->MySQL->PHP->Redis->memcahced。这样选择原因是是PHP需要整合进Apache并且要对MySQL进行支持,所以首先安装好前面两者。整个安装过程还算便捷,其实安装过程中出现过各种依赖、错误,很多时候完全可以通过Google就能解决。
本次安装过程中安装的软件版本为:
- Apache 2.2.26
 - MySQL 5.5.35
 - PHP 5.4.24
 - Redis 2.8.6
 - Memcached 1.4.17
 - libevent 2.0.21
 - libmemcached 1.0.16
 - PHP Memcached extension 2.1.0
 
Apache
安装Apache时,在configure这一步的时候,因为想要尽量和生产环境一致,使用了
| 
					 1  | 
						cat $APACHE_PATH/build/config.nice  | 
					
来查看安装时配置,$APACHE_PATH为生产环境上实际的Apache安装位置。例如:
| 
					 1 2 3 4 5 6 7 8 9 10 11  | 
						➜  local  cat /usr/local/lamp/apache/build/config.nice #! /bin/sh # # Created by configure "./configure" \ "--prefix=/usr/local/lamp/apache" \ "--enable-so" \ "--enable-rewrite=shared" \ "--enable-mime=shared" \ "$@"  | 
					
上面的配置很少,实际配置项还是很多的,如果只用
| 
					 1  | 
						./configure --prefix=/usr/local/lamp/apache  | 
					
进行configure实际上也是能跑的,之后如果需要再安装其他模块,比如rewrite模块,可以通过apxs进行安装。
apxs安装模块rewrite
在Apache的源代码目录中下的modules/mappers中存在rewrite模块的源码,通过
| 
					 1 2  | 
						$APACHE_PATH/bin/apxs -c mod_rewrite.c sudo $APACHE_PATH/bin/apxs -i -a -n rewrite mod_rewrite.la  | 
					
其中-c选项表示编译,-i表示安装,-a表示在httpd中增加一句LoadModule语句,而增加的名称则通过-n的参数决定。
上述命令可以解释为编译modrewrite,之后安装,并在$APACHEPATH/conf/httpd.conf中增加
| 
					 1  | 
						LoadModule rewrite_module modules/mod_rewrite.so  | 
					
其中LoadModule语句中第一个参数由安装命令中的-n选项指定。之后重启apache即可测试是否能够正常使用该模块。
MySQL
MySQL的安装比Apache的安装过程稍微麻烦了一些,在配置的时候需要使用cmake而不是用一般软件都自带的configure。
| 
					 1 2 3 4 5 6  | 
						cmake -DCMAKE_INSTALL_PREFIX=/usr/local/lamp/mysql \       -DDEFAULT_CHARSET=utf8 \       -DDEFAULT_COLLATION=utf8_general_ci \       -DWITH_MYISAM_STORAGE_ENGINE=1 \       -DWITH_INNOBASE_STORAGE_ENGINE=1 \       -DMYSQL_DATADIR=/usr/local/lamp/mysql/data .  | 
					
上述命令主要指定了使用的目录以及默认的字符集以及校对(DEFAULT_COLLATION,关于校对问题,参见MySQL文档-字符集支持),同时开启了MyISAM和InnoDB存储引擎。之后就是熟悉的make && sudo make install过程。Ubuntu上需要先安装好libncurses5-dev。
好在MySQL的安装文档写得很详细,基本上按照文档中的操作方式就不会出岔子。
之后可以给mysql单独建立用户和用户组,例如均为mysql。之后将整个mysql的安装目录都更改所属人为建立的用户和用户组,同时还有复制标准配置文件并修改成自己的配置文件。这之后有一步非常关键的建立基本数据库的的操作:
| 
					 1 2 3  | 
						sudo sh $MYSQL_PATH/scripts/mysql_install_db.sh \         --basedir=$MYSQL_PATH --datadir=$MYSQL_PATH/data \         --user=mysql  | 
					
这一个操作使得数据库创建了基本的授权标,使得数据库可以开始使用。
由于使用mysql连接数据库需要使用套接字文件,文件的位置又是通过配置文件获取的,而且mysql读取配置文件的默认顺序为/etc/my.cnf>/etc/mysql/my.cnf>$MYSQL_PATH/etc/my.cnf>~/.my.cnf,所以需要在这些文件中指定套接字文件位置。例如配置成:
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18  | 
						[client] port            = 3306 socket          = /usr/local/lamp/mysql/data/mysql.sock # Here is entries for some specific programs # The following values assume you have at least 32M ram # This was formally known as [safe_mysqld]. Both versions are currently parsed. [mysqld_safe] socket          = /usr/local/lamp/mysql/data/mysql.sock nice            = 0 [mysqld] # # * Basic Settings # user            = mysql socket          = /usr/local/lamp/mysql/data/mysql.sock  | 
					
配置结束之后,可以通过mysql_safe脚本启动mysql:
| 
					 1 2 3 4 5 6 7 8  | 
						sudo mysqld_safe --defaults-file=$MYSQL_PATH/conf/mysql.conf \                  --basedir=$MYSQL_PATH/ \                  --datadir=$MYSQL_PATH/data/ \                  --plugin-dir=$MYSQL_PATH/lib/plugin \                  --user=mysql \                  --log-error=/var/lamp/log/mysql/mysql_error_log \                  --pid-file=$MYSQL_PATH/data/mysql.pid \                  --socket=$MYSQL_PATH/data/mysql.sock --port=3306 &  | 
					
在命令中指定了pid文件位置和socket文件的位置。socket文件的路径可以用于关闭mysql。
关闭mysql的操作可以使用mysqladmin进行:
| 
					 1  | 
						sudo mysqladmin --socket=$MYSQL_PATH/data/mysql.sock shutdown  | 
					
通过socket参数指定关闭哪一个mysql实例。
同样的,mysql工具也可以指定使用哪一个sock文件进行连接。
PHP
PHP安装过程中最让人头疼的就是那些依赖,好在还有apt-get,安装时一般将对应的依赖包安装即可(例如需要libpng,那么一般安装上libpng和libpng-dev即可,dev一般包含了头文件等),这里不再赘述。
PHP的configure参数也比较多,但是主要是指指定了需要开启的功能支持:
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23  | 
						./configure --prefix=/usr/local/lamp/php \             --with-apxs2=$APACHE_PATH/bin/apxs \             --with-mysql=$MYSQL_PATH \             --with-mysqli=$MYSQL_PATH/bin/mysql_config \             --with-zlib-dir \             --enable-mbstring=all \             --with-iconv-dir \             --enable-sockets \             --with-pear \             --enable-ftp \             --with-jpeg-dir \             --with-png-dir \             --with-freetype-dir \             --with-libxml-dir \             --with-xsl \             --with-mcrypt \             --with-pdo-mysql=$MYSQL_PATH \             --enable-pcntl \             --with-curl \             --enable-soap \             --enable-shmop \             --with-openssl \             --with-ldap  | 
					
参数本身也很清晰,在只阅读参数的情况下,大致可以确定需要安装的依赖库的名称。
但是依赖库中也需要注意,在Ubuntu下,实验得知对于curl的支持还需要安装libcurl4-gnutls-dev。参数中的–with-apxs2指定了Apache中的apxs的路径,这里用于生成mod_php5(即对应文件libphp5.so)模块(参见TIPI 第二章 用户代码的执行 » 第二节 SAPI概述 » Apache模块)。
由于使用的PC是联想的K29,使用的是Pentium B960 CPU,不能虚拟出64位主机,所以使用的是32位系统,这里就有一个安装了ldap之后对应的so文件找不到的问题,通过dpkg -L可以看到这些文件在/usr/lib/i386-linux-gnu/目录下,这里解决的方法是在/usr/lib中创建对应文件的软链。
| 
					 1 2 3 4 5 6 7  | 
						sudo ln -s /usr/lib/i386-linux-gnu/libldap_r.so /usr/lib/libldap.so sudo ln -sf /usr/lib/i386-linux-gnu/libldap_r.so /usr/lib/libldap.so sudo ln -sf /usr/lib/i386-linux-gnu/libldap_r-2.4.so.2.8.1 /usr/lib/libldap_r.so sudo ln -sf /usr/lib/i386-linux-gnu/libldap_r-2.4.so.2.8.1 /usr/lib/libldap_r-2.4.so.2 sudo ln -sf /usr/lib/i386-linux-gnu/libldap_r.a /usr/lib/libldap.a sudo ln -sf /usr/lib/i386-linux-gnu/libldap_r.a /usr/lib/libldap-2.4.so.2 sudo ln -sf /usr/lib/i386-linux-gnu/libldap_r-2.4.so.2 /usr/lib/libldap-2.4.so.2  | 
					
make过程中,编译ldap相关的代码时出现了一个liblber.so could not read symbols的问题,通过修改configure完成之后Makefile中的EXTRA_LIBS参数,增加-llber字段,这个问题得以解决。
安装完成之后需要设定php.ini文件配置PHP的运行属性,其中一些在编译过程中没有添加的支持,例如gd库,可以通过扩展的方式进行安装。
最后还要设定php文件需要通过执行才能显示,否则请求php就会显示具体代码了……
| 
					 1 2 3 4 5 6  | 
						<IfModule mime_module>     TypesConfig conf/mime.types     AddType application/x-compress .Z     AddType application/x-gzip .gz .tgz     AddType application/x-httpd-php .php </IfModule>  | 
					
Redis
Redis的安装非常方便,只需要进行configure && make即可,完成安装之后需要的是将src目录下编译完成的
- redis-benchmark
 - redis-check-aof
 - redis-check-dump
 - redis-cli
 - redis-server
 
复制到需要安装的目录,同时设定配置文件,位置随意,之后用redis-server启动服务:
| 
					 1  | 
						sudo $REDIS_PATH/bin/redis-server $REDIS_PATH/conf/redis_7890.conf  | 
					
配置项中需要将redis作为daemon方式执行,即在配置项目中将daemonize配置设定为yes。
Memcached
Memcached的安装需要已安装libevent,之后在configure时加入libevent目录路径:
| 
					 1  | 
						./configure --prefix=/usr/local/srv/memcached --with-libevent=/usr/lib/libevent  | 
					
Memcached的启动参数中的-u选项值得注意,如果使用PHP操作Memcached,当用户为www时,需要将-u也设定为www,才可以进行读写。
| 
					 1  | 
						sudo /usr/local/srv/memcached/bin/memcached -d -u www -m 256 -P /var/srv/memcached.pid  | 
					
其中-d以daemon方式运行,-m表示可以使用内存的MB数目,-P即pid文件的位置。
PHP的Memcached扩展
这一个扩展的安装比较麻烦,首先需要需要安装libmemcached,而libmemcached的安装需要注意版本,实验中必须安装1.0以上版本才能成功的编译PHP的Memcached扩展,并且需要通过apt-get安装libcloog-ppl0。在:
| 
					 1  | 
						./configure  --prefix=/usr/local/libmemcached --with-memcached  | 
					
之后编译安装libmemcached。
在编译安装完libmemcached之后,在PHP的Memcached扩展的代码顶级目录下,执行:
| 
					 1 2 3 4 5 6  | 
						phpize ./configure --enable-memcached \             --with-php-config=$PHP_PATH/bin/php-config \             --with-libmemcached-dir=/usr/local/libmemcached make sudo make install  | 
					
完成PHP的Memcached扩展的安装,同时在php.ini中启用扩展。