一步一步深入理解Nginx(二)LNMP架构的实现

2015/12/2720:58:11 发表评论

 

前面一节中,我们初体验了Nginx的安装以及使用浏览器访问自己的html页面,Nginx作为一个优秀的WEB服务器,如果只是支持静态页面,那么整个互联网数据就没法和用户进行沟通。那么有童鞋就问了,为什么静态页面就没法和用户沟通了?

 

因为一个网站如果要想和用户沟通,那么就必须允许用户进行数据的输入与提交,从技术角度来讲,就是我们常说的动态网页,除了动态网页还不够,我们还必须存储用户提交的数据,比如:评论、留言等。那么这些就是我们今天要讲的一个后台Service,LNMP架构的实现,即Linux+Nginx+Mysql+PHP,其中PHP就是一种网页制作动态语言,当然除了它,我们还有Perl、Python、Jsp、Asp等动态网页脚本语言,而LNMP架构是当前互联网中使用最广泛的架构之一。

 

今天我们要讲的与网上绝大多数的LNMP架构搭建可能都不太一样,网上绝大多数文章一上来就是使用源码,各种编译,各种找编译问题,想要看源码编译折腾的童鞋可以看我另外一篇文章:http://www.guoziweb.com/?p=748 而本文中,我尽量以一种简洁快速的方式让大家轻松实现,到底有多简洁呢?请看下文。

1、安装PHP-FPM和MYSQL

在CentOS系统中,很容易安装这两样服务,那么为什么是安装PHP-FPM而不是PHP呢?

 

PHP-FPM其实是PHP的5.3版本就内置添加进来的一个第三方插件,现在既然是内置了,那么就不存在第三方的说法了,直接变成私有的东西。它的存在就是为了作为FCGI技术解决Nginx本身不能解析PHP脚本设计,并不是说Nginx做得不够强大,而是它做得足够灵活,它能提供各种第三方接口,以体现其强大的灵活性。

 

关于FCGI技术的解释这里就不作多写了,有兴趣的童鞋可以自行上百度或谷歌查阅。好了,安装我们还是使用yum在线安装的方式,这就是前面我们提到的简洁的方式(其实我们Nginx也可以使用yum在线安装方式,只是因为我们后面会涉及到开发Nginx模块,所以使用了源码编译的方式,让大家深入了解下)。

yum -y install php-fpm php-* mysql-server

 

怎么样?是不是很简单,我们安装了php-fpm模块,为了避免少PHP扩展库,我们把所有的php扩展库都安装上了,同时也安装好了mysql的server端。我们可以使用如下命令继续查看php-fpm安装的具体位置:

 

[root@localhost ~]# rpm -qa | grep php-fpm
php-fpm-5.3.3-46.el6_6.x86_64
[root@localhost ~]# rpm -ql php-fpm-5.3.3-46.el6_6.x86_64
/etc/logrotate.d/php-fpm
/etc/php-fpm.conf
/etc/php-fpm.d
/etc/php-fpm.d/www.conf
/etc/rc.d/init.d/php-fpm
/etc/sysconfig/php-fpm
/usr/sbin/php-fpm
/usr/share/doc/php-fpm-5.3.3
/usr/share/doc/php-fpm-5.3.3/LICENSE
/usr/share/doc/php-fpm-5.3.3/php-fpm.conf.default
/usr/share/fpm/status.html
/usr/share/man/man8/php-fpm.8.gz
/var/log/php-fpm
/var/run/php-fpm

2、开始配置

我们先把/etc/php-fpm.conf备份下,同时去掉所有注释和空行语句:

 

cp /etc/php-fpm.conf /etc/php-fpm.conf.bak
grep -Ev '^(;|$)' /etc/php-fpm.conf.bak >/etc/php-fpm.conf

 

查看下该配置文件内容如下:

include=/etc/php-fpm.d/*.conf
[global]
pid = /var/run/php-fpm/php-fpm.pid
error_log = /var/log/php-fpm/error.log
daemonize = no

 

这时,我们在/etc/php-fpm.d/目录下会发现有一个www.conf文件,我们如法炮制:

 

cd /etc/php-fpm.d
cp www.conf www.conf.bak
grep -Ev '^(;|$)' www.conf.bak > www.conf

 

从现在开始,我们下面的配置字段将都不做解释,你只管按我的配置好就行了,随着学习的慢慢深入,我们后面会接触到。

我们将其中的user和group字段值修改成www,listen字段值修改成/tmp/php-fcgi.sock,为了和Nginx接口进行对接,修改了一些参数,最后的内容如下:

 

[www]
listen = /tmp/php-fcgi.sock
listen.allowed_clients = 127.0.0.1
user = www
group = www
pm = dynamic
pm.max_children = 5
pm.start_servers = 3
pm.min_spare_servers = 1
pm.max_spare_servers = 3
slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session

chroot = /var/www/html

 

注意,这里边增加了一行配置chroot = /var/www/html这是后面我们WEB目录配置的根目录。

上一节中,我们将Nginx的配置文件放在:/usr/local/nginx/nginx.conf,我们修改nginx.conf的内容修改成如下(你现在不需要懂这些配置,我们先只管运行起来再说,透过现象看本质):

worker_processes  1;
user www www;
error_log  logs/error.log;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  logs/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  65;
    gzip  on;
    server {
        listen       80;
        server_name  localhost;
        charset utf-8;
        location / {
            root   /var/www/html;
            index  index.html index.htm index.php;
            if (!-e $request_filename) {
                    rewrite  ^/(.*)$  /index.php/$1  last;
                    break;
            }
        }
        #error_page  404              /404.html;
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /var/www/html;
        }
        location ~ \.php($|/) {
                set $script $uri;
                set $path_info "/";
                if ($uri ~ "^(.+\.php)(/.+)") {
                        set $script     $1;
                        set $path_info  $2;
                }
                fastcgi_pass unix:/tmp/php-fcgi.sock;
                fastcgi_index index.php;
                include fastcgi_params;
                fastcgi_param PATH_INFO $path_info;
                fastcgi_param  SCRIPT_FILENAME  $document_root$script;
        }

    }
}

 

到目前为止,我们还缺少一个nginx的启动脚本,这里我也写好了,直接粘贴放到/etc/init.d/nginx文件中即可:

 

#! /bin/sh
# chkconfig: 2345 55 25
# Description: Startup script for nginx webserver on Debian. Place in /etc/init.d and
# run 'update-rc.d -f nginx defaults', or use the appropriate command on your
# distro. For CentOS/Redhat run: 'chkconfig --add nginx'
### BEGIN INIT INFO
# Provides:          nginx
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the nginx web server
# Description:       starts nginx using start-stop-daemon
### END INIT INFO
# Author:   guozi
# website:  http://lnmp.org
. /etc/init.d/functions
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=nginx
NGINX_BIN=/usr/local/nginx/sbin/$NAME
CONFIGFILE=/usr/local/nginx/$NAME.conf
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
case "$1" in
        start)
                echo -n "Starting $NAME... "
                if netstat -tnpl | grep -q nginx;then
                echo "$NAME (pid `pidof $NAME`) already running."
                exit 1
                fi
                $NGINX_BIN -c $CONFIGFILE
                if [ "$?" != 0 ] ; then
                        echo " failed"
                        exit 1
                else
                        echo " done"
                fi
        ;;
        stop)
                echo -n "Stoping $NAME... "
                if ! netstat -tnpl | grep -q nginx; then
                        echo "$NAME is not running."
                        exit 1
                fi
                $NGINX_BIN -s stop
                for nid in `ps aux | grep "nginx:" | grep -v grep | awk '{print $1}'`
                do
                        kill -9 $nid >/dev/null 2>&1
                done
                if [ "$?" != 0 ] ; then
                        echo " failed. Use force-quit"
                        exit 1
                else
                        echo " done"
                fi
        ;;
        status)
                if netstat -tnpl | grep -q nginx; then
                        PID=`pidof nginx`
                        echo "$NAME (pid $PID) is running..."
                else
                        echo "$NAME is stopped"
                        exit 0
                fi
        ;;
        force-quit)
                echo -n "Terminating $NAME... "
                if ! netstat -tnpl | grep -q nginx; then
                        echo "$NAME is not running."
                        exit 1
                fi
                kill `pidof $NAME`
                if [ "$?" != 0 ] ; then
                        echo " failed"
                        exit 1
                else
                        echo " done"
                fi
        ;;
        restart)
                $SCRIPTNAME stop
                sleep 1
                $SCRIPTNAME start
        ;;
        reload)
                echo -n "Reload service $NAME... "
                if netstat -tnpl | grep -q nginx; then
                        $NGINX_BIN -s reload
                        echo " done"
                else
                        echo "$NAME is not running, can't reload."
                        exit 1
                fi
        ;;
        configtest)
                echo -n "Test $NAME configure files... "
                $NGINX_BIN -t
        ;;
        *)
                echo "Usage: $SCRIPTNAME {start|stop|force-quit|restart|reload|status|configtest}"
                exit 1
        ;;
esac

 

接着再对/etc/init.d/nginx赋与可执行权限并添加到开机启动项中:

 

chmod a+x /etc/init.d/nginx
chkconfig nginx on

3、启动所有服务

/etc/init.d/php-fpm start
/etc/init.d/nginx start

4、测试一下

 

我们在/var/www/html目录中创建一个1.php文件,内容如下:

 

<?php
echo phpinfo();
?>

 

接着在网页中访问链接:http://192.168.128.7/1.php 效果如下图:

 

1

好了,今天就至此为止了,大家有任何疑问都可以给我留言哦wink

如果需要一键安装脚本,请访问我的github链接:

https://github.com/linuxbirds/lnmp/ 

  • 微信扫码赞助
  • weinxin
  • 支付宝赞助
  • weinxin

发表评论

您必须才能发表评论!