PHP连接Nginx服务器并解析Nginx日志的方法


Posted in PHP onAugust 16, 2015

php与nginx整合

PHP-FPM也是一个第三方的FastCGI进程管理器,它是作为PHP的一个补丁来开发的,在安装的时候也需要和PHP源码一起编译,也就是说PHP-FPM被编译到PHP内核中,因此在处理性能方面更加优秀;同时它在处理高并发方面也比spawn-fcgi引擎好很多,因此,推荐Nginx+PHP/PHP-FPM这个组合对PHP进行解析。
FastCGI 的主要优点是把动态语言和HTTP Server分离开来,所以Nginx与PHP/PHP-FPM经常被部署在不同的服务器上,以分担前端Nginx服务器的压力,使Nginx专一处理静态请求和转发动态请求,而PHP/PHP-FPM服务器专一解析PHP动态请求

#fastcgi
FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口。多数流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等,同时,FastCGI也被许多脚本语言所支持,其中就有PHP。
FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发访问时,几乎是不可用的。另外传统的CGI接口方式安全性也很差,现在已经很少被使用了。
FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。
Nginx+FastCGI运行原理
Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket,(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接纳到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程。

php与nginx整合
php.ini:php的主配置文件

[root@server79 php-5.4.12]# cp php.ini-production /usr/local/lnmp/php/etc/php.ini

拷贝php的启动脚本

[root@server79 fpm]# pwd
/root/php-5.4.12/sapi/fpm
[root@server79 fpm]# cp init.d.php-fpm /etc/init.d/php-fpm

给启动脚本加可执行权限

[root@server79 fpm]# chmod +x /etc/init.d/php-fpm
[root@server79 ~]# vim /usr/local/lnmp/php/etc/php.ini
cgi.fix_pathinfo=0
date.timezone = /Asia/Shanghai
[root@server79 ~]# cp /usr/local/lnmp/php/etc/php-fpm.conf.default /usr/local/lnmp/php/etc/php-fpm.conf
[root@server79 etc]# vim php-fpm.conf

打开注释pid = run/php-fpm.pid

php-fpm.conf文件参数解析
PHP的全局配置文件是php.ini,在上面的步骤中,已经将此文件复制到了/usr/local/lnmp/php/etc/php.ini下。可以根据每个应用需求的不同,对php.ini进行相应的配置。
下面重点介绍PHP-FPM引擎的配置文件。
根据上面指定的安装路径,PHP-FPM的默认配置文件为/usr/local/lnmp/php/etc/php-fpm.conf。
php-fpm.conf是一个XML格式的纯文本文件,其内容很容易看明白。这里重点介绍几个重要的配置标签:
标签listen_address是配置fastcgi进程监听的IP地址以及端口,默认是127.0.0.1:9000。

listen = 127.0.0.1:9000

标签user和group用于设置运行FastCGI进程的用户和用户组。需要注意的是,这里指定的用户和用户组要和Nginx配置文件中指定的用户和用户组一致。

user = nginx
group = nginx

标签max_children用于设置FastCGI的进程数。根据官方建议,小于2GB内存的服务器,可以只开启64个进程,4GB以上内存的服务器可以开启200个进程。

<value name="max_children">5</value>

标签request_terminate_timeout用于设置FastCGI执行脚本的时间。默认是0s,也就是无限执行下去,可以根据情况对其进行修改。

<value name="request_terminate_timeout">0s</value>

标签rlimit_files用于设置PHP-FPM对打开文件描述符的限制,默认值为1024。这个标签的值必须和Linux内核打开文件数关联起来,例如要将此值设置为65535,就必须在Linux命令行执行'ulimit -HSn 65536'。

<value name="rlimit_files">1024</value>

标签max_requests指明了每个children最多处理多少个请求后便会被关闭,默认的设置是500。

pm.max_requests = 500

标签allowed_clients用于设置允许访问FastCGI进程解析器的IP地址。如果不在这里指定IP地址,Nginx转发过来的PHP解析请求将无法被接受。

<value name="allowed_clients">127.0.0.1</value>

5.管理FastCGI进程
在配置完php-fpm后,就可以启动FastCGI进程了。启动fastcgi进程有两种方式:

/usr/local/php/bin/php-cgi --fpm
或者
/usr/local/php/sbin/php-fpm start

建议采用第二种方式启动FastCGI进程。
/usr/local/php/sbin/php-fpm还有其他参数,具体为start|stop|quit|restart|reload|logrotate。
每个启动参数的含义如下:

  • q start,启动PHP的FastCGI进程。
  • q stop,强制终止PHP的FastCGI进程。
  • q quit,平滑终止PHP的FastCGI进程。
  • q restart,重启PHP的FastCGI进程。
  • q reload,重新加载PHP的php.ini。
  • q logrotate,重新启用log文件。
  • reload是个很重要的参数,它可以在PHP的FastCGI进程不中断的情况下重新加载改动过的php.ini,因此通过php-fpm可以平滑变更FastCGI模式下的PHP设置。
[root@server79 etc]# /etc/init.d/php-fpm start

配置nginx的主配置文件,打开与php的接口

[root@server79 conf]# pwd
/usr/local/lnmp/nginx/conf
[root@server79 conf]# vim nginx.conf
user nginx;
#
location ~ \.php$ {
root html; 
fastcgi_pass 127.0.0.1:9000; //本地9000端口
fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
}
[root@server79 conf]# nginx -t^C
[root@server79 conf]# nginx -s reload^C
[root@server79 html]# pwd
/usr/local/lnmp/nginx/html
[root@server79 html]# cat index.php
<?php
phpinfo()?>

测试:浏览器中输入192.168.0.179/index.php,出现php页面

PHP解析Nginx日志
nginx日志格式

access_log日志格式

log_format main '$server_name$remote_addr$remote_user[$time_local]"$request"' 
      '$status$body_bytes_sent"$http_referer"' 
      '"$http_user_agent""$http_x_forwarded_for"';

日志参数

    server_name          : 虚拟主机的主机名称 
    remote_addr          : 远程客户端的ip地址 
    remote_user          : 远程客户端用户名称 
    time_local           : 访问的时间与时区 
    status           : 记录请求返回的http状态码 
    body_bytes_sent      : 发送给客户端的文件主体内容的大小 
    http_referer             : 从哪个页面链接访问过来  
    http_user_agent      : 客户端浏览器信息 
    http_x_forwarded_for     : 客户端的真实ip 

日志分割符
使用特殊的不可打印字符^A(ctrl+v,ctrl+a)作为日志分割符

根据关键字过滤文件内容

需求
根据http的请求里是否有“weibo”这个关键字提取文件的内容

php代码

/** 
  * Description:按行读取文件内容进行过滤匹配 
  * 
  * @return array 
  */ 
 function readFileContent ($filename) 
 { 
  $weibo_content = array(); 
  $fh = @fopen($filename, 'r'); 
   
  if ($fh) { 
   while (! feof($fh)) { 
    $row = fgets($fh, 4096); 
    $row_arr = explode("", $row); 
    if (isset($row_arr[3]) && preg_match('/weibo/', $row_arr[3])) { 
     $weibo_content[] = $row_arr; 
    } 
   } 
  } 
  fclose($fh); 
   
  return $weibo_content; 
 }
PHP 相关文章推荐
Php做的端口嗅探器--可以指定网站和端口
Oct 09 PHP
discuz Passport 通行证 整合笔记
Jun 30 PHP
php 图片加水印与上传图片加水印php类
May 12 PHP
php小型企业库存管理系统的设计与实现代码
May 16 PHP
使用php方法curl抓取AJAX异步内容思路分析及代码分享
Aug 25 PHP
Mac环境下php操作mysql数据库的方法分享
May 11 PHP
老版本PHP转义Json里的特殊字符的函数
Jun 08 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
Oct 20 PHP
ThinkPHP的SAE开发相关注意事项详解
Oct 09 PHP
php插入含有特殊符号数据的处理方法
Nov 24 PHP
php微信公众号开发之快递查询
Oct 20 PHP
PHP的PDO事务与自动提交
Jan 24 PHP
ThinkPHP开发框架函数详解:C方法
Aug 14 #PHP
提高php编程效率技巧
Aug 13 #PHP
php轻量级的性能分析工具xhprof的安装使用
Aug 12 #PHP
详细解读PHP中接口的应用
Aug 12 #PHP
举例讲解PHP面对对象编程的多态
Aug 12 #PHP
详解PHP中的状态模式编程
Aug 11 #PHP
简单介绍PHP的责任链编程模式
Aug 11 #PHP
You might like
PHP常用函数小技巧
2008/09/11 PHP
批量获取memcache值并按key的顺序返回的实现代码
2011/06/14 PHP
PHP之短标签开启设置
2013/06/17 PHP
CI框架验证码CAPTCHA辅助函数用法实例
2014/11/05 PHP
PHP实现删除多重数组对象属性并重新赋值的方法
2017/06/07 PHP
PHP实现腾讯与百度坐标转换
2017/08/05 PHP
JS 字符串连接[性能比较]
2009/05/10 Javascript
Jquery 获取表单text,areatext,radio,checkbox,select值的代码
2009/11/12 Javascript
jQuery创建插件的代码分析
2011/04/14 Javascript
JS对img标签进行优化使用onerror显示默认图像
2014/04/24 Javascript
AngularJS Module方法详解
2015/12/08 Javascript
JavaScript中的prototype原型学习指南
2016/05/09 Javascript
VUEJS实战之构建基础并渲染出列表(1)
2016/06/13 Javascript
JS图片压缩(pc端和移动端都适用)
2017/01/12 Javascript
基于Bootstrap的Java开发问题汇总(Spring MVC)
2017/01/15 Javascript
基于Vue的延迟加载插件vue-view-lazy
2018/05/21 Javascript
Vue.js 中的实用工具方法【推荐】
2019/07/04 Javascript
vue项目使用.env文件配置全局环境变量的方法
2019/10/24 Javascript
ng-alain的sf如何自定义部件的流程
2020/06/12 Javascript
vue2.0 watch里面的 deep和immediate用法说明
2020/10/30 Javascript
Nuxt 嵌套路由nuxt-child组件用法(父子页面组件的传值)
2020/11/05 Javascript
[13:18]《一刀刀一天》之DOTA全时刻21:详解TI新赛制 A队再露獠牙
2014/06/24 DOTA
Python通过命令开启http.server服务器的方法
2017/11/04 Python
python图书管理系统
2020/04/05 Python
Python 忽略warning的输出方法
2018/10/18 Python
Pandas读写CSV文件的方法示例
2019/03/27 Python
Python OpenCV 调用摄像头并截图保存功能的实现代码
2019/07/02 Python
将自己的数据集制作成TFRecord格式教程
2020/02/17 Python
德国消费电子产品购物网站:Guter Kauf
2020/09/15 全球购物
中英文自我评价语句
2013/12/20 职场文书
男方父母婚礼答谢词
2014/01/25 职场文书
军人违纪检讨书
2014/02/04 职场文书
公司年终奖分配方案
2014/06/16 职场文书
建设办主任四风问题整改思路和措施
2014/09/20 职场文书
2016年中学清明节活动总结
2016/04/01 职场文书
Java中API的使用方法详情
2022/04/06 Java/Android