搭建LNMP平台

——源码编译安装nginxmysqlphp

写在前面的话

LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构。 

Linux是一类Unix计算机操作系统的统称,是目前最流行的免费操作系统。代表版本有:debiancentosubuntufedoragentoo

Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器;是一个小巧而高效的Linux下的Web服务器软件,是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler 站点开发的,已经在一些俄罗斯的大型网站上运行多年,相当的稳定。 。

Mysql是一个小型关系型数据库管理系统

Php是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言。

这四种软件均为免费软件,组合到一起,成为一个免费、高效的网站服务系统。

一、安装Nginx-1.0.13

1. 解决依赖关系

Nginx软件的安装依赖gcc编译器、openssl-develpcre-develzlib-devel,所以安装Nginx之前,先确保系统上已经安装上了这些软件包;若没有安装,则先配好yum源,使用yum命令安装。


  1. #yum install gcc openssl-devel pcre-devel zlib-devel  

2. 添加系统组nginx和系统用户nginx

添加系统组和用户nginx的目的是为了确保服务器的安全,以系统用户nginx的身份来运行nginx,因为系统用户nginx在系统中的权限是很低的,所以可避免nginx进程被***攻破后获得root权限。

  1. # groupadd -r nginx 
  2.  
  3. # useradd -r -g nginx -s /bin/false -M nginx 

3. 编译安装nginx

  1. ./configure \ 
  2.  
  3.   --prefix=/usr \   #指定安装目录 
  4.  
  5.   --sbin-path=/usr/sbin/nginx \   #指定nginx相关的可执行的管理类命令的存放目录 
  6.  
  7.   --conf-path=/etc/nginx/nginx.conf \  #指定配置文件的存放目录 
  8.  
  9.   --error-log-path=/var/log/nginx/error.log \  #指定错误日志文件的存放目录 
  10.  
  11.   --http-log-path=/var/log/nginx/access.log \  #指定访问日志文件的存放目录 
  12.  
  13.   --pid-path=/var/run/nginx/nginx.pid  \  #指定pid文件的存放目录 
  14.  
  15.   --lock-path=/var/lock/nginx.lock \ #指定进程锁文件的存放目录 
  16.  
  17.   --user=nginx \  #指定以哪个用户的身份运行 
  18.  
  19.   --group=nginx \ #指定以哪个组的身份运行 
  20.  
  21.   --with-http_ssl_module \  #指定支持ssl 
  22.  
  23.   --with-http_flv_module \ #指定添加上flv模块 
  24.  
  25.   --with-http_stub_status_module \ # 支持显示web服务器的运行状态 
  26.  
  27.   --with-http_gzip_static_module \ #支持文件压缩传送 
  28.  
  29.   --http-client-body-temp-path=/var/tmp/nginx/client/ \ --以下是指定关于一些临时文件的存放位置 
  30.  
  31.   --http-proxy-temp-path=/var/tmp/nginx/proxy/ \ 
  32.  
  33.   --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \ 
  34.  
  35.   --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \ 
  36.  
  37.   --http-scgi-temp-path=/var/tmp/nginx/scgi \ 
  38.  
  39.   --with-pcre   #支持pcre正则表达式 


  1. make && make install 

4. 提供SysV服务脚本/etc/rc.d/init.d/nginx 

内容如下:

  1. #!/bin/sh 
  2.  
  3.  
  4. # nginx - this script starts and stops the nginx daemon 
  5.  
  6.  
  7. # chkconfig:   - 85 15  
  8.  
  9. # description:  Nginx is an HTTP(S) server, HTTP(S) reverse \ 
  10.  
  11. #               proxy and IMAP/POP3 proxy server 
  12.  
  13. # processname: nginx 
  14.  
  15. # config:      /etc/nginx/nginx.conf 
  16.  
  17. # config:      /etc/sysconfig/nginx 
  18.  
  19. # pidfile:     /var/run/nginx.pid  
  20.  
  21. # Source function library. 
  22.  
  23. . /etc/rc.d/init.d/functions  
  24.  
  25. # Source networking configuration. 
  26.  
  27. . /etc/sysconfig/network  
  28.  
  29. Check that networking is up. 
  30.  
  31. "$NETWORKING" = "no" ] && exit 0  
  32.  
  33. nginx="/usr/sbin/nginx" 
  34.  
  35. prog=$(basename $nginx)  
  36.  
  37. NGINX_CONF_FILE="/etc/nginx/nginx.conf"  
  38.  
  39. [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx  
  40.  
  41. lockfile=/var/lock/subsys/nginx  
  42.  
  43. make_dirs() { 
  44.  
  45.    # make required directories 
  46.  
  47.    user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -` 
  48.  
  49.    options=`$nginx -V 2>&1 | grep 'configure arguments:'
  50.  
  51.    for opt in $options; do 
  52.  
  53.        if [ `echo $opt | grep '.*-temp-path'` ]; then 
  54.  
  55.            value=`echo $opt | cut -d "=" -f 2` 
  56.  
  57.            if [ ! -d "$value" ]; then 
  58.  
  59.                # echo "creating" $value 
  60.  
  61.                mkdir -p $value && chown -R $user $value 
  62.  
  63.            fi 
  64.  
  65.        fi 
  66.  
  67.    done 
  68.  
  69. }  
  70.  
  71. start() { 
  72.  
  73.     [ -x $nginx ] || exit 5 
  74.  
  75.     [ -f $NGINX_CONF_FILE ] || exit 6 
  76.  
  77.     make_dirs 
  78.  
  79.     echo -n $"Starting $prog: " 
  80.  
  81.     daemon $nginx -c $NGINX_CONF_FILE 
  82.  
  83.     retval=$? 
  84.  
  85.     echo 
  86.  
  87.     [ $retval -eq 0 ] && touch $lockfile 
  88.  
  89.     return $retval 
  90.  
  91. }  
  92.  
  93. stop() { 
  94.  
  95.     echo -n $"Stopping $prog: " 
  96.  
  97.     killproc $prog -QUIT 
  98.  
  99.     retval=$? 
  100.  
  101.     echo 
  102.  
  103.     [ $retval -eq 0 ] && rm -f $lockfile 
  104.  
  105.     return $retval 
  106.  
  107. }  
  108.  
  109. restart() { 
  110.  
  111.     configtest || return $? 
  112.  
  113.     stop 
  114.  
  115.     sleep 1 
  116.  
  117.     start 
  118.  
  119. }  
  120.  
  121. reload() { 
  122.  
  123.     configtest || return $? 
  124.  
  125.     echo -n $"Reloading $prog: " 
  126.  
  127.     killproc $nginx -HUP 
  128.  
  129.     RETVAL=$? 
  130.  
  131.     echo 
  132.  
  133. }  
  134.  
  135. force_reload() { 
  136.  
  137.     restart 
  138.  
  139.  
  140. configtest() { 
  141.  
  142.   $nginx -t -c $NGINX_CONF_FILE 
  143.  
  144. }  
  145.  
  146. rh_status() { 
  147.  
  148.     status $prog 
  149.  
  150. }  
  151.  
  152. rh_status_q() { 
  153.  
  154.     rh_status >/dev/null 2>&1 
  155.  
  156. }  
  157.  
  158. case "$1" in 
  159.  
  160.     start) 
  161.  
  162.         rh_status_q && exit 0 
  163.  
  164.         $1 
  165.  
  166.         ;; 
  167.  
  168.     stop) 
  169.  
  170.         rh_status_q || exit 0 
  171.  
  172.         $1 
  173.  
  174.         ;; 
  175.  
  176.     restart|configtest) 
  177.  
  178.         $1 
  179.  
  180.         ;; 
  181.  
  182.     reload) 
  183.  
  184.         rh_status_q || exit 7 
  185.  
  186.         $1 
  187.  
  188.         ;; 
  189.  
  190.     force-reload) 
  191.  
  192.         force_reload 
  193.  
  194.         ;; 
  195.  
  196.     status) 
  197.  
  198.         rh_status 
  199.  
  200.         ;; 
  201.  
  202.     condrestart|try-restart) 
  203.  
  204.         rh_status_q || exit 0 
  205.  
  206.             ;; 
  207.  
  208.     *) 
  209.  
  210.         echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" 
  211.  
  212.         exit 2 
  213.  
  214. esac 

5. 为脚本添加执行权限


  1. chmod +x  /etc/rc.d/init.d/nginx 

6. 添加至服务列表


  1. chkconfig --add nginx 

7. 让服务开机启动


  1. chkconfig nginx on  

接下来可以启动服务进行测试

二、安装mysql-5.5.20

1、准备数据存放的文件系统

新建一个逻辑卷,并将其挂载至特定目录即可。

这里假设其逻辑卷的挂载目录为/mydata,而后需要创建/mydata/data目录做为mysql数据的存放目录。

  1. #pvcreate /dev/sda5 --这里假设将sda5分区作为物理卷 
  2.  
  3. #vgcreate myvg /dev/sda5 
  4.  
  5. #lvcreate -L 2G -n lv1 myvg --这里假设逻辑卷的大小为2G 

2、新建用户以安全方式运行进程

  1. # groupadd -r mysql 
  2.  
  3. # useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql 
  4.  
  5. # chown -R mysql:mysql /mydata/data 

3、安装并初始化mysql-5.5.20

首先下载平台对应的mysql版本,这里选择mysql-5.5.19-linux2.6-i686.tar.gz

 

  1. # tar xf mysql-5.5.19-linux2.6-i686.tar.gz -C /usr/local 
  2.  
  3. # cd /usr/local
  4.  
  5. # ln -sv mysql-5.5.19-linux2.6-i686  mysql 
  6.  
  7. # cd mysql  
  8.  
  9. # chown -R mysql:mysql  . 
  10.  
  11. # scripts/mysql_install_db --user=mysql --datadir=/mydata/data 
  12.  
  13. # chown -R root  . 

4、为mysql提供主配置文件

  1. # cd /usr/local/mysql 
  2.  
  3. # cp support-files/my-large.cnf  /etc/my.cnf 

并修改此文件中thread_concurrency的值为你的CPU个数乘以2,比如这里使用如下行:


  1. thread_concurrency = 2 

另外还需要添加如下行指定mysql数据文件的存放位置:


  1. datadir = /mydata/data 

5、为mysql提供sysv服务脚本

  1. # cd /usr/local/mysql 
  2.  
  3. # cp support-files/mysql.server  /etc/rc.d/init.d/mysqld 

添加至服务列表

  1. # chkconfig --add mysqld 
  2.  
  3. # chkconfig mysqld on 

而后就可以启动服务测试使用了。

为了使用mysql的安装符合系统使用规范,并将其开发组件导出给系统使用,这里还需要进行如下步骤:

6、输出mysqlman手册至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 

9、修改PATH环境变量

让系统可以直接使用mysql的相关命令。

三、安装PHP-5.3.10

1. 解决依赖关系

Php-5.3.10的安装需要依赖以下软件及对应的开发包组;

libevent nginx是基于event drivelibevent API提供了当特定事件发生时应执行的对应的函数);

libiconv (编码转换库);

libmcrypt (双向加密库);

mhash(单向加密算法);

这里用这些软件的rpm包来安装

  1. #rpm -Uvh  libevent-2.0.17-2.i386.rpm \ 
  2.  
  3.   libevent-devel-2.0.17-2.i386.rpm \ 
  4.  
  5. libmcrypt-2.5.7-5.el5.i386.rpm \ 
  6.  
  7. libmcrypt-devel-2.5.7-5.el5.i386.rpm\ 
  8.  
  9. mcrypt-2.6.8-1.el5.i386.rpm \ 
  10.  
  11.  mhash-0.9.2-6.el5.i386.rpm \ 
  12.  
  13. mhash-devel-0.9.2-6.el5.i386.rpm 

2. 编译安装php-5.3.10

首先下载源码包至本地目录

  1. # tar xf php-5.3.10.tar.bz2 
  2.  
  3. # cd php-5.3.10 
  4.  
  5. ./configure --prefix=/usr/local/php \ 
  6.  
  7. --with-mysql=/usr/local/mysql \ 
  8.  
  9. --with-openssl \ 
  10.  
  11. --enable-fpm \ 
  12.  
  13. --with-mysqli=/usr/local/mysql/bin/mysql_config \ 
  14.  
  15. --enable-mbstring \ 
  16.  
  17. --with-freetype-dir \ 
  18.  
  19. --with-jpeg-dir \ 
  20.  
  21. --with-png-dir \ 
  22.  
  23. --with-zlib-dir \ 
  24.  
  25. --with-libxml-dir=/usr \ 
  26.  
  27. --enable-xml \ 
  28.  
  29. --with-mhash \ 
  30.  
  31. --with-mcrypt \ 
  32.  
  33. --with-config-file-path=/etc/php \ 
  34.  
  35. --with-config-file-scan-dir=/etc/php \ 
  36.  
  37. --with-bz2 --with-curl  

--with-iconv=/usr/local  #若前面安装了libconv的话,需加上这一项;】

 

  1. # make 【ZEND_EXTRA_LIBS='-liconv' 】 #若前面没有安装了libconv的话,则只使用make 
  2.  
  3. # make install 

3. php提供配置文件


  1. # cp  php.ini-production  /usr/local/php/etc/php.ini 

4. 添加php-fpm的服务脚本


  1. # cp sapi/fpm/init.d.php-fpm  /etc/rc.d/init.d/php-fpm 

添加php-fpm到服务列表


  1. #chkconfig --add php-fpm 

开机启动php-fpm


  1. #chkconfig php-fpm on 

5. 启动fastcgi


  1. # cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf  

# vim /usr/local/php/etc/php-fpm.conf   --启用如下选项:

  1. pm.max_children = 50 
  2.  
  3. pm.start_servers = 5 
  4.  
  5. pm.min_spare_servers = 2 
  6.  
  7. pm.max_spare_servers = 8 
  8.  
  9. pid = /var/run/php-fpm.pid 

接下来整合nginxphp5

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

  1. location ~ \.php$ { 
  2.  
  3.             root           html; 
  4.  
  5.             fastcgi_pass   127.0.0.1:9000; 
  6.  
  7.             fastcgi_index  index.php; 
  8.  
  9.             fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name; 
  10.  
  11.             include        fastcgi_params; 
  12.  
  13.         } 

        

        

6. 编辑FastCGI 的文件

内容如下:

 

 

  1. #vim fastcgi_params 
  2.  
  3. fastcgi_param  GATEWAY_INTERFACE  CGI/1.1; 
  4.  
  5. fastcgi_param  SERVER_SOFTWARE    nginx; 
  6.  
  7. fastcgi_param  QUERY_STRING       $query_string; 
  8.  
  9. fastcgi_param  REQUEST_METHOD     $request_method; 
  10.  
  11. fastcgi_param  CONTENT_TYPE       $content_type; 
  12.  
  13. fastcgi_param  CONTENT_LENGTH     $content_length; 
  14.  
  15. fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name; 
  16.  
  17. fastcgi_param  SCRIPT_NAME        $fastcgi_script_name; 
  18.  
  19. fastcgi_param  REQUEST_URI        $request_uri; 
  20.  
  21. fastcgi_param  DOCUMENT_URI       $document_uri; 
  22.  
  23. fastcgi_param  DOCUMENT_ROOT      $document_root; 
  24.  
  25. fastcgi_param  SERVER_PROTOCOL    $server_protocol; 
  26.  
  27. fastcgi_param  REMOTE_ADDR        $remote_addr; 
  28.  
  29. fastcgi_param  REMOTE_PORT        $remote_port; 
  30.  
  31. fastcgi_param  SERVER_ADDR        $server_addr; 
  32.  
  33. fastcgi_param  SERVER_PORT        $server_port; 
  34.  
  35. fastcgi_param  SERVER_NAME        $server_name; 

7. 在所支持的主页面格式中添加php格式的主页

类似如下:

  1. location / { 
  2.  
  3.             root   html; 
  4.  
  5.             index  index.php index.html index.htm; 
  6.  
  7.         } 

        

而后重启nginx


  1. # service nginx restart 

8. FCGI设定缓存,提高服务器的可用性

  1. http { 
  2.  
  3. fastcgi_cache_path /www/cache levels=1:2 
  4.  
  5. keys_zone=fcgicache:10m 
  6.  
  7. inactive=5m; 
  8.  
  9. server { 
  10.  
  11. server_name www.aydon.com; 
  12.  
  13. ... 
  14.  
  15. location / { 
  16.  
  17. ... 
  18.  
  19. fastcgi_pass 127.0.0.1:9000; 
  20.  
  21. fastcgi_cache fcgicache; 
  22.  
  23. fastcgi_cache_valid 200 302 1h; 
  24.  
  25. fastcgi_cache_valid 301 1d; 
  26.  
  27. fastcgi_cache_valid any 1m; 
  28.  
  29. fastcgi_cache_min_uses 1; 
  30.  
  31. fastcgi_cache_use_stale error timeout invalid_header http_500; 
  32.  
  33.  
  34.  

到此LNMP平台的安装和一些基本配置工作已经完成了,接下来便可以测试LNMP平台是否能正常工作。