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 相关文章推荐
VML绘图板②脚本--VMLgraph.js、XMLtool.js
Oct 09 PHP
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
Nov 18 PHP
PHP 5.0 Pear安装方法
Dec 06 PHP
从MySQL数据库表中取出随机数据的代码
Sep 05 PHP
PHP中MD5函数使用实例代码
Jun 07 PHP
php懒人函数 自动添加数据
Jun 28 PHP
PHP-redis中文文档介绍
Feb 07 PHP
apache配置虚拟主机的方法详解
Jun 17 PHP
PHP实现批量检测网站是否能够正常打开的方法
Aug 23 PHP
浅谈Laravel中的一个后期静态绑定
Aug 11 PHP
PHP PDOStatement::execute讲解
Jan 31 PHP
Ajax+Jpgraph实现的动态折线图功能示例
Feb 11 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
模拟SQLSERVER的两个函数:dateadd(),datediff()
2006/10/09 PHP
简单的过滤字符串中的HTML标记
2006/12/25 PHP
php 批量生成html,txt文件的实现代码
2013/06/26 PHP
一个经典的PHP验证码类分享
2014/11/18 PHP
PHP 读取和编写 XML
2014/11/19 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
2014/12/15 PHP
php从数组中随机选择若干不重复元素的方法
2015/03/14 PHP
php中时间函数date及常用的时间计算
2017/05/12 PHP
Laravel5.1框架注册中间件的三种场景详解
2019/07/09 PHP
用正则获取指定路径文件的名称
2007/02/27 Javascript
关于javascript function对象那些迷惑分析
2011/10/24 Javascript
js调用后台servlet方法实例
2013/06/09 Javascript
JavaScript实现按照指定长度为数字前面补零输出的方法
2015/03/19 Javascript
jquery实现简易的移动端验证表单
2015/11/08 Javascript
封装的dialog插件 基于bootstrap模态对话框的简单扩展
2016/08/10 Javascript
基于JavaScript实现鼠标箭头移动图片跟着移动
2016/08/30 Javascript
不使用 JS 匿名函数理由
2017/11/17 Javascript
MUI 实现侧滑菜单及其主体部分上下滑动的方法
2018/01/25 Javascript
小程序使用wxs解决wxml保留2位小数问题
2019/12/13 Javascript
Vue数字输入框组件使用方法详解
2020/02/10 Javascript
Python 列表(List)操作方法详解
2014/03/11 Python
python实现ip查询示例
2014/03/26 Python
利用arcgis的python读取要素的X,Y方法
2018/12/22 Python
解决pycharm工程启动卡住没反应的问题
2019/01/19 Python
python+selenium实现QQ邮箱自动发送功能
2019/01/23 Python
基于python框架Scrapy爬取自己的博客内容过程详解
2019/08/05 Python
Python基于numpy模块实现回归预测
2020/05/14 Python
pyecharts调整图例与各板块的位置间距实例
2020/05/16 Python
英国二手物品交易网站:Preloved
2017/10/06 全球购物
捷克浴室和厨房设备购物网站:SIKO
2018/08/11 全球购物
学习方法演讲稿
2014/05/10 职场文书
绍兴鲁迅故居导游词
2015/02/09 职场文书
生产实习心得体会范文
2016/01/22 职场文书
vue如何使用模拟的json数据查看效果
2022/03/31 Vue.js
Python日志模块logging用法
2022/06/05 Python
了解MySQL查询语句执行过程(5大组件)
2022/08/14 MySQL