Linux下如何用Nginx作Perl程序服務器及其中Perl模塊

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
喜歡就支持一下吧
點贊10 分享