LNMP

LNMP组合工作流程

LNMP组合工作时,首先是用户通过浏览器输入域名请求Nginx Web服务,如果请求是静态资源,则由Nginx解析返回给用户;如果是动态请求(.php结尾),那么Nginx就会把它通过FastCGI接口(快速接口规则,生产常用方法)发送FastCGI数据包给PHP引擎服务(FastCGI进程php-fpm)进行解析,如果这个动态请求要读取数据库数据,那么PHP就会继续向后请求MySQL数据库,以读取需要的数据,并最终通过Nginx服务把获取的数据返回给用户,这就是LNMP环境的基本请求顺序流程。这个请求流程是企业使用LNMP环境的常用流程。

用户通过浏览器将请求发到nginx

1)若请求为静态请求,location/{

静态

}

nginx就会去网页目录根据URLURI部分取得网页,并将网页返回给用户。(磁盘IO读写),图片、视频在存储(NFS)中(代码不放在存储中),此时NFS需要挂载Nginx

2) 若请求为动态请求,location ~* .(php|php5)${

fastcgi_pass 127.0.0.1:9000

}

nginx就会将用户的请求转换为fastcgi格式的数据包推给fastcgi的服务端PHP-fpm(一个socket进程,端口为9000,加快了PHP解析速度),PHP激活JS代码

动态网页由实体文件index.php(放在内存中),通过JS语言到数据库取得数据,并写回index.php文件,再打包给用户(代码不放在存储中)

1. 分离式部署中,NGINX服务器和PHP服务器上网页、代码必须两者都有,否则会触发404

2. nginxApache一样,若没有PHP支持,都处理不了所谓的动态请求,他们自身其实都只能出路静态,只是Apache转发动态数据包的速度快,但是只是单个包速度,Apache并发低。

3. 读取网页时无需挂载存储NFS,但是动态(如上传图片)需要挂载存储NFS

4. fastcgi快速接口有两端:

1)作为客户端的fastcgi_passNginx安装包包含)

2)作为服务端的PHP-fpmPHP安装包包含)

fastcgi数据包格式非常严谨,PHP解析速度非常快,但是越严谨的数据包越大,所以fsatcgi数据包大小 要绝对大于http数据包

#### LNMP的部署方式:

1)全都部署在一台服务器上

2)全都不部署在一台服务器上(N+P+M

3)只分离MySQLNP+M

### 部署LNMP

nginxPHP的程序用户设为同一个

1. 安装nginx

```

[root@localhost ~]# tar xf nginx-1.10.2.tar.gz -C /usr/src/

[root@localhost ~]# cd /usr/src/nginx-1.10.2/

[root@localhost ~]# mount /dev/sr0 /media/cdrom

[root@localhost nginx-1.10.2]# yum -y install pcre-devel openssl-devel

[root@localhost nginx-1.10.2]# useradd -s /sbin/nologin -M www

[root@localhost nginx-1.10.2]# ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

[root@localhost nginx-1.10.2]# make && make install

[root@localhost nginx-1.10.2]# ln -s /usr/local/nginx/sbin/* /usr/local/sbin/

[root@localhost conf]# cd /usr/local/nginx/conf/

[root@localhost conf]# egrep -v "#|^$" nginx.conf.default > nginx.conf

[root@localhost conf]# vim nginx.conf

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {

        listen       80;

        server_name  localhost;

        location / {

            root   html;

            index  index.html index.htm;

        }

    }

}

              

# nginx编译完毕

```

2. 安装MySQLPHP需要MySQL的支持环境)

```

[root@localhost ~]# tar xf mysql-5.5.32-linux2.6-x86_64.tar.gz -C /usr/local/

# 创建mysql程序用户

[root@localhost ~]# useradd -s /sbin/nologin -M mysql

[root@localhost ~]# cd /usr/local/mysql-5.5.32-linux2.6-x86_64/

[root@localhost mysql-5.5.32-linux2.6-x86_64]# echo "192.168.184.137 LNMP" >> /etc/hosts

[root@localhost mysql-5.5.32-linux2.6-x86_64]# ln -s /usr/local/mysql-5.5.32-linux2.6-x86_64/ /usr/local/mysql

# 初始化MySQL配置文件my.conf

[root@localhost ~]# cd /usr/local/mysql-5.5.32-linux2.6-x86_64/

[root@localhost mysql-5.5.32-linux2.6-x86_64]# /bin/cp support-files/my-small.cnf  /etc/my.cnf

# 初始化mysql

[root@localhost mysql]# chown -R mysql.mysql /usr/local/mysql

[root@localhost mysql]# yum -y install libaio

[root@localhost mysql]# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/ --user=mysql

Installing MySQL system tables...

OK

Filling help tables...

OK

To start mysqld at boot time you have to copy

support-files/mysql.server to the right place for your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !

To do so, start the server, then issue the following commands:

/usr/local/mysql/bin/mysqladmin -u root password 'new-password'

/usr/local/mysql/bin/mysqladmin -u root -h localhost.localdomain password 'new-password'

Alternatively you can run:

/usr/local/mysql/bin/mysql_secure_installation

which will also give you the option of removing the test

databases and anonymous user created by default.  This is

strongly recommended for production servers.

See the manual for more instructions.

You can start the MySQL daemon with:

cd /usr/local/mysql ; /usr/local/mysql/bin/mysqld_safe &

You can test the MySQL daemon with mysql-test-run.pl

cd /usr/local/mysql/mysql-test ; perl mysql-test-run.pl

Please report any problems with the /usr/local/mysql/scripts/mysqlbug script!

```

初始化故障排错集锦

错误示例1:

```

usr/local/mysql/bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared ob

#错误原因是没有libaio函数库的支持。需要

yum -y install libaio

```

错误示例2:

```

WARNING:The host'mysql'could not be looked up with resolveip

#需要修改主机名解析,使其和uname -n一样,修改后的结果如下:

[root@localhost ~] # grep `uname -n` /etc/hosts

```

错误示例3:

```

ERROR:1004Can't create file '/tmp/#sql300e_1_o.frm'(errno:13)

#原因是/tmp目录的权限有问题。

解决办法为处理/tmp目录,如下:

[root@localhost ~]# ls -ld /tmp

drwxrwxrwt. 3 root root 4096 Jul 14 07:56 /tmp

[root@localhost ~]# chmod -R 1777 /tmp/

```

此故障必须解除,否则,后面会出现登陆不了数据库等问题。

3. 配置并启动MySQL数据库

```

[root@localhost mysql]# cp support-files/mysql.server /etc/init.d/mysqld

[root@localhost mysql]# chmod +x /etc/init.d/mysqld

[root@localhost mysql]# /etc/init.d/mysqld start

Starting MySQL.. SUCCESS!

[root@localhost mysql]# netstat -antup | grep mysql

tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      4688/mysqld         

# 设置MySQL开机自启动

[root@localhost mysql]# chkconfig --add mysqld

[root@localhost mysql]# chkconfig mysqld on

[root@localhost mysql]# chkconfig --list mysqld

mysqld          0:off 1:off 2:on 3:on 4:on 5:on 6:off

[root@localhost mysql]# ln -s /usr/local/mysql/bin/* /usr/local/bin/

[root@localhost mysql]# which mysqladmin

/usr/local/bin/mysqladmin

[root@localhost mysql]# mysqladmin -uroot password '123456'

[root@localhost mysql]# mysql -uroot -p123456

Welcome to the MySQL monitor.  Commands end with ; or g.

Your MySQL connection id is 2

Server version: 5.5.32 MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql>

```

4. PHPfastcgi方式)服务的安装和准备

```

[root@localhost mysql]# yum -y install zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel

[root@localhost mysql]# yum -y install freetype-devel libpng-devel gd libcurl-devel libxslt-devel

[root@localhost ~]# rpm -qa zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel

zlib-devel-1.2.3-29.el6.x86_64

libxml2-devel-2.7.6-14.el6.x86_64

libjpeg-turbo-devel-1.2.1-1.el6.x86_64

#这里仅缺少libiconv-devel

[root@localhost ~]# rpm -qa freetype-devel libpng-devel gd libcurl-devel libxslt-devel

freetype-devel-2.3.11-14.el6_3.1.x86_64

libpng-devel-1.2.49-1.el6_2.x86_64

libcurl-devel-7.19.7-37.el6_4.x86_64

libxslt-devel-1.1.26-2.el6_3.1.x86_64

gd-2.0.35-11.el6.x86_64

[root@localhost ~]# tar xf libiconv-1.14.tar.gz -C /usr/src/

[root@localhost ~]# cd /usr/src/libiconv-1.14/

[root@localhost libiconv-1.14]# ./configure --prefix=/usr/local/libiconv && make && make install

 [root@localhost ~]# rpm -ivh mhash-0.9.9.9-3.el6.x86_64.rpm

warning: mhash-0.9.9.9-3.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY

Preparing...                ########################################### [100%]

   1:mhash                  ########################################### [100%]

[root@localhost ~]# rpm -ivh libmcrypt-2.5.8-9.el6.x86_64.rpm

warning: libmcrypt-2.5.8-9.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY

Preparing...                ########################################### [100%]

   1:libmcrypt              ########################################### [100%]

[root@localhost ~]# rpm -ivh libmcrypt-devel-2.5.8-9.el6.x86_64.rpm

warning: libmcrypt-devel-2.5.8-9.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY

Preparing...                ########################################### [100%]

   1:libmcrypt-devel        ########################################### [100%]

[root@localhost ~]# rpm -ivh mcrypt-2.6.8-10.el6.x86_64.rpm

warning: mcrypt-2.6.8-10.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY

Preparing...                ########################################### [100%]

   1:mcrypt                 ########################################### [100%]

```

5. 开始安装PHPfastcgi方式)服务

1)解压配置PHP

```

[root@localhost ~]# tar xf php-5.3.28.tar.gz -C /usr/src/

[root@localhost ~]# cd /usr/src/php-5.3.28/

[root@localhost php-5.3.28]# ./configure

> --prefix=/usr/local/php5.3.28

> --with-mysql=/usr/local/mysql

> --with-iconv-dir=/usr/local/libiconv

> --with-freetype-dir

> --with-jpeg-dir

> --with-png-dir

> --with-zlib

> --with-libxml-dir=/usr

> --enable-xml

> --disable-rpath

> --enable-safe-mode

> --enable-bcmath

> --enable-shmop

> --enable-sysvsem

> --enable-inline-optimization

> --with-curl

> --with-curlwrappers

> --enable-mbregex

> --enable-fpm

> --enable-mbstring

> --with-mcrypt

> --with-gd

> --enable-gd-native-ttf

> --with-openssl

> --with-mhash

> --enable-pcntl

> --enable-sockets

> --with-xmlrpc

> --enable-zip

> --enable-soap

> --enable-short-tags

> --enable-zend-multibyte

> --enable-static

> --with-xsl

> --with-fpm-user=www

> --with-fpm-group=www

> --enable-ftp

+--------------------------------------------------------------------+

| License:                                                           |

| This software is subject to the PHP License, available in this     |

| distribution in the file LICENSE.  By continuing this installation |

| process, you are bound by the terms of this license agreement.     |

| If you do not agree with the terms of this license, you must abort |

| the installation process at this point.                            |

+--------------------------------------------------------------------+

Thank you for using PHP.

```

对于上面命令,部分参数说明如下:

1--prefix=/usr/local/php5.2.28

表示指定PHP的安装路径为/usr/local/php5.3.28

2--with-mysql=/usr/local/mysql

表示需要指定MySQL的安装路径,安装PHP需要的MySQL相关内容。当然,如果没有MySQL软件包,也可以不单独安装,这样的情况可使用--with-mysql=mysqlnd替代--with-mysql=/usr/local/mysql,因为PHP软件里已经自带了连接MySQL的客户端工具。

3--with-fpm-user=www

nginx表示指定PHP-FPM进程管理的用户为www,此处最好和Nginx服务用户统一

4--with-fpm-group=www

表示指定PHP-FPM进程管理的组为www,此处最好与Nginx服务用户组统一。

5--enable-fpm

表示激活PHP-FPM方式服务,即以FastCGIF方式运行PHP服务。

2)编译安装PHP

```

[root@localhost php-5.3.28]# ln -s /usr/local/mysql/lib/libmysqlclient.

libmysqlclient.a          libmysqlclient.so.18      

libmysqlclient.so         libmysqlclient.so.18.0.0  

[root@localhost php-5.3.28]# ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64/

[root@localhost php-5.3.28]# touch ext/phar/phar.phar

[root@localhost php-5.3.28]# make

[root@localhost php-5.3.28]# make install

[root@localhost php-5.3.28]#  ln -s /usr/local/php5.3.28/ /usr/local/php

[root@localhost php-5.3.28]# cd /usr/local/php

[root@localhost php]# cd /usr/src/php-5.3.28/

[root@localhost php-5.3.28]# ls php.ini*

php.ini-development  php.ini-production

[root@localhost php-5.3.28]# cp php.ini-production /usr/local/php/lib/php.ini

[root@localhost php-5.3.28]# cd /usr/local/php/etc/

[root@localhost etc]# ls

pear.conf  php-fpm.conf.default

[root@localhost etc]# cp php-fpm.conf.default php-fpm.conf

[root@localhost etc]#  /usr/local/php/sbin/php-fpm

[root@localhost etc]# netstat -antup | grep 9000

tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      129604/php-fpm      

[root@localhost etc]# vim php-fpm.conf

151 listen = 127.0.0.1:9000  #若设为分布式部署,需要将IP地址改为对方IP地址

```

6. 配置nginx支持PHP程序请求访问

```

[root@localhost etc]# cd /usr/local/nginx/conf/

[root@localhost conf]# cp nginx.conf nginx.conf.bak

[root@localhost conf]# vim nginx.conf

worker_processes  1;

error_log logs/error.log;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {

        listen       80;

        server_name  blog.yunjisuan.com;

        location / {

            root   html/blog;

            index  index.html index.htm;

        }

        location ~ .*.(php|php5)?$ {

                root html/blog;

                fastcgi_pass 127.0.0.1:9000;

                fastcgi_index index.php;

                include fastcgi.conf;

        }

    }

}

 # 启动nginx

[root@localhost nginx]# cd html/

[root@localhost html]# ls

50x.html  index.html

[root@localhost html]# mkdir blog

[root@localhost html]# ls

50x.html  blog  index.html

[root@localhost html]# echo "`hostname -I` blog.yunjisuan.com" > blog/index.html

[root@localhost blog]# vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.214.163 LNMP blog.yunjisuan.com

[root@localhost html]# /usr/local/nginx/sbin/nginx

[root@localhost html]# netstat -antup | grep 80

tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      129672/nginx        

tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1380/sshd           

tcp        0      0 :::22                       :::*                        LISTEN      1380/sshd           

[root@localhost blog]# curl blog.yunjisuan.com

192.168.184.137  blog.yunjisuan.com

[root@localhost blog]# vim test_info.php

<?php phpinfo(); ?>

 #本机/我的电脑/磁盘C/Windows/system32/drivers/etc/hosts

 192.168.184.137 blog.yunjisuan.com                                   

```

到浏览器查看静态网页内容

 

到浏览器查看动态网页内容

检查MySQLPHP的连接是否成功

```

[root@localhost blog]# vim test_mysql.php

<?php

        //$link_id=mysql_connect('主机名','用户','密码');

        $link_id=mysql_connect('localhost','root','123456');

        if($link_id){

                echo "mysql successful by daisy ";

        }else{

                echo mysql_error();

        }       

?>

[root@localhost blog]# ln -s /usr/local/php/bin/* /usr/local/bin/

[root@localhost blog]# ls

index.html  test_info.php  test_mysql.php

[root@localhost blog]# php test_mysql.php    #激活php脚本

mysql successful by daisy

[root@localhost blog]#

```

通过浏览器查看测试mysqlphp脚本

 

### FastCGI介绍

1.  CGI

CGI的全称为“通用网关接口”(Common Gateway Interface),为HTTP服务器与其他机器上的程序服务通信交流的一种工具,CGI程序须运行在网络服务器上。

传统CGI接口方式的主要缺点是性能较差,因为每次HTTP服务器遇到动态程序时都需要重新启动解析器来执行解析,之后结果才会被返回给HTTP服务器。这在处理高并发访问时几乎是不可用的,因此就诞生了FastCGI。另外,传统的CGI接口方式安全性也很差,故而现在已经很少被使用了。

2. FastCGI

FastCGI是一个可伸缩的,高速地在HTTP服务器和动态脚本语言间通信的接口(在Linux下,FastCGI接口即为socket,这个socket可以是文件socket,也可以是IP socket),主要优点是把动态语言和HTTP服务器分离出来。多数流行的HTTP服务器都支持FastCGI,包括ApacheNginxLighttpd等。

同时,FastCGI也被许多脚本语言所支持,例如当前比较流程的脚本语言PHPFastCGI接口采用的是C/S架构,它可以将HTTP服务器和脚本解析服务器分开,同时还能在脚本解析服务器上启动一个或多个脚本来解析守护进程。当HTTP服务器遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求,或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。

 FastCGI的重要特点如下:

HTTP服务器和动态脚本语言间通信的接口或工具。

可把动态语言解析和HTTP服务器分离开。

NginxApacheLighttpd,以及多数动态语言都支持FastCGI

FastCGI接口方式采用C/S结构,分为客户端(HTTP服务器)和服务器端(动态语言解析服务器)

PHP动态语言服务器端可以启动多个FastCGI的守护进程(例如php-fpmfcgi process mangement))

HTTP服务器通过(例如Nginx fastcgi_passFastCGI客户端和动态语言FastCGI服务器端通信(例如php-fpm

3. Nginx FastCGI的运行原理

Nginx不支持对外部动态程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket,为了调用CGI程序,还需要一个FastCGIwrapper(可以理解为用于启动另一个程序的程序),这个wrappper绑定在某个固定的socket上,如端口或文件socket。当NginxCGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接收到请求,然后派生出一个新的线程,这个线程调用解释器或外部程序处理脚本来读取返回的数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程。

![屏幕快照 2017-07-13 下午9.09.02.png-535.6kB](https://img-blog.csdnimg.cn/20181126213133843.?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzMwNDgwNA==,size_16,color_FFFFFF,t_70)

FastCGI的主要优点是把动态语言和HTTP服务器分离开来,使Nginx专门处理静态请求及向后转发的动态请求,而PHP/PHP-FPM服务器则专门解析PHP动态请求。

原文地址:https://www.cnblogs.com/woshifanren/p/10050997.html