源码编译nginx-1.2构建LNMP

先介绍下Nginx: Nginx的代码是由一个核心和一系列的模块组成, 核心主要用于提供Web Server的基本功能,以及Web和Mail反向代理的功能;还用于启用网络协议,创建必要的运行时环境以及确保不同的模块之间平滑地进行交互。不过,大多跟协议相关的功能和某应用特有的功能都是由nginx的模块实现的.

在nginx内部,进程间的通信是通过模块的pipeline或chain实现的;换句话说,每一个功能或操作都由一个模块来实现。例如,压缩、通过FastCGI或uwsgi协议与upstream服务器通信,以及与memcached建立会话等。
 
此次实现基于redhat 5.8,软件 nginx-1.2.2.tar.gz,mysql-5.5.24-linux2.6-i686.tar.gz, php-5.4.4.tar.bz2。(mysql不需要编译,直接解压并初始化就可以用)
 
实验步骤:
一,源码编译Nginx:
1,编译软件有两个开发包不能""Development Tools"和 "Development Libraries",由于php还依赖于" X Software Development",因此先将这三个包安装包
2,添加用户与组为nginx,运行nginx这个进程的用户为nginx。

  1. useradd -r -M -s /sbin/nologin nginx 
3,解压nginx后,cd到nginx目录中开始编译

  1. ./configure \    
  2.  --prefix=/usr/local/lnmp \    
  3.  --sbin-path=/usr/sbin/nginx \    
  4.  --conf-path=/etc/nginx/nginx.conf \    
  5.  --error-log-path=/var/log/nginx/error.log \    
  6.  --http-log-path=/var/log/nginx/access.log \    
  7.  --pid-path=/var/run/nginx/nginx.pid  \    
  8.  --lock-path=/var/lock/nginx.lock \    
  9.  --user=nginx \    
  10.  --group=nginx \    
  11.  --with-http_ssl_module \ 启用ssl的加密   
  12.  --with-http_flv_module \  启用flv模块   
  13.  --with-http_stub_status_module \ 启用监控nginx运行状态的模块   
  14.  --with-http_gzip_static_module \    
  15.  --http-client-body-temp-path=/var/tmp/nginx/client/ \    
  16.  --http-proxy-temp-path=/var/tmp/nginx/proxy/ \    
  17.  --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \    
  18.  --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \    
  19.  --http-scgi-temp-path=/var/tmp/nginx/scgi \    
  20.  --with-pcre 启用http-rewrite   
这此编译会出错,因为没有安装pcre-devel包,错误如下:

  1. ./configure: error: the HTTP rewrite module requires the PCRE library. 
  2. You can either disable the module by using --without-http_rewrite_module 
  3. option, or install the PCRE library into the system, or build the PCRE library 
  4. statically from the source with nginx by using --with-pcre=<path> option. 
解决办法很简单,需要安装pere-devel。下载perc-devel的rpm包或源码都都可以我使用

  1. yum -y install pcre-devel 
 然后再编译就就不会出错了。成功之后make && make install
  为nginx提供一个脚本, vim /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. [root@server30 ~]# vim /etc/rc.d/init.d/nginx 
  2. [root@server30 ~]# chmod +x /etc/rc.d/init.d/nginx  
  3. [root@server30 ~]# chkconfig --add nginx 
  4. [root@server30 ~]# chkconfig nginx on 
  5. [root@server30 ~]# service nginx start 
 在浏览器中输入自己主机的ip地址,如果出现welcome to nginx,则到此nginx安装已成功。
二,(1)编译mysql,先创建mysql用户,并将数据存储在lvm的分区中。并挂载

  1. [root@server30 ~]# useradd -r -s /sbin/nologin mysql   
  2. [root@server30 ~]# tar xf mysql-5.5.24-linux2.6-i686.tar.gz -C /usr/local/lamp/   
  3. [root@server30 ~]# ln -s /usr/local/lamp/mysql-5.5.24-linux2.6-i686/ /usr/local/mysql   
  4. [root@server30 ~]# fdisk /dev/sda   
  5. [root@server30 ~]# partprobe /dev/sda   
  6. [root@server30 ~]# pvcreate /dev/sda5   
  7. Writing physical volume data to disk "/dev/sda5"   
  8. Physical volume "/dev/sda5" successfully created   
  9. [root@server30 ~]# vgcreate myvg /dev/sda5   
  10. Volume group "myvg" successfully created   
  11. [root@server30 ~]# lvcreate -L 5G -n mydata myvg   
  12. Logical volume "mydata" created   
  13. [root@server30 ~]# mke2fs -j -L MYDATA /dev/myvg/mydata   
  14. [root@server30 ~]# mkdir /data  
  15. [root@server30 ~]# vim /etc/fstab   
  16. [root@server30 ~]# mount -a  
  17. [root@server30 mysql]# mkdir /data/mysql 
  18. [root@server30 mysql]# chown -R mysql:mysql /data/mysql/ 

(2)初始化mysql,指定运行mysql的用户,与数据存储的位置


  1. [root@server30 mysql]# scripts/mysql_install_db --user=mysql --datadir=/data/mysql/ 

(3)为mysql提供配置文件,并修改其中的参数,/etc/my.cnf

thread_concurrency = 4 将原来的8修改成4。

datadir = /data/mysql 并添加这一行


  1. [root@server30 mysql]# cp support-files/my-large.cnf  /etc/my.cnf 
  2. [root@server30 mysql]# vim /etc/my.cnf  

(4)为mysql提供sysv服务脚本。


  1. [root@server30 mysql]# cp support-files/mysql.server  /etc/rc.d/init.d/mysqld 
  2. [root@server30 mysql]# chkconfig --add mysqld  
  3. [root@server30 mysql]# chkconfig mysqld on 
  4. [root@server30 mysql]# service mysqld start 

(5)为mysql提供man文档编辑/etc/man.config,添加一行

MANPATH=/usr/local/mysql/man

(6)输出mysql的头文件至系统头文件路径/usr/include


  1. [root@server30 ~]# ln -sv /usr/local/mysql/include/ /usr/include/mysql 

(6)输出mysql的库文件给系统库查找路径:


  1. [root@server30 ~]# echo '/usr/local/mysql/lib/' > /etc/ld.so.conf.d/mysql.conf 
  2. [root@server30 ~]# ldconfig  (通知系统更新库文件)

 (7)修改PATH环境变量,让系统可以直接使用mysql的相关命令。编辑/etc/profile,添加一行PATH=/usr/local/mysql/bin:$PATH

并执行export PATH=/usr/local/mysql/bin:$PATH

到此mysql安装完。

三,(1)编译安装php,如果想让php支持加密需要安装mcrypt,则mcrpyt由libmcrypt-2.5.7-5.el5.i386.rpm,libmcrypt-devel-2.5.7-5.el5.i386.rpm提供库。因此安装需要先安装这三个rpm包,启用mhash编码安装mhash-0.9.2-6.el5.i386.rpm ,mhash-devel-0.9.2-6.el5.i386.rpm.启用libevent,需要安装libevent-2.0.17-2.i386.rpmlibevent-devel-2.0.17-2.i386.rpm。


  1. [root@server30 ~]# rpm -ivh libmcrypt-*   
  2. [root@server30 ~]# rpm -ivh mhash-*  
  3. [root@server30 ~]# rpm -ivh mcrypt-2.6.8-1.el5.i386.rpm   
  4. [root@server30 ~]# rpm -ivh libevent-2.0.17-2.i386.rpm   
  5. [root@server30 ~]# rpm -ivh libevent-devel-2.0.17-2.i386.rpm   
  6. [root@server30 php-5.4.4]#./configure --prefix=/usr/local/lamp/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
  7. [root@server30 php-5.4.4]# make && make intall 

 (2)为php提供配置文件


  1. [root@server30 php-5.4.4]# cp php.ini-production /etc/php.ini 

(3)为php-fpm提供脚本,并将其添加到服务列表:


  1. [root@server30 php-5.4.4]# cp php.ini-production /etc/php.ini 
  2. [root@server30 php-5.4.4]# cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm 
  3. [root@server30 php-5.4.4]# chmod +x /etc/rc.d/init.d/php-fpm  
  4. [root@server30 php-5.4.4]# chkconfig --add php-fpm 
  5. [root@server30 php-5.4.4]# chkconfig php-fpm on 

(4)为php-fpm提供配置文件:


  1. [root@server30 php-5.4.4]# cp /usr/local/lamp/php/etc/php-fpm.conf.default /usr/local/lamp/php/etc/php-fpm.conf 

 (5)编辑php-fpm的配置文件:

# vim /usr/local/php/etc/php-fpm.conf

配置pm.的相关选项为你所需要的值,并启用pid文件


  1. pid = /usr/local/php/var/run/php-fpm.pid (启用pid文件,这个路径在php-fpm脚本中定义了,这一行需要启用) 
  2. pm.max_children = 50 (最大子进程)
  3. pm.start_servers = 10 (刚启动时启动多少个进程)
  4. pm.min_spare_servers = 5 (最小空闲进程)
  5. pm.max_spare_servers = 10 (最多空闲进程)

(6)接下来就可以启动php-fpm了:


  1. [root@server30 php-5.4.4]# service php-fpm start 
  2. Starting php-fpm . done 

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


  1. [root@server30 php-5.4.4]# ps aux |grep php-fpm 
  2. root     10934  0.0  0.5  33848  2784 ?        Ss   20:38   0:00 php-fpm: master process (/usr/local/lamp/php/etc/php-fpm.co 
 

四,整合nginx和php5

(1)编辑/etc/nginx/nginx.conf,启用如下选项:


  1.  location / { 
  2.         root   html; 
  3.        index index.php index.html index.htm; (添加index.php格式的网页)
  4.         } 
  5. location ~ \.php$ {  
  6.     root           html;  
  7.     fastcgi_pass   127.0.0.1:9000; (php与nginx安装在同一台主机,因此监听的IP为本机) 
  8.     fastcgi_index  index.php;  
  9.     fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;  
  10.     include        fastcgi_params;(fastcgi_param的参数)  
  11. }  

(3)编辑/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; 

重新载入nginx的配置文件:


  1. [root@server30 php-5.4.4]# service nginx reload 

(4)在/usr/local/lamp/html/新建index.php的测试页面,测试php是否能正常工作。


  1. <?php 
  2. phpinfo(); 
  3. ?> 

 重新载入nginx的配置文件,并在浏览器中输入ip,能不能正常访问。

五、安装xcache,为php加速:

1、安装


  1. [root@server30 ~]# tar xcache-2.0.0.tar.bz2  
  2. tar: Old option `b' requires an argument. 
  3. Try `tar --help' or `tar --usage' for more information. 
  4. [root@server30 ~]# tar xf  xcache-2.0.0.tar.bz2  
  5. [root@server30 ~]# cd xcache-2.0.0    
  6. [root@server30 xcache-2.0.0]# /usr/local/lamp/php/bin/phpize  
  7. Configuring for: 
  8. PHP Api Version:         20100412 
  9. Zend Module Api No:      20100525 
  10. Zend Extension Api No:   220100525 
  11. [root@server30 xcache-2.0.0]# ./configure --enable-xcache --with-php-config=/usr/local/lamp/php/bin/php-config  


  1. [root@server30 xcache-2.0.0]# make 
  2. [root@server30 xcache-2.0.0]# make install 
  3. Installing shared extensions:     /usr/local/lamp/php/lib/php/extensions/no-debug-non-zts-20100525/
  4. 这个路径很重要,需要将此路径添加到xcache.ini中 

2、编辑php.ini,整合php和xcache:

首先将xcache提供的样例配置导入php.ini


  1. [root@server30 xcache-2.0.0]# mkdir -pv /etc/php.d (此目录在编译php已经指定了)
  2. mkdir: created directory `/etc/php.d' 
  3. [root@server30 xcache-2.0.0]# cp xcache.ini /etc/php.d/ 
  4. [root@server30 xcache-2.0.0]# vim /etc/php.d/xcache.ini 
  5. 在xcache.ini中修改原来的zend_extension的路径 
  6. zend_extension =/usr/local/lamp/php/lib/php/extensions/no-debug-non-zts-20100525/xcache.so

3、重新启动php-fpm:service php-fpm restart

打开网页,查看没有出现xcache。如果出现了,则表示正常。










本文转自 deng304749970 51CTO博客,原文链接:http://blog.51cto.com/damondeng/933722,如需转载请自行联系原作者
上一篇:Cassandra 最佳实践系列(1) - CQL 基本数据类型


下一篇:详解ASP.NET的最新安全漏洞,Padding Oracle攻击原理及其他