前面介绍了nginx和memcached的工作机制,接下来我们主要配置下LNMP的编译安装以及将Memcached整合到LNMP中(基于Red Hat Enterprise Linux Server release 5.8)
一、安装Nginx:
 
1、解决依赖关系
编译安装nginx需要事先需要安装开发包组"Development Tools"和 "Development Libraries"。同时,还需要专门安装pcre-devel包:

  1. # yum -y install pcre-devel 
  2. # yum -y groupinstall "group_name"
2、安装
首先添加用户nginx,实现以之运行nginx服务进程:

  1. # groupadd -r nginx 
  2. # useradd -r -g nginx nginx 
接着开始编译和安装:nginx-1.2.3.tar.gz下载路径:ftp://172.16.0.1/pub/Sources/nginx 

  1. # tar xvf nginx-1.2.3.tar.gz 
  2. # cd nginx-1.2.3 
  3. #  ./configure \ 
  4.   --prefix=/usr \ 
  5.   --sbin-path=/usr/sbin/nginx \ 
  6.   --conf-path=/etc/nginx/nginx.conf \ 
  7.   --error-log-path=/var/log/nginx/error.log \ 
  8.   --http-log-path=/var/log/nginx/access.log \ 
  9.   --pid-path=/var/run/nginx/nginx.pid  \ 
  10.   --lock-path=/var/lock/nginx.lock \ 
  11.   --user=nginx \ 
  12.   --group=nginx \ 
  13.   --with-http_ssl_module \ 
  14.   --with-http_flv_module \ 
  15.   --with-http_stub_status_module \ 
  16.   --with-http_gzip_static_module \ 
  17.   --http-client-body-temp-path=/var/tmp/nginx/client/ \ 
  18.   --http-proxy-temp-path=/var/tmp/nginx/proxy/ \ 
  19.   --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \ 
  20.   --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \ 
  21.   --http-scgi-temp-path=/var/tmp/nginx/scgi \ 
  22.   --with-pcre 
  23. # make && make install 
说明:如果想使用nginx的perl模块,可以通过为configure脚本添加--with-http_perl_module选项来实现,但目前此模块仍处于实验性使用阶段,可能会在运行中出现意外,因此,其实现方式这里不再介绍。如果想使用基于nginx的cgi功能,也可以基于FCGI来实现,具体实现方法请参照网上的文档。
 
3、为nginx提供SysV init脚本:(仅作参考)
新建文件/etc/rc.d/init.d/nginx,内容如下:

  1. #!/bin/sh 
  2. # nginx - this script starts and stops the nginx daemon 
  3. # chkconfig:   - 85 15  
  4. # description:  Nginx is an HTTP(S) server, HTTP(S) reverse \ 
  5. #               proxy and IMAP/POP3 proxy server 
  6. # processname: nginx 
  7. # config:      /etc/nginx/nginx.conf 
  8. # config:      /etc/sysconfig/nginx 
  9. # pidfile:     /var/run/nginx.pid 
  10.   
  11. # Source function library. 
  12. . /etc/rc.d/init.d/functions 
  13.   
  14. # Source networking configuration. 
  15. . /etc/sysconfig/network 
  16.   
  17. # Check that networking is up. 
  18. [ "$NETWORKING" = "no" ] && exit 0 
  19.   
  20. nginx="/usr/sbin/nginx" 
  21. prog=$(basename $nginx) 
  22.   
  23. NGINX_CONF_FILE="/etc/nginx/nginx.conf" 
  24.   
  25. [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx 
  26.   
  27. lockfile=/var/lock/subsys/nginx 
  28.   
  29. make_dirs() { 
  30.    # make required directories 
  31.    user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -` 
  32.    options=`$nginx -V 2>&1 | grep 'configure arguments:'` 
  33.    for opt in $options; do 
  34.        if [ `echo $opt | grep '.*-temp-path'` ]; then 
  35.            value=`echo $opt | cut -d "=" -f 2` 
  36.            if [ ! -d "$value" ]; then 
  37.                # echo "creating" $value 
  38.                mkdir -p $value && chown -R $user $value 
  39.            fi 
  40.        fi 
  41.    done 
  42.   
  43. start() { 
  44.     [ -x $nginx ] || exit 5 
  45.     [ -f $NGINX_CONF_FILE ] || exit 6 
  46.     make_dirs 
  47.     echo -n $"Starting $prog: " 
  48.     daemon $nginx -c $NGINX_CONF_FILE 
  49.     retval=$? 
  50.     echo 
  51.     [ $retval -eq 0 ] && touch $lockfile 
  52.     return $retval 
  53.   
  54. stop() { 
  55.     echo -n $"Stopping $prog: " 
  56.     killproc $prog -QUIT 
  57.     retval=$? 
  58.     echo 
  59.     [ $retval -eq 0 ] && rm -f $lockfile 
  60.     return $retval 
  61.   
  62. restart() { 
  63.     configtest || return $? 
  64.     stop 
  65.     sleep 1 
  66.     start 
  67.   
  68. reload() { 
  69.     configtest || return $? 
  70.     echo -n $"Reloading $prog: " 
  71.     killproc $nginx -HUP 
  72.     RETVAL=$? 
  73.     echo 
  74.   
  75. force_reload() { 
  76.     restart 
  77.   
  78. configtest() { 
  79.   $nginx -t -c $NGINX_CONF_FILE 
  80.   
  81. rh_status() { 
  82.     status $prog 
  83.   
  84. rh_status_q() { 
  85.     rh_status >/dev/null 2>&1 
  86.   
  87. case "$1" in 
  88.     start) 
  89.         rh_status_q && exit 0 
  90.         $1 
  91.         ;; 
  92.     stop) 
  93.         rh_status_q || exit 0 
  94.         $1 
  95.         ;; 
  96.     restart|configtest) 
  97.         $1 
  98.         ;; 
  99.     reload) 
  100.         rh_status_q || exit 7 
  101.         $1 
  102.         ;; 
  103.     force-reload) 
  104.         force_reload 
  105.         ;; 
  106.     status) 
  107.         rh_status 
  108.         ;; 
  109.     condrestart|try-restart) 
  110.         rh_status_q || exit 0 
  111.             ;; 
  112.     *) 
  113.         echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" 
  114.         exit 2 
  115. esac 
而后为此脚本赋予执行权限:

  1. # chmod +x /etc/rc.d/init.d/nginx 
添加至服务管理列表,并让其开机自动启动:

  1. # chkconfig --add nginx 
  2. # chkconfig nginx on 
而后就可以启动服务并测试了(这一步要保证你的httpd没有在运行):

  1. # service nginx start 
二、安装mysql-5.5.28
 
1、准备数据存放的文件系统
新建一个逻辑卷,并将其挂载至特定目录即可。(这里不再给出过程)
假设其逻辑卷的挂载目录为/data,而后需要创建/data/mydata目录做为mysql数据的存放目录。
 
2、新建用户以安全方式运行进程:

  1. # groupadd -r mysql 
  2. # useradd -g mysql -r -s /sbin/nologin -M -d /data/mydata mysql 
  3. # chown -R mysql:mysql /data/mydata 
3、安装并初始化mysql-5.5.28
首先下载平台对应的mysql版本至本地,这里是32位平台,因此,选择的为mysql-5.5.28-linux2.6-i686.tar.gz,其下载位置为ftp://172.16.0.1/pub/Sources/mysql-5.5。

  1. # tar xf mysql-5.5.28-linux2.6-i686.tar.gz -C /usr/local 
  2. # cd /usr/local/ 
  3. # ln -sv mysql-5.5.28-linux2.6-i686  mysql 
  4. # cd mysql  
  5.  
  6. # chown -R :mysql  . 
  7. # scripts/mysql_install_db --user=mysql --datadir=/mydata/data 
4、为mysql提供主配置文件:

  1. # cd /usr/local/mysql 
  2. # cp support-files/my-large.cnf  /etc/my.cnf 
并修改此文件中thread_concurrency的值为你的CPU个数乘以2,比如这里使用如下行:

  1. thread_concurrency = 2 
  2. datadir = /data/mydata  #指定文件存放的位置
5、为mysql提供sysv服务脚本:

  1. # cd /usr/local/mysql 
  2. # cp support-files/mysql.server  /etc/rc.d/init.d/mysqld 
添加至服务列表:

  1. # chkconfig --add mysqld 
  2. # chkconfig mysqld on 
为了使用mysql的安装符合系统使用规范,并将其开发组件导出给系统使用,这里还需要进行如下步骤:
6、输出mysql的man手册至man命令的查找路径:
编辑/etc/man.config,添加如下行即可:

  1. MANPATH  /usr/local/mysql/man 
7、输出mysql的头文件至系统头文件路径/usr/include:
这可以通过简单的创建链接实现:

  1. # ln -sv /usr/local/mysql/include  /usr/include/mysql 
8、输出mysql的库文件给系统库查找路径:

  1. # echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf 
而后让系统重新载入系统库:

  1. # ldconfig -v 
9、修改PATH环境变量,让系统可以直接使用mysql的相关命令。

  1. vim /etc/profile.d/mysql.sh 
  2. # /usr/local/mysql/bin 
10、之后便可以启动服务并测试了。
 
三、编译安装php-5.4.4
 
1、解决依赖关系:
请配置好yum源(可以是本地系统光盘)后执行如下命令:

  1. # yum -y groupinstall "X Software Development"  
如果想让编译的php支持mcrypt、mhash扩展和libevent,此处还需要下载ftp://172.16.0.1/pub/Sources/ngnix目录中的如下几个rpm包并安装之:

  1. libmcrypt-2.5.7-5.el5.i386.rpm 
  2. libmcrypt-devel-2.5.7-5.el5.i386.rpm  
  3. mhash-0.9.2-6.el5.i386.rpm  
  4. mhash-devel-0.9.2-6.el5.i386.rpm  
  5. mcrypt-2.6.8-1.el5.i386.rpm  
最好使用升级的方式安装上面的rpm包,命令格式如下:
# rpm -Uvh 
 
另外,也可以根据需要安装libevent,系统一般会自带libevent,但版本有些低。因此可以升级安装之,它包含如下两个rpm包。下载路径ftp://172.16.0.1/pub/Sources/memcached

  1. libevent-2.0.17-2.i386.rpm 
  2. libevent-devel-2.0.17-2.i386.rpm 
安装这两个包时,它可能会依赖于其他包的,所以可以用yum -y install 命令来安装
 
说明:libevent是一个异步事件通知库文件,其API提供了在某文件描述上发生某事件时或其超时时执行回调函数的机制,它主要用来替换事件驱动的网络服务器上的event loop机制。目前来说, libevent支持/dev/poll、kqueue、select、poll、epoll及Solaris的event ports。
 
2、编译安装php-5.4.8
首先下载源码包至本地目录,下载位置ftp://172.16.0.1/pub/Sources/new_lamp。

  1. # tar xf php-5.4.8.tar.bz2 
  2. # cd php-5.4.8 
  3. #  ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-openssl --enable-fpm --enable-sockets --enable-sysvshm  --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib-dir --with-libxml-dir=/usr --enable-xml  --with-mhash --with-mcrypt  --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 --with-curl  
说明:如果前面第1步解决依赖关系时安装mcrypt相关的两个rpm包,此./configure命令还可以带上--with-mcrypt选项以让php支持mycrpt扩展。--with-snmp选项则用于实现php的SNMP扩展,但此功能要求提前安装net-snmp相关软件包。

  1. make && make install 
为php提供配置文件:

  1. # cp php.ini-production /etc/php.ini 
为php-fpm提供Sysv init脚本,并将其添加至服务列表:

  1. # cp sapi/fpm/init.d.php-fpm  /etc/rc.d/init.d/php-fpm 
  2. # chmod +x /etc/rc.d/init.d/php-fpm 
  3. # chkconfig --add php-fpm 
  4. # chkconfig php-fpm on 
为php-fpm提供配置文件:

  1. # cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf  
编辑php-fpm的配置文件:
# vim /usr/local/php/etc/php-fpm.conf
配置fpm的相关选项为你所需要的值,并启用pid文件(如下最后一行):

  1. pm.max_children = 50 
  2. pm.start_servers = 5 
  3. pm.min_spare_servers = 2 
  4. pm.max_spare_servers = 8 
  5. pid = /usr/local/php/var/run/php-fpm.pid  
说明:以上数值可以根据实际需要进行调整
接下来就可以启动php-fpm了:

  1. # service php-fpm start 
使用如下命令来验正(如果此命令输出有中几个php-fpm进程就说明启动成功了):

  1. # ps aux | grep php-fpm 
 
四、整合nginx和php
 
1、编辑/etc/nginx/nginx.conf,启用如下选项:

  1. location ~ \.php$ { 
  2.             root           html; 
  3.             fastcgi_pass   127.0.0.1:9000; 
  4.             fastcgi_index  index.php; 
  5.             fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name; 
  6.             include        fastcgi_params; 
  7.         } 
2、编辑/etc/nginx/fastcgi_params,将其内容更改为如下内容(可以将已经存在的文件更名保存,然后重新添加新的文件):

  1. fastcgi_param  GATEWAY_INTERFACE  CGI/1.1; 
  2. fastcgi_param  SERVER_SOFTWARE    nginx; 
  3. fastcgi_param  QUERY_STRING       $query_string; 
  4. fastcgi_param  REQUEST_METHOD     $request_method; 
  5. fastcgi_param  CONTENT_TYPE       $content_type; 
  6. fastcgi_param  CONTENT_LENGTH     $content_length; 
  7. fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name; 
  8. fastcgi_param  SCRIPT_NAME        $fastcgi_script_name; 
  9. fastcgi_param  REQUEST_URI        $request_uri; 
  10. fastcgi_param  DOCUMENT_URI       $document_uri; 
  11. fastcgi_param  DOCUMENT_ROOT      $document_root; 
  12. fastcgi_param  SERVER_PROTOCOL    $server_protocol; 
  13. fastcgi_param  REMOTE_ADDR        $remote_addr; 
  14. fastcgi_param  REMOTE_PORT        $remote_port; 
  15. fastcgi_param  SERVER_ADDR        $server_addr; 
  16. fastcgi_param  SERVER_PORT        $server_port; 
  17. fastcgi_param  SERVER_NAME        $server_name; 
并在所支持的主页面格式中添加php格式的主页,类似如下:(这个直接添加上index.php 即可)

  1. location / { 
  2.             root   html; 
  3.             index  index.php index.html index.htm; 
  4.         }       
而后重新载入nginx的配置文件:

  1. # service nginx reload | restart 
3、在/usr/html新建index.php的测试页面,测试php是否能正常工作:

  1. # vim /usr/html/index.php 
  2. <?php 
  3. phpinfo(); 
  4. ?> 
接着就可以通过浏览器访问此测试页面了。

 
五、下面为加速请求过程安装缓存:Memcached
 
Memcached依赖于libevent API,因此要事先安装,我们刚刚已经安装过了,所以这块可以不用再重新安装,如果你想要安装更新版本,可以到ftp://pub/Sources/memcached/下载libevent-2.0.16-stable.tar.gz进行编译安装
我们这里给大家演示下编译安装的过程:

  1. # tar xf libevent-2.0.20-stable.tar.gz 
  2. # cd libevent-2.0.20-stable 
  3. # ./configure --prefix=/usr/local/libevent 
  4. # make && make install 
  5.  
  6. # echo "/usr/local/libevent/lib" > /etc/ld.so.conf.d/libevent.conf 
  7. # ldconfig -v 
2、安装配置memcached
 
1)安装memcached

  1. # tar xf memcached-1.4.15.tar.gz  
  2. # cd memcached-1.4.15 
  3. # ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent 
  4.  
  5. # make && make install 
2)memcached SysV的startup脚本代码如下所示,将其建立为/etc/rc.d/init.d/memcached文件:

  1. #!/bin/bash 
  2. # Init file for memcached 
  3. # chkconfig: - 86 14 
  4. # description: Distributed memory caching daemon 
  5. # processname: memcached 
  6. # config: /etc/sysconfig/memcached 
  7.  
  8. . /etc/rc.d/init.d/functions 
  9.  
  10. ## Default variables 
  11. PORT="11211" 
  12. USER="nobody" 
  13. MAXCONN="1024" 
  14. CACHESIZE="64" 
  15. OPTIONS="" 
  16.  
  17. RETVAL=0 
  18. prog="/usr/local/memcached/bin/memcached" 
  19. desc="Distributed memory caching" 
  20. lockfile="/var/lock/subsys/memcached" 
  21.  
  22. start() { 
  23.         echo -n $"Starting $desc (memcached): " 
  24.         daemon $prog -d -p $PORT -u $USER -c $MAXCONN -m $CACHESIZE $OPTIONS 
  25.         RETVAL=$? 
  26.         echo 
  27.         [ $RETVAL -eq 0 ] && touch $lockfile 
  28.         return $RETVAL 
  29.  
  30. stop() { 
  31.         echo -n $"Shutting down $desc (memcached): " 
  32.         killproc $prog 
  33.         RETVAL=$? 
  34.         echo 
  35.         [ $RETVAL -eq 0 ] && rm -f $lockfile 
  36.         return $RETVAL 
  37.  
  38. restart() { 
  39.         stop 
  40.         start 
  41.  
  42. reload() { 
  43.         echo -n $"Reloading $desc ($prog): " 
  44.         killproc $prog -HUP 
  45.         RETVAL=$? 
  46.         echo 
  47.         return $RETVAL 
  48.  
  49. case "$1" in 
  50.   start) 
  51.         start 
  52.         ;; 
  53.   stop) 
  54.         stop 
  55.         ;; 
  56.   restart) 
  57.         restart 
  58.         ;; 
  59.   condrestart) 
  60.         [ -e $lockfile ] && restart 
  61.         RETVAL=$? 
  62.         ;;        
  63.   reload) 
  64.         reload 
  65.         ;; 
  66.   status) 
  67.         status $prog 
  68.         RETVAL=$? 
  69.         ;; 
  70.    *) 
  71.         echo $"Usage: $0 {start|stop|restart|condrestart|status}" 
  72.         RETVAL=1 
  73. esac 
  74.  
  75. exit $RETVAL 
使用如下命令配置memcached成为系统服务:

  1. # chmod +x /etc/init.d/memcached 
  2. # chkconfig --add memcached 
  3. # service memcached start 
3)使用telnet命令测试memcached的使用
Memcached提供一组基本命令用于基于命令行调用其服务或查看服务器状态等。
eg:

  1. [[email protected] ~]# telnet 127.0.0.1 11211 
  2. Trying 127.0.0.1... 
  3. Connected to localhost.localdomain (127.0.0.1). 
  4. Escape character is '^]'. 
  5. set key 0 60 3 
  6. abd 
  7. STORED 
  8. get key 
  9. VALUE key 0 3 
  10. abd 
  11. END
关于Memcached的命令还有很多,下面会给大家附上一份有关其命令的文件。
 
六、安装Memcache的PHP扩展
 
1、安装PHP的memcache扩展

  1. # tar xf memcache-2.2.5.tgz 
  2. # cd memcache-2.2.5 
  3. /usr/local/php/bin/phpize 
  4. # ./configure --with-php-config=/usr/local/php/bin/php-config --enable-memcache 
  5. # make && make install 
上述安装完后会有类似以下的提示:
Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/
 
2、编辑/etc/php.ini,在“扩展模块”相关的位置如(; extension_dir = "ext")类似的行下添加如下一行来载入memcache扩展:

  1. extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/memcache.so 
重启服务,而后对memcached功能进行测试
 
3、安装Memcached管理与监控工具memadmin-master.zip

  1. unzip memadmin-master.zip  
  2. cd memadmin-master 
  3. mv * /usr/html/ 
刷新所访问页面,会出现如下管理网页:

默认用户名和密码是admin,你可以在配置文件/usr/html/config.php 中进行修改,登陆进去:

点击开始管理,就可以进入后台对服务器进行监控了。。

七、使用libmemcached的客户端工具:
 
访问memcached的传统方法是使用基于perl语言开发的Cache::memcached模块,这个模块在大多数perl代码中都能良好的工作,但也有着众所周知的性能方面的问题。libMemcached则是基于C语言开发的开源的C/C++代码访问memcached的库文件,同时,它还提供了数个可以远程使用的memcached管理工具,如memcat, memping,memstat,memslap等。
 
1) 编译安装libmemcached

  1. # tar xf libmemcached-1.0.2.tar.gz  
  2. # cd libmemcached-1.0.2 
  3. # ./configure  
  4. # make && make install 
  5. # ldconfig -v 
接下来就可以在命令行里调用服务或查看服务状态了
2) 在/usr/local/bin下有一系列客户端工具,可以直接使用了
例如:

  1. [[email protected] ~]# memping --server=127.0.0.1:11211 
  2. [[email protected] ~]# memstat --server=127.0.0.1:11211 
  3. Server: 127.0.0.1 (11211) 
  4.      pid: 29198 
  5.      uptime: 3660 
  6.      time: 1352786258 
  7.      version: 1.4.15 
  8.      libevent: 2.0.20-stable 
  9.      pointer_size: 32 
  10.      rusage_user: 0.003999 
  11.      rusage_system: 0.037994 
  12.      curr_connections: 10 
  13.      ……………………………… 
 
八、Nginx整合memcached:
 

  1. vim /etc/nginx/nginx.conf 
  2. server { 
  3.         listen       80; 
  4.         server_name  www.magedu.com; 
  5.  
  6.         #charset koi8-r; 
  7.  
  8.         #access_log  logs/host.access.log  main; 
  9.  
  10.         location / { 
  11.                 set $memcached_key $uri; 
  12.                 memcached_pass     127.0.0.1:11211; 
  13.                 default_type       text/html; 
  14.                 error_page         404 @fallback; 
  15.         } 
  16.  
  17.         location @fallback { 
  18.                 proxy_pass http://172.16.0.1; 
  19.         } 
 
 ok,到这里LNMP编译安装以及memcached缓存系统的安装就告一段落了,动手尝试一下~~