之前自己一直用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中启用扩展。