亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Linux服務器 > 正文

Linux下用Nginx作Perl程序服務器及其中Perl模塊的配置

2024-09-05 23:02:30
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Linux下用Nginx作Perl程序服務器及其中Perl模塊的配置,文中使用到了FastCGI中間件進行連接,需要的朋友可以參考下
 

perl + fastcgi + nginx搭建

nginx + fastcgi是php下最流行的一套環境了,那perl會不會也有fastcgi呢,當然有,今天來搭建下nginx下perl的fastcgi.性能方面也不亞于php,但是現在web程序php的流行程度perl無法比擬了,性能再好也枉然,但是部分小功能可以考慮使用perl的fastcgi來搞定.進入正題.
1. 準備軟件環境:

nginx:http://www.nginx.org
perl:系統自帶
fastcgi:http://www.cpan.org/modules/by-module/FCGI/
1.1 nginx安裝
這里就不再詳細介紹了~
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.vevb.com;  #access_log /data/logs/nginx/test.vevb.com.access.log main;   index index.html index.php index.html;  root /data/site/test.vevb.com;   location /   {   }   location ~ /.pl$   {   include fastcgi_params;   fastcgi_pass 127.0.0.1:8999;   #fastcgi_pass unix:/var/run/vevb.com.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/vevb.com.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 scriptsEND() { } BEGIN() { }*CORE::GLOBAL::exit = sub { die "fakeexit/nrc=".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 < $req_len) {      my $data = '';      my $bytes = read(STDIN, $data, ($req_len - $bytes_read));      last if ($bytes == 0 || !defined($bytes));      $stdin_passthrough .= $data;      $bytes_read += $bytes;    }   }    #running the cgi app   if ( (-x $req_params{SCRIPT_FILENAME}) && #can I execute this?     (-s $req_params{SCRIPT_FILENAME}) && #Is this file empty?     (-r $req_params{SCRIPT_FILENAME})  #can I read this file?   ){  pipe(CHILD_RD, PARENT_WR);  my $pid = open(KID_TO_READ, "-|");  unless(defined($pid)) {   print("Content-type: text/plain/r/n/r/n");      print "Error: CGI app returned no output - ";      print "Executing $req_params{SCRIPT_FILENAME} failed !/n";   next;  }  if ($pid > 0) {   close(CHILD_RD);   print PARENT_WR $stdin_passthrough;   close(PARENT_WR);    while(my $s = <KID_TO_READ>) { 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, "<&CHILD_RD");   exec($req_params{SCRIPT_FILENAME});   die("exec failed");  }   }   else {    print("Content-type: text/plain/r/n/r/n");    print "Error: No such CGI app - $req_params{SCRIPT_FILENAME} may not ";    print "exist or is not executable by this process./n";   }   }}

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.vevb.com/test.pl

#!/usr/bin/perl print "Content-type:text/html/n/n";print <<EndOfHTML;<html><head><title>Perl Environment Variables</title></head><body><h1>Perl Environment Variables</h1>EndOfHTML foreach $key (sort(keys %ENV)) { print "$key = $ENV{$key}<br>/n";} print "</body></html>";

5. 訪問測試

5.1 訪問
http://http:test.vevb.com/test.pl,出現內容表示OK.
 
6. 簡單壓力測試:
6.1 使用tcp/ip方式

ab -n 1000 -c 10 http://test.vevb.com/test.pl

他是在是太慢了,只好用10個并發,共計100個請求來測試.

Linux下用Nginx作Perl程序服務器及其中Perl模塊的配置

6.2 使用socket方式:

ab -n 100000 -c 500 http://test.vevb.com/test.pl

Linux下用Nginx作Perl程序服務器及其中Perl模塊的配置

很奇怪,使用tcp/ip方式,每秒就140多個請求,而使用socket方式卻有5800個請求/秒。差距不是一般的大。順便測試了一下php的fastcgi,大概請求在3000(tcp/ip方式),4800(socket方式)。

 

perl模塊的使用
如果對于一個絕大部分內容是靜態的網站,只有極少數的地方需要動態顯示,碰巧你又了解一點perl知識,那么nginx + perl的結合就能很好解決問題。要想nginx支持perl腳本,在編譯nginx時候需要如下參數:

./configure --with-http_perl_module

如果make時候出現如下類似錯誤:

Can't locate ExtUtils/Embed.pm in @INC (@INC contains: /usr/lib/perl5/5.10.0/i386-linux-thread-multi /usr/lib/perl5/5.10.0 /usr/local/lib/perl5/site_perl/5.10.0/i386-linux-thread-multi /usr/local/lib/perl5/site_perl/5.10.0 /usr/lib/perl5/vendor_perl/5.10.0/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.10.0 /usr/lib/perl5/vendor_perl /usr/local/lib/perl5/site_perl .)

你的機器上可能需要安裝perl-devel perl-ExtUtils-Embed,對于centos系統,直接使用yum搞定,例如:

yum -y install perl-devel perl-ExtUtils-Embed

nginx中使用perl有兩種方法,一種是直接在配置文件寫,還有一種是把perl腳本寫在外部文件中,下面主要介紹一下第二種用法。
假設nginx的根目錄為/usr/local/nginx,perl腳本存放的目錄為nginx的根目錄下的perl/lib下,腳本名字為test.pm,nginx配置為:

#位于http配置中 perl_modules perl/lib; perl_require test.pm; #位于server配置中 location /user/ { perl pkg_name::process; }

上述配置是把所有來自http://servername/user/下的請求交由test.pm腳本中定義的process方法來處理。
test.pm腳本的內容如下:

package pkg_name; use Time::Local;use nginx; sub process { my $r = shift;  $r->send_http_header('text/html; charset=utf-8'); my @arr = split('/', $r->uri); my $username = @arr[2];  if (!$username || ($username eq "")) { $username = "Anonymous"; }  $r->print('Hello, You name is : <strong>' . $username . '</strong>'); $r->rflush(); return;} 1;__END__

當你訪問http://servername/user/netingcn,你應該可以在網頁上看到:

Hello, You name is : netingcn

另外:當使用 use nginx 時,會有如下的對象可以調用,可以看到上面 shift 一個對象到 $r 上,然后就可以用 $r 調用那些對象了:

  • $r->args – 請求的參數 .
  • $r->discard_request_body – 這個參數是讓 Nginx 放棄 request 的 body 的內容.
  • $r->filename – 返回合適的請求文件的名字
  • $r->has_request_body(function) – 如果沒有請求主體,返回0,但是如果請求主體存在,那么建立傳遞的函數并返回1,在程序的最后,nginx將調用指定的處理器.
  • $r->header_in(header) – 查找請求頭的信息
  • $r->header_only – 如果我們只要返回一個響應的頭
  • $r->header_out(header, value) – 設置響應的頭
  • $r->internal_redirect(uri) – 使內部重定向到指定的URI,重定向僅在完成perl腳本后發生.可以使用 header_out(Location….的方法來讓瀏覽器自己重定向
  • $r->print(args, …) – 發送數據給客戶端
  • $r->request_body – 得到客戶端提交過來的內容 (body 的參數,可能需要修改 nginx 的 client_body_buffer_size. )
  • $r->request_body_file —給客戶的 body 存成文件,并返回文件名
  • $r->request_method — 得到請求 HTTP method.
  • $r->remote_addr – 得到客戶端的 IP 地址.
  • $r->rflush – 立即傳送數據給客戶端
  • $r->sendfile(file [, displacement [, length ] ) – 傳送給客戶端指定文件的內容,可選的參數表明只傳送數據的偏移量與長度,精確的傳遞僅在perl腳本執行完畢后生效.這可是所謂的高級功能啊
  • $r->send_http_header(type) – 添加一個回應的 http 頭的信息
  • $r->sleep(milliseconds, handler) – 設置為請求在指定的時間使用指定的處理方法和停止處理,在此期間nginx將繼續處理其他的請求,超過指定的時間后,nginx將運行安裝的處理方法,注意你需要為處理方法通過一個reference,在處理器間轉發數據你可以使用$r->variable().
  • $r->status(code) – 設置 http 的響應碼
  • $r->unescape(text) – 使用 http 方法加密內容如 %XX
  • $r->uri – 得到請求的 URL.
  • $r->variable(name[, value]) – 設置變量的值


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲欧美另类中文| 欧美日韩一区二区免费在线观看| 色婷婷av一区二区三区久久| 欧美成人免费va影院高清| 欧美激情一区二区三区成人| 国产日本欧美一区二区三区| 国产精品69精品一区二区三区| 国产精品 欧美在线| 久久久成人的性感天堂| 欧美激情精品久久久久久| 亚洲精品小视频在线观看| 亚洲国产黄色片| 久久中文字幕国产| 日韩欧美在线看| 亚洲福利视频网| 午夜精品理论片| 中文字幕日韩精品在线观看| 国产精品美女免费视频| 中文字幕日韩av| 久久精品国产亚洲精品2020| 亚洲精品美女在线观看播放| www.亚洲男人天堂| 日韩va亚洲va欧洲va国产| 尤物yw午夜国产精品视频明星| 亚州成人av在线| 国产欧亚日韩视频| 中国日韩欧美久久久久久久久| 亚洲专区在线视频| 欧美体内谢she精2性欧美| 国产美女主播一区| 91精品视频免费看| 亚洲国产小视频在线观看| 日韩精品免费在线| 茄子视频成人在线| 国产精品1234| 精品露脸国产偷人在视频| 色中色综合影院手机版在线观看| 精品丝袜一区二区三区| 亚洲国产欧美一区二区三区同亚洲| 国产大片精品免费永久看nba| 亚洲美女在线视频| 日韩中文在线中文网在线观看| 日本91av在线播放| 日韩在线资源网| 亚洲精品久久久久久下一站| 4p变态网欧美系列| 国产91精品久| 欧美日韩亚洲成人| 欧美成人免费在线视频| 精品自拍视频在线观看| 欧美国产亚洲视频| 亚洲第一天堂无码专区| 欧美黑人巨大xxx极品| 成人亲热视频网站| 久久国产视频网站| 91超碰中文字幕久久精品| 国产成人在线一区| 欧美成人精品一区二区三区| 亚洲字幕一区二区| 欧美午夜xxx| 欧美高清视频在线观看| 91亚洲精华国产精华| 久久亚洲影音av资源网| 国产成人啪精品视频免费网| 国产福利视频一区二区| 国产美女久久精品香蕉69| 日本91av在线播放| 高清欧美性猛交xxxx黑人猛交| 91热福利电影| 国产精品日韩久久久久| 亚洲最大成人免费视频| 亚洲男人的天堂在线播放| 久久噜噜噜精品国产亚洲综合| 欧美理论电影在线播放| 国产精品视频白浆免费视频| 97在线视频观看| 国产精品高潮粉嫩av| 国产又爽又黄的激情精品视频| 久久久www成人免费精品张筱雨| 欧美高清电影在线看| 久久免费视频网| 亚洲尤物视频网| 日本一区二三区好的精华液| 欧美日本黄视频| 亚洲国产精品高清久久久| 国产福利成人在线| 91天堂在线视频| 国产精品wwww| 国产69精品99久久久久久宅男| 国产精品一区二区三区久久久| 一本色道久久88综合亚洲精品ⅰ| 国产成人在线精品| 97在线视频一区| 国产精品久在线观看| 亚洲天堂av在线免费| 亚洲精品国精品久久99热| 欧美精品生活片| 亚洲最大的免费| 日韩中文在线观看| 日韩精品在线看| 欧美美女15p| 亚洲一区久久久| 欧美电影免费看| 日韩在线观看网站| 久久成人综合视频| 国产成人精品电影| 91嫩草在线视频| 日本精品免费观看| 日韩av在线免费| 亚洲跨种族黑人xxx| 亚洲人成网站免费播放| 国产免费成人av| 国产精品久久久久久久久影视| 日韩视频免费观看| 精品中文视频在线| 欧美电影在线播放| 亚洲乱码国产乱码精品精| 亚洲天堂av女优| 精品久久久久久久久久| 日韩亚洲精品视频| 色综合久久精品亚洲国产| 国内精品一区二区三区四区| 91在线|亚洲| 欧美午夜视频一区二区| 亚洲色图13p| 日本精品视频在线观看| 日本欧美在线视频| 在线播放国产一区中文字幕剧情欧美| 日韩在线欧美在线国产在线| 国产91精品久久久久久| 国产精品久久久久久久久免费| 久久人人爽人人爽人人片av高请| 日韩h在线观看| 国产噜噜噜噜久久久久久久久| 亚洲摸下面视频| 亚洲第一视频在线观看| 欧美成人免费在线观看| 91网站在线看| 国产在线拍偷自揄拍精品| 亚洲午夜小视频| 亚洲成人网在线| 欧美成人亚洲成人日韩成人| 久久久国产一区二区三区| 国产精品一区二区三区毛片淫片| 黄色精品一区二区| 亚洲欧美中文日韩在线| 亚洲天堂日韩电影| 久久不射热爱视频精品| 伊人久久精品视频| 欧美日韩激情网| 欧美成人午夜剧场免费观看| 欧美成人午夜激情视频| 91精品国产91久久久久| 亚洲国产欧美一区二区三区同亚洲| 欧美在线亚洲一区| 综合国产在线观看| 97香蕉超级碰碰久久免费的优势| 国产精品678| 欧美裸体xxxx极品少妇| 最新69国产成人精品视频免费| 91美女片黄在线观| 亚洲自拍小视频免费观看| 欧美激情亚洲另类| 日韩在线视频观看正片免费网站|