第1部分Nginx与PHP要将Nginx和PHP结合,让Nginx解析静态网页,而PHP的动态网页交给PHP处理.
解决方法从大的方向有两类:(从Nginx角度来讲)一类是使用Nginx的代理模块,而另外一类则是使用FastCGI模块.
而从PHP角度来讲则是FastCGI进程,它的方法有三种:一种是以php-fpm方式运行,第二种是PHP自带的fastcgiserver,第三种就是借助lighttpd带的spawn-fcgi(听起来有点龌龊,但是确实可行,有时候还必须使用这种方法).
目前最新的PHP版本是5.
3.
4,PHP与Nginx的结合主要靠两个方面,即服务器端和客户端.
服务器端使用的是FastCGI模块,FastCGI从请求的角度应该叫"客户端";而客户端使用的是php-fpm,从响应的角度它却应该叫"服务器端",它们之间通信的协议就是FastCGI协议.
示意图如下:而一种结合方式就是使用代理.
关于代理方式的结合,我们将放在别的章节具体讲解,因为对于Nginx,作为代理也是它的一个主要功能之一.
第1章环境部署本章作为该部分的第1章,我们首先来部署环境.
在PHP方面我们使用了php-fpm,而在Nginx方面我们使用的是FastCGI模块.
1.
1php-fpm的安装与测试在PHP内核5.
3.
3以上,就不再有专门的php-fpm安装(例如SVN或者是打补丁了),低于这个版本的安装可以到http://php.
net/和http://php-fpm.
org站点下载相应的版本.
php-fpm的作者是AndreiNgmatulin.
i1.
1.
1下载并安装PHP下面我们就谈谈最新版本的PHP安装及设置.
1.
编译安装下载php-5.
3.
4:[root@mail~]#wgethttp://cn.
php.
net/distributions/php-5.
3.
4.
tar.
bz2执行.
/configure:[root@mail~]#tar-jxvfphp-5.
3.
4.
tar.
bz2[root@mailphp-5.
3.
4]#.
/configure--help在这里我提醒读者一定要看一下".
/configure--help"的内容.
如果我在这里把它贴出来,你肯定会骂我是为了浪费资源,但你如果不看,那将会失去PHP的许多功能.
这里为了节约资源就不贴出了.
根据自己的需要,例如GD、libxml2、mhash、curl、gettext、iconv等,你需要在安装PHP之前就将其安装好,然后再开始安装PHP:[root@mailphp-5.
3.
4]#.
/configure--enable-fpm…在执行makeinstall时,因为是定制位置,所以留意一下其内容:[root@mailphp-5.
3.
4]#makeinstallInstallingPHPSAPImodule:fpmInstallingPHPCLIbinary:/usr/local/php5.
3.
4/bin/InstallingPHPCLImanpage:/usr/local/php5.
3.
4/man/man1/InstallingPHPFPMbinary:/usr/local/php5.
3.
4/sbin/InstallingPHPFPMconfig:/usr/local/php5.
3.
4/etc/InstallingPHPFPMmanpage:/usr/local/php5.
3.
4/man/man8/Installingbuildenvironment:/usr/local/php5.
3.
4/lib/php/build/Installingheaderfiles:/usr/local/php5.
3.
4/include/php/Installinghelperprograms:/usr/local/php5.
3.
4/bin/program:phpizeprogram:php-configInstallingmanpages:/usr/local/php5.
3.
4/man/man1/page:phpize.
1page:php-config.
1InstallingPEARenvironment:/usr/local/php5.
3.
4/lib/php/2.
相关设置拷贝php.
ini文件:[root@mailphp-5.
3.
4]#cpphp.
ini-production/usr/local/php5.
3.
4/lib/php.
ini编辑Nginx配置文件,添加如下配置:[root@mailsbin]#vi/usr/local/nginx0.
8.
53/conf/nginx.
conf…location~*\.
php${fastcgi_pass127.
0.
0.
1:9000;fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;fastcgi_paramPATH_INFO$fastcgi_script_name;includefastcgi_params;}…1.
1.
2启动php-fpm[root@mailsbin]#cd/usr/local/php5.
3.
4/sbin/[root@mailsbin]#.
/php-fpm在Nginx的html目录下编辑测试文件:[root@mailsbin]#cd/usr/local/nginx0.
8.
53/html/[root@mailhtml]#vit.
php访问测试:可见php-fpm访问成功.
在以上的篇幅中,我们以php-fpm的方式安装了PHP,并且通过与Nginx的FastCGI模块相结合,使得Nginx提供了对动态网页的解析,即静态网页由Nginx自己解析,而属于PHP的网页(文件的扩展名为.
php)由php-fpm来解析.
在下面的内容中我们将分别来学习php-fpm和FastCGI模块.
1.
2php-fpm的目录结构Nginx与php-fpm的配置测试没问题了,接着要注意安装完成PHP后的目录结构,特别是bin/、sbin/、etc/这三个目录.
1.
2.
1etc/目录[root@mailphp5.
3.
4]#treeetc/etc/|--pear.
conf|--php-fpm.
conf'--php-fpm.
conf.
default需要修改配置的文件是php-fpm.
conf,这是php-fpm的配置文件,通过修改配置文件,我们可以达到以下目的:编辑用于UNIX套接字与进程的用户和组;php-fpm监听的IP地址和端口号;提供同时处理请求的总数;允许连接到php-fpm的IP地址;了解php-fpm的使用状态(/status);定义资源使用.
1.
配置文件php-fpm.
conf了解一下PHP的FastCGI的配置文件,该配置文件分为三部分,第一部分为fpm配置;第二部分为全局配置,第三部分为进程池的定义.
熟练掌握配置文件中的这些指令,对于Nginx的排除很有帮助.
由于PHP从5.
3.
3开始集成了php-fpm,它的配置文件也有原来的xml格式改为了ini格式.
除了格式上的更改外,配置内容没有改变,首行是";"的表示注释行,不会被fpm解释.
第一部分:fpm配置本配置文件中的相对路径都与在PHP安装时使用的配置参数"--prefix="有关,在这里是"/usr/local/php5.
3.
4",前缀prefix在命令行中可以通过使用"-p"参数来动态改变.
;include=etc/fpm.
d/*.
conf该指令用于包含一个或多个文件.
如果glob(3)存在(glob()函数返回匹配指定模式的文件名或目录.
该函数返回一个包含有匹配文件/目录的数组.
如果出错则返回false),那么可以包含由glob(3)模式的一批文件.
该指令可以在配置文件的任何地方使用.
也可使用相对路径,如果你使用相对路径,那么可能是下面情况中的一种:如果使用了-p参数设置,那么就是全局前缀(globalprefix);否则就是/usr/local/php5.
3.
4,这是安装php时使用"--prefix="指定的路径.
第二部分:全局部分全局配置部分由标志[global]开始,它是针对php-fpm全局的设置.
;pid=run/php-fpm.
pid设置pid文件的位置.
默认位置是/usr/local/php5.
3.
4/var(或者说是"--prefix="下的var/目录下).
pid指令没有默认值,就是没有设置pid文件.
;error_log=log/php-fpm.
log记录错误日志的文件.
该指令的默认值为log/php-fpm.
log,它的默认前缀为/usr/local/php5.
3.
4/var.
;log_level=notice记录日志的级别,可能的值为:alert、error、warning、notice、debug.
默认值为:notice.
;emergency_restart_threshold=0如果一些子进程在这个时间段(通过该指令设置)内,而带有IGSEGV或SIGBUS退出,那么fpm将会重启.
它的值为"0",表示关闭该功能.
;emergency_restart_interval=0当文雅(graceful)的重启服务时,通过使用指令emergency_restart_interval设置时间间隔来决定服务的初始化时间.
这个设置对于工作在加速器共享内存意外时很有用.
默认单位:秒默认值:0;process_control_timeout=0子进程等待master进程对信号的回应.
有效的时间单位为:s(econds)、m(inutes)、h(ours)或d(ays).
默认值为"0".
;daemonize=yes将fpm转至后台运行.
如果设置为"no",那么fpm会运行在前台,这种情况用于调试.
默认值为"yes".
第三部分:进程池的定义通过监听不同的端口和不同的管理选择可以定义多个不同的子进程池.
进程池的名字将被用于记录和统计.
对于fpm能够处理进程池数目的多少并没有限制.
[www]定义一个新的进程池,命名为"www".
变量$pool可以在任何指令中使用,它将会替代相应的进程池名字.
例如在这里是www.
;prefix=/path/to/pools/$pool对于每个池的前缀,它仅可以应用在下列指令中:slowloglisten(unixsocket)chrootchdirphp_valuesphp_admin_values如果没有设置前缀,那么全局的签字(或者/usr/local/php5.
3.
4)将被应用.
注意:该指令也可以是相对于全局前缀.
默认值:没有(none).
listen=127.
0.
0.
1:9000接受FastCGI请求的IP地址,有效的语法如下.
ip.
add.
re.
ss:port:在指定的IP地址和端口号上监听TCP套接字.
port:在所有IP地址的指定端口上监听TCP套接字.
/path/to/unix/socket:在UNIX套接字上监听.
注意:"127.
0.
0.
1:9000"这个值是强制性的.
;listen.
backlog=-1该指令用于设置listen(2)backlog.
如果设置为"-1",那么就意味着不受限制.
默认值为:128(FreeBSD和OpenBSD为"-1").
;listen.
allowed_clients=127.
0.
0.
1列出允许FastCGI客户端连接的IPv4IP地址.
该指令与原来PHPFCGI(5.
2.
2+)的环境变量FCGI_WEB_SERVER_ADDRS相等.
每一个地址之间需要使用逗号隔开,如果该指令的值为空,那么该进程池将接受从任何地址来的请求连接.
默认值为any,即接受任何连接.
;listen.
owner=nobody;listen.
group=nobody;listen.
mode=0666设置UNIX套接字权限,如果使用它,为了允许从Web服务器连接,在Linux中必须设置读/写权限.
许多源于BSD的系统允许连接而不管权限问题.
默认值:ser和group都被设置为运行fpm的用户,而mode设置为0666.
user=nobodygroup=nobody运行fpm进程的用户和组,该用户和组必须在UNIX系统中存在.
注意:user是强制的,必须设置,如果group没有设置,那么默认user的组将被使用.
pm=dynamic选择进程管理器如何控制子进程的数目.
可能的值如下.
static:对于子进程的开启数目给定一个锁定的值(pm.
max_children).
dynamic:子进程的数目为动态的,它的数目是基于下面指令的值.
pm.
max_children:同一时刻能够存活的最大子进程数目.
pm.
start_servers:在启动时启动的子进程数目.
pm.
min_spare_servers:处于"空闲('idle')"状态(等待处理)的最小子进程.
如果空闲进程的数目小于该值,那么相应的子进程将会被创建.
pm.
max_spare_servers:最大的空闲子进程数目,如果空闲的子进程数目大于这个数目,那么相应的子进程将会被杀掉.
注意:dynamic为强制值.
pm.
max_children=50当pm被设置为"static"的时候,该指令的值表示为开启php-fpm的数目;当pm被设置为"dynamic"的时候,该指令的值表示被建立的最大子进程数目.
该值设置了能够同时提供请求的最大限制数目.
相当于在Apache中mpm_prefork下的指令ApacheMaxClients的功能,也类似于以前PHPCGI的环境变量PHP_FCGI_CHILDREN.
注意:无论pm被设置为"static"还是"dynamic",该指令都会被使用.
该值是强制的.
;pm.
start_servers=20在启动fpm时创建的子进程.
注意:仅将pm设置为"dynamic"时使用.
默认值:min_spare_servers+(max_spare_servers-min_spare_servers)/2;pm.
min_spare_servers=5期望空闲进程的最小值.
注意:仅当将pm设置为"dynamic"时才使用该指令.
;pm.
max_spare_servers=35期望空闲进程的最大值.
注意:仅当将pm设置为"dynamic"时才使用该指令.
;pm.
max_requests=500在派生出新的子进程之前,每一个子进程应该处理的请求数目.
在第三方库中这个对于解决内存溢出很有用.
如果将该值设置为"0",那么处理的请求将不会受到限制.
相当于PHP_FCGI_MAX_REQUESTS.
默认值为0.
;pm.
status_path=/status配置一个URI,以便查看fpm状态页,如果该值没有设置,那么没有URI会被认做是状态页.
默认情况下,它会显示如下信息.
acceptedconn:该进程池接受的请求数量.
pool:进程池的名字.
processmanager:进程管理,就是配置中的pm指令,可以选择的值有两个,static或dynamic.
idleprocesses:空闲的进程数量.
activeprocesses:当前活跃的进程数量.
totalprocesses:总的进程数量,它的值等于空闲进程+活跃进程.
maxchildrenreached:达到最大子进程的次数,达到进程的限制,当pm试图开启更多的子进程的时候(仅当pm工作在"dynamic"时).
"idleprocesses"、"activeprocesses"和"totalprocesses"的值每秒钟更新一次,而"acceptedconn"的值是实时更新.
下面是一个输出的例子:;acceptedconn:12073;pool:www;processmanager:static;idleprocesses:35;activeprocesses:65;totalprocesses:100;maxchildrenreached:1默认情况下,状态页(statuspage)的输出格式为text/plain,通过传递"html"或"json"查询字符串来返回相应的输出.
例如,以下语法:http://www.
foo.
bar/statushttp://www.
foo.
bar/statusjsonhttp://www.
foo.
bar/statushtml注意:该指令的值必须由斜线(/)开始,它的值可以是任何值,但是不要使用.
php扩展名,因为这样可能会和一个真实存在的PHP文件相冲突.
该指令没有设置默认值.
;ping.
path=/ping该pingURI去调用fpm的监控页面,如果这个值没有设置,那么不会有URI被作为ping页面.
它是被用于从外面测试fpm的活跃和响应情况.
利用该功能可以做到以下应用:创建一个可用性图(例如rrd);如果没有响应,那么从组中移除一个服务(负载均衡);为运营团队触发警告(24/7);注意:该值必要由斜线(/)开始,它的值可以是任何值,但是不要使用.
PHP作为扩展名,因为这样可能会和一个真实存在的PHP文件相冲突.
;ping.
response=pong该指令用于定制ping请求的响应,响应的格式是text/plain(对200响应代码).
默认值为pong.
;request_terminate_timeout=0终止请求超时.
在worker进程被杀掉之后,提供单个请求的超时间隔.
当指令"max_execution_time"(该指令在php.
ini文件中设置,一般设置为30,表示每一个脚本的最大执行时间)由于某种原因不停止脚本执行时,应该使用该选项.
如果设置为"0",那么就意味着"off",即不启用该指令.
有效的单位:s(econds)(默认单位)、m(inutes)、h(ours)或d(ays)默认值:0;request_slowlog_timeout=0超时设置.
通过设置该选项,能够让你对一个PHP程序进行跟踪,对于执行缓慢的脚本,则将它们连同调用的栈一起转储并记录到日志文件中.
如果将该值设置为"0s",那么意味着设置为"off".
有效的单位:s(econds)(默认单位)、m(inutes)、h(ours)或者d(ays)默认值:0;slowlog=log/$pool.
log.
slow该文件用于记录慢请求.
没有设置默认值.
注意:如果设置了request_slowlog_timeout指令,那么该指令会被强制使用.
;rlimit_files=1024设置打开文件描述符的限制.
默认值为系统定义的值.
;rlimit_core=0该指令设置内核文件对资源的使用限制,用于内核转储.
如果设置为0,那么将不能够对内核进行转储,否则会出错,因此不建议这么做.
可能的值有"unlimited",或者大于或等于0的整数.
默认值:系统定义的值.
;chroot=设置chroot路径.
在程序一开始启动时就将其chroot放置到指定的目录下.
该指令的值必须是一个绝对路径,如果没有设置该指令的值,那么chroot就不被使用.
注意:你可以使用"$prefix"添加前缀,"$prefix"的值将会是在相应的进程池中定义的"$prefix",当然也可以是它的子目录.
如果进程池的前缀没有设置,那么将会使用全局的前缀.
chroot是一项非常安全的功能,无论在任何时候都可以使用该功能.
然而,所有的PHP路径将会随着chroot转移(error_log,sessions.
save_path,.
.
.
).
默认值:没有设置.
;chdir=/var/www在程序启动时将会改变到该指令指定的位置.
注意:相对路径将会被使用.
默认值:当前路径或者是chroot后的"/"目录.
;catch_workers_output=yes将worker的标准输出(stdout)和错误输出(stdout)重定向到主要的错误日志记录中.
如果没有设置,根据FastCGI的指定,那么标准输出(stdout)和错误输出(stdout)将会被重定向到设备/dev/null上.
注意:在高负荷的环境中,在载入页面时,将会引起延时.
处理时间为几个毫秒.
默认值:no;env[HOSTNAME]=$HOSTNAME;env[PATH]=/usr/local/bin:/usr/bin:/bin;env[TMP]=/tmp;env[TMPDIR]=/tmp;env[TEMP]=/tmp传递环境变量,类似于LD_LIBRARY_PATH.
所有$VARIABLE都来自于当前的环境.
默认值:清除系统指令env的值;php_admin_value[sendmail_path]=/usr/sbin/sendmail-t-i-fwww@my.
domain.
com;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;php_value/php_flag可以设置典型的ini定义,它可以覆盖由PHP调用的"ini_set".
;php_admin_value/php_admin_flag这些指令的值将不会被PHP调用的"ini_set"覆盖.
额外的php.
ini定义,对具体进程池的worker定义.
这些设置会覆盖以前在配置文件中设置的值.
这些指令和PHPSAPI(ServerApplicationProgrammingInterface,服务端应用编程端口)一样.
对于php_*flag,有效的值为:on、off、1、0、true、false、yes或no.
定义"extension"将会从extension_dir载入相应的共享扩展.
定义"disable_functions"或"disable_classes"将不会覆盖先前在php.
ini中定义的值,而会添加新的值.
注意:ini的路径选项可以是相对路径,相对路径可以是先前定义的前缀(例如进程池中的前缀、全局配置中的前缀或者是/usr/local/php5.
3.
4,即在安装配置时"--prefix"指定的前缀).
默认值:除了php.
ini的值和在启动时通过-d选项定义的值外,没有定义默认值.
在php-fpm的配置文件中有两个指令非常重要,那就是"pm.
max_children"和"request_terminate_timeout".
第一个指令确定了php-fpm的处理能力,原则上是越多越好,但这是在内存足够大的前提条件下,每开启一个php-fpm进程要占用30MB左右的内存,因此如果开启120个进程,那就会使用120*40MB=4800MB内存,如果想看看还能开启多少个进程,你可以通过free命令来查看一下现在的内存使用情况:[root@s8~]#freetotalusedfreesharedbufferscachedMem:831062482990401158401970763848784-/+buffers/cache:42531804057444Swap:41942881444194144如果你的内存较小,那么设置的进程数目就要小,例如,如果是512MB内存,除去系统和其他应用程序使用的内存,也许只能开启3~5个进程,如果请求访问较多,那么肯定会出现502、504错误.
对于502错误来说,属于繁忙进程出错而造成的,而对于504来说,就是客户发送的请求在限定的时间内没有得到响应——过多的请求而导致php-fpm无法及时处理就产生了"504GatewayTime-out".
这里我们没有考虑服务器端网络带宽的问题,就假设它具有足够的带宽吧.
另一个需要注意的指令就是"request_terminate_timeout",它决定了php-fpm进程的连接、发送和读取的时间.
说得极端一点,如果你将这个值设置为"1",再加上你的服务器较忙且处理的PHP程序较耗时,那么在这种情况下肯定会出现"502BadGateway"和"504GatewayTime-out".
该指令的默认值为"0",就是说没有启用,换句话说就是对于php-fpm不加限制,随意它执行,这种情况并非不可,但前提条件是你的php-fpm足够健康(就是说你要保证它没有bug,你能保证吗),因此我们还是要加以限制,但是要根据实际情况做限定,这个要根据具体的环境情况作决定.
2.
配置文件pear.
conf该配置文件与pear命令相关,是pear的配置文件:[root@mailetc]#morepear.
conf#PEAR_Config0.
9a:31:{s:9:"cache_dir";s:15:"/tmp/pear/cache";s:15:"default_channel";s:12:"pear.
php.
net";s:16:"preferred_mirror";s:12:"pear.
php.
net";s:13:"remote_config";s:0:"";s:13:"auto_discover";i:0;s:13:"master_server";s:12:"pear.
php.
net";s:10:"http_proxy";s:0:"";s:7:"php_dir";s:27:"/usr/local/php5.
3.
4/lib/php";s:7:"ext_dir";s:64:"/usr/local/php5.
3.
4/lib/php/extensions/no-debug-non-zts-20090626";s:7:"doc_dir";s:31:"/usr/local/php5.
3.
4/lib/php/doc";s:7:"bin_dir";s:23:"/usr/local/php5.
3.
4/bin";s:8:"data_dir";s:32:"/usr/local/php5.
3.
4/lib/php/data";s:7:"cfg_dir";s:31:"/usr/local/php5.
3.
4/lib/php/cfg";s:7:"www_dir";s:34:"/usr/local/php5.
3.
4/lib/php/htdocs";s:8:"test_dir";s:32:"/usr/local/php5.
3.
4/lib/php/test";s:8:"temp_dir";s:14:"/tmp/pear/temp";s:12:"download_dir";s:18:"/tmp/pear/download";s:7:"php_bin";s:27:"/usr/local/php5.
3.
4/bin/php";s:10:"php_prefix";s:0:"";s:10:"php_suffix";s:0:"";s:7:"php_ini";s:0:"";s:8:"username";s:0:"";s:8:"password";s:0:"";s:7:"verbose";i:1;s:15:"preferred_state";s:6:"stable";s:5:"umask";i:18;s:9:"cache_ttl";i:3600;s:8:"sig_type";s:3:"gpg";s:7:"sig_bin";s:12:"/usr/bin/gpg";s:9:"sig_keyid";s:0:"";s:10:"sig_keydir";s:32:"/usr/local/php5.
3.
4/etc/pearkeys";}1.
2.
2bin/目录[root@mailphp5.
3.
4]#treebin/bin/|--pear|--peardev|--pecl|--phar->/usr/local/php5.
3.
4/bin/phar.
phar|--phar.
phar|--php|--php-config'--phpize虽然这些知识和Nginx的关系不大,但是为了读者更好地使用,因此在这里再花点篇幅讲一下它们的作用.
1.
pear命令pear(PHPExtensionandApplicationRepository,PHP扩展与应用资源库,原为PHPExtensionandAdd-onRepository)是PHP程序的基础类,并可能在将来增强为在开发人员间分发PHP和C语言编写的PHP扩展的关键方法.
它可以查看已经安装的pear包以及这些包的信息,对pear包进行升级,等等.
[root@mailbin]#pwd/usr/local/php5.
3.
4/bin[root@mailbin]#.
/php-r"readfile('http://pear.
php.
net/go-pear');">go-pear如果在执行该命令时出现下面的错误:[root@mailbin]#.
/pear-r"readfile('http://pear.
php.
net/go-pear');">go-pearPHPWarning:require_once(Console/Getopt.
php):failedtoopenstream:Nosuchfileordirectoryin/usr/local/php5.
3.
4/lib/php/System.
phponline21PHPFatalerror:require_once():Failedopeningrequired'Console/Getopt.
php'(include_path='/usr/local/php5.
3.
4/lib/php')in/usr/local/php5.
3.
4/lib/php/System.
phponline21这是因为System.
php没安装,或者是位置不对,解决方法如下:[root@mail~]#wgethttp://download.
pear.
php.
net/package/Console_Getopt-1.
3.
0.
tgz[root@mail~]#[root@mail~]#tar-zxvfConsole_Getopt-1.
3.
0.
tgzpackage.
xmlConsole_Getopt-1.
3.
0/Console/Getopt.
php[root@mail~]#[root@mail~]#mkdir/usr/local/php5.
3.
4/lib/php/Console/[root@mail~]#cpConsole_Getopt-1.
3.
0/Console/Getopt.
php\/usr/local/php5.
3.
4/lib/php/Console/Getopt.
php这样就可以了,然后执行:[root@mailbin]#.
/phpgo-pear接着按照提示做就可以了.
下面我们来看一下它的使用方法;[root@mailbin]#.
/pearCommands:buildBuildanExtensionFromCSourcebundleUnpacksaPeclPackagechannel-addAddaChannelchannel-aliasSpecifyanaliastoachannelnamechannel-deleteRemoveaChannelFromtheListchannel-discoverInitializeaChannelfromitsserverchannel-infoRetrieveInformationonaChannelchannel-loginConnectsandauthenticatestoremotechannelserverchannel-logoutLogsoutfromtheremotechannelserverchannel-updateUpdateanExistingChannelclear-cacheClearWebServicesCacheconfig-createCreateaDefaultconfigurationfileconfig-getShowOneSettingconfig-helpShowInformationAboutSettingconfig-setChangeSettingconfig-showShowAllSettingsconvertConvertapackage.
xml1.
0topackage.
xml2.
0formatcvsdiffRuna"cvsdiff"forallfilesinapackagecvstagSetCVSReleaseTagdownloadDownloadPackagedownload-allDownloadseachavailablepackagefromthedefaultchannelinfoDisplayinformationaboutapackageinstallInstallPackagelistListInstalledPackagesInTheDefaultChannellist-allListAllPackageslist-channelsListAvailableChannelslist-filesListFilesInInstalledPackagelist-upgradesListAvailableUpgradesloginConnectsandauthenticatestoremoteserver[Deprecatedinfavorofchannel-login]logoutLogsoutfromtheremoteserver[Deprecatedinfavorofchannel-logout]makerpmBuildsanRPMspecfilefromaPEARpackagepackageBuildPackagepackage-dependenciesShowpackagedependenciespackage-validateValidatePackageConsistencypickleBuildPECLPackageremote-infoInformationAboutRemotePackagesremote-listListRemotePackagesrun-scriptsRunPost-InstallScriptsbundledwithapackagerun-testsRunRegressionTestssearchSearchremotepackagedatabaseshell-testShellScriptTestsignSignapackagedistributionfilesvntagSetSVNReleaseTaguninstallUn-installPackageupdate-channelsUpdatetheChannelListupgradeUpgradePackageupgrade-allUpgradeAllPackages[Deprecatedinfavorofcallingupgradewithnoparameters]Usage:pear[options]command[command-options]Type"pearhelpoptions"tolistalloptions.
Type"pearhelpshortcuts"tolistallcommandshortcuts.
Type"pearhelp"togetthehelpforthespecifiedcommand用法比较简单,这里就不把它翻译为中文了.
下面安装一个库:[root@mailbin]#.
/pearinstallConsole_Getopt-1.
3.
0WARNING:channel"pear.
php.
net"hasupdateditsprotocols,use"pearchannel-updatepear.
php.
net"toupdatedownloadingConsole_Getopt-1.
3.
0.
tgz.
.
.
StartingtodownloadConsole_Getopt-1.
3.
0.
tgz(4,408bytes)…done:4,408bytesinstallok:channel://pear.
php.
net/Console_Getopt-1.
3.
0注意,有警告信息,需要升级它的协议:[root@mailbin]#.
/pearchannel-updatepear.
php.
netUpdatingchannel"pear.
php.
net"UpdateofChannel"pear.
php.
net"succeede再安装一个库:[root@mailbin]#.
/pearinstallHTML_QuickForm2-0.
5.
0downloadingHTML_QuickForm2-0.
5.
0.
tgz.
.
.
StartingtodownloadHTML_QuickForm2-0.
5.
0.
tgz(138,925bytes)done:138,925bytesdownloadingHTML_Common2-2.
0.
0.
tgz.
.
.
StartingtodownloadHTML_Common2-2.
0.
0.
tgz(7,777bytes).
.
.
done:7,777bytesinstallok:channel://pear.
php.
net/HTML_Common2-2.
0.
0installok:channel://pear.
php.
net/HTML_QuickForm2-0.
5.
0这次正常了.
用法就是这么简单.
2.
pecl命令pecl(PHPExtensionCommunityLibrary)是PHP的扩展库,它提供了一系列已知的扩展库,由C++等其他语言编写而成,多数以DLL(动态链接库)的形式体现,执行比pear更快,但是与pear不同的是,pecl需要在服务器上配置并被注册到主机中.
还有与pear不同的一点是,它提供的是其他的编程语言编写的扩展库.
pecl的用法也比较简单,基本和pear一样,只是对于库的安装过程稍微复杂一些,因为需要调用系统的编译器进行编译安装.
在此就不多讲了,一句话,就是它是安装其他语言编写的PHP扩展库.
3.
phpize命令当PHP编译完成后,PHP的bin目录下会有phpize这个脚本文件,phpize是用来扩展PHP扩展模块的,通过phpize可以建立PHP的外挂模块,在编译你要添加的扩展模块之前,执行一下phpize就可以了.
比如你想在原来编译好的PHP中加入memcached或者curl等扩展模块,可以使用phpize,通过以下几步工作.
下面以curl模块为例,演示一下如何添加PHP扩展模块.
步骤如下.
下载curl:[root@mail~]#wgethttp://curl.
haxx.
se/download/curl-7.
21.
3.
tar.
gz编译安装:[root@mailcurl-7.
21.
3]#.
/configure--prefix=/usr/local/curl-7.
21.
3…curlversion:7.
21.
3Hostsetup:i686-pc-linux-gnuInstallprefix:/usr/local/curl-7.
21.
3Compiler:gccSSLsupport:enabled(OpenSSL)SSHsupport:no(--with-libssh2)zlibsupport:enabledkrb4support:no(--with-krb4*)GSSAPIsupport:no(--with-gssapi)SPNEGOsupport:no(--with-spnego)resolver:default(--enable-ares/--enable-threaded-resolver)ipv6support:enabledIDNsupport:enabledBuildlibcurl:Shared=yes,Static=yesBuilt-inmanual:enabledVerboseerrors:enabled(--disable-verbose)SSPIsupport:no(--enable-sspi)cacertbundle:/etc/pki/tls/certs/ca-bundle.
crtcacertpath:noLDAPsupport:enabled(OpenLDAP)LDAPSsupport:enabledRTSPsupport:enabledRTMPsupport:no(--with-librtmp)Protocols:DICTFILEFTPFTPSGOPHERHTTPHTTPSIMAPIMAPSLDAPLDAPSPOP3POP3SRTSPSMTPSMTPSTELNETTFTP[root@mailcurl-7.
21.
3]#make[root@mailcurl-7.
21.
3]#makeinstall安装扩展模块:[root@mailcurl]#pwd/root/php-5.
3.
4/ext/curl[root@mailcurl]#/usr/local/php5.
3.
4/bin/phpizeConfiguringfor:PHPApiVersion:20090626ZendModuleApiNo:20090626ZendExtensionApiNo:220090626[root@mailcurl]#.
/configure--with-php-config=/usr/local/php5.
3.
4/bin/php-config[root@mailcurl]#make[root@mailcurl]#makeinstallInstallingsharedextensions:/usr/local/php5.
3.
4/lib/php/extensions/no-debug-non-zts-20090626/这一步注意:.
/configure后面可以指定的是php-config文件的路径.
编辑配置文件添加配置项:[root@mailsbin]#vi/usr/local/php5.
3.
4/lib/php.
ini;…orwithapath:;;extension=/path/to/extension/msql.
soextension=curl.
so重新启动php-fpm,然后看一下是否支持curl,如果已经支持,那么会有如下显示:为了了解它的用法,我们再举一个例子.
下载并安装zlib:[root@mail~]wgethttp://cdnetworks-kr-2.
dl.
sourceforge.
net/project/libpng/zlib/1.
2.
5/zlib-1.
2.
5.
tar.
bz2[root@mail~]#tar-jxvfzlib-1.
2.
5.
tar.
bz2[root@mailzlib-1.
2.
5]#.
/configure--prefix=/usr/local/zlib-1.
2.
5[root@mailzlib-1.
2.
5]#make[root@mailzlib-1.
2.
5]#makeinstall添加扩展模块:[root@mailzlib]#pwd/root/php-5.
3.
4/ext/zlib[root@mailzlib]#/usr/local/php5.
3.
4/bin/phpizeCannotfindconfig.
m4.
Makesurethatyourun'/usr/local/php5.
3.
4/bin/phpize'inthetoplevelsourcedirectoryofthemodule[root@mailzlib]#[root@mailzlib]#cpconfig0.
m4config.
m4[root@mailzlib]#/usr/local/php5.
3.
4/bin/phpizeConfiguringfor:PHPApiVersion:20090626ZendModuleApiNo:20090626ZendExtensionApiNo:220090626[root@mailzlib]#配置:[root@mailzlib]#.
/configure\--with-php-config=/usr/local/php5.
3.
4/bin/php-config编译安装:[root@mailzlib]#make…Librarieshavebeeninstalledin:/root/php-5.
3.
4/ext/zlib/modules…[root@mailzlib]#makeinstallInstallingsharedextensions:/usr/local/php5.
3.
4/lib/php/extensions/no-debug-non-zts-20090626/在配置文件中添加如下条目:[root@mailzlib]#vi/usr/local/php5.
3.
4/lib/php.
iniextension=zlib.
so访问测试:1.
2.
3sbin/目录这个目录下只有一个php-fpm文件:[root@mailphp5.
3.
4]#treesbin/sbin/'--php-fpm1.
2.
4php-fpm命令该命令是启动php-fpm服务的命令,通过该命令可以管理php-fpm.
1.
3管理php-fpm由于这个版本的php-fpm不再支持php-fpm补丁,因此也就没有管理php-fpm进程的php-fpm(start|stop|reload)命令,但是我们知道php-fpm的master进程能够理解以下控制信号.
SIGINT、SIGTERM:立刻终止进程.
SIGQUIT:平滑终止进程.
SIGUSR1:重新打开日志文件.
SIGUSR2:平滑重载所有worker进程并重新载入配置和二进制模块.
例如:关闭php-fpm:kill-SIGINT'cat/usr/local/php5.
3.
4/var/run/php-fpm.
pid'重载php-fpm:kill-SIGUSR2'cat/usr/local/php5.
3.
4/var/run/php-fpm.
pid'1.
3.
1编写init启动脚本基于这些知识,我们可以自己写一个int脚本来控制php-fpm.
我们看一下这个脚本的内容:[root@mailinit.
d]#catphp-fpm#!
/bin/sh###BEGININITINFO#Provides:php-fpm#Required-Start:$remote_fs$network#Required-Stop:$remote_fs$network#Default-Start:2345#Default-Stop:016#Short-Description:startsphp-fpm#Description:startsthePHPFastCGIProcessManagerdaemon###ENDINITINFOprefix=/usr/local/php5.
3.
4exec_prefix=${prefix}php_fpm_BIN=${exec_prefix}/sbin/php-fpmphp_fpm_CONF=${prefix}/etc/php-fpm.
confphp_fpm_PID=${prefix}/var/run/php-fpm.
pidphp_opts="--fpm-config$php_fpm_CONF"wait_for_pid(){try=0whiletest$try-lt35;docase"$1"in'created')if[-f"$2"];thentry=''breakfi;;'removed')if[!
-f"$2"];thentry=''breakfi;;esacecho-n.
try='expr$try+1'sleep1done}case"$1"instart)echo-n"Startingphp-fpm"$php_fpm_BIN$php_optsif0];thenecho"failed"exit1fiwait_for_pidcreated$php_fpm_PIDif[-n"$try"];thenecho"failed"exit1elseecho"done"fi;;stop)echo-n"Gracefullyshuttingdownphp-fpm"if[!
-r$php_fpm_PID];thenecho"warning,nopidfilefound-php-fpmisnotrunning"exit1fikill-QUIT'cat$php_fpm_PID'wait_for_pidremoved$php_fpm_PIDif[-n"$try"];thenecho"failed.
Useforce-exit"exit1elseecho"done"fi;;force-quit)echo-n"Terminatingphp-fpm"if[!
-r$php_fpm_PID];thenecho"warning,nopidfilefound-php-fpmisnotrunning"exit1fikill-TERM'cat$php_fpm_PID'wait_for_pidremoved$php_fpm_PIDif[-n"$try"];thenecho"failed"exit1elseecho"done"fi;;restart)$0stop$0start;;reload)echo-n"Reloadservicephp-fpm"if[!
-r$php_fpm_PID];thenecho"warning,nopidfilefound-php-fpmisnotrunning"exit1fikill-USR2'cat$php_fpm_PID'echo"done";;*)echo"Usage:$0{start|stop|force-quit|restart|reload}"exit1;;esac1.
3.
2添加init启动如果你不想自己写也没关系,你只要细心点就会找到PHP在安装时按照你的配置而生成的管理脚本,只是它仍然放置在PHP的源代码目录中,我们所需要做的就是将它拷贝到/etc/init.
d目录下:[root@mailfpm]#pwd/root/php-5.
3.
4/sapi/fpm/init.
d.
php-fpm[root@mailfpm]#cpinit.
d.
php-fpm/etc/init.
d/php-fpm[root@mailfpm]#chmod755/etc/init.
d/php-fpm然后再进行以下两步就可以使用service命令来管理了:[root@mailfpm]chkconfig--addphp-fpm[root@mailfpm]chkconfig--level35php-fpmonservicephp-fpm后可使用的命令有{start|stop|force-quit|restart|reload},使用比较简单,这个就不多说了.
1.
4认识FastCGI模块FastCGI模块是一个必选模块,在官方的wiki中找到了29条指令,在0.
8.
53中提供了35条指令,根据其功能分为七类,并给予简短的说明,以便更好地使用这些指令.
1.
4.
1配置示例location/{fastcgi_passlocalhost:9000;fastcgi_indexindex.
php;fastcgi_paramSCRIPT_FILENAME/home/www/scripts/php$fastcgi_script_name;fastcgi_paramQUERY_STRING$query_string;fastcgi_paramREQUEST_METHOD$request_method;fastcgi_paramCONTENT_TYPE$content_type;fastcgi_paramCONTENT_LENGTH$content_length;}另一个是带有缓存的例子:http{fastcgi_cache_path/path/to/cachelevels=1:2keys_zone=NAME:10minactive=5m;fastcgi_cache_key"$scheme$request_method$host$request_uri";server{location/{fastcgi_pass127.
0.
0.
1:9000;fastcgi_cacheNAME;fastcgi_cache_valid2003021h;fastcgi_cache_valid3011d;fastcgi_cache_validany1m;fastcgi_cache_min_uses1;fastcgi_cache_use_staleerrortimeoutinvalid_headerhttp_500;}}}1.
4.
2指令下面我们来看看FastCGI模块提供的指令.
1.
与连接相关的指令指令名称:fastcgi_pass语法:fastcgi_passfastcgi-server默认值:none使用环境:location、ifinlocation功能:指定FastCGI服务器监听端口与地址,即TCP套接字,可以是本机或者其他服务器的IP地址.
例如:使用TCP套接字格式:fastcgi_passlocalhost:9000;也可以使用UNIX套接字:fastcgi_passunix:/tmp/fastcgi.
socket;还可以用作upstream区段:upstreambackend{serverlocalhost:1234;}fastcgi_passbackend;指令名称:fastcgi_bind语法:fastcgi_bindaddress默认值:none使用环境:http、server、location功能:在调用connect()之前,该指令会将每一个上游连接的套接字绑定到本地的IP地址上.
如果主机有多个网卡接口/别名,并且你想通过指定的网卡接口/IP地址对外连接,那么该指令将会很有用.
该指令于0.
8.
22版本开始提供.
例如:fastcgi_bind192.
168.
1.
1;指令名称:fastcgi_param语法:fastcgi_paramparametervalue默认值:none使用环境:http、server、location功能:指定一些传递到FastCGI服务器的参数,参数可以使用字符串、变量及它们的组合.
如果没有对该指令进行设置,那么它会从它的上一层(或者叫外层,outerlevel)继承;如果在当前层设置了该指令,那么相对于本级别会清除任何之前的设置.
下面的例子是一个对于PHP来说最低限度的设置:fastcgi_paramSCRIPT_FILENAME/www/scripts/php$fastcgi_script_name;fastcgi_paramQUERY_STRING$query_string;参数SCRIPT_FILENAME被PHP用作处理执行的脚本的名字,而QUERY_STRING则包含了请求的参数.
如果处理POST请求,那么还有另外的三个参数必不可少.
下面的这三个参数,对于PHP程序来说是最低限度的设置:fastcgi_paramREQUEST_METHOD$request_method;fastcgi_paramCONTENT_TYPE$content_type;fastcgi_paramCONTENT_LENGTH$content_length;如果在编译安装PHP时使用了--enable-force-cgi-redirect参数,那么必须将参数"200"传递给REDIRECT_STATUS参数:fastcgi_paramREDIRECT_STATUS200;指令名称:fastcgi_send_lowat功能:对于TCP套接字,该指令允许你使用SO_SNDLOWAT标志,仅在FreeBSD系统下.
2.
与负载均衡相关的指令指令名称:fastcgi_store语法:fastcgi_storeon|off|path默认值:fastcgi_storeoff使用环境:http、server、location功能:该指令用于设置存储前端服务器文件的路径.
该指令的值有三种类型,其中on指定了与使用root和alias指令相同的路径;而off禁止存储;还有一种选择就是指定路径(path).
此外,参数中可以使用变量使路径名更明确,例如:fastcgi_store/data/www$original_uri;对于文件的修改日期,在响应中将会由"Last-Modified"头来设置.
为了使这些文件更加安全(不会被无意删除或者是访问),可以将它们存放在一个临时目录中,使用fastcgi_temp_path指令指定目录.
该指令可以被用作创建后台服务器的动态输出,并不是经常改变的动态输出的本地拷贝,例如:location/images/{root/data/www;error_page404=/fetch$uri;}location/fetch{internal;fastcgi_passbackend;fastcgi_storeon;fastcgi_store_accessuser:rwgroup:rwall:r;fastcgi_temp_path/data/temp;alias/data/www;}指令名称:fastcgi_store_access语法:fastcgi_store_accessusers:permissions[users:permission.
.
.
]默认值:fastcgi_store_accessuser:rw使用环境:http、server、location功能:该指令用于指定创建文件或目录的权限.
例如:fastcgi_store_accessuser:rwgroup:rwall:r;如果为group或者all设置了任何权限,那么就没必要为user设置了:fastcgi_store_accessgroup:rwall:r指令名称:fastcgi_next_upstream语法:fastcgi_next_upstreamerror|timeout|invalid_header|http_500|http_503|http_404|off默认值:fastcgi_next_upstreamerrortimeout使用环境:http、server、location功能:当fastcgi_pass连接到一个upstream区段时,该指令定义了请求被抛弃并且重新发送到下一个upstream服务区段的情况.
该指令指定在哪种情况下请求将被转发到下一个FastCGI服务器,在官方wiki中没有介绍到这个配置,可能是不太成熟吧.
注意:在将请求传送到下一个服务器之前可能就已经将空的数据传送到了客户端,因此,如果在数据传送中有错误或者超时发生,该指令可能无法修复这些传送错误.
该指令定义了如果出现以下情况,可以将请求传递到下一台服务器.
Error:在连接服务器的过程中发生错误,即将请求传递到服务器或者是读取服务器响应头的过程中;Timeout:在连接服务器期间发生超时,即将请求传递到服务器或者是读取服务器响应头的过程中;invalid_header:服务器返回为空或者是无效的响应;http_500:服务器返回500响应.
http_503:服务器返回503响应.
http_404:服务器返回404响应.
off:明确禁止将请求传递到下一台服务器.
例如:fastcgi_next_upstreamerrortimeouthttp_504;3.
与缓存相关的指令指令名称:fastcgi_buffers语法:fastcgi_buffersthe_numberis_size默认值:fastcgi_buffers84k/8k使用环境:http、server、location功能:设置缓存区的数量和大小,被用于缓存从FastCGI应用程序读取响应数据.
该指令有两个参数,第一个设置缓存的数量,第二个设置缓存的大小.
例如:fastcgi_buffers84k;指令名称:fastcgi_busy_buffers_size功能:Nginx从0.
1.
14版本中就提供了该指令,但是在官方的wiki中却没有提供用法,按照一般的用法来说就是将其设为fastcgi_buffers的两倍.
例如:fastcgi_busy_buffers_size64k;指令名称:fastcgi_buffer_size语法:fastcgi_buffer_sizethe_size默认值:fastcgi_buffer_size4k/8k使用环境:http、server、location功能:设置缓存区的大小,用于缓存FastCGI应用程序响应数据包开始的部分,通常包含的是简单头数据.
默认值相当于1个缓存区大小.
例如:fastcgi_buffer_size4k;指令名称:fastcgi_cache_min_uses语法:fastcgi_cache_min_usesn默认值:fastcgi_cache_min_uses1使用环境:http、server、location功能:在定义了使用缓存后,通过该指令来定义一个相同的URL经过多少次请求后将会被缓存,默认情况下,一个请求被响应一次被击中后就会被缓存(下一个具有同样缓存key请求将会收到被缓存的响应).
指令名称:fastcgi_cache_bypass功能:在官方的wiki中没有介绍该指令.
该指令指定了什么样的内容不要从缓存中读取,即使该内容已被缓存.
换句话说,就是指定不容许从缓存中读的内容.
例如:fastcgi_cache_bypass$cookie_NAME;指令名称:fastcgi_no_cache语法:fastcgi_no_cachevariable[.
.
.
]默认值:none使用环境:http、server、location功能:指定在哪种情况下的应答将不会使用缓存.
换句话说就是不在缓存中保存的响应内容(不容许、阻止保存的内容).
例如:fastcgi_no_cache$cookie_nocache$arg_nocache$arg_comment;fastcgi_no_cache$http_pragma$http_authorization;指令名称:fastcgi_cache_valid语法:fastcgi_cache_valid[http_return_code[.
.
.
]]time默认值:none使用环境:http、server、location功能:可以使用该指令为各种不同的响应代码定制不同的缓存时间.
例如,404错误代码相关的条目为1分钟,相反,代码200OK响应设置为10分钟或者更多.
该指令可以插入多次.
例如:fastcgi_cache_valid20030210m;fastcgi_cache_valid4041m;指令名称:fastcgi_cache_use_stale语法:fastcgi_cache_use_staleupdating|error|timeout|invalid_header|http_500默认值:fastcgi_cache_use_staleoff使用环境:http、server、location功能:决定在网关出问题时,例如错误,超时等情况下,是否提供过时的、陈旧的缓存数据.
如果你使用该指令的timeout参数,并且是网关超时,那么Nginx将会提供缓存数据.
指令名称:fastcgi_cache_methods语法:fastcgi_cache_methods[GETHEADPOST]默认值:fastcgi_cache_methodsGETHEAD使用环境:main、http、location功能:定义被用于缓存的HTTP方法.
GET和HEAD被默认包含在内,不可以禁止.
例如,开启对POST请求的缓存.
例如:fastcgi_cache_methodsPOST;指令名称:fastcgi_catch_stderr功能:允许拦截一些发送到stderr(标准的错误输出设备)的错误信息并且将其存储在Nginx的错误日志中.
例如:fastcgi_catch_stderr"PHPFatalerror:"指令名称:fastcgi_cache_key语法:fastcgi_cache_keyline默认值:none使用环境:http、server、location功能:该指令用来定义缓存key,换句话说,就是为了区分不同的缓存条目.
如果一个缓存的key设置为$uri,那么所有带有类似$uri的请求将相当于同样的缓存条目.
对于大多数动态Web站点来说这还不够,还需要在缓存key中包含查询字符参数,以便/index.
php和/index.
phppage=contact不会指向同一个缓存条目.
例如:fastcgi_cache"$scheme$host$request_uri$cookie_user";指令名称:fastcgi_cache语法:fastcgi_cachezone|off默认值:off使用环境:http、server、location功能:为缓存实际使用的共享内存指定一个区域,定义一个cache区域(zone).
对区域(zone)定义标识符是为了进一步在其他指令中使用.
相同的区域可以用在不同的地方.
例如:fastcgi_cachef1;指令名称:fastcgi_cache_path语法:fastcgi_cache_pathpath[levels=m:n]keys_zone=name:size[inactive=time][max_size=size]默认值:none使用环境:http功能:指定用于存储缓存文件的目录,也包括其他相关的缓存参数.
所有的数据被存储在这些文件中.
例如:fastcgi_cache_path/s1/d/mglevels=1:2keys_zone=f1:50m;4.
与临时文件相关的指令指令名称:fastcgi_temp_file_write_size功能:当提供了使用存储驱动器上的临时文件方式时,需要设置写缓存区大小,该指令就是来完成这个工作的.
例如:fastcgi_temp_file_write_size64k;指令名称:fastcgi_temp_path语法:fastcgi_temp_pathpath[level1[level2[level3]]]默认值:fastcgi_temp_pathfastcgi_temp使用环境:http、server、location功能:该指令设置存储临时文件的路径用来存放从其他的服务器传送来的数据,可以指定一个三级子目录来建立哈希存储.
例如:fastcgi_temp_path/spool/nginx/fastcgi_temp12;临时文件的名字可能会类似于:/spool/nginx/fastcgi_temp/7/45/00000123457指令名称:fastcgi_max_temp_file_size语法:fastcgi_max_temp_file_size0默认值:none使用环境:http、server、location功能:指定临时文件的最大值.
设置该指令的值为0,那么对于FastCGI请求将会禁止使用临时文件,或者指定临时文件的最大值.
例如:fastcgi_max_temp_file_size8m;5.
与请求相关的指令指令名称:fastcgi_pass_header语法:fastcgi_pass_headername使用环境:http、server、location功能:该指令明确指定了允许传递到客户端的头信息.
例如:fastcgi_pass_headerAuthorization;指令名称:fastcgi_hide_header语法:fastcgi_hide_headername使用环境:http、server、location功能:默认情况下,Nginx不会将"Status"和"X-Accel-.
.
.
"头信息从后边的FastCGI进程传递到客户端.
该指令也可以用来隐藏其他的头信息.
如果头信息"Status"和"X-Accel-.
.
.
"必须被提供,那么就必须使用指令fastcgi_pass_header来强迫它们返回给客户端.
例如:fastcgi_hide_headerX-Forwarded-For;指令名称:fastcgi_ignore_headers语法:fastcgi_ignore_headersname[name.
.
.
]使用环境:http、server、location功能:该指令禁止处理从FastCGI后台服务器返回的四种头信息(之一):X-Accel-Redirect、X-Accel-Expires、Expires及Cache-Control.
例如:fastcgi_ignore_headersX-Accel-Redirect;指令名称:fastcgi_pass_request_headers语法:fastcgi_pass_request_headerson|off默认值:fastcgi_pass_request_headerson使用环境:http、server、location功能:定义是否将请求头(requestheaders)传递到后台服务器.
指令名称:fastcgi_pass_request_body语法:fastcgi_pass_request_bodyon|off默认值:fastcgi_pass_request_bodyon使用环境:http、server、location功能:定义是否将请求体传递到后台服务器.
指令名称:fastcgi_intercept_errors语法:fastcgi_intercept_errorson|off默认值:fastcgi_intercept_errorsoff使用环境:http、server、location功能:定义Nginx是处理被网关返回的错误还是直接向客户端返回错误页.
该指令以前的名字为:fastcgi_redirect_errors.
指令名称:fastcgi_ignore_client_abort语法:fastcgi_ignore_client_aborton|off默认值:fastcgi_ignore_client_abortoff使用环境:http、server、location功能:该指令定义如果客户端放弃它们对服务器端的请求,那么会发生什么.
如果打开该指令,那么Nginx会忽略该放弃的请求并且完成处理请求;如果关闭该指令,那么Nginx不会忽略放弃的请求,它会中断请求处理并且放弃与FastCGI服务器的通信.
指令名称:fastcgi_split_path_info语法:fastcgi_split_path_inforegex其中regex可以包含两个组:实际的PHP脚本文件名(包括路径),相当于$fastcgi_script_name;PHP脚本文件名之后给定的参数值,相当于$fastcgi_path_info;使用环境:location功能:该指令允许设置CGI的两个变量SCRIPT_FILENAME(SCRIPT_NAME)和PATH_INFO.
Nginx服务器0.
7.
31以后的版本提供该指令.
例如:location~^.
+\.
php{(…)fastcgi_split_path_info^(.
+\.
php)(.
*)$;fastcgi_paramSCRIPT_FILENAME/path/to/php$fastcgi_script_name;fastcgi_paramPATH_INFO$fastcgi_path_info;fastcgi_paramPATH_TRANSLATED$document_root$fastcgi_path_info;(…)}请求/show.
php/article/0001将会成为:SCRIPT_FILENAME--->/path/to/php/show.
phpPATH_INFO--->/article/0001指令名称:fastcgi_index语法:fastcgi_indexfile默认值:none使用环境:http、server、location功能:FastCGI服务不支持自动目录索引——如果URI请求以/结尾,那么Nginx会将fastcgi_index指定的值附加在/之后,并且会存储在变量$fastcgi_script_name中.
例如:fastcgi_indexindex.
php;fastcgi_paramSCRIPT_FILENAME/path/to/php$fastcgi_script_name;6.
与时间相关的指令指令名称:fastcgi_send_timeout语法:fastcgi_send_timeouttime默认值:fastcgi_send_timeout60使用环境:http、server、location功能:该指令为向上游服务器FastCGI进程传送数据设置超时时间,如果在上游服务器的错误里面发现一些超时错误,那么可以恰当地增加这个值.
该指令指定的是请求服务器的超时时间,指的是完成了2次握手,而不是完整的连接,如果在这期间客户端没有进行数据传递,那么服务器将关闭这个连接.
指令名称:fastcgi_connect_timeout语法:fastcgi_connect_timeouttime默认值:fastcgi_connect_timeout60使用环境:http、server、location功能:该指令设置与FastCGI服务器连接阶段的超时,应该指出的是,这个值不能超过75秒.
指令名称:fastcgi_read_timeout语法:fastcgi_read_timeouttime默认值:fastcgi_read_timeout60使用环境:http、server、location功能:定义后端FastCGI服务器的响应超时时间.
如果有一些直到它们运行完才有输出的程序而又长时间运行FastCGI进程,或者在错误日志中出现前端服务器响应超时的错误,那么可能需要调整这个值.
在这个指定的时间段内如果Nginx没有收到响应,那么就会返回"504GatewayTimeout"的HTTP错误.
1.
4.
3变量FastCGI模块提供了以下变量.
变量名称:$fastcgi_script_name功能:这个变量等于请求的URI,如果请求的URI以斜线"/"结束,那么请求的URI将会加上由fastcgi_index指令给定的index文件.
可以用这个变量来替代SCRIPT_FILENAME和PATH_TRANSLATED变量,以便确定PHP脚本的名称.
例如,请求"/info/":fastcgi_indexindex.
php;fastcgi_paramSCRIPT_FILENAME/home/www/scripts/php$fastcgi_script_name;那么SCRIPT_FILENAME将会等于"/home/www/scripts/php/info/index.
php".
1.
4.
4fastcgi_cache与fastcgi-store的区别fastcgi_cache是在使用内存,它是缓存,而fastcgi-store是在使用文件,它不是缓存,在一定程度上它更像镜像;但fastcgi_cache和fastcgi-store的相同点是都可以被共享,即可以用在多个地方.
1.
4.
5被传递到FastCGI服务器的参数在这里我们需要了解以下由Nginx向后台FastCGI服务器传递请求头的处理方法,在这一点上和传统的代理处理是不一样的.
请求头以参数的格式被传递到FastCGI服务器,从FastCGI服务器运行应用程序或者脚本,这些参数通常以环境变量的格式被取得.
例如,"User-agent"头被作为HTTP_USER_AGENT变量传递.
除了HTTP请求头之外,可能还会主观地传递其他参数,可以通过使用fastcgi_param来实现.
1.
5与FastCGI模块相关的配置文件在Nginx中除了主配置文件nginx.
conf外,还有两个配置文件与FastCGI有关,那就是fastcgi.
conf和fastcgi_params.
1.
5.
1配置文件fastcgi.
conf和fastcgi_params看一下以下四个文件,实际上是两个文件,即fastcgi.
conf和fastcgi_params.
[root@mailconf]#pwd/usr/local/nginx0.
8.
53/conf[root@mailconf]#tree.
|--fastcgi.
conf|--fastcgi.
conf.
default|--fastcgi_params|--fastcgi_params.
default…1.
5.
2配置文件fastcgi.
conf和fastcgi_params的关系配置文件fastcgi.
conf和fastcgi_params为FastCGI模块设置了基本的环境变量,下面我们看一下这两个文件的比较:[root@mailconf]#pwd/usr/local/nginx0.
8.
53/conf[root@mailconf]#difffastcgi_paramsfastcgi.
conf1a2>fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;可见fastcgi.
conf文件只是比fastcgi_params文件多了一行:fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;从Nginx0.
7.
65开始,在nginx.
conf中开启FastCGI时,不用再添加下面这行配置了:fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name而是在Nginx的配置文件中将:includefastcgi_params;改为:includefastcgi.
conf;就可以了.
当然,如果你不怕麻烦,也可以在fastcgi_params文件中添加那一行也行.
既然这样,我们以fastcgi.
conf文件分析一下其功能:[root@mailconf]#morefastcgi.
conffastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;fastcgi_paramQUERY_STRING$query_string;fastcgi_paramREQUEST_METHOD$request_method;fastcgi_paramCONTENT_TYPE$content_type;fastcgi_paramCONTENT_LENGTH$content_length;fastcgi_paramSCRIPT_NAME$fastcgi_script_name;fastcgi_paramREQUEST_URI$request_uri;fastcgi_paramDOCUMENT_URI$document_uri;fastcgi_paramDOCUMENT_ROOT$document_root;fastcgi_paramSERVER_PROTOCOL$server_protocol;fastcgi_paramGATEWAY_INTERFACECGI/1.
1;fastcgi_paramSERVER_SOFTWAREnginx/$nginx_version;fastcgi_paramREMOTE_ADDR$remote_addr;fastcgi_paramREMOTE_PORT$remote_port;fastcgi_paramSERVER_ADDR$server_addr;fastcgi_paramSERVER_PORT$server_port;fastcgi_paramSERVER_NAME$server_name;#PHPonly,requiredifPHPwasbuiltwith--enable-force-cgi-redirectfastcgi_paramREDIRECT_STATUS200;该文件的功能很简单,它只是提供基本的环境变量,这一点从文件中的指令fastcgi_param可以看出来,文件分为以下五部分.
第一部分:设定的变量与客户端相关.
如PHP脚本文件的目录及文件名、请求的方法和被请求文件的类型等.
第二部分:设定的变量与服务器相关.
如客户端请求的URI、服务器端的协议等.
第三部分:设定的变量与版本相关.
设定CGI和Nginx的版本.
第四部分:设定的变量与IP地址相关.
设定远程、本地的IP地址和端口号及服务器的名字.
第五部分:可选的REDIRECT_STATUS.
你可能会在这两个文件的末尾看到以下行:#PHPonly,requiredifPHPwasbuiltwith--enable-force-cgi-redirectfastcgi_paramREDIRECT_STATUS200;就是说在编译安装PHP时使用了选项"--enable-force-cgi-redirect",用于内部重定向,那么就要在以上的配置文件中添加"fastcgi_paramREDIRECT_STATUS200;",对于PHP5.
3.
0以上的版本,该参数被默认使用,因此选项"--enable-force-cgi-redirect"就不再存在了,要禁用该功能,可以在php.
ini文件中将指令cgi.
force_redirect设置为"0".
如果使用了应用MVC的设计模式,可能还需要添加PATH_INFO,例如以下内容:fastcgi_paramPATH_INFO$fastcgi_script_name;1.
6Nginx和PHP的结合在上面分别分析了Nginx的FastCGI模块和PHP的php-fpm模式,下面通过一个例子将这两者结合起来,使得动静分离,静态网页由Nginx处理,而动态网页由php-fpm处理.
其实在本章开始的部分就将这两者结合起来了.
reliablesite怎么样?reliablesite是一家于2006年成立的老牌美国主机商,主要提供独服,数据中心有迈阿密、纽约、洛杉矶等,均免费提供20Gbps DDoS防护,150TB月流量,1Gbps带宽。月付19美金可升级为10Gbps带宽。洛杉矶/纽约/迈阿密等机房,E3-1240V6/64GB内存/1TB SSD硬盘/DDOS/150TB流量/1Gbps带宽/DDOS,$95/月,...
关于Linode,这是一家运营超过18年的VPS云主机商家,产品支持随时删除(按小时计费),可选包括美国、英国、新加坡、日本、印度、加拿大、德国等全球十多个数据中心,最低每月费用5美元($0.0075/小时)起。目前,注册Linode的新用户添加付款方式后可以获得100美元赠送,有效期为60天,让更多新朋友可以体验Linode的产品和服务。Linode的云主机产品分为几类,下面分别列出几款套餐配置...
轻云互联成立于2018年的国人商家,广州轻云互联网络科技有限公司旗下品牌,主要从事VPS、虚拟主机等云计算产品业务,适合建站、新手上车的值得选择,香港三网直连(电信CN2GIA联通移动CN2直连);美国圣何塞(回程三网CN2GIA)线路,所有产品均采用KVM虚拟技术架构,高效售后保障,稳定多年,高性能可用,网络优质,为您的业务保驾护航。官方网站:点击进入广州轻云网络科技有限公司活动规则:1.用户购...