perl + fastcgi + nginx搭建
nginx + fastcgi是php下最流行的一套環境了,那perl會不會也有fastcgi呢,當然有,今天來搭建下nginx下perl的fastcgi.性能方面也不亞于php,但是現在web程序php的流行程度perl無法比擬了,性能再好也枉然,但是部分小功能可以考慮使用perl的fastcgi來搞定.進入正題.
1. 準備軟件環境:
nginx
perl:系統自帶
fastcgi
1.2 perl安裝
一般linux都有自帶perl,可以不用安裝,如果確實沒有,請執行:
#?yum?install?perl
1.3 perl-fastcgi安裝
#?cd?/usr/local/src #?wget?http://www.cpan.org/modules/by-module/fcgi/fcgi-0.74.tar.gz #?tar?-xzvf?fcgi-0.74.tar.gz #?cd?fcgi-0.74 #?perl?makefile.pl? #?make #?make?install
2. nginx虛擬主機配置
server?{ ? ??listen??80; ??server_name?test.jb51.net; ??#access_log?/data/logs/nginx/test.jb51.net.access.log?main; ? ??index?index.html?index.php?index.html; ??root?/data/site/test.jb51.net; ? ??location?/? ??{ ? ??} ? ??location?~?.pl$? ??{ ???include?fastcgi_params; ???fastcgi_pass?127.0.0.1:8999; ???#fastcgi_pass?unix:/var/run/jb51.net.perl.sock; ???fastcgi_index?index.pl; ??} }
如果想把tcp/ip方式改為socket方式,可以修改fastcgi-wrapper.pl.
$socket?=?fcgi::opensocket(?"127.0.0.1:8999",?10?);?#use?ip?sockets
改為
$socket?=?fcgi::opensocket(?"/var/run/jb51.net.perl.sock",?10?);?#use?ip?sockets
3. 配置腳本
3.1 fastcgi監聽腳本
文件路徑:/usr/bin/fastcgi-wrapper.pl
#!/usr/bin/perl ? use?fcgi; use?socket; use?posix?qw(setsid); ? require?'syscall.ph'; ? &daemonize; ? #this?keeps?the?program?alive?or?something?after?exec'ing?perl?scripts end()?{?}?begin()?{?} *core::global::exit?=?sub?{?die?"fakeexitnrc=".shift()."n";?}; eval?q{exit}; if?($@)?{ ?exit?unless?$@?=~?/^fakeexit/; }; ? &main; ? sub?daemonize()?{ ?chdir?'/'?????or?die?"can't?chdir?to?/:?$!"; ?defined(my?$pid?=?fork)?or?die?"can't?fork:?$!"; ?exit?if?$pid; ?setsid?????or?die?"can't?start?a?new?session:?$!"; ?umask?0; } ? sub?main?{ ??$socket?=?fcgi::opensocket(?"127.0.0.1:8999",?10?);?#use?ip?sockets ??$request?=?fcgi::request(?*stdin,?*stdout,?*stderr,?%req_params,?$socket?); ??if?($request)?{?request_loop()}; ???fcgi::closesocket(?$socket?); } ? sub?request_loop?{ ??while(?$request->accept()?>=?0?)?{ ? ???#processing?any?stdin?input?from?webserver?(for?cgi-post?actions) ???$stdin_passthrough?=''; ???$req_len?=?0?+?$req_params{'content_length'}; ???if?(($req_params{'request_method'}?eq?'post')?&&?($req_len?!=?0)?){ ????my?$bytes_read?=?0; ????while?($bytes_read??0)?{ ???close(child_rd); ???print?parent_wr?$stdin_passthrough; ???close(parent_wr); ? ???while(my?$s?=?)?{?print?$s;?} ???close?kid_to_read; ???waitpid($pid,?0); ??}?else?{ ?????foreach?$key?(?keys?%req_params){ ??????$env{$key}?=?$req_params{$key}; ?????} ?????#?cd?to?the?script's?local?directory ?????if?($req_params{script_filename}?=~?/^(.*)/[^/]+$/)?{ ???????chdir?$1; ?????} ? ???close(parent_wr); ???close(stdin); ???#fcntl(child_rd,?f_dupfd,?0); ???syscall(&sys_dup2,?fileno(child_rd),?0); ???#open(stdin,?" 3.2 fastcgi自啟動服務腳本:
文件路徑:/etc/rc.d/init.d/perl-fastcgi
文件路徑:/etc/rc.d/init.d/perl-fastcgi
?#!/bin/sh # #?nginx?–?this?script?starts?and?stops?the?nginx?daemon # #?chkconfig:?-?85?15 #?description:?nginx?is?an?http(s)?server,?http(s)?reverse? #?proxy?and?imap/pop3?proxy?server #?processname:?nginx #?config:?/opt/nginx/conf/nginx.conf #?pidfile:?/opt/nginx/logs/nginx.pid ? #?source?function?library. .?/etc/rc.d/init.d/functions ? #?source?networking?configuration. .?/etc/sysconfig/network ? #?check?that?networking?is?up. [?"$networking"?=?"no"?]?&&?exit?0 ? perlfastcgi="/usr/bin/fastcgi-wrapper.pl" prog=$(basename?perl) ? lockfile=/var/lock/subsys/perl-fastcgi ? start()?{ ?[?-x?$perlfastcgi?]?||?exit?5 ?echo?-n?$"starting?$prog:?" ?daemon?$perlfastcgi ?retval=$? ?echo ?[?$retval?-eq?0?]?&&?touch?$lockfile ?return?$retval } ? stop()?{ ?echo?-n?$"stopping?$prog:?" ?killproc?$prog?-quit ?retval=$? ?echo ?[?$retval?-eq?0?]?&&?rm?-f?$lockfile ?return?$retval } ? restart()?{ ?stop ?start } ? reload()?{ ?echo?-n?$”reloading?$prog:?” ?killproc?$nginx?-hup ?retval=$? ?echo } ? force_reload()?{ ?restart } rh_status()?{ ?status?$prog } ? rh_status_q()?{ ?rh_status?>/dev/null?2>&1 } ? case?"$1"?in ?start) ??rh_status_q?&&?exit?0 ??$1 ??;; ?stop) ??rh_status_q?||?exit?0 ??$1 ??;; ?restart) ??$1 ??;; ?reload) ??rh_status_q?||?exit?7 ??$1 ??;; ?force-reload) ??force_reload ??;; ?status) ??rh_status ??;; ?condrestart|try-restart) ??rh_status_q?||?exit?0 ??;; ?*) ??echo?$"usage:?$0?{start|stop|status|restart|condrestart|try-restart|reload|force-reload}" ??exit?2 ?esac
3.3 設置腳本權限
#?chmod?a+x?/usr/bin/fastcgi-wrapper.pl #?chmod?a+x?/etc/rc.d/init.d/perl-fastcgi
4. fastcgi測試
4.1 啟動nginx與fastcgi
#?/usr/local/nginx-1.4.2/sbin/nginx #?/etc/init.d/perl-fastcgi?start
4.2 perl測試文件:
文件路徑/data/site/test.jb51.net/test.pl
#!/usr/bin/perl ? print?"content-type:text/htmlnn"; print?<title>perl?environment?variables</title><h1>perl?environment?variables</h1> endofhtml ? foreach?$key?(sort(keys?%env))?{ ?print?"$key?=?$env{$key}<br>n"; } ? print?"
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END