plack basics for perl websites - yapc::eu 2011
DESCRIPTION
Run a website with Perl? - you should learn how to use Plack. Most Perl web frameworks support it and it makes your life a lot easier and a lot more funTRANSCRIPT
![Page 1: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/1.jpg)
Plack Basics
Leo Lapworth @ YAPC::EU 2011
Much content from Tatsuhiko Miyagawa’sYAPC::NA 2010 talk
![Page 2: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/2.jpg)
What is Plack?
![Page 3: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/3.jpg)
What is Plack?
“Superglue for Perl 5 Web Frameworks and Web
Servers”
![Page 4: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/4.jpg)
How will that help me?
![Page 5: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/5.jpg)
How will that help me?‣ Flexibility
![Page 6: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/6.jpg)
How will that help me?‣ Flexibility
‣ Middleware (plugins)
![Page 7: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/7.jpg)
How will that help me?‣ Flexibility
‣ Middleware (plugins)
‣ Apps
![Page 8: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/8.jpg)
How will that help me?‣ Flexibility
‣ Middleware (plugins)
‣ Apps
‣ Development
![Page 9: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/9.jpg)
How will that help me?‣ Flexibility
‣ Middleware (plugins)
‣ Apps
‣ Development
‣ Testing
![Page 10: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/10.jpg)
How will that help me?‣ Flexibility
‣ Middleware (plugins)
‣ Apps
‣ Development
‣ Testing
‣ Deployment
![Page 11: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/11.jpg)
How will that help me?‣ Flexibility
‣ Middleware (plugins)
‣ Apps
‣ Development
‣ Testing
‣ Deployment
‣ World peace
![Page 12: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/12.jpg)
How will that help me?‣ Flexibility
‣ Middleware (plugins)
‣ Apps
‣ Development
‣ Testing
‣ Deployment
‣ World peace
![Page 13: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/13.jpg)
History...
![Page 14: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/14.jpg)
Hello World
![Page 15: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/15.jpg)
#!/usr/bin/perluse strict;
print “Content-Type: text/plain\r\n\r\n”;print “Hello World”;
![Page 16: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/16.jpg)
package HelloWorld;use strict;use Apache::RequestRec;use Apache::RequestIO;use Apache::Const -compile => qw(OK);
sub handler { my $r = shift;
$r->content_type(‘text/plain’); $r->print(“Hello World”);
return Apache::Const::OK;}
1;
![Page 17: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/17.jpg)
use FCGI;
my $req = FCGI::Request();
while ($req->Accept >= 0) {
print “Content-Type: text/plain\r\n\r\n”; print “Hello World”;
}
![Page 18: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/18.jpg)
package HelloWorld;use base qw(HTTP::Server::Simple::CGI);
sub handle_request { my($self, $cgi) = @_;
print “HTTP/1.0 200 OK\r\n”; print “Content-Type: text/plain\r\n\r\n”; print “Hello World”;}
1;
![Page 19: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/19.jpg)
All similar but slightly different
![Page 20: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/20.jpg)
Painful to supportall of them
![Page 21: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/21.jpg)
There wasone common way to do all of this.
![Page 22: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/22.jpg)
CGI.pm
![Page 23: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/23.jpg)
#!/usr/bin/perluse CGI;
my $q = CGI->new;
print $q->header(‘text/plain’);print “Hello World”;
![Page 24: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/24.jpg)
Works under...CGI
FastCGImod_perl
HTTP::Server::Simple::CGI
![Page 25: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/25.jpg)
Apache IIS lighttpd
CGI.pm
CGI fastcgimod_perl
![Page 26: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/26.jpg)
CGI.pm?
![Page 27: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/27.jpg)
CGI.pm?meh
![Page 28: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/28.jpg)
Frameworks to the rescue!
![Page 29: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/29.jpg)
![Page 30: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/30.jpg)
Catalyst Maypole Mason Mojo Sledge Spoon PageKit AxKit Egg Gantry Continuity Solstice Mojolicious Tripletail Konstrukt Reaction Jifty Cyclone3 WebGUI OpenInteract Squatting
Dancer CGI::Application Nanoa Ark Angelos Noe Schenker Tatsumaki Amon
Apache2::WebApp Web::Simple Apache2::REST SweetPea Hydrant Titanium
![Page 31: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/31.jpg)
Let’s look how they handled web servers.
![Page 32: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/32.jpg)
Apache IIS lighttpd
CGI.pm
CGI fastcgimod_perl
![Page 33: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/33.jpg)
CGI::Application
Apache IIS lighttpd
![Page 34: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/34.jpg)
CGI::Application
Apache IIS lighttpd
CGI.pm
![Page 35: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/35.jpg)
CGI::Application
Apache IIS lighttpd
CGI.pm
CGI fastcgimod_perl
![Page 36: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/36.jpg)
CGI::Application
Apache IIS lighttpd
CGI.pm
CGI fastcgimod_perl
Jifty
![Page 37: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/37.jpg)
CGI::Application
Apache IIS lighttpd
CGI.pm
CGI fastcgimod_perl
Jifty Catalyst
![Page 38: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/38.jpg)
CGI::Application
Apache IIS lighttpd
CGI.pm
CGI fastcgimod_perl
Jifty Catalyst
Catalyst::Engine
![Page 39: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/39.jpg)
CGI::Application
Apache IIS lighttpd
CGI.pm
CGI fastcgimod_perl
Jifty Catalyst
Catalyst::Engine
nginx
![Page 40: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/40.jpg)
CGI::Application
Apache IIS lighttpd
CGI.pm
CGI fastcgimod_perl
Jifty Catalyst
Catalyst::Engine
nginxHTTP::Server::Simple
![Page 41: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/41.jpg)
CGI::Application
Apache IIS lighttpd
CGI.pm
CGI fastcgimod_perl
JiftyMason Catalyst
Catalyst::Engine
nginxHTTP::Server::Simple
![Page 42: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/42.jpg)
CGI::Application
Apache IIS lighttpd
CGI.pm
CGI fastcgimod_perl
JiftyMason Catalyst
Mason::CGIHandlerCatalyst::Engine
nginxHTTP::Server::Simple
![Page 43: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/43.jpg)
Gross.
![Page 44: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/44.jpg)
CGI.pmJifty, CGI::Application, Spoon
mod_perl centricMason, Sledge, PageKit, WebGUI
AdaptersCatalyst, Maypole, Squatting
![Page 45: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/45.jpg)
That was 2008...
![Page 46: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/46.jpg)
Gentleman thief &Double agent
Miyagawa
![Page 47: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/47.jpg)
Acquired a great ideafrom Python/Ruby
![Page 48: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/48.jpg)
WSGI (Python)Rack (Ruby)
![Page 49: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/49.jpg)
WSGI (PEP-333)
![Page 50: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/50.jpg)
WSGI Python Frameworks• Django
• Bottle
• CherryPy
• Tornado
• Pylons
• Flask
• mod_wsgi
• Paste
• gunicorn
• uWSGI
• wsgiref
• Google AppEngine
![Page 51: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/51.jpg)
WSGI
WSGI middleware
Django Bottle Flask Tornado
Apache lighttpd nginx mod_wsgi
wsgi handlers
GAE
![Page 52: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/52.jpg)
Rack
![Page 53: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/53.jpg)
Rack Ruby Frameworks• Rails
• Merb
• Sinatra
• Camping
• Ramaze
• etc.
• Unicorn
• Thin
• Mongrel
• Rainbows!
• Phusion Passenger
• Heroku
![Page 54: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/54.jpg)
Rack
Rack middleware
Rails Merb Sinatra Ramaze
Apache lighttpd Thin Unicorn
Rack handlers
Mongrel
![Page 55: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/55.jpg)
Perl ?
![Page 56: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/56.jpg)
Perl ?PSGIPerl Web Server Gateway Interface
![Page 57: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/57.jpg)
Interface
![Page 58: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/58.jpg)
Interface
![Page 59: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/59.jpg)
InterfacePSGI != Plack
![Page 60: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/60.jpg)
PSGI applicationcode reference$app = sub {...};
![Page 61: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/61.jpg)
# PSGI Hello Worldmy $app = sub { my $env = shift; return [ 200, [ ‘Content-Type’, ‘text/plain’ ], [ ‘Hello World’ ], ];};
![Page 62: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/62.jpg)
my $app = sub { my $env = shift; return [ $status, $header, $body ];};
CGI-like environment variables+ psgi.input, psgi.errors etc.
![Page 63: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/63.jpg)
my $app = sub { my $env = shift; return [ $status, $header, $body ];};
HTTP status code (int.): 200, 404 etc.
![Page 64: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/64.jpg)
my $app = sub { my $env = shift; return [ $status, $header, $body ];};
Array reference of header pairs:[ ‘Content-Type’, ‘text/html’, ... ]
![Page 65: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/65.jpg)
my $app = sub { my $env = shift; return [ $status, $header, $body ];};
String, array reference of content chunks,Filehandle or IO::Handle-ish object
![Page 66: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/66.jpg)
That’s it.(There’s a callback based streaming interface as well)
![Page 67: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/67.jpg)
# PSGImy $app = sub { my $env = shift; return [ 200, [ ‘Content-Type’, ‘text/plain’ ], [ ‘Hello World’ ], ];};
![Page 68: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/68.jpg)
Now you’ve gota PSGI compatible
application.
![Page 69: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/69.jpg)
Apache IIS lighttpd
CGI.pm
CGI fastcgimod_perl
JiftyMason Catalyst
Mason::CGIHandlerCatalyst::Engine
nginxHTTP::Server::Simple
CGI::App
![Page 70: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/70.jpg)
PSGI Compatible App
Plack::Middleware
Catalyst CGI::App Jifty Mason 2
Apache lighttpd HTTP::Server::PSGI Perlbalmod_psgi
Plack::Handler::* (CGI, FCGI, Apache)
![Page 71: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/71.jpg)
PSGI Compatible App
Plack::Middleware
Catalyst CGI::App Jifty Mason 2
Apache lighttpd HTTP::Server::PSGI Perlbalmod_psgi
Plack::Handler::* (CGI, FCGI, Apache)
other PSGI Webservers
![Page 72: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/72.jpg)
Web Servers
![Page 73: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/73.jpg)
Plack::HandlerConnects PSGI compatible apps
to Web servers...
![Page 74: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/74.jpg)
FCGIPlack::Handler::FCGI
![Page 75: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/75.jpg)
ApachePlack::Handler::Apache1Plack::Handler::Apache2
![Page 76: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/76.jpg)
StarmanUNIX Preforking HTTP servers (like Unicorn.rb)
HTTP/1.1 chunk + keep-alives / Very Fast
![Page 77: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/77.jpg)
HTTP::Server::Simple::PSGIZero-deps other than HTTP::Server::Simple
Best for embedding PSGI applications
![Page 78: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/78.jpg)
StarletSimpler UNIX HTTP/1.0 Server
Best used with Server::Starter and nginx/lighttpd
TwiggyNon-blocking web server (like Thin.rb)
based on AnyEvent framework
![Page 79: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/79.jpg)
Perlbal pluginhttp://github.com/miyagawa/Perlbal-Plugin-PSGI
![Page 80: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/80.jpg)
nginx embedded perlhttp://github.com/yappo/nginx-psgi-patchs
![Page 81: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/81.jpg)
mod_psgihttp://github.com/spiritloose/mod_psgi
Apache2
![Page 82: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/82.jpg)
Gepokhttp://metacpan/module/Gepok
Pure Perl standalone HTTPSFirst released July 2011
evpsgihttp://github.com/sekimura/evpsgi
Feersumhttp://github.com/stash/Feersum
uWSGIhttp://projects.unbit.it/uwsgi/
CoronaCoroutine for each connection
based on Coro.pm
![Page 83: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/83.jpg)
PSGI
Plack::Middleware
Frameworks Apps Your own code
Plack::Handler::* (CGI, FCGI, Apache)
![Page 84: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/84.jpg)
PSGI
Plack::Middleware
Frameworks Apps Your own code
Apache lighttpd HTTP::Server::PSGI Perlbalmod_psgi
Plack::Handler::* (CGI, FCGI, Apache)
Starman Twiggy uWSGI Corona etc, etc
![Page 85: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/85.jpg)
25+ Plack::Handlers
![Page 86: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/86.jpg)
Adoption?
![Page 87: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/87.jpg)
PSGI Compatible App
Plack::Middleware
Apache lighttpd HTTP::Server::PSGI Perlbalmod_psgi
Plack::Handler::* (CGI, FCGI, Apache)
Starman Twiggy uWSGI Corona etc
![Page 88: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/88.jpg)
PSGI Compatible App
Plack::Middleware
Apache lighttpd HTTP::Server::PSGI Perlbalmod_psgi
Plack::Handler::* (CGI, FCGI, Apache)
?
Starman Twiggy uWSGI Corona etc
![Page 89: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/89.jpg)
Catalyst Maypole Mason Mojo Sledge Spoon PageKit AxKit Egg Gantry Continuity Solstice Mojolicious
Tripletail Konstrukt Reaction Jifty Cyclone3 WebGUIOpenInteract Squatting Dancer CGI::Application
Nanoa Ark Angelos Noe Schenker Tatsumaki Amon Apache2::WebApp Web::Simple Apache2::REST
SweetPea Hydrant Titanium
![Page 90: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/90.jpg)
Catalyst Maypole Mason Mojo Sledge Spoon PageKit AxKit Egg Gantry Continuity Solstice Mojolicious
Tripletail Konstrukt Reaction Jifty Cyclone3 WebGUIOpenInteract Squatting Dancer CGI::Application
Nanoa Ark Angelos Noe Schenker Tatsumaki Amon Apache2::WebApp Web::Simple Apache2::REST
SweetPea Hydrant Titanium
![Page 91: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/91.jpg)
• Amon
• Angelos
• Ark
• Catalyst
• CGI::Application
• Continuity
• Dancer
• Hydrant
• Jifty
• Mason
• Maypole
• Mojo
• Mojolicious
• Noe
• Schenker
• Sledge
• Squatting
• Tatsumaki
• Titanium
• Web::Simple
PSGI Perl Frameworks
![Page 92: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/92.jpg)
ApplicationsMovable Type 6
WebGUI 8RT4
ACT (conference toolkit)Bricolage (if someone gets time)
![Page 93: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/93.jpg)
PSGI Compatible App
Plack::Middleware
Apache lighttpd HTTP::Server::PSGI Perlbalmod_psgi
Plack::Handler::* (CGI, FCGI, Apache)
Starman Twiggy uWSGI Corona evpsgi
![Page 94: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/94.jpg)
PSGI Compatible App
Plack::Middleware
Apache lighttpd HTTP::Server::PSGI Perlbalmod_psgi
Plack::Handler::* (CGI, FCGI, Apache)
Starman Twiggy uWSGI Corona evpsgi
Catalyst CGI::App Jifty Tatsumaki
Dancer Mojoliscious MT6 Mason 2
Web::Simple WebGui 8 Mojo etc...
![Page 95: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/95.jpg)
PSGI from a framework
![Page 96: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/96.jpg)
use Dancer;
get ‘/’ => sub { “Hello World”;};
dance;
![Page 97: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/97.jpg)
use Mojolicious::Lite;
get ‘/:name’ => sub { my $self = shift; $self->render_text(‘Hello!’);};
app->start;
![Page 98: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/98.jpg)
use My::Jifty::App;
my $app = My::Jifty::App->psgi_app;
![Page 99: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/99.jpg)
use Web::Simple ‘MyApp’;
package MyApp;
dispatch { sub(GET) { [ 200, [...], [ ‘Hello’ ] ]; }};
my $app = MyApp->as_psgi;
![Page 100: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/100.jpg)
use My::Catalyst::App;
My::Catalyst::App->setup_engine(‘PSGI’);
my $app = sub {
My::Catalyst::App->run(@_)
};
![Page 101: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/101.jpg)
![Page 102: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/102.jpg)
![Page 103: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/103.jpg)
![Page 104: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/104.jpg)
catalyst.pl My::Catalyst::App
![Page 105: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/105.jpg)
Plack“PSGI implementation & toolkit”
![Page 106: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/106.jpg)
Plack toolkit
![Page 107: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/107.jpg)
Plack toolkitPlack::Handlers Connect PSGI apps and Web Servers
![Page 108: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/108.jpg)
Plack toolkit
plackup Command line launcher
Plack::Handlers Connect PSGI apps and Web Servers
![Page 109: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/109.jpg)
Plack toolkit
plackup Command line launcher
Plack::Loader (auto)load Plack Servers
Plack::Handlers Connect PSGI apps and Web Servers
![Page 110: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/110.jpg)
Plack toolkit
plackup Command line launcher
Plack::Loader (auto)load Plack Servers
Plack::Handlers Connect PSGI apps and Web Servers
Plack::Middleware Easy-to-use PSGI Middleware
![Page 111: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/111.jpg)
Plack toolkit
plackup Command line launcher
Plack::Loader (auto)load Plack Servers
Plack::Handlers Connect PSGI apps and Web Servers
Plack::Middleware Easy-to-use PSGI Middleware
Plack::Builder OO & DSL to enable Middleware
![Page 112: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/112.jpg)
Plack toolkit
plackup Command line launcher
Plack::Loader (auto)load Plack Servers
Plack::Handlers Connect PSGI apps and Web Servers
Plack::Middleware Easy-to-use PSGI Middleware
Plack::Apps Apps
Plack::Builder OO & DSL to enable Middleware
![Page 113: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/113.jpg)
Plack toolkit
plackup Command line launcher
Plack::Loader (auto)load Plack Servers
Plack::Handlers Connect PSGI apps and Web Servers
Plack::Middleware Easy-to-use PSGI Middleware
Plack::Apps Apps
Plack::Test Testing
Plack::Builder OO & DSL to enable Middleware
![Page 114: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/114.jpg)
plackupRuns PSGI app instantly from CLI
(inspired by rackup)
![Page 115: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/115.jpg)
> plackup app.psgi
![Page 116: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/116.jpg)
> plackup app.psgiHTTP::Server::PSGI: Accepting connections at http://0:5000/
![Page 117: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/117.jpg)
HTTP::Server::PSGIReference PSGI web server
bundled in Plack
Standalone, single-process HTTP servergreat for development and testing
![Page 118: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/118.jpg)
Plack::Middleware(160+ modules - July 2011)
![Page 119: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/119.jpg)
MiddlewareDebug, Session, Logger, Static, Lint,
AccessLog, ErrorDocument, StackTrace, Auth::Basic, Auth::Digest, ReverseProxy, Refresh, Auth::OAuth,
Throttle....
![Page 120: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/120.jpg)
![Page 121: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/121.jpg)
Access AccessLog AccessLog::Timed Acme::YadaYada AddDefaultCharset AllowCrossSiteAJAX AMF Assets Auth::Digest Auth::Form Auth::Htpasswd Auth::Negotiate Auth::Basic AutoRefresh BufferedStreaming Cache Cached ChromeFrame Chunked Class::Refresh Compile Conditional ConditionalGET ConsoleLogger ContentLength ContentMD5 CrossOrigin CSRFBlock Dancer::Debug DBIC::QueryLog Debug Debug::CatalystPluginCache Debug::DBIC::QueryLog Debug::DBIProfile Debug::Profiler::NYTProf Debug::W3CValidate Deflater DoCoMoGUID Doorman ErrorDocument ESI ETag Expires File::Sass Firebug::Lite FirePHP ForceEnv Head Header HTMLify HTMLMinify HTTPExceptions IEnosniff IIS6ScriptNameFix Image::Scale Inline InteractiveDebugger IPAddressFilter iPhone JavaScript::Ectype JSConcat JSONP LighttpdScriptNameFix Lint Log::Contextual Log::Minimal Log4perl LogDispatch LogWarn MethodOverride Mirror NeverExpire NoDeflate NoMultipleSlashes NullLogger Options OptionsOK Precompressed ProxyMap RearrangeHeaders Recursive RefererCheck Refresh REPL Reproxy ReverseProxy Rewrite Runtime Scope::Container Scope::Session ServerStatus::Lite Session Session::SerializedCookie SetAccept SimpleContentFilter SimpleLogger SizeLimit SocketIO SSI StackTrace Static Static::Minifier StaticShared Status Test::StashWarnings Throttle TMT UseChromeFrame Watermark
![Page 122: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/122.jpg)
Plack MiddlewareWraps a PSGI applicationto add pre/post processing
![Page 123: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/123.jpg)
![Page 124: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/124.jpg)
Logging
![Page 125: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/125.jpg)
LoggingStatus code redirect
![Page 126: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/126.jpg)
LoggingStatus code redirectError Handler
![Page 127: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/127.jpg)
LoggingStatus code redirectError HandlerCache Middleware
![Page 128: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/128.jpg)
LoggingStatus code redirectError HandlerCache MiddlewareSession Middleware
![Page 129: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/129.jpg)
LoggingStatus code redirectError HandlerCache MiddlewareSession MiddlewareRoutes Middleware
![Page 130: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/130.jpg)
LoggingStatus code redirectError HandlerCache MiddlewareSession MiddlewareRoutes MiddlewareYour App
![Page 131: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/131.jpg)
Plack::Middleware::A
Plack::Middleware::B
PSGI Compatible App
![Page 132: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/132.jpg)
Plack::Middleware::A
Request in
Plack::Middleware::B
PSGI Compatible App
![Page 133: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/133.jpg)
P::MW::A
Plack::Middleware::A
Request in
Plack::Middleware::B
PSGI Compatible App
![Page 134: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/134.jpg)
P::MW::B
P::MW::A
Plack::Middleware::A
Request in
Plack::Middleware::B
PSGI Compatible App
![Page 135: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/135.jpg)
PSGI App
P::MW::B
P::MW::A
Plack::Middleware::A
Request in
Plack::Middleware::B
PSGI Compatible App
![Page 136: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/136.jpg)
P::MW::B
PSGI App
P::MW::B
P::MW::A
Plack::Middleware::A
Request in
Plack::Middleware::B
PSGI Compatible App
![Page 137: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/137.jpg)
P::MW::A
P::MW::B
PSGI App
P::MW::B
P::MW::A
Plack::Middleware::A
Request in
Plack::Middleware::B
PSGI Compatible App
![Page 138: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/138.jpg)
Response out
P::MW::A
P::MW::B
PSGI App
P::MW::B
P::MW::A
Plack::Middleware::A
Request in
Plack::Middleware::B
PSGI Compatible App
![Page 139: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/139.jpg)
e.g. Redirect Response out
P::MW::A
P::MW::B
PSGI App
P::MW::B
P::MW::A
Plack::Middleware::A
Request in
Plack::Middleware::B
PSGI Compatible App
![Page 140: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/140.jpg)
e.g. Redirect
e.g. Static
Response out
P::MW::A
P::MW::B
PSGI App
P::MW::B
P::MW::A
Plack::Middleware::A
Request in
Plack::Middleware::B
PSGI Compatible App
![Page 141: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/141.jpg)
Enabling Plack::Middleware
reusable and extensible Middleware framework
Plack::Builder DSL in .psgi
![Page 142: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/142.jpg)
my $app = sub { return [ $status, $header, $body ];};
use Plack::Builder;
return builder { enable “A”; enable “B”; $app;}
![Page 143: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/143.jpg)
my $app = sub { return [ $status, $header, $body ];};
use Plack::Builder;
return builder { enable “A”; enable “B”; $app;}
![Page 144: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/144.jpg)
my $app = sub { return [ $status, $header, $body ];};
use Plack::Builder;
return builder { enable “A”; enable “B”; $app;}
![Page 145: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/145.jpg)
my $app = sub { return [ $status, $header, $body ];};
use Plack::Builder;
return builder { enable “A”; enable “B”; $app;}
![Page 146: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/146.jpg)
my $app = sub { return [ $status, $header, $body ];};
use Plack::Builder;
return builder { enable “A”; # Plack::Middleware::A enable “B”; # Order matters $app;}
![Page 147: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/147.jpg)
my $app = sub { return [ $status, $header, $body ];};
use Plack::Builder;
return builder { enable “A”; enable “B”; $app;}
![Page 148: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/148.jpg)
my $app = sub { return [ $status, $header, $body ];};
use Plack::Builder;
return builder { enable “Static”, root => “/htdocs”, path => qr!^/static/!; enable “Deflater”; $app;}
![Page 149: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/149.jpg)
my $app = sub { return [ $status, $header, $body ];};
use Plack::Builder;
return builder { enable “Static”, root => “/htdocs”, path => qr!^/static/!; enable “Deflater”; $app;}
![Page 150: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/150.jpg)
my $app = sub { return [ $status, $header, $body ];};
use Plack::Builder;
return builder { enable “Static”, root => “/htdocs”, path => qr!^/static/!; enable “Deflater”; # gzip/deflate $app;}
![Page 151: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/151.jpg)
my $app = sub { return [ $status, $header, $body ];};
use Plack::Builder;
return builder { enable “Static”, root => “/htdocs”, path => qr!^/static/!; enable “Deflater”; $app;}
![Page 152: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/152.jpg)
Plack::Middleware::Static
Plack::Middleware::Deflate
PSGI Compatible App
![Page 153: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/153.jpg)
Plack::Middleware::Static
Request in
Plack::Middleware::Deflate
PSGI Compatible App
![Page 154: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/154.jpg)
Static
Plack::Middleware::Static
Request in
Plack::Middleware::Deflate
PSGI Compatible App
![Page 155: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/155.jpg)
=~ ^/static Response out
Static
Plack::Middleware::Static
Request in
Plack::Middleware::Deflate
PSGI Compatible App
![Page 156: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/156.jpg)
=~ ^/static Response out
-
Static
Plack::Middleware::Static
Request in
Plack::Middleware::Deflate
PSGI Compatible App
![Page 157: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/157.jpg)
=~ ^/static Response out
PSGI App
-
Static
Plack::Middleware::Static
Request in
Plack::Middleware::Deflate
PSGI Compatible App
![Page 158: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/158.jpg)
=~ ^/static Response out
Deflate compresses
PSGI App
-
Static
Plack::Middleware::Static
Request in
Plack::Middleware::Deflate
PSGI Compatible App
![Page 159: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/159.jpg)
=~ ^/static Response out
-
Deflate compresses
PSGI App
-
Static
Plack::Middleware::Static
Request in
Plack::Middleware::Deflate
PSGI Compatible App
![Page 160: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/160.jpg)
=~ ^/static Response out
-
Deflate compresses
PSGI App
-
Static
Plack::Middleware::Static
Request in
Plack::Middleware::Deflate
PSGI Compatible App
![Page 161: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/161.jpg)
plackup compatibleplackup -e ‘enable “Foo”;’ app.psgi
![Page 162: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/162.jpg)
MiddlewareWrite once, run in every framework
![Page 163: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/163.jpg)
A few demos..
![Page 164: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/164.jpg)
Assume...
use Plack::Builder;
my $body = ‘<html><body>Hello World</body></html>’;
my $app = sub { my $self = shift;
return [200, ['Content-Type' => 'text/html'], [ $body ]];};
![Page 165: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/165.jpg)
Assume...
use Plack::Builder;
my $body = ‘<html><body>Hello World</body></html>’;
my $app = sub { my $self = shift;
return [200, ['Content-Type' => 'text/html'], [ $body ]];};
![Page 166: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/166.jpg)
Assume...
use Plack::Builder;
my $body = ‘<html><body>Hello World</body></html>’;
my $app = sub { my $self = shift;
return [200, ['Content-Type' => 'text/html'], [ $body ]];};
![Page 167: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/167.jpg)
Debugger
![Page 168: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/168.jpg)
return builder { # Precious debug info. Right on your page! enable 'Debug';
$app;}
![Page 169: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/169.jpg)
![Page 170: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/170.jpg)
![Page 171: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/171.jpg)
![Page 172: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/172.jpg)
![Page 173: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/173.jpg)
![Page 174: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/174.jpg)
![Page 175: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/175.jpg)
![Page 176: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/176.jpg)
![Page 177: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/177.jpg)
InteractiveDebugger
![Page 178: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/178.jpg)
my $app = sub { my $foo = 'bar'; die "oops" if $foo eq 'bar';
[200, ['Content-Type' => 'text/html'], [ $body ]];};
return builder { # Enable Interactive debugging enable "InteractiveDebugger";
$app;}
![Page 179: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/179.jpg)
my $app = sub { my $foo = 'bar'; die "oops" if $foo eq 'bar';
[200, ['Content-Type' => 'text/html'], [ $body ]];};
return builder { # Enable Interactive debugging enable "InteractiveDebugger";
$app;}
![Page 180: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/180.jpg)
my $app = sub { my $foo = 'bar'; die "oops" if $foo eq 'bar';
[200, ['Content-Type' => 'text/html'], [ $body ]];};
return builder { # Enable Interactive debugging enable "InteractiveDebugger";
$app;}
![Page 181: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/181.jpg)
![Page 182: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/182.jpg)
![Page 183: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/183.jpg)
![Page 184: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/184.jpg)
![Page 185: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/185.jpg)
![Page 186: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/186.jpg)
![Page 187: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/187.jpg)
NYTProf - profiler
![Page 188: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/188.jpg)
First rule of Program Optimisation
![Page 189: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/189.jpg)
Don’t do it!
![Page 190: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/190.jpg)
Second rule of Program Optimisation
(for experts only)
![Page 191: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/191.jpg)
Don’t do it - yet!
![Page 192: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/192.jpg)
return builder { enable 'Debug', panels => [ [ 'Profiler::NYTProf' ] ]; $app;};
![Page 193: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/193.jpg)
![Page 194: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/194.jpg)
![Page 195: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/195.jpg)
![Page 196: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/196.jpg)
![Page 197: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/197.jpg)
![Page 198: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/198.jpg)
ServerStatus::Lite
![Page 199: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/199.jpg)
use Plack::Builder;
return builder { enable "ServerStatus::Lite", path => '/server-status', allow => [ '127.0.0.1'], scoreboard => '/tmp/score'; $app;}
![Page 200: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/200.jpg)
![Page 201: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/201.jpg)
![Page 202: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/202.jpg)
![Page 203: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/203.jpg)
![Page 204: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/204.jpg)
SizeLimit
![Page 205: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/205.jpg)
use Plack::Builder;
return builder { enable "SizeLimit", max_unshared_size_in_kb => 3000, check_every_n_requests => 5; $app;}
![Page 206: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/206.jpg)
Plack::App::*ready-to-use applications
![Page 207: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/207.jpg)
![Page 208: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/208.jpg)
Apache::ActionWrapper CGIBin Cascade CocProxy DAV Directory Directory::Xslate FCGIDispatcher File ImageMagick JSP PSGIBin Path::Router Proxy Proxy::Backend::AnyEvent::HTTP Proxy::Backend::LWP Proxy::Selective Proxy::Test URLMap WrapApacheReq WrapApacheReq::FakeRequest WrapCGI
![Page 209: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/209.jpg)
Plack::App::CGIBinmount /cgi-bin as PSGI applications
![Page 210: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/210.jpg)
CGI::PSGIEasy migration from CGI.pm
![Page 211: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/211.jpg)
Plack::App::DirectoryStatic content file server
![Page 212: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/212.jpg)
Plack::App::Proxy(non-blocking) proxy server
Can be used as reverse proxy as well
![Page 213: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/213.jpg)
Plack::App::JSPRuns JavaScript PSGI apps :)
![Page 214: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/214.jpg)
# app.psgi - Javascript! Plack::App::JSP->new( js => q{ function respond(body) { return [ 200, [ 'Content-type', 'text/html' ], [ body ] ] } respond("Five factorial is " + (function(x) { if ( x<2 ) return x; return x * arguments.callee(x - 1); })(5) ); });
![Page 215: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/215.jpg)
# app.psgi - Javascript! Plack::App::JSP->new( js => q{ function respond(body) { return [ 200, [ 'Content-type', 'text/html' ], [ body ] ] } respond("Five factorial is " + (function(x) { if ( x<2 ) return x; return x * arguments.callee(x - 1); })(5) ); });
![Page 216: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/216.jpg)
Plack::App::URLMapMultiplex multiple apps
Integrated with Builder DSL
![Page 217: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/217.jpg)
use CatApp;use CGIApp;
my $c1 = sub { CatApp->run };my $c2 = sub { CGIApp->run_psgi };
use Plack::Builder;
return builder { mount “/cat” => $c1; mount “/cgi-app” => builder { enable “StackTrace”; $c2; };}
![Page 218: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/218.jpg)
use CatApp;use CGIApp;
my $c1 = sub { CatApp->run };my $c2 = sub { CGIApp->run_psgi };
use Plack::Builder;
return builder { mount “/cat” => $c1; mount “/cgi-app” => builder { enable “StackTrace”; $c2; };}
![Page 219: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/219.jpg)
use CatApp;use CGIApp;
my $c1 = sub { CatApp->run };my $c2 = sub { CGIApp->run_psgi };
use Plack::Builder;
return builder { mount “/cat” => $c1; mount “/cgi-app” => builder { enable “StackTrace”; $c2; };}
![Page 220: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/220.jpg)
Some more demos...
![Page 221: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/221.jpg)
Basic website
![Page 222: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/222.jpg)
TemplateToolkit + Static
![Page 223: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/223.jpg)
my $root = '/path/to/html_doc_root';
my $app = Plack::Middleware::TemplateToolkit->new( INCLUDE_PATH => root,)->to_app;
return builder {
enable 'Static', path =>
qr{\.[gif|png|jpg|swf|ico|mov|mp3|pdf|js|css]$}, root => $root;
$app; }
![Page 224: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/224.jpg)
my $root = '/path/to/html_doc_root';
my $app = Plack::Middleware::TemplateToolkit->new( INCLUDE_PATH => root,)->to_app;
return builder {
enable 'Static', path =>
qr{\.[gif|png|jpg|swf|ico|mov|mp3|pdf|js|css]$}, root => $root;
$app; }
![Page 225: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/225.jpg)
my $root = '/path/to/html_doc_root';
my $app = Plack::Middleware::TemplateToolkit->new( INCLUDE_PATH => root,)->to_app;
return builder {
enable 'Static', path =>
qr{\.[gif|png|jpg|swf|ico|mov|mp3|pdf|js|css]$}, root => $root;
$app; }
![Page 226: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/226.jpg)
my $root = '/path/to/html_doc_root';
my $app = Plack::Middleware::TemplateToolkit->new( INCLUDE_PATH => root,)->to_app;
return builder {
enable 'Static', path =>
qr{\.[gif|png|jpg|swf|ico|mov|mp3|pdf|js|css]$}, root => $root;
$app; }
![Page 227: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/227.jpg)
my $root = '/path/to/html_doc_root';
my $app = Plack::Middleware::TemplateToolkit->new( INCLUDE_PATH => root,)->to_app;
return builder {
enable 'Static', path =>
qr{\.[gif|png|jpg|swf|ico|mov|mp3|pdf|js|css]$}, root => $root;
$app; }
![Page 228: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/228.jpg)
Creating utilities
![Page 229: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/229.jpg)
Caching Proxy
![Page 230: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/230.jpg)
Website
![Page 231: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/231.jpg)
Website
Developing code
![Page 232: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/232.jpg)
Website
Developing code
![Page 233: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/233.jpg)
Website
Developing code
Slow website
![Page 234: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/234.jpg)
Slow website
Developing code
![Page 235: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/235.jpg)
Slow website
Developing code
Caching Proxy
![Page 236: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/236.jpg)
use Plack::Middleware::Cache;use Plack::App::Proxy;
my $app = Plack::App::Proxy->new(
remote => "http://london.pm.org/" )->to_app;
return builder { enable "Cache", match_url => '^/.*', # everything cache_dir => '/tmp/plack-cache'; $app;};
![Page 237: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/237.jpg)
use Plack::Middleware::Cache;use Plack::App::Proxy;
my $app = Plack::App::Proxy->new(
remote => "http://london.pm.org/" )->to_app;
return builder { enable "Cache", match_url => '^/.*', # everything cache_dir => '/tmp/plack-cache'; $app;};
![Page 238: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/238.jpg)
use Plack::Middleware::Cache;use Plack::App::Proxy;
my $app = Plack::App::Proxy->new(
remote => "http://london.pm.org/" )->to_app;
return builder { enable "Cache", match_url => '^/.*', # everything cache_dir => '/tmp/plack-cache'; $app;};
![Page 239: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/239.jpg)
![Page 240: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/240.jpg)
![Page 241: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/241.jpg)
![Page 242: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/242.jpg)
use LWP::Simple;
my $content = get(‘http://localhost:5000/’);
![Page 243: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/243.jpg)
Caching Proxy + Domain hijack
![Page 244: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/244.jpg)
use LWP::Simple;
my $content = get(‘http://localhost:5000/’);
![Page 245: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/245.jpg)
use LWP::Simple;
my $content = get(‘http://london.pm.org/’);
![Page 246: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/246.jpg)
my $app = Plack::App::Proxy->new(
remote => "http://london.pm.org/" )->to_app;
return builder { enable "Cache", match_url => '^/.*', # everything cache_dir => '/tmp/plack-cache2'; $app;};
![Page 247: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/247.jpg)
my $app = Plack::App::Proxy->new(
remote => "http://london.pm.org/" )->to_app;
return builder { enable "Cache", match_url => '^/.*', # everything cache_dir => '/tmp/plack-cache2'; $app;};
![Page 248: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/248.jpg)
my $app = Plack::App::Proxy->new(
remote => "http://london.pm.org/" )->to_app;
$app = builder { enable "Cache", match_url => '^/.*', # everything cache_dir => '/tmp/plack-cache2'; $app;};
![Page 249: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/249.jpg)
# Hijack Any LWP::Useragent requestsLWP::Protocol::PSGI->register($app);
use LWP::Simple;
my $content = get("http://london.pm.org/");
say '\o/' if $content =~ /London Perl Mongers/;
![Page 250: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/250.jpg)
# Hijack Any LWP::Useragent requestsLWP::Protocol::PSGI->register($app);
use LWP::Simple;
my $content = get("http://london.pm.org/");
say '\o/' if $content =~ /London Perl Mongers/;
![Page 251: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/251.jpg)
# Hijack Any LWP::Useragent requestsLWP::Protocol::PSGI->register($app);
use LWP::Simple;
my $content = get("http://london.pm.org/");
say '\o/' if $content =~ /London Perl Mongers/;
![Page 252: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/252.jpg)
# Hijack Any LWP::Useragent requestsLWP::Protocol::PSGI->register($app);
use LWP::Simple;
my $content = get("http://london.pm.org/");
say '\o/' if $content =~ /London Perl Mongers/;
![Page 253: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/253.jpg)
![Page 254: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/254.jpg)
![Page 255: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/255.jpg)
![Page 256: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/256.jpg)
Plack::TestUnified interface to write TAP testswith Mock HTTP and Live HTTP
![Page 257: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/257.jpg)
use Plack::Test;use HTTP::Request::Common;
my $app = sub { my $env = shift; return [ $status, $header, $body ];};
test_psgi app => $app,client => sub { my $callback = shift;
my $req = GET “http://localhost/foo”; my $res = $callback->($req); ok $res->[0] == ‘200’, ‘Success’; };
![Page 258: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/258.jpg)
use Plack::Test;use HTTP::Request::Common;
my $app = sub { my $env = shift; return [ $status, $header, $body ];};
test_psgi app => $app,client => sub { my $callback = shift;
my $req = GET “http://localhost/foo”; my $res = $callback->($req); ok $res->[0] == ‘200’, ‘Success’; };
![Page 259: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/259.jpg)
use Plack::Test;use HTTP::Request::Common;
my $app = sub { my $env = shift; return [ $status, $header, $body ];};
test_psgi app => $app,client => sub { my $callback = shift;
my $req = GET “http://localhost/foo”; my $res = $callback->($req); ok $res->[0] == ‘200’, ‘Success’; };
![Page 260: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/260.jpg)
use Plack::Test;use HTTP::Request::Common;
my $app = sub { my $env = shift; return [ $status, $header, $body ];};
test_psgi app => $app,client => sub { my $callback = shift;
my $req = GET “http://localhost/foo”; my $res = $callback->($req); ok $res->[0] == ‘200’, ‘Success’; };
![Page 261: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/261.jpg)
use Plack::Test;use HTTP::Request::Common;
my $app = sub { my $env = shift; return [ $status, $header, $body ];};
test_psgi app => $app,client => sub { my $callback = shift;
my $req = GET “http://localhost/foo”; my $res = $callback->($req); ok $res->[0] == ‘200’, ‘Success’; };
![Page 262: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/262.jpg)
use Plack::Test;use HTTP::Request::Common;
my $app = sub { my $env = shift; return [ $status, $header, $body ];};
test_psgi app => $app,client => sub { my $callback = shift;
my $req = GET “http://localhost/foo”; my $res = $callback->($req); ok $res->[0] == ‘200’, ‘Success’; };
![Page 263: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/263.jpg)
use Plack::Test;use HTTP::Request::Common;
my $app = sub { my $env = shift; return [ $status, $header, $body ];};
test_psgi app => $app,client => sub { my $callback = shift;
my $req = GET “http://localhost/foo”; my $res = $callback->($req);
ok $res->[0] == ‘200’, ‘Success’; };
![Page 264: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/264.jpg)
use Plack::Test;use HTTP::Request::Common;
my $app = sub { my $env = shift; return [ $status, $header, $body ];};
test_psgi app => $app,client => sub { my $callback = shift;
my $req = GET “http://localhost/foo”; my $res = $callback->($req);
ok $res->[0] == ‘200’, ‘Success’; };
![Page 265: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/265.jpg)
Test::WWW::Mechanize::PSGI
![Page 266: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/266.jpg)
use Test::WWW::Mechanize::PSGI; my $mech = Test::WWW::Mechanize::PSGI->new( app => $app, );
$mech->get_ok('/');
![Page 267: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/267.jpg)
use Test::WWW::Mechanize::PSGI; my $mech = Test::WWW::Mechanize::PSGI->new( app => $app, );
$mech->get_ok('/');
![Page 268: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/268.jpg)
Testing your full configuration!
![Page 269: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/269.jpg)
Network setup tip
![Page 270: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/270.jpg)
Use a reverse proxy
![Page 271: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/271.jpg)
• Sits in front of servers, not clients - “reverse”
Use a reverse proxy
![Page 272: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/272.jpg)
• Sits in front of servers, not clients - “reverse”
•Makes servers more efficient
Use a reverse proxy
![Page 273: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/273.jpg)
• Sits in front of servers, not clients - “reverse”
•Makes servers more efficient
• Add HTTPS easily
Use a reverse proxy
![Page 274: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/274.jpg)
• Sits in front of servers, not clients - “reverse”
•Makes servers more efficient
• Add HTTPS easily
•Makes scaling easier
Use a reverse proxy
![Page 275: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/275.jpg)
Webserver App
Internet / Users
![Page 276: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/276.jpg)
Webserver App
Internet / Users
![Page 277: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/277.jpg)
Webserver App
Internet / Users
![Page 278: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/278.jpg)
Webserver App
Internet / Users
![Page 279: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/279.jpg)
Webserver App
Internet / Users
Reverse ProxyNGINX Perlbal Pound
![Page 280: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/280.jpg)
Webserver App
Internet / Users
Reverse ProxyNGINX Perlbal Pound
![Page 281: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/281.jpg)
Webserver App
Internet / Users
Reverse ProxyNGINX Perlbal Pound
![Page 282: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/282.jpg)
Webserver App
Internet / Users
Reverse ProxyNGINX Perlbal Pound
![Page 283: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/283.jpg)
Webserver App
Internet / Users
Reverse ProxyNGINX Perlbal Pound
![Page 284: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/284.jpg)
Server
Reverse ProxyNGINX Perlbal Pound
![Page 285: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/285.jpg)
Server 1
Reverse ProxyNGINX Perlbal Pound
Server 2
![Page 286: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/286.jpg)
Server 1
Reverse ProxyNGINX Perlbal Pound
Server 2
Server 3
![Page 287: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/287.jpg)
Server 1
Reverse ProxyNGINX Perlbal Pound
Server 2
Server 3
![Page 288: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/288.jpg)
Plack::Middleware::ReverseProxy
Updates $env->{REMOTE_ADDRESS}
![Page 289: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/289.jpg)
Why use Plack?
![Page 290: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/290.jpg)
Why use Plack?
‣ Flexibility
‣ Middleware
‣ Apps
‣ Development
‣ Testing
‣ Deployment
![Page 291: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/291.jpg)
Flexibility
Apache lighttpd HTTP::Server::PSGI Perlbalmod_psgi
Starman Twiggy uWSGI Corona etc
Plack::Handler::* (CGI, FCGI, Apache)
![Page 292: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/292.jpg)
Flexibility• Easy to change webserver (25+!)
Apache lighttpd HTTP::Server::PSGI Perlbalmod_psgi
Starman Twiggy uWSGI Corona etc
Plack::Handler::* (CGI, FCGI, Apache)
![Page 293: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/293.jpg)
Flexibility• Easy to change webserver (25+!)
Apache lighttpd HTTP::Server::PSGI Perlbalmod_psgi
Starman Twiggy uWSGI Corona etc
• Starman seems to be used most
Plack::Handler::* (CGI, FCGI, Apache)
![Page 294: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/294.jpg)
Middleware
![Page 295: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/295.jpg)
Middleware
• Easy to reuse with any PSGI app
![Page 296: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/296.jpg)
Middleware
• Easy to reuse with any PSGI app
• Many tools to make your life easy
![Page 297: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/297.jpg)
Middleware
• Easy to reuse with any PSGI app
• Many tools to make your life easy
• 160+ on CPAN now
![Page 298: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/298.jpg)
App
![Page 299: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/299.jpg)
App
• URLMapping / Routing
![Page 300: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/300.jpg)
App
• URLMapping / Routing
• Static files
![Page 301: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/301.jpg)
App
• URLMapping / Routing
• Static files
• Proxying
![Page 302: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/302.jpg)
Development
![Page 303: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/303.jpg)
Development
• plackup
![Page 304: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/304.jpg)
Development
• plackup
• Restarter (monitor changes on disk)
![Page 305: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/305.jpg)
Development
• plackup
• Restarter (monitor changes on disk)
• HTTP::Server::PSGI
![Page 306: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/306.jpg)
Development
• plackup
• Restarter (monitor changes on disk)
• HTTP::Server::PSGI
• Debugging middleware
![Page 307: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/307.jpg)
Development
• plackup
• Restarter (monitor changes on disk)
• HTTP::Server::PSGI
• Debugging middleware
• Profiler
![Page 308: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/308.jpg)
Testing
![Page 309: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/309.jpg)
Testing
• Testing your full configuration
![Page 310: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/310.jpg)
Testing
• Testing your full configuration
• Test::WWW::Mechanize::PSGI
![Page 311: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/311.jpg)
Testing
• Testing your full configuration
• Test::WWW::Mechanize::PSGI
• Plack::Test
![Page 312: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/312.jpg)
Deployment
![Page 313: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/313.jpg)
Deployment
• No separate configuration files
![Page 314: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/314.jpg)
Deployment
• No separate configuration files
• Easy to choose/change webserver
![Page 315: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/315.jpg)
Deployment
• No separate configuration files
• Easy to choose/change webserver
• DotCloud etc - cloud deployment
![Page 316: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/316.jpg)
Summary
![Page 317: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/317.jpg)
Summary
✦ PSGI is an interface, Plack is the code.
![Page 318: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/318.jpg)
Summary
✦ PSGI is an interface, Plack is the code.
✦ Many fast PSGI servers.
![Page 319: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/319.jpg)
Summary
✦ PSGI is an interface, Plack is the code.
✦ Many fast PSGI servers.
✦ Adapters and tools for frameworks and webservers.
![Page 320: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/320.jpg)
Summary
✦ PSGI is an interface, Plack is the code.
✦ Many fast PSGI servers.
✦ Adapters and tools for frameworks and webservers.
✦ An amazing amount of middleware
![Page 321: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/321.jpg)
Summary
✦ PSGI is an interface, Plack is the code.
✦ Many fast PSGI servers.
✦ Adapters and tools for frameworks and webservers.
✦ An amazing amount of middleware
✦ Used in many production systems
![Page 322: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/322.jpg)
Use Plack
![Page 323: Plack basics for Perl websites - YAPC::EU 2011](https://reader034.vdocuments.us/reader034/viewer/2022052522/554f49e4b4c905b9508b47ce/html5/thumbnails/323.jpg)
Thank you!Slides: http://slideshare.net/ranguard
http://plackperl.org/
irc://irc.perl.org/#plack