php的fastcgi启动停止重启脚本分享

lighttpd学习–使用mod_secdownload模块防盗链及fastcgi模式配置

最近应用端要配置出防盗链来,早就知道可以通过referer来判断是否是盗链,从而设置防盗链,然后我们开发的人员跟我说了lighttpd的另外有个模块可以来配置出防盗链来,这个模块就是mod_secdownload,这个模块的使用思路是,lighttpd端先配置此模块,设置一个固定的用于加密的字串,比如abc,然后设置一个url前缀,比如/flv/,再设置一个过期时间,比如10s,然后在通过一段php代码,对加密字串,系统时间等进行md5算法加密生成一个字串,这个字串在和url前缀组合生成最终的文件url,这个url会在10s后自动失效,从而达到防盗链的效果。原理就是这些,下面看下实际的例子。

因为需要php的支持,所以fastcgi的配置在这里就一并写出了,至于lighttpd和php的编译安装这里就不在赘述,需要的朋友请去google查询。有一点需要注意的就是php编译的时候需要启用fastcgi模式。

编辑配置文件,找到server.modules处,开启如下两个模块

server.modules = ( ….,"mod_fastcgi", "mod_secdownload",……)

先配置secdownload模块,如下

## secdownload config
secdownload.secret          = "abc"            #设置需要的加密字串
secdownload.document-root   = "/data/wwwroot"  #需要防盗链文件的所在目录   
secdownload.uri-prefix      = "/flv/"          #生成后url的前缀
secdownload.timeout         = 20               #设置过期时间,单位秒    

再来看下fastcgi模式的配置,我个人认为真的是太方便了。

#### fastcgi module
## read fastcgi.txt for more info
## for PHP don’t forget to set cgi.fix_pathinfo = 1 in the php.ini
fastcgi.server             = ( ".php" =>
                               ( "localhost" =>
                                 (
                                   "host" => "127.0.0.1",                            #设置fastcgi服务监听的ip
                                   "port" => 9000,                                   #设置fastcgi服务监听的端口
                                   "bin-path" => "/usr/local/php/bin/php-cgi"        #php-cgi所在的路径
                                 )
                               )
                            )

到此,lighttpd上的配置就完毕了,然后看下php程序的写法

<?php

  $secret = "abc";
  $uri_prefix = "/flv/";

  # filename
  # please note file name starts with "/"
  $f = "/123.mp4";

  # current timestamp
  $t = time();

  $t_hex = sprintf("%08x", $t);
  $m = md5($secret.$f.$t_hex);

  # generate link
  $videoUrl = $uri_prefix.$m."/".$t_hex.$f;
?>
这里$videoUrl就应该是最后生成出来的url

现在就可以启动lighttpd去测试了,启动lighttpd后执行ps afx可以看到如下内容,表示启动正常,如果不正常,请参看errorlog来排查错误

 7178 ?        S      0:00 ../sbin/lighttpd -f ../conf/lighttpd.conf
 7179 ?        Ss     0:00  _ /usr/local/php/bin/php-cgi
 7180 ?        S      0:00  |   _ /usr/local/php/bin/php-cgi
 7181 ?        Ss     0:00  _ /usr/local/php/bin/php-cgi
 7182 ?        S      0:00  |   _ /usr/local/php/bin/php-cgi
 7183 ?        Ss     0:00  _ /usr/local/php/bin/php-cgi
 7184 ?        S      0:00  |   _ /usr/local/php/bin/php-cgi
 7185 ?        Ss     0:00  _ /usr/local/php/bin/php-cgi
 7186 ?        S      0:00      _ /usr/local/php/bin/php-cgi

参考资料:

http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:ModSecDownload
http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:ModFastCGI

nginx学习手札—nginx+php整合入门篇[原创]

折腾两天,终于在今天调通了,居然是因为配置文件中有一个参数没有写,真是气死了,看来以后还需要细心些呀,下面我就把php+nginx的实现方法写下来

不像apache和lighttpd,nginx并不能自动的启动spawn FCGI processes,所以需要人为在nginx启动前加载fcgi进程,我使用的是lighttpd带的spawn-fcgi程序,可以下载 lighttpd的源码包,./configure && make后,然后

cp src/spawn-fcgi /usr/local/php/bin/

现在可以手动启动fcgi程序了

/usr/local/php/bin/spawn-fcgi -a 127.0.0.1 -p 10005 -u daemon -f /usr/local/php/bin/php-cgi

这其中daemon是启动nginx程序的用户,其他参数可以执行/usr/local/php/bin/spawn-fcgi查看

接下来是nginx的配置了
nginx安装这里就不在赘述了,php我用的5.2.6,编译时只加了–enable-fastcgi –enable-force-cgi-redirect这两个参数,其他参数请根据各人实际需求添加,这是这两个是必须的
然后在nginx.conf文件中加入

location ~ .*\.php?$ {
            root html;
            index index.php;
            include /usr/local/nginx/conf/fastcgi_params;
            fastcgi_pass 127.0.0.1:10005;
            fastcgi_index index.php;
        }

在这里我使用了nginx自带的fastcgi_params配置文件,具体内容如下

fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
#fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param SERVER_SOFTWARE nginx;

fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200

其中蓝色部分是默认配置文件中没有的,也是最关键的,我就是差这一条,卡住了两天,接下来就可以在html文件夹下建立info.php文件了,内容如下

<?php
phpinfo();
?>

保存退出后启动nginx程序

/usr/local/nginx/sbin/nginx

然后通过http://youip/info.php,就可以看到php的详细信息了
到此一个可用的,简单的nginx+php环境就做好了
接下来就对fastcgi_params文件内容按我自己的理解做个解释吧,还望各位看官拍砖
fastcgi_param QUERY_STRING $query_string;以这个为例,这个参数的意思就是,取query_string变量的值付给QUERY_STRING,然后通过fastcgi_param程序去运行,然而这些参数中的变量都是可以通过info.php来查看的。举例来说吧,fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;在info.php中查到$document_root/usr/local/nginx/html,$fastcgi_script_name是所请求的url,在我的例子中就是info.php这文件,当然,如果要是把info.php放到了html/phpinfo文件夹下,那$fastcgi_script_name就是/phpinfo/info.php,这样连起来,SCRIPT_FILENAME就是/usr/local/nginx/html/info.php,然后再交友fastcgi_param来处理,其他参数完全可以按照此理解进行对照

参考文章:http://wiki.codemongers.com/NginxHttpFcgiModule#fastcgi_param
         http://wiki.codemongers.com/NginxFcgiExample