`
wx1569466809
  • 浏览: 72240 次
文章分类
社区版块
存档分类
最新评论

LNMP架构介绍、安装PHP(php-fpm)

 
阅读更多

第十一章 LNMP架构

12.1 LNMP架构介绍

>LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构。Nginx中的PHP是以fastcgi的方式结合Nginx的,可以理解为Nginx代理了PHP的fastcgi。

LNMP工作模式

mark

  • 和LAMP不同的是,LNMP中提供web服务的是Nginx。
  • 在LNMP架构中PHP是作为一个独立的服务存在的,这个服务叫做php-fpm。
  • Nginx直接处理静态请求(支持的并发更高,速度比Apache快),动态请求转发给php-fpm处理。

CGI、FastCGI、PHP-CGI与PHP-FPM概念

CGI

CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。
CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php,perl,tcl等。

FastCGI

FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。它还支持分布式的运算,即FastCGI程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。
FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail-Over特性等等。

FastCGI特点:

  1. FastCGI具有语言无关性
  2. FastCGI在进程中的应用程序,独立于核心web服务器运行,提供了一个比API更安全的环境。APIs把应用程序的代码与核心的web服务器链接在一起,这意味着在一个错误的API的应用程序可能会损坏其他应用程序或核心服务器。 恶意的API的应用程序代码甚至可以窃取另一个应用程序或核心服务器的密钥。
  3. FastCGI技术目前支持语言有:C/C++、Java、Perl、Tcl、Python、SmallTalk、Ruby等。相关模块在Apache, ISS, Lighttpd等流行的服务器上也是可用的。
  4. FastCGI的不依赖于任何Web服务器的内部架构,因此即使服务器技术的变化, FastCGI依然稳定不变。

FastCGI工作原理:

  1. Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)
  2. FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。
  3. 当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
  4. FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出了。

在上述情况中,你可以想象CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部扩展并重初始化全部数据结构。使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接(Persistent database connection)可以工作。

FastCGI的不足:
因为是多进程,所以比CGI多线程消耗更多的服务器内存,PHP-CGI解释器每进程消耗7至25兆内存,将这个数字乘以50或100就是很大的内存数。
Nginx 0.8.46+PHP 5.2.14(FastCGI)服务器在3万并发连接下,开启的10个Nginx进程消耗150M内存(15M* 10=150M),开启的64个php-cgi进程消耗1280M内存(20M *64=1280M),加上系统自身消耗的内存,总共消耗不到2GB内存。如果服务器内存较小,完全可以只开启25个php-cgi进程,这样php-cgi消耗的总内存数才500M。

PHP-CGI

PHP-CGI是PHP自带的FastCGI管理器。
PHP-CGI的不足:

  1. php-cgi变更php.ini配置后需重启php-cgi才能让新的php-ini生效,不可以平滑重启。
  2. 直接杀死php-cgi进程,php就不能运行了。(PHP-FPM和Spawn-FCGI就没有这个问题,守护进程会平滑从新生成新的子进程。)

PHP-FPM

PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的,可以在 http://php-fpm.org/download 下载。
PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用。
PHP5.3.3已经集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多有点,所以被PHP官方收录了。在./configure的时候带 –enable-fpm参数即可开启PHP-FPM。

Spawn-FCGI

Spawn-FCGI是一个通用的FastCGI管理服务器,它是lighttpd中的一部份,很多人都用Lighttpd的Spawn-FCGI进行FastCGI模式下的管理工作,不过有不少缺点。而PHP-FPM的出现多少缓解了一些问题,但PHP-FPM有个缺点就是要重新编译,这对于一些已经运行的环境可能有不小的风险(refer),在php 5.3.3中可以直接使用PHP-FPM了。
Spawn-FCGI目前已经独成为一个项目,更加稳定一些,也给很多Web 站点的配置带来便利。已经有不少站点将它与nginx搭配来解决动态网页。
注: 最新的Spawn-FCGI可以到lighttpd.net网站搜索“Spawn-FCGI”找到它的最新版本发布地址。

PHP-FPM与spawn-CGI对比

PHP-FPM的使用非常方便,配置都是在PHP-FPM.ini的文件内,而启动、重启都可以从php/sbin/PHP-FPM中进行。更方便的是修改php.ini后可以直接使用PHP-FPM reload进行加载,无需杀掉进程就可以完成php.ini的修改加载。
结果显示使用PHP-FPM可以使php有不小的性能提升。PHP-FPM控制的进程cpu回收的速度比较慢,内存分配的很均匀。
Spawn-FCGI控制的进程CPU下降的很快,而内存分配的比较不均匀。有很多进程似乎未分配到,而另外一些却占用很高。可能是由于进程任务分配的不均匀导致的。而这也导致了总体响应速度的下降。而PHP-FPM合理的分配,导致总体响应的提到以及任务的平均。

本节选自: http://www.nowamagic.net/librarys/veda/detail/1319/

12.2 安装MySQL

卸载MySQL

直接删除MySQL安装时的相关文件。

[root@adailinux ~]# rm -rf /usr/local/mysql 
[root@adailinux ~]# rm -rf /etc/init.d/mysqld 
[root@adailinux ~]# rm -rf /data/mysql

安装MySQL

在LNMP环境和LAMP环境安装MySQL的方法一样。

12.3-12.4 PHP安装

和LAMP安装PHP有区别,需要开启php-fpm服务。

准备工作

安装包卸载&解压

[root@adailinux ~]# cd /usr/local/src/

下载安装包:
[root@adailinux src]# wget http://cn2.php.net/distributions/php-5.6.30.tar.gz  

解压:
[root@adailinux src]# tar zxvf php-5.6.30.tar.gz

创建账号

[root@adailinux src]# useradd -s /sbin/nologin php-fpm

说明: 该账号用来运行php-fpm服务,因为在LNMP环境中,PHP是以一种服务的形式独立存在的。

安装php

如果之前安装过PHP,需要清除其原有配置:

[root@adailinux src]# cd php-5.6.30
[root@adailinux src]# make clean

环境配置

[root@adailinux src]# cd php-5.6.30

[root@adailinux src]# ./configure --prefix=/usr/local/php-fpm --with-config-file-path=/usr/local/php-fpm/etc --enable-fpm --with-fpm-user=php-fpm --with-fpm-group=php-fpm --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-pdo-mysql=/usr/local/mysql --with-mysql-sock=/tmp/mysql.sock --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --with-pear --with-curl  --with-openssl  

报错:
错误1:

configure: error: xml2-config not found. Please check your libxml2 installation.

解决办法:

[root@adailinux php-5.6.30]# yum list |grep libxml2  

查找相关库的安装包:
[root@adailinux php-5.6.30]# yum list |grep libxml2
libxml2.x86_64                          2.9.1-6.el7_2.3                @anaconda
libxml2.i686                            2.9.1-6.el7_2.3                base     
libxml2-devel.i686                      2.9.1-6.el7_2.3                base     
libxml2-devel.x86_64                    2.9.1-6.el7_2.3                base     
libxml2-python.x86_64                   2.9.1-6.el7_2.3                base     
libxml2-static.i686                     2.9.1-6.el7_2.3                base     
libxml2-static.x86_64                   2.9.1-6.el7_2.3                base     

选择包进行安装:  
[root@adailinux php-5.6.30]# yum install -y libxml2 libxml2-devel

错误2:

configure: error: Cannot find OpenSSL's <evp.h>

解决办法:

[root@adailinux php-5.6.30]# yum install -y openssl openssl-devel

错误3:

configure: error: Please reinstall the libcurl distribution -
    easy.h should be in <curl-dir>/include/curl/

解决办法:

[root@adailinux php-5.6.30]# yum install -y libcurl libcurl-devel

错误3:

configure: error: jpeglib.h not found.

解决办法:

[root@adailinux php-5.6.30]# yum install -y libjpeg libjpeg-turbo-devel 

错误4:

configure: error: png.h not found.

解决办法:

[root@adailinux php-5.6.30]# yum install -y libpng libpng-devel

错误5:

configure: error: freetype-config not found.

解决办法:

[root@adailinux php-5.6.30]# yum install -y freetype freetype-devel

错误6:

configure: error: mcrypt.h not found. Please reinstall libmcrypt.

解决办法:

[root@adailinux php-5.6.30]# yum install -y libmcrypt libmcrypt-devel

说明: 每次报错后根据提示查找相应的库的安装包,选择包进行安装,安装完成后重新配置即可!

配置完成后进行检测:

[root@adailinux php-5.6.30]# echo $?
0

总结一下需要安装的包:

[root@adailinux php-5.6.30]#  yum install  -y  gcc gcc-c++ libxml2-devel openssl-devel libcurl-devel libjpeg-devel libpng-devel freetype libmcrypt-devel

编译&安装

编译:

[root@adailinux php-5.6.30]# make 

报错: virtual memory exhausted: Cannot allocate memory #虚拟内存耗尽:无法分配内存

解决办法:
1、停掉虚拟机中未在使用的进程
2、临时增加swap分区内存:

[root@adai002 ~]# dd if=/dev/zero of=/tmp/newdisk bs=1M count=100  手动创建一个新分区
记录了100+0 的读入
记录了100+0 的写出
104857600字节(105 MB)已复制,5.72931 秒,18.3 MB/秒
[root@adai002 ~]# du -sh /tmp/newdisk
100M	/tmp/newdisk
[root@adai002 ~]# mkswap /tmp/newdisk  格式化该swap分区
正在设置交换空间版本 1,大小 = 102396 KiB
无标签,UUID=d42e907a-aae0-4d5f-bf58-586fac415f48
[root@adai002 ~]# free -m  
              total        used        free      shared  buff/cache   available
Mem:            984         114         626           6         244         706
Swap:          2047           0        2047
[root@adai002 ~]# swapon /tmp/newdisk  挂载到原swap分区
swapon: /tmp/newdisk:不安全的权限 0644,建议使用 0600。
[root@adai002 ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:            984         114         626           6         244         707
Swap:          2147           0        2147
[root@adai002 ~]# chmod 0600 /tmp/newdisk  更改权限以保安全

待PHP编译完成后要卸载掉该分区
[root@adai002 ~]# swapoff /tmp/newdisk   卸载分区

安装:

[root@adailinux php-5.6.30]# make install

php-fpm相关命令:

执行PHP相关命令的两种方式:

方法1:
[root@adailinux php-fpm]# /usr/local/php-fpm/sbin/php-fpm -m

方法2:
[root@adailinux php-fpm]# /usr/local/php-fpm/bin/php -m

php-fpm配置文件语法检测:

[root@adailinux php-fpm]# /usr/local/php-fpm/sbin/php-fpm -t

配置

添加配置文件

将配置文件添加到php-fpm配置文件目录:

[root@adailinux php-5.6.30]# cp php.ini-production /usr/local/php-fpm/etc/php.ini

配置文件调试

切换至配置文件所在目录:
[root@adailinux php-5.6.30]# cd /usr/local/php-fpm/etc/  

手动添加配置文件,写入如下内容:
[root@adailinux etc]# vim php-fpm.conf

[global]
#定义全局参数
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
[www]
listen = /tmp/php-fcgi.sock
#监听地址,也可以写:listen = 127.0.0.1::9000,本地监听,也可以监听其他IP:port
#此处格式会影响配置Nginx和PHP结合时Nginx寻址PHP的路径
listen.mode = 666
#当监听的为socket文件时该部分才生效,用于指定.sock文件的权限
user = php-fpm
group = php-fpm
#定义php-fpm服务的用户
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024
#以上部分为进程相关信息

配置启动脚本

切换至文件源目录:
[root@adailinux etc]# cd /usr/local/src/php-5.6.30

添加启动脚本到系统配置:
[root@adailinux php-5.6.30]#  cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm

更改文件权限:
[root@adailinux php-5.6.30]# chmod 755 /etc/init.d/php-fpm

添加到系统服务:
[root@adailinux php-5.6.30]# chkconfig --add php-fpm
设置开机启动:
[root@adailinux php-5.6.30]# chkconfig php-fpm on  

启动php-fpm服务:
[root@adailinux php-5.6.30]# service php-fpm start
Starting php-fpm  done

12.5 Nginx介绍

>Nginx("engine x")是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、新浪、网易、腾讯、 淘宝等。

Nginx应用场景:

web服务器、反向代理、负载均衡

Nginx分支

淘宝基于Nginx开发的Tengine,使用上和Nginx一致,服务名,配置文件名都一样,和Nginx的最大区别在于Tengine增加了一些定制化模块,在安全限速方面表现突出,另外它支持对js,css合并。

Nginx核心+lua相关的组件和模块组成了一个支持lua的高性能web容器openresty,参考 http://jinnianshilongnian.iteye.com/blog/2280928

OpenResty

OpenResty是一个基于Nginx与Lua的高性能Web平台,其内部集成了大量精良的Lua库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
OpenResty通过汇聚各种设计精良的Nginx模块(主要由OpenResty团队自主开发),从而将Nginx有效地变成一个强大的通用Web应用平台。这样,Web开发人员和系统工程师可以使用Lua脚本语言调动Nginx支持的各种C以及Lua模块,快速构造出足以胜任10K乃至1000K以上单机并发连接的高性能Web应用系统。
OpenResty® 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。
本节摘自: http://openresty.org/cn/

Lua

Lua是一种轻量级、可嵌入式的脚本语言,这样可以非常容易的嵌入到其他语言中使用。另外Lua提供了协程并发,即以同步调用的方式进行异步执行,从而实现并发,比起回调机制的并发来说代码更容易编写和理解,排查问题也会容易。Lua还提供了闭包机制,函数可以作为First Class Value 进行参数传递,另外其实现了标记清除垃圾收集。
因为Lua的小巧轻量级,可以在Nginx中嵌入Lua VM,请求的时候创建一个VM,请求结束的时候回收VM。

ngx_lua

ngx_lua是Nginx的一个模块,将Lua嵌入到Nginx中,从而可以使用Lua来编写脚本,这样就可以使用Lua编写应用脚本,部署到Nginx中运行,即Nginx变成了一个Web容器;这样开发人员就可以使用Lua语言开发高性能Web应用了。
ngx_lua提供了与Nginx交互的很多的API(API就是操作系统留给应用程序的一个调用接口,应用程序通过调用操作系统的API而使操作系统去执行应用程序的命令/动作。),对于开发人员来说只需要学习这些API就可以进行功能开发,而对于开发web应用来说,如果接触过Servlet的话,其开发和Servlet类似,无外乎就是知道接收请求、参数解析、功能处理、返回响应这几步的API是什么样子的。

转载于:https://my.oschina.net/1995blog/blog/1594230

分享到:
评论

相关推荐

    lnmp+fpm安装脚本

    此 LNMP+FPM 安装脚本通过一系列的自动化操作实现了 LNMP 架构的快速搭建,包括基础软件包的安装、配置及环境变量设置等。这对于需要快速部署 LNMP 架构的开发人员来说非常实用,大大减少了手动配置的时间和复杂度。...

    LNMP架构教程学习手册

    LNMP架构是Linux操作系统、Nginx web服务器、MySQL数据库和PHP编程语言的组合,这种架构在Web开发领域被广泛采用,特别是在需要高性能、高并发处理能力的网站中。本教程将带你深入理解和掌握LNMP架构,从基础到实践...

    Ubuntu下apt-get方式安装LNMP

    LNMP(Linux、Nginx、MySQL、PHP)是一种常见的Web服务器架构,本文将指导读者使用apt-get方式在Ubuntu系统下安装LNMP环境。 一、安装Nginx LNMP环境的核心组件是Nginx,使用以下命令安装Nginx: sudo apt-get ...

    搭建lnmp或是lamp架构

    #### LNMP架构搭建: 1. **Nginx的安装与配置**: - 安装依赖包:`sudo yum install gcc zlib-devel openssl-devel pcre-devel -y` - 下载并解压Nginx源码包。 - 配置Nginx: ```shell ./configure --prefix=/...

    安装lnmp中的PHP的包

    首先,我们需要理解PHP在LNMP架构中的作用。PHP(Hypertext Preprocessor,超文本预处理器)是一种开源的服务器端脚本语言,主要应用于Web开发,可以嵌入到HTML中,实现动态网页。Nginx则是一个高性能的HTTP和反向...

    Centos 7.4 LNMP架构_部署 glpi 9.4.3.docx

    ### Centos 7.4 LNMP架构部署GLPI 9.4.3 #### 一、准备工作 在开始部署之前,我们需要确保系统已准备好并安装了必要的软件包。本指南将帮助您通过以下步骤在Centos 7.4上设置LNMP (Linux Nginx MySQL PHP) 架构,...

    php-fpm 占用CPU过高,100%的解决方法

    文章中提到了一个具体的案例:在部署了一个基于LNMP(Linux + Nginx + MySQL + PHP)架构的网站之后,原本运行平稳的服务器突然出现了CPU占用率飙升至100%的情况。进一步通过`top`命令观察,发现是php-fpm进程导致的...

    源码安装lnmp包

    本教程将详细介绍如何在CentOS 6.8环境下通过源码安装LNMP环境。 ### 一、Nginx安装 Nginx是一款轻量级、高性能的HTTP和反向代理服务器,以其低内存占用和高效的处理能力而受到广泛欢迎。 1. 下载源码包: 首先...

    Python-阿里云配置PHP集成环境LNMP

    在LNMP架构中,Nginx主要负责接收客户端的HTTP请求,并根据配置转发到后端的PHP解释器。 3. **MySQL**:作为流行的开源关系型数据库管理系统,MySQL在处理结构化数据方面表现出色,广泛应用于Web应用程序的数据存储...

    LNMP环境搭建1

    【LNMP环境搭建】指的是在Linux系统中搭建Nginx(网络服务器)、MySQL(数据库服务)和PHP(脚本语言解析器)的组合,这种架构常用于构建高性能的Web服务。与LAMP(Linux、Apache、MySQL、PHP)架构相比,LNMP的主要...

    云计算基础架构-LNMP服务构建.pptx

    **LNMP组成介绍** 1. **Nginx网站服务器**: Nginx是一款高性能的HTTP和反向代理服务器,适用于处理高并发的动态网站。它的设计采用了分阶段资源分配技术,降低了CPU和内存的使用,确保了服务的稳定性和高效性。...

    编译安装PHP7+LNMP+扩展技术文档

    ### 编译安装 PHP7+LNMP+扩展技术文档 #### 概述 本文档将指导您通过编译的方式安装 PHP7 和 LNMP (Linux, Nginx, MySQL, PHP) 环境,并进一步安装 PHP 的扩展如 Redis 和 MongoDB。整个过程详细地分解为多个步骤...

    centos7安装LNMP服务器教程

    随着互联网技术的发展,越来越多的应用程序选择基于 Linux、Nginx、MySQL 和 PHP(简称 LNMP)架构来构建高性能的服务平台。本教程将详细介绍如何在 CentOS 7 系统下搭建 LNMP 服务器环境,并确保所有步骤均在命令行...

    【25】基于Centos7.5源码编译LNMP架构.docx

    通过源码编译安装LNMP架构不仅可以充分利用Nginx的高性能特点,还能根据实际需求定制特定的配置与功能,适用于对性能和定制性要求较高的场景。尽管这一过程可能较为复杂,但最终的结果将会带来显著的性能提升和灵活...

    LNMP源码安装详细笔记(Linux+Nginx+Mysql+php).pdf

    【LNMP架构详解】 LNMP(Linux + Nginx + MySQL + PHP)是一种常见的Web服务器架构,用于构建高性能的动态网站和应用。本篇笔记详细记录了在Linux环境下,通过源代码方式安装LNMP各组件的过程。 首先,我们来看...

    Day-4-阿里云lnmp源码安装实践

    首先,我们需要了解LNMP架构的基础。Linux作为开源操作系统,提供了一个稳定的平台来运行各种服务。Nginx是一款轻量级且高效的Web服务器,它能处理高并发请求,并且常被用作反向代理和负载均衡器。MySQL是一种流行的...

    LAMP&LNMP安装教程

    ### LNMP架构详解 **Nginx**: Nginx是一款高性能的HTTP和反向代理服务器,以其轻量级、高并发的特点而闻名。 **LNMP安装步骤**: 1. **更新系统**: 同LAMP。 2. **安装Nginx**: 使用`sudo apt-get install nginx`...

    centos7离线lnmp

    首先,我们需要了解LNMP架构的基本组成部分: 1. **Linux**:作为基础操作系统,CentOS 7是一款稳定且被广泛使用的Linux发行版,适合企业级服务器部署。 2. **Nginx**:Nginx是一款高性能的HTTP和反向代理服务器,...

    LNMP安装与配置

    wget http://blog.s135.com/soft/linux/nginx_php/phpfpm/php-5.2.14-fpm-0.5.14.diff.gz wget http://blog.s135.com/soft/linux/nginx_php/mysql/mysql-5.5.3-m3.tar.gz wget ...

    LNMP 一键安装脚本

    - **安装PHP**:选择合适的PHP版本(如PHP-FPM),配置与Nginx的接口,使两者能够协同工作。 - **配置文件**:调整各组件的配置文件以适应服务器环境,如Nginx的虚拟主机配置、PHP的性能优化参数等。 - **启动服务**...

Global site tag (gtag.js) - Google Analytics