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的整个运作过程。
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!
- 安装软件说明:
- libmcrypt-devel:对于程序运行时添加移除算法很有用,目前已经不被官方支持。其软件地址为:http://mcrypt.hellug.gr/。
- mhash:基于离散数学原理不可逆向的PHP加密方式扩展库,其在默认情况下不会开启。mhash可以用于创建校验数值、消息摘要、消息认证码以及无需原文的关键信息保存(如密码)等。
- 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
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 !
第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

我的微信
如果有技术上的问题可以扫一扫我的微信