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 "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 =) { 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.jb51.net/test.pl
#!/usr/bin/perl print "content-type:text/html\n\n"; print <<endofhtml; <html><head><title>perl environment variables</title></head> <body> <h1 id="perl-nbsp-environment-nbsp-variables">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.jb51.net/test.pl,出现内容表示ok.
6. 简单压力测试:
6.1 使用tcp/ip方式
ab -n 1000 -c 10 http://test.jb51.net/test.pl
他是在是太慢了,只好用10个并发,共计100个请求来测试.
6.2 使用socket方式:
ab -n 100000 -c 500 http://test.jb51.net/test.pl
很奇怪,使用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 ] ) - 지정된 파일의 내용을 클라이언트에 전송, 선택적 매개변수 데이터의 오프셋과 길이만 전송됨을 나타냅니다. 이는 소위 고급 기능인
$r->send_http_header(type)입니다. 응답 http 헤더 정보
$r->sleep(milliseconds, handler) – 지정된 처리 방법을 사용하고 지정된 시간에 처리를 중지하도록 요청을 설정합니다. 이 기간 동안 nginx는 이후의 다른 요청을 계속 처리합니다. , nginx는 설치된 처리 방법을 실행합니다. 처리 방법에 대한 참조를 전달하려면 $r->variable()을 사용할 수 있습니다.
$r- >status(code) – http 응답 코드 설정
$r->unescape(text) – http 메소드를 사용하여 %xx
$r->uri와 같은 콘텐츠를 암호화합니다. – 요청된 URL을 가져옵니다.
$r ->variable(name[, value]) – 변수의 값을 설정합니다
위 내용은 Linux에서 Nginx를 Perl 프로그램 서버 및 해당 Perl 모듈로 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

NginXunit은 여러 프로그래밍 언어를 지원하고 동적 구성, 제로 다운 타임 업데이트 및 내장로드 밸런싱과 같은 기능을 제공하는 오픈 소스 응용 프로그램 서버입니다. 1. 동적 구성 : 다시 시작하지 않고 구성을 수정할 수 있습니다. 2. 다국어 지원 : Python, Go, Java, PHP 등과 호환됩니다. 3. 제로 다운 타임 업데이트 : 서비스를 중단하지 않는 응용 프로그램 업데이트를 지원합니다. 4. 내장로드 밸런싱 : 요청을 여러 응용 프로그램 인스턴스에 배포 할 수 있습니다.

NginxUnit은 다국어 프로젝트 및 동적 구성 요구 사항에 적합한 Apachetomcat, Gunicorn 및 Node.js 내장 HTTP 서버보다 낫습니다. 1) 여러 프로그래밍 언어를 지원하고, 2) 동적 구성 재 장전을 제공합니다. 3) 확장 성과 신뢰성이 높은 프로젝트에 적합한 내장로드 밸런싱 기능.

NginxUnit은 모듈 식 아키텍처 및 동적 재구성 기능으로 응용 프로그램 성능 및 관리 가능성을 향상시킵니다. 1) 모듈 식 설계에는 마스터 프로세스, 라우터 및 응용 프로그램 프로세스가 포함되어 효율적인 관리 및 확장을 지원합니다. 2) 동적 재구성을 통해 CI/CD 환경에 적합한 런타임시 구성을 완벽하게 업데이트 할 수 있습니다. 3) 다국어 지원은 언어 런타임의 동적로드를 통해 구현되어 개발 유연성을 향상시킵니다. 4) 고성능은 이벤트 중심 모델과 비동기 I/O를 통해 달성되며 높은 동시성에서도 효율적으로 유지됩니다. 5) 응용 프로그램 프로세스를 분리하고 응용 프로그램 간의 상호 영향을 줄임으로써 보안이 향상됩니다.

NginxUnit을 사용하여 여러 언어로 응용 프로그램을 배포하고 관리 할 수 있습니다. 1) nginxunit을 설치하십시오. 2) Python 및 PHP와 같은 다른 유형의 응용 프로그램을 실행하도록 구성하십시오. 3) 응용 프로그램 관리에 동적 구성 기능을 사용하십시오. 이러한 단계를 통해 응용 프로그램을 효율적으로 배포하고 관리하고 프로젝트 효율성을 향상시킬 수 있습니다.

Nginx는 높은 동시 연결을 처리하는 데 더 적합한 반면 Apache는 복잡한 구성 및 모듈 확장이 필요한 시나리오에 더 적합합니다. 1.NGINX는 고성능 및 낮은 자원 소비로 유명하며 높은 동시성에 적합합니다. 2. Aapache는 안정성과 풍부한 모듈 확장으로 유명하며 복잡한 구성 요구에 적합합니다.

NginxUnit은 동적 구성 및 고성능 아키텍처로 응용 프로그램 유연성 및 성능을 향상시킵니다. 1. 동적 구성을 사용하면 서버를 다시 시작하지 않고 응용 프로그램 구성을 조정할 수 있습니다. 2. 고성능은 이벤트 중심 및 비 블로킹 아키텍처 및 다중 프로세스 모델에 반영되며 동시 연결을 효율적으로 처리하고 멀티 코어 CPU를 활용할 수 있습니다.

Nginx와 Apache는 성능, 확장 성 및 효율성 측면에서 고유 한 장점과 단점을 가진 강력한 웹 서버입니다. 1) NGINX는 정적 컨텐츠를 처리하고 역전 프록시를 처리 할 때 잘 수행되며 동시 동시성 시나리오에 적합합니다. 2) Apache는 동적 컨텐츠를 처리 할 때 더 나은 성능을 발휘하며 풍부한 모듈 지원이 필요한 프로젝트에 적합합니다. 서버 선택은 프로젝트 요구 사항 및 시나리오에 따라 결정해야합니다.

Nginx는 높은 동시 요청을 처리하는 데 적합한 반면 Apache는 복잡한 구성 및 기능 확장이 필요한 시나리오에 적합합니다. 1.NGINX는 이벤트 중심의 비 블로킹 아키텍처를 채택하며, 대결 환경에 적합합니다. 2. Apache는 프로세스 또는 스레드 모델을 채택하여 복잡한 구성 요구에 적합한 풍부한 모듈 생태계를 제공합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

WebStorm Mac 버전
유용한 JavaScript 개발 도구
