ubuntu10.04配置 nginx+php-fpm模式的详解


Posted in PHP onJune 03, 2013

ppa安装php-fpm
安装工具包

$ sudo apt-get install python-software-properties  

添加ppa源
$ sudo add-apt-repository ppa:yola/php5

安装php5-fpm
sudo  apt-get  update
sudo  apt-get install  php5-fpm

其它必要的软件安装接
sudo   apt-get   install   nginx

配置php-fpm
php-fpm的解析器是C/S结构,它的配置文件位于:
(1)/etc/php5/fpm/php-fpm.conf
(2)/etc/php5/fpm/pool.d/
一般没什么严格的配置的要求,或者说这块我还没有具体的研究每个配置参数的意义
我采用了tcp模式与fastcgi进程进行连接,因此我修改了tcp监听的地址和端口,修改了一下监视目录的名称,这里不做具体详细解释了,大家可以参考官方文档根据自己的需求进行配置
重启php5-fpm

ubuntu10.04配置 nginx+php-fpm模式的详解

配置nginx
前言
nginx本身并不会对php语言进行解析,这个区别于apache(apache有在带的mod_php模块进行php解析).nginx是通过fastcgi将客户端的php请求交给后台的php5-fpm进程管理器,php5-fpm具有解析php的功能
nginx的主配置文件
文件位置:/etc/nginx/nginx.conf,我的配置参数如下:

user  www-data;
#主动开启cpu多核功能
worker_processes  2;
worker_cpu_affinity 01 10;
#指定nginx进程可以打开的最大文件描述符数量
worker_rlimit_nofile 65535;
pid /var/run/nginx.pid;
events {
 #使用epoll的I/O模型
 use epoll;
 #工作单进程的并发连接数,总体并发连接数 = worker_connections * worker_processes
 worker_connections 2048;
 #multi_accept在Nginx接到一个新连接通知后调用accept()来接受尽量多的连接
 multi_accept on;
}
http {
 include       /etc/nginx/mime.types;
 default_type  application/octet-stream;
 charset utf-8; server_names_hash_bucket_size 128;
 client_header_buffer_size 2k;
 large_client_header_buffers 4 4k;
 #通过nginx上传文件的大小
 client_max_body_size 8m;
#$remote_addr:记录ip地址;$remote_user:记录远程客户端用户名称;$request:请求的url和http协议;$status:用于记录请求状态;$body_bytes_sent:用于记录发送给客户端文件主体内容的大小;$http_referer:跳转链接;$http_x_forwarded_for:客户的真实ip地址
 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"';
 access_log /var/log/nginx/access.log  main;
 error_log /var/log/nginx/error.log;
 sendfile        on;
 tcp_nopush     on;
 #keepalive的超时时间
 keepalive_timeout  60;
 open_file_cache max=204800 inactive=20s;
 open_file_cache_min_uses 1;
 open_file_cache_valid 30s;
     tcp_nodelay on;
     gzip  on;
     include /etc/nginx/conf.d/*.conf;
}

日志格式之间是用不可打印符号进行分隔的,ctrl+v && ctrl+a
nginx虚拟主机配置文件
upstream haolianxi_php {
 server 127.0.0.1:9444;
}
server {
 listen 192.168.1.137:7777; access_log /var/log/nginx/haolianxi/haolianxi.access.log main;
 error_log /var/log/nginx/haolianxi/haolianxi.error.log;
 #通用匹配 
 location / {
  root /srv/www/php/;
  autoindex on;
  autoindex_exact_size off;
  autoindex_localtime on;
  access_log /var/log/nginx/haolianxi/location.default.access.log main; 
  error_log /var/log/nginx/haolianxi/location.default.error.log;
  allow 192.168.1.0/24;
  deny all;
 }
 #正则表达式匹配 
 #proxy the php scripts to php-fpm
 location ~ \.php$ {
  root /srv/www/php/;
  include /etc/nginx/fastcgi_params;
  fastcgi_pass haolianxi_php; # The upstream determined above
  fastcgi_index index.php;
 }
 #php-fpm status monitor
 location = /phpfpm_status {
  fastcgi_pass 127.0.0.1:9444;
  fastcgi_index index.php;
  include /etc/nginx/fastcgi_params;
  allow 192.168.1.127;
  allow 127.0.0.1;
  deny all;
 }
 ## Compression
 # src: http://www.ruby-forum.com/topic/141251
 # src: http://wiki.brightbox.co.uk/docs:nginx
     gzip on;
     gzip_http_version 1.0;
     gzip_comp_level 2;
     gzip_proxied any;
     gzip_min_length  1100;
     gzip_buffers 16 8k;
     gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
     # Some version of IE 6 don't handle compression well on some mime-types, so just disable for them
     gzip_disable "MSIE [1-6].(?!.*SV1)";
     # Set a vary header so downstream proxies don't send cached gzipped content to IE6
     gzip_vary on;
     ## /Compression
}

注意:
include /etc/nginx/fastcgi_params中一个参数设置需要修改,修改如下:
fastcgi_param   SCRIPT_NAME             $document_root$fastcgi_script_name;

因为脚本的名称不加上$document_root,php5-fpm是无法找到需要执行的php脚本的绝对路径的
重启nginx
sudo  /etc/init.d/nginx  restart

测试fastcgi_finish_request()函数
<?php
echo "OK";
fastcgi_finish_request(); /* 响应完成, 关闭连接 */
sleep(5);
file_put_contents("/tmp/fastcgi.log", "hello",FILE_APPEND);
sleep(5);
file_put_contents("/tmp/fastcgi.log", "world",FILE_APPEND);
?>

说明:
用最大的白话说,fastcgi_finish_request()可以提前关闭和客户端的连接,把需要返回的数据返回给客户端,但是函数之后的分支业务逻辑还是继续在后台运行!
php5-fpm日志按天分割脚本
#!/bin/bash - 
#1.php5-fpm日志存放路径
php5_fpm_logs_path="/var/log/php5-fpm/"
category_array=("access" "error")
#2.php5-fpm日志名后缀
postfix=`date -d '-1 days' +%Y%m%d`".log"
#3.php5-fpm日志切割
for category in ${category_array[*]}
do
 if [ -e $php5_fpm_logs_path/php5-fpm.$category.log ]
 then
  mv $php5_fpm_logs_path/php5-fpm.$category.log \
   $php5_fpm_logs_path/php5-fpm.$category.$postfix
 fi
done
#4.查找php5-fpm进程号,让其产生新的日志文件
php5fpm_pid=`ps -aux |grep -E 'php-fpm: master process'|grep -v 'grep'|awk '{print $2}'`
#USR1:Reopen log files,刷新nginx日志文件
kill -USR1 $php5fpm_pid
PHP 相关文章推荐
一些被忽视的PHP函数(简单整理)
Apr 30 PHP
PHP统计目录下的文件总数及代码行数(去除注释及空行)
Jan 17 PHP
PHP连接SQLServer2005的实现方法(附ntwdblib.dll下载)
Jul 02 PHP
APACHE的AcceptPathInfo指令使用介绍
Jan 18 PHP
yii框架表单模型使用及以数组形式提交表单数据示例
Apr 30 PHP
让ThinkPHP支持大小写url地址访问的方法
Oct 31 PHP
php输入数据统一类实例
Feb 23 PHP
php实现比较全的数据库操作类
Jun 18 PHP
ajax+php控制所有后台函数调用
Jul 15 PHP
使用PHP编写发红包程序
Jul 22 PHP
学习php设计模式 php实现工厂模式(factory)
Dec 07 PHP
PHP超全局变量实现原理及代码解析
Sep 01 PHP
基于php-fpm的配置详解
Jun 03 #PHP
php的POSIX 函数以及进程测试的深入分析
Jun 03 #PHP
基于PHP一些十分严重的缺陷详解
Jun 03 #PHP
spl_autoload_register与autoload的区别详解
Jun 03 #PHP
基于Linux调试工具strace与gdb的常用命令总结
Jun 03 #PHP
linux命令之调试工具strace的深入分析
Jun 03 #PHP
如何使用Strace调试工具
Jun 03 #PHP
You might like
php简单对象与数组的转换函数代码(php多层数组和对象的转换)
2011/05/18 PHP
PHP实现设计模式中的抽象工厂模式详解
2014/10/11 PHP
php实现session自定义会话处理器的方法
2015/01/27 PHP
微信公众平台DEMO(PHP)
2016/05/04 PHP
Laravel5权限管理方法详解
2016/07/26 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
2016/10/28 PHP
PHP Header失效的原因分析及解决方法
2016/11/16 PHP
laravel手动创建数组分页的实现代码
2018/06/07 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
2019/03/22 PHP
javascript下有关dom以及xml节点访问兼容问题
2007/11/26 Javascript
javascript+xml技术实现分页浏览
2008/07/27 Javascript
JavaScript中函数声明优先于变量声明的实例分析
2012/03/01 Javascript
js将控件隐藏的方法及display属性介绍
2013/07/04 Javascript
兼容主流浏览器的iframe自适应高度js脚本
2014/01/10 Javascript
jQuery队列操作方法实例
2014/06/11 Javascript
win7下安装配置node.js+express开发环境
2015/12/06 Javascript
基于jquery实现图片上传本地预览功能
2016/01/08 Javascript
JavaScript实现时间表动态效果
2017/07/15 Javascript
新手快速入门JavaScript装饰者模式与AOP
2019/06/24 Javascript
layui中select,radio设置不生效的解决方法
2019/09/05 Javascript
python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
2014/06/09 Python
python实现爬虫统计学校BBS男女比例(一)
2015/12/31 Python
django 使用 request 获取浏览器发送的参数示例代码
2018/06/11 Python
Python 字符串池化的前提
2020/07/03 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
2021/03/03 Python
应用化学专业本科生求职信
2013/09/29 职场文书
秦兵马俑教学反思
2014/02/07 职场文书
管理失职检讨书
2014/02/12 职场文书
学校督导评估方案
2014/06/10 职场文书
体育馆的标语
2014/06/24 职场文书
党的群众路线个人对照检查材料
2014/09/23 职场文书
机票销售员态度不好检讨书
2014/09/27 职场文书
工作期间打牌检讨书范文
2014/11/20 职场文书
2015年小学数学教研组工作总结
2015/05/21 职场文书
导游词之永泰公主墓
2019/12/04 职场文书
Spring Boot项目如何优雅实现Excel导入与导出功能
2022/06/10 Java/Android