LNMP环境之PHP

11.3 PHP-FPM配置文件详解

第1章 LNMP之PHP服务

1.1 FastCGI介绍

1.1.1 什么是FastCGI

FastCGI是一个可伸缩的,高速地在HTTP服务器和动态脚本语言间通信的接口,主要优点是把动态语言和HTTP服务器分离开来。

1.1.2 FastCGI的特点

  • HTTP服务器和动态脚本语言间通信的接口或工具
  • 可把动态语言解析和HTTP服务器分离开
  • Nginx、Apache、Lighttpd以及多数动态语言都支持FastCGI
  • FastCGI接口方式采用C/S结构,分为客户端(HTTP端)和服务端(动态语言解析服务器)
  • PHP动态语言服务器端可以启动多个FastCGI的守护进程。例如:php-fpm(fcgi process mangement)
  • HTTP服务器通过FastCGI客户端和动态语言FastCGI服务端通信

1.1.3 Nginx FastCGI运行原理

Nginx不支持对外部动态程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linxu下是socket,为了调用CGI程序还需要一个FastCGI的wrapper(可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定的socket上,如端口或文件socket。

当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接收到请求,然后派生出一个新的线程,这个线程调用解释器或外部程序处理脚本来读取返回的数据;接着wrapper再将返回的数据通过FastCGI接口沿着固定的socket传递给Nginx;最后将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程。

图片[1]|LNMP环境之PHP|leon的博客

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

第2章 安装PHP服务

2.1 安装准备

2.1.1 解决PHP软件的依赖关系(需要base源的依赖包)

[root@web02 ~]# yum install -y zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel freetype-devel libpng-devel gd-devel libcurl-devel libxslt-devel
...省略部分输出信息...
Installed:
  freetype-devel.x86_64 0:2.3.11-17.el6       gd-devel.x86_64 0:2.0.35-11.el6              
  libcurl-devel.x86_64 0:7.19.7-53.el6_9      libjpeg-turbo-devel.x86_64 0:1.2.1-3.el6_5   
  libpng-devel.x86_64 2:1.2.49-2.el6_7        libxml2-devel.x86_64 0:2.7.6-21.el6_8.1      
  libxslt-devel.x86_64 0:1.1.26-2.el6_3.1   

Dependency Installed:
  fontconfig-devel.x86_64 0:2.8.0-5.el6         gd.x86_64 0:2.0.35-11.el6                  
  libX11-devel.x86_64 0:1.6.4-3.el6             libXau-devel.x86_64 0:1.0.6-4.el6          
  libXpm.x86_64 0:3.5.10-2.el6                  libXpm-devel.x86_64 0:3.5.10-2.el6         
  libXt.x86_64 0:1.1.4-6.1.el6                  libgcrypt-devel.x86_64 0:1.4.5-12.el6_8    
  libgpg-error-devel.x86_64 0:1.7-4.el6         libidn-devel.x86_64 0:1.18-2.el6           
  libxcb-devel.x86_64 0:1.12-4.el6              libxslt.x86_64 0:1.1.26-2.el6_3.1          
  xorg-x11-proto-devel.noarch 0:7.7-14.el6    

Dependency Updated:
  curl.x86_64 0:7.19.7-53.el6_9               libcurl.x86_64 0:7.19.7-53.el6_9             

Complete!

2.1.2 解决PHP软件的依赖关系(需要epel源的依赖包)

[root@web02 ~]# yum install -y libmcrypt-devel mhash mcrypt
Installed:
  libmcrypt-devel.x86_64 0:2.5.8-9.el6              mcrypt.x86_64 0:2.6.8-10.el6            
  mhash.x86_64 0:0.9.9.9-3.el6                    

Dependency Installed:
  libmcrypt.x86_64 0:2.5.8-9.el6                                                            

Complete!
  • 安装软件说明:
  1. libmcrypt-devel:对于程序运行时添加移除算法很有用,目前已经不被官方支持。其软件地址为:http://mcrypt.hellug.gr/
  2. mhash:基于离散数学原理不可逆向的PHP加密方式扩展库,其在默认情况下不会开启。mhash可以用于创建校验数值、消息摘要、消息认证码以及无需原文的关键信息保存(如密码)等。
  3. mcrypt:是PHP里面重要的加密支持扩展库,该库默认情况下不开启。可以实现加密解密功能,就是既能将明文加密,也能还原密文。

2.1.3 编译安装libiconv(PHP5.5后已内置此依赖库,不需要单独安装了)

[root@web02 ~]# cd /server/tools/
[root@web02 ~]# wget <a href="http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz">http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz</a>
[root@web02 tools]# tar xf libiconv-1.14.tar.gz
[root@web02 tools]# cd libiconv-1.14
[root@web02 libiconv-1.14]# ./configure --prefix=/usr/local/libiconv
[root@web02 libiconv-1.14]# make && make install
提示:libiconv相关信息地址为:http://www.gnu.org/software/libiconv/

2.2 编译安装PHP

提示:PHP软件下载地址:http://php.net/downloads.php

2.2.1 下载解压PHP软件

[root@web02 ~]# cd /server/tools/
[root@web02 tools]# tar xf php-5.5.32.tar.gz

2.2.2 配置PHP源文件

[root@web02 tools]# cd php-5.5.32
[root@web02 php-5.5.32]# ./configure \
--prefix=/application/php-5.5.32 \
--with-mysql=/application/mysql/ \
--with-pdo-mysql=mysqlnd \
--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-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--with-curl \
--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-soap \
--enable-short-tags \
--enable-static \
--with-xsl \
--with-fpm-user=www \
--with-fpm-group=www \
--enable-ftp \
--enable-opcache=no

...省略部分输出...
Generating files
configure: creating ./config.status
creating main/internal_functions.c
creating main/internal_functions_cli.c
+--------------------------------------------------------------------+
| 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.
  • 配置参数说明:
--prefix=/application/php-5.5.32 \          #指定PHP的安装路径
--with-mysql=/application/mysql/ \          #指定MySQL数据库的路径
--with-pdo-mysql=mysqlnd \                  #使用PHP默认自带的mysql数据库
--with-iconv-dir=/usr/local/libiconv \      #为XMLRPC-EPI指定iconv目录
--with-freetype-dir \                       #指定FreeType 2的安装路径
--with-jpeg-dir \                           #指定libjpeg的安装路径
--with-png-dir \                            #指定libpng的安装路径
--with-zlib \                               #指定libz的安装路径
--with-libxml-dir=/usr \                    #指定libxml2的安装路径
--enable-xml \                              #启用xml,帮助中只有--disable-xml
--disable-rpath \                           #搜索路径时禁用传递额外的运行时库
--enable-bcmath \                           #启用bc风格精确的数学函数
--enable-shmop \                            #启用shmop支持
--enable-sysvsem \                          #启用System V信号量的支持
--enable-inline-optimization \              #启用System V共享内存支持
--with-curl \                               #包含cURL支持
--enable-mbregex \                          #启用多字节的正则表达式,帮助中只有--disable-regex
--enable-fpm \                              #激活PHP-FRM方式服务,即以FastCGI方式运行PHP服务
--enable-mbstring \                         #启用多字节的字符串支持
--with-mcrypt \                             #包含mcrypt支持
--with-gd \                                 #包含GD支持(后面可以接DIR,是GD的基本库目录)
--enable-gd-native-ttf \                    #启用TrueType字体的字符串支持
--with-openssl \                            #包含OpenSSL支持(需要0.9.6以上的OpenSSL版本支持)
--with-mhash \                              #包含mhash支持
--enable-pcntl \                            #启用pcntl支持(只在CLI/CGI模式下)
--enable-sockets \                          #启用sockets支持
--with-xmlrpc \                             #包含XMLRPC-EPI支持(后面可以接DIR)
--enable-soap \                             #启用SOAP支持
--enable-short-tags \                       #启用短格式的< 作为默认开始标记
--enable-static \                           #建立静态库,默认为yes
--with-xsl \                                #包含XSL支持(后面可以接DIR,是libxslt的基本库目录)
--with-fpm-user=www \                       #指定PHP-FRM进程管理的用户为www(Nginx的管理用户)
--with-fpm-group=www \                      #指定PHP-FRM进程管理的组为www(Nginx的管理组)
--enable-ftp \                              #启用FTP支持
--enable-opcache=no                         #关闭Zend OPcache支持
提示:\代表换行输入,更多参数可以通过./configure –help获得。

2.2.3 防止PHP安装编译时报错

[root@web01 php-5.5.32]# ln -s /application/mysql/lib/libmysqlclient.so.18  /usr/lib64/
[root@web01 php-5.5.32]# touch ext/phar/phar.phar

2.2.4 编译并安装PHP

[root@web01 php-5.5.32]# make && make install
...省略部分输出...
Build complete.
Don't forget to run 'make test'.
...省略部分输出...

2.3 配置PHP

2.3.1 创建php文件夹软链接

[root@web01 php-5.5.32]# ln -s /application/php-5.5.32/ /application/php
[root@web01 php-5.5.32]# ll /application/ | grep php
lrwxrwxrwx  1 root root   24 Sep 13 19:08 php -> /application/php-5.5.32/
drwxr-xr-x  9 root root 4096 Sep 13 19:01 php-5.5.32

2.3.2 设置与Nginx相关的配置文件

[root@web01 ~]# cp /server/tools/php-5.5.32/php.ini-production /application/php/lib/php.ini
[root@web01 php-5.5.32]# ll /application/php/lib/php.ini
-rw-r--r-- 1 root root 69266 Sep 13 19:13 /application/php/lib/php.ini
  • 配置文件说明:
[root@web01 ~]# ll /server/tools/php-5.5.32/php.ini-*
-rw-r--r-- 1 1001 1001 69236 Feb  2  2016 /server/tools/php-5.5.32/php.ini-development
-rw-r--r-- 1 1001 1001 69266 Feb  2  2016 /server/tools/php-5.5.32/php.ini-production
  • ini-development:开发使用的PHP配置文件,开启了很多debug调试信息输出,可以给开发人员使用
  • ini-production:生产环境使用的PHP配置文件,没有开发配置文件的debug调试信息输出,适合已经调试好的PHP生产环境使用

2.3.3 设置与MySQL相关的配置文件

[root@web01 ~]# cp /application/php/etc/php-fpm.conf.default /application/php/etc/php-fpm.conf
[root@web01 ~]# ll /application/php/etc/php-fpm.conf
-rw-r--r-- 1 root root 22609 Sep 13 19:16 /application/php/etc/php-fpm.conf

2.4 启动PHP

[root@web01 ~]# /application/php/sbin/php-fpm
[root@web01 ~]# lsof -i:9000                        #PHP服务默认使用9000端口
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
php-fpm 28260 root    7u  IPv4 172091      0t0  TCP localhost:cslistener (LISTEN)
php-fpm 28261  www    0u  IPv4 172091      0t0  TCP localhost:cslistener (LISTEN)
php-fpm 28262  www    0u  IPv4 172091      0t0  TCP localhost:cslistener (LISTEN)
[root@web01 ~]# ps -ef | grep php
root      28260      1  0 19:18          00:00:00 php-fpm: master process (/application/php-5.5.32/etc/php-fpm.conf)
www       28261  28260  0 19:18          00:00:00 php-fpm: pool www           
www       28262  28260  0 19:18          00:00:00 php-fpm: pool www           
root      28265  33071  0 19:18 pts/0    00:00:00 grep php

第3章 配置PHP对Nginx和MySQL的支持

3.1 配置Nginx支持PHP程序请求访问

3.1.1 修改Nginx配置文件

[root@web01 ~]# vim /application/nginx/conf/extra/blog.conf
server {
        listen       80;
        server_name  blog.leon.com;
        location / {
            root   html/blog;
            index  index.html index.htm index.php;      #添加index.php首页支持
        }
        location ~* .*\.(php|php5)?$ {                  #Nginx添加PHP支持
            root html/blog;
            fastcgi_pass  127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi.conf;
        }
}
说明:利用nginx的location区块实现动态请求与静态请求的分别处理。

3.1.2 检查并重启Nginx配置

[root@web01 ~]# nginx -t
nginx: the configuration file /application/nginx-1.10.3/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.10.3/conf/nginx.conf test is successful
[root@web01 ~]# nginx -s reload

3.1.3 制作php首页

[root@web01 ~]# echo '< php phpinfo();  >' >/application/nginx/html/blog/test_info.php

3.1.4 实验结果

[root@web01 ~]# curl -I blog.leon.com/test_info.php
HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 14 Sep 2017 01:54:20 GMT
Content-Type: text/html
Connection: keep-alive
X-Powered-By: PHP/5.5.32

图片[2]|LNMP环境之PHP|leon的博客

3.2 配置PHP连接MySQL

3.2.1 编辑PHP文件连接MySQL

[root@web01 ~]# vim /application/nginx/html/blog/test_mysql.php
< php
//$link_id=mysql_connect('主机名','用户','密码');   //单行注释使用//,多行注释使用/*...*/
//mysql -u用户 -p密码 -h 主机
$link_id=mysql_connect('localhost','root','oldboy123') or mysql_error();
if($link_id){
             echo "mysql successful by root !\n";
            }else{
             echo mysql_error();
            }
 >

3.2.2 实验结果

[root@web01 ~]# curl blog.leon.com/test_mysql.php
mysql successful by root !

图片[3]|LNMP环境之PHP|leon的博客

第4章 PHP-FPM配置文件详解

# 包含其他POOL定义配置文件
include=/etc/php-fpm.d/*.conf
# 全局配置段,一般在主配置文件php-fpm.conf全局配置段中的配置非常少,php-fpm可以配置多个pool,每个# pool都是以一个独立的配置文件来运作,默认都会定义在主配置文件的include包含文件目录中。
[global]
# 定义PID文件的位置
pid = /var/run/php-fpm/php-fpm.pid
# 定义错误日志的位置
error_log = /var/log/php-fpm/error.log
; syslog_facility is used to specify what type of program is logging the
; message. This lets syslogd specify that messages from different facilities
; will be handled differently.
; See syslog(3) for possible values (ex daemon equiv LOG_DAEMON)
; Default Value: daemon 
syslog.facility = daemon
; syslog_ident is prepended to every message. If you have multiple FPM
; instances running on the same server, you can change the default value
; which must suit common needs.
; Default Value: php-fpm
syslog.ident = php-fpm
# 错误级别. 上面的php-fpm.log纪录的登记。可用级别为: alert(必须立即处理), error(错误情况),
# warning(警告情况), notice(一般重要信息), debug(调试信息). 默认: notice。
log_level = notice
# 表示在emergency_restart_interval所设值内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果超过 
# emergency_restart_threshold个,php-fpm就会平湖重启,这两个选项一般保持默认值。
# 0 表示‘关闭该功能’,默认值: 0 (关闭)。
emergency_restart_threshold = 0
emergency_restart_interval = 0
# 设置子进程接受主进程复用信号的超时时间。
# 可用单位: s(秒), m(分), h(小时), 或者 d(天) 默认单位: s(秒). 默认值: 0。
process_control_timeout = 0
; The maximum number of processes FPM will fork. This has been design to control
; the global number of processes when using dynamic PM within a lot of pools.
; Use it with caution.
process.max = 128
process.priority = -19
# 后台执行fpm,默认值为yes,如果为了调试可以改为no。
# 在FPM中,可以使用不同的设置来运行多个进程池,这些设置可以针对每个进程池单独设置。
daemonize = yes
# 设置文件打开描述符的rlimit限制,默认值: 系统定义值默认可打开句柄是1024,可使用 ulimit -n查看,
# ulimit -n 2048修改。
rlimit_files = 1024
#设置核心rlimit最大限制值,可用值: ‘unlimited’ 、0或者正整数. 默认值: 系统定义值。
rlimit_core = 0
; Specify the event mechanism FPM will use. The following is available:
; - select (any POSIX os)
; - poll (any POSIX os)
; - epoll (linux >= 2.5.44)
; - kqueue (FreeBSD >= 4.1, OpenBSD >= 2.9, NetBSD >= 2.0)
; - /dev/poll (Solaris >= 7)
; - port (Solaris >= 10)
; Default Value: not set (auto detection)
events.mechanism = epoll
; When FPM is build with systemd integration, specify the interval,
; in second, between health report notification to systemd.
; Set to 0 to disable.
; Available Units: s(econds), m(inutes), h(ours)
; Default Unit: seconds
; Default value: 10
systemd_interval = 10
[www]
# 指定pool的位置路径
prefix = /path/to/pools/$pool
# 启动进程的用户和用户组,FPM 进程运行的Unix用户, 必须要设置。
# 用户组,如果没有设置,则默认用户的组被使用。
user = nginx
group = nginx
# fpm监听端口,即nginx中php处理的地址,一般默认值即可。
# 可用格式为:'ip:port','port','/path/to# /unix/socket',每个进程池都需要设置。
# 如果nginx和php在不同的机器上分布式处理,就设置这里的ip 就可以了。
listen = 127.0.0.1:9000
# backlog数,设置 listen 的半连接队列长度,-1表示无限制,由操作系统决定,此行注释掉就行。
listen.backlog = 65535
# unix socket设置选项,如果使用tcp方式访问,这里注释即可
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
# 允许访问FastCGI进程的IP白名单,设置any为不限制IP,如果要设置其他主机的nginx也能访问这台FPM进# 程,listen处要设置成本地可被访问的IP。
# 默认值是any,每个地址是用逗号分隔.,如果没有设置或者为空,则允许任何服务器请求连接。
listen.allowed_clients = 127.0.0.1
# php-fpm进程启动模式,pm可以设置为static和dynamic和ondemand。
# 如果选择static,则进程数就是固定的,由pm.max_children指定固定的子进程数。
# 如果选择dynamic,则进程数是动态变化的,由以下参数决定:
# pm.max_children,pm.start_servers,pm.min_spare_servers,pm.max_spare_servers
# 模式选用原则:
# 动态适合小内存机器,灵活分配进程,省内存。
# 静态适用于大内存机器,动态创建回收进程对服务器资源也是一种消耗。
pm = dynamic
# 子进程能开启的最大数,必须设置。这里表示最多只能5个子进程。
pm.max_children = 5
#随着php-fpm一起启动时创建的子进程数目。默认值:min_spare_servers+ (max_spare_servers-min_spare_
# servers) / 2。这里表示:一起启动会有2个子进程。
pm.start_servers = 2
# 保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程,必须设置。
# 如果空闲的时候,会检查如果少于10个,就会启动几个来补上。
pm.min_spare_servers = 10
# 保证空闲进程数最大值,如果空闲进程大于此值,此进行清理,必须设置。
# 如果空闲时会检查进程数,多于30个就会关闭几个,达到30个的状态。
pm.max_spare_servers = 30
# 设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用的.。
# 如果设置为‘0’则一直接受请求, 等同于 PHP_FCGI_MAX_REQUESTS 环境变量, 默认值: 0。
pm.max_requests = 500
# FPM状态页面的网址,如果没有设置则无法访问状态页面,默认值: none。munin监控会使用到。
pm.status_path = /status
# FPM监控页面的ping网址,如果没有设置则无法访问ping页面。
# 该页面用于外部检测FPM是否存活并且可以响应请求,请注意必须以斜线开头 (/)。
ping.path = /ping
#用于定义ping请求的返回响应,返回为 HTTP 200 的 text/plain 格式文本,默认值: pong。
ping.response = pong
# 每一个请求的访问日志,默认是关闭的。
access.log = log/$pool.access.log
# 设定访问日志的格式。
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
# 慢请求的记录日志,配合request_slowlog_timeout使用,默认关闭。
slowlog = log/$pool.log.slow
# 当一个请求该设置的超时时间后,就会将对应的PHP调用堆栈信息完整写入到慢日志中,设置为'0'表示'Off'
request_slowlog_timeout = 0
# 设置单个请求的超时中止时间,该选项可能会对php.ini设置中的’max_execution_time’因为某些特殊原因
# 没有中止运行的脚本有用,设置为'0'表示'Off'。当经常出现502错误时可以尝试更改此选项。
request_terminate_timeout = 0
# 设置文件打开描述符的rlimit限制,默认值:系统定义值默认可打开句柄是1024。
# 可使用 ulimit -n查看,ulimit -n 2048修改。
rlimit_files = 1024
# 设置核心rlimit最大限制值,可用值:'unlimited'、0或者正整数,默认值: 系统定义值。
rlimit_core = 0
# 启动时的Chroot目录,所定义的目录需要是绝对路径。如果没有设置,则chroot不被使用。
chroot =
#设置启动目录,启动时会自动Chdir到该目录。所定义的目录需要是绝对路径,
# 默认值:当前目录或者/目录(chroot时)。
chdir = /var/www
# 重定向运行过程中的stdout和stderr到主要的错误日志文件中。
# 如果没有设置,stdout和stderr将会根据FastCGI的规则被重定向到/dev/null,默认值:空。
catch_workers_output = yes
; Clear environment in FPM workers
; Prevents arbitrary environment variables from reaching FPM worker processes
; by clearing the environment in workers before env vars specified in this
; pool configuration are added.
; Setting to "no" will make all environment variables available to PHP code
; via getenv(), $_ENV and $_SERVER.
; Default Value: yes
clear_env = no
; Limits the extensions of the main script FPM will allow to parse. This can
; prevent configuration mistakes on the web server side. You should only limit
; FPM to .php extensions to prevent malicious users to use other extensions to
; exectute php code.
; Note: set an empty value to allow all extensions.
; Default Value: .php
security.limit_extensions = .php .php3 .php4 .php5
; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from
; the current environment.
; Default Value: clean env
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f [email protected]
php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 32M

 

温馨提示:本文最后更新于2022-12-20 20:57:48,已超过487天没有更新。某些文章具有时效性,若文章内容或图片资源有错误或已失效,请联系站长。谢谢!
转载请注明本文链接:https://blog.leonshadow.cn/763482/1074.html
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享