基于Nginx+mysql+php构建LNMP

 Nginx采用了模块化、事件驱动、异步、单线程及非阻塞的架构,并大量采用了多路复用及事件通知机制,是一种轻量级的web服务器。

实验平台:RHCE5.8
 
一: 安装Nginx:
 
1、解决依赖关系:
先安装三个包组和pcre-devel:
 
    
    
    
    
  1. yum -y groupinstall "Development Libraries" "Development Tools" "X Software  Development" 
  2. yum -y install pcre-devel 
2、若之前装有httpd,在编译安装Nginx之前确保httpd处于关闭状态
  因为httpd和nginx都占用tcpde 80端口 
 
3、安装nginx
首先添加用户nginx,实现用普通用户运行nginx服务进程:
 
    
    
    
    
  1. # groupadd -r nginx 
  2. # useradd -r -g nginx nginx 
下载nginx源码包至本地,这里使用的是nginx-1.2.3版本的
 
  
  
  
  
  1. tar xf nginx-1.2.3.tar.gz 
  2. cd nginx-1.2.3 
  3. 编译安装: 
  4. ./configure \ 
  5.   --prefix=/usr \ 
  6.   --sbin-path=/usr/sbin/nginx \ 
  7.   --conf-path=/etc/nginx/nginx.conf \ 
  8.   --error-log-path=/var/log/nginx/error.log \ 
  9.   --http-log-path=/var/log/nginx/access.log \ 
  10.   --pid-path=/var/run/nginx/nginx.pid  \ 
  11.   --lock-path=/var/lock/nginx.lock \ 
  12.   --user=nginx \ 
  13.   --group=nginx \ 
  14.   --with-http_ssl_module \ 
  15.   --with-http_flv_module \ 
  16.   --with-http_stub_status_module \ 
  17.   --with-http_gzip_static_module \ 
  18.   --http-client-body-temp-path=/var/tmp/nginx/client/ \ 
  19.   --http-proxy-temp-path=/var/tmp/nginx/proxy/ \ 
  20.   --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \ 
  21.   --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \ 
  22.   --http-scgi-temp-path=/var/tmp/nginx/scgi \ 
  23.   --with-pcre 
  24.  
  25. make && make install   
4、为脚本赋予执行权限:
新建文件/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:" | \
  32. sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -` 
  33.    options=`$nginx -V 2>&1 | grep 'configure arguments:'` 
  34.    for opt in $options; do 
  35.        if [ `echo $opt | grep '.*-temp-path'` ]; then 
  36.            value=`echo $opt | cut -d "=" -f 2` 
  37.            if [ ! -d "$value" ]; then 
  38.                # echo "creating" $value 
  39.                mkdir -p $value && chown -R $user $value 
  40.            fi 
  41.        fi 
  42.    done 
  43.  
  44. start() { 
  45.     [ -x $nginx ] || exit 5 
  46.     [ -f $NGINX_CONF_FILE ] || exit 6 
  47.     make_dirs 
  48.     echo -n $"Starting $prog: " 
  49.     daemon $nginx -c $NGINX_CONF_FILE 
  50.     retval=$? 
  51.     echo 
  52.     [ $retval -eq 0 ] && touch $lockfile 
  53.     return $retval 
  54.  
  55. stop() { 
  56.     echo -n $"Stopping $prog: " 
  57.     killproc $prog -QUIT 
  58.     retval=$? 
  59.     echo 
  60.     [ $retval -eq 0 ] && rm -f $lockfile 
  61.     return $retval 
  62.  
  63. restart() { 
  64.     configtest || return $? 
  65.     stop 
  66.     sleep 1 
  67.     start 
  68.  
  69. reload() { 
  70.     configtest || return $? 
  71.     echo -n $"Reloading $prog: " 
  72.     killproc $nginx -HUP 
  73.     RETVAL=$? 
  74.     echo 
  75.  
  76. force_reload() { 
  77.     restart 
  78.  
  79. configtest() { 
  80.   $nginx -t -c $NGINX_CONF_FILE 
  81.  
  82. rh_status() { 
  83.     status $prog 
  84.  
  85. rh_status_q() { 
  86.     rh_status >/dev/null 2>&1 
  87.  
  88. case "$1" in 
  89.     start) 
  90.         rh_status_q && exit 0 
  91.         $1 
  92.         ;; 
  93.     stop) 
  94.         rh_status_q || exit 0 
  95.         $1 
  96.         ;; 
  97.     restart|configtest) 
  98.         $1 
  99.         ;; 
  100.     reload) 
  101.         rh_status_q || exit 7 
  102.         $1 
  103.         ;; 
  104.     force-reload) 
  105.         force_reload 
  106.         ;; 
  107.     status) 
  108.         rh_status 
  109.         ;; 
  110.     condrestart|try-restart) 
  111.         rh_status_q || exit 0 
  112.             ;; 
  113.     *) 
  114.         echo $"Usage: $0 {start|stop|status|restart|condrestart| \
  115. try-restart|reload|force-reload|configtest}" 
  116.         exit 2 
  117. esac 
然后为此脚本赋予执行权限: 
# chmod +x /etc/rc.d/init.d/nginx
 
添加至服务管理列表,并让其开机自动启动:
 
   
   
   
   
  1. chkconfig --add nginx 
  2. chkconfig nginx on 
启动nginx,并查看监听窗口:
  
  
  
  
  1. service nginx start 
  2. netstat -tnlp 
在本地浏览器访问,出现还有页面说明安装成功

二、安装mysql-5.5.28:
 
1、创建逻辑卷用于存放数据
1.1创建一个大小为10G的分区/dev/sda5
 
   
   
   
   
  1. # partprobe /dev/sda 
  2. 创建物理卷: 
  3. # pvcreate /dev/sda5 
  4. 创建卷组: 
  5. # vgcreate myvg /dev/sda5 
  6. 创建大小为5G的逻辑卷,命名为data: 
  7. # lvcreate -L 5G -n data myvg 
  8. 格式化: 
  9. # mke2fs -j /dev/myvg/data 
1.2、指定逻辑卷的挂载目录为/mydata
 
  
  
  
  
  1. # mkdir /mydata 
  2. # vim /etc/fstab   添加如下行: 
  3. /dev/myvg/data          /mydata                 ext3    defaults        0 0 
  4. # mount -a     ##自动挂载 
  5. # mount  
  6. /dev/mapper/myvg-data on /mydata type ext3 (rw) 
  7. #mkdir /mydata/data 

2、创建系统用户mysql和组mysql:
 
  
  
  
  
  1. # groupadd -r mysql 
  2. # useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql 
  3. # chown -R mysql.mysql /mydata/data 
3、安装mysql-5.5.28
 
3.1、首先下载平台对应的mysql版本至本地,这里是32位平台,选择mysql-5.5.28-linux2.6-i686.tar.gz,
首先检查系统是否安装过mysql;有的话先卸载
 
3.2、下载mysql-5.5.28-linux2.6-i386.tar.gz至本地,并解压后放在/usr/local:
 
  
  
  
  
  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 

4、初始化mysql
 
  
  
  
  
  1. # scripts/mysql_install_db --datadir=/mydata/data --user=mysql 
  2. # ls /mydata/data     ##生成了三个文件 
  3. mysql  performance_schema  test 

5修改配置文件:
 
  
  
  
  
  1. # cd support-files/ 
  2. # cp support-files/my-large.cnf  /etc/my.cnf    ##内存超过512M的话,建议使用my-large.cnf 
  3.  
  4. # vim /etc/my.cnf 
  5. thread_concurrency = 4   ##根据你的cpu的个数适当修改这个参数 
  6. 另外还需要添加如下行指定mysql数据文件的存放位置: 
  7. datadir = /mydata/data 

6.使用mysql自身提供的服务脚本:
 
# cp mysql.server /etc/rc.d/init.d/mysqld
 
加入服务列表:
# chkconfig --add mysqld
# chkconfig mysqld on

启动mysql,查看mysqld的端口3306是否监听:

# netstat -tnlp |grep mysqld
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      22953/mysqld 
 
7、导出mysql的PATH路径
 
    
    
    
    
  1. # echo $PATH  
  2. # vim /etc/profile.d/mysql.sh 
  3. 添加如下: 
  4. PATH=$PATH:/usr/local/mysql/bin 
  5. export PATH 
  6.  
  7. 重新登录: 
8、输出mysql的man手册至man命令的查找路径:
 
      
      
      
      
  1. vim /etc/man.config 
  2. 在MANPATH处添加:MANPATH /usr/local/mysql/man 
9、输出mysql的库文件给系统库查找路径:
 
       
       
       
       
  1. # vim /etc/ld.so.conf.d/mysql.conf 
  2. 写入:/usr/local/mysql/lib 
让系统重新载入系统库
# ldconfig -v
 
10、输出mysql的头文件至系统头文件路径/usr/include:
 
    
    
    
    
  1. 这可以通过简单的创建链接实现: 
  2. # ln -sv /usr/local/mysql/include  /usr/include/mysql 
重新启动mysql
 
三:安装php
 
1.解决依赖关系:
 
    
    
    
    
  1. 如果想让编译的php支持mcrypt、mhash扩展和libevent,此处还需要下载录如下几个rpm包并安装之: 
  2. libmcrypt-2.5.8-4.el5.centos.i386.rpm 
  3. libmcrypt-devel-2.5.8-4.el5.centos.i386.rpm 
  4. mhash-0.9.9-1.el5.centos.i386.rpm 
  5. mhash-devel-0.9.9-1.el5.centos.i386.rpm 
  6. mcrypt-2.6.8-1.el5.i386.rpm 

最好使用升级的方式安装上面的rpm包,命令格式如下:
# rpm -Uvh *.rpm
 
2、编译安装php-5.4.8
    
    
    
    
  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 \
  4.  --with-openssl --enable-fpm --enable-sockets --enable-sysvshm  \
  5.  --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring \
  6.  --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib-dir \
  7.  --with-libxml-dir=/usr --enable-xml  --with-mhash --with-mcrypt \
  8.  --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d \
  9.  --with-bz2 --with-curl  
  10.  
  11. # make &&  make intall 
 
3、配置php
 
    
    
    
    
  1. 3.1:为php提供配置文件: 
  2. # cp php.ini-production /etc/php.ini 
  3.  
  4. 3.2、为php-fpm提供Sysv init脚本,并将其添加至服务列表: 
  5. # cp sapi/fpm/init.d.php-fpm  /etc/rc.d/init.d/php-fpm 
  6. # chmod +x /etc/rc.d/init.d/php-fpm 
  7. # chkconfig --add php-fpm 
  8. # chkconfig php-fpm on 
  9.  
  10. 3.3为php-fpm提供配置文件: 
  11. # cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf 
  12.  
  13. 3.4、编辑php-fpm的配置文件: 
  14. # vim /usr/local/php/etc/php-fpm.conf 
  15. 配置fpm的相关选项为你所需要的值,并启用pid文件(如下最后一行): 
  16. pm.max_children = 50 
  17. pm.start_servers = 5 
  18. pm.min_spare_servers = 2 
  19. pm.max_spare_servers = 8 
  20. pid = /usr/local/php/var/run/php-fpm.pid 

接下来就可以启动php-fpm了:
# service php-fpm start

使用如下命令来验正(如果此命令输出有中几个php-fpm进程就说明启动成功了):
# ps aux | grep php-fpm
 
四、整合nginx和php5
1、编辑/etc/nginx/nginx.conf,启用如下选项:
 
     
     
     
     
  1. location ~ \.php$ { 
  2.             root           /web/htdocs; 
  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加到index行:如下
    
    
    
    
  1. ocation / { 
  2.             root   html; 
  3.             index  index.php index.html index.htm; 
  4.         } 
而后重新载入nginx的配置文件:
# service nginx reload
 
3、在/usr/html新建index.php的测试页面,测试php是否能正常工作:
 
    
    
    
    
  1. # cat > /usr/html/index.php << EOF 
  2. <?php 
  3. phpinfo(); 
  4. ?> 
接着就可以通过浏览器访问此测试页面了。
 
五、安装xcache,为php加速:
 
1、安装 xcache
 
     
     
     
     
  1. # tar xf xcache-2.0.0.tar.gz 
  2. # cd xcache-2.0.0 
  3. # /usr/local/php/bin/phpize 
  4. # ./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config 
  5. # make && make install 
  6.  
  7. 安装结束时,会出现类似如下行: 
  8. Installing shared extensions:     /usr/local/php/lib/php/extensions/no \
  9. -debug-non-zts-20100525/ 
2、编辑php.ini,整合php和xcache:
 
   
   
   
   
  1. 首先将xcache提供的样例配置导入php.ini 
  2. # mkdir /etc/php.d 
  3. # cp xcache.ini /etc/php.d 
  4.  
  5. 说明:xcache.ini文件在xcache的源码目录中。 
  6.  
  7. 接下来编辑/etc/php.d/xcache.ini,找到zend_extension开头的行,修改为如下行: 
  8. zend_extension = /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/xcache.so 
  9.  
  10. 注意:如果php.ini文件中有多条zend_extension指令行,要确保此新增的行排在第一位。 
3、重新启动php-fpm
# service php-fpm restart
 
 
六、安装phpMyadmin:
 
   
   
   
   
  1. # tar xf phpMyAdmin-3.5.1-all-languages.tar.bz2  
  2. # cd phpMyAdmin-3.5.1-all-languages 
将当前目录下文件移到/web/htdocs:
 
    
    
    
    
  1. # mv * /web/htdocs/ 
  2.  
  3. # cd /web/htdocs/ 
  4. # cp config.sample.inc.php config.inc.php 
启动浏览页面: (发现是这样)

##图像无法正常显示;说是cookie没有启用,希望有人给予指点
 
为了安全考虑,在Mysql数据库中设置密码;便于对Myadin进行管理:
 
  
  
  
  
  1. mysql> set password for root@localhost=password('nongda'); 
  2. Query OK, 0 rows affected (0.07 sec) 
  3.  
  4. mysql> flush privileges; 
  5. Query OK, 0 rows affected (0.01 sec) 

输入账号和密码;登陆  Myadmin就可以进行管理操作了:(登陆后是在这样)

下图是操作正常的情况下显示的页面:

 
七、基于ssl为nginx创建CA证书:
 
  
  
  
  
  1. 7.1、修改主配置文件/etc/pki/tls/openssl.conf 
  2. 将目录设置为/etc/pki/CA 
  3. dir             = /etc/pki/CA     ##45行 
  4.  
  5.  
  6. 7.2 生成私钥,并放置于/etc/pki/CA/pravate下,命名为cakey.pem 
  7. # cd /etc/pki/CA 
  8. # (umask 077;openssl genrsa 2048 > private/cakey.pem) 
  9.  
  10.  
  11. 7.3:基于私钥生成自签证书 
  12.  
  13. # openssl req -new -x509 -key private/catey.pem -out cacert.pem -days 3650 
  14.  
  15. Country Name (2 letter code) [GB]:cn 
  16. State or Province Name (full name) [Berkshire]:henan 
  17. Locality Name (eg, city) [Newbury]:zz 
  18. Organization Name (eg, company) [My Company Ltd]:nongda 
  19. Organizational Unit Name (eg, section) []:yuanlin 
  20. Common Name (eg, your name or your server's hostname) []:ca.xiangbo.com 
  21.  
  22.  
  23. 7.5:创建相关目录文件: 
  24.  
  25. # mkdir certs newcerts crl 
  26. # touch index.txt serial 
  27. # echo 01 > serial 
  28.  
  29. 7.6:生成一个证书颁发请求 
  30.  
  31. # cd /etc/nginx 
  32. # mkdir ssl 
  33. # cd ssl 
  34. # (umask 077;openssl genrsa 1024 > nginx.key) 
  35.  
  36.  
  37. 7.7生成证书签发请求: 
  38.  
  39. # openssl req -new -key nginx.key -out nginx.csr 
  40.  
  41. Country Name (2 letter code) [GB]:cn 
  42. State or Province Name (full name) [Berkshire]:henan 
  43. Locality Name (eg, city) [Newbury]:zz 
  44. Organization Name (eg, company) [My Company Ltd]:nongda 
  45. Organizational Unit Name (eg, section) []:yuanlin 
  46. Common Name (eg, your name or your server's hostname) []:www.xiangbo.com   
  47.  
  48. //www.xiangbo.com 要与被访问的主机名保持一致 
  49.  
  50. 6.8签发私有证书: 
  51.  
  52. # openssl ca -in nginx.csr -out nginx.crt 
  53.  
  54. 查看生成文件 

 

你可能感兴趣的:(nginx,LNMP)