Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Deploying Plack
Web Applications
    Tatsuhiko Miyagawa
   O’Reilly OSCON 2011
Me

• Tatsuhiko Miyagawa
• @miyagawa
• Lives in San Francisco, CA
• Software Engineer, DotCloud
My Software

• Plack
• PSGI
• cpanminus
• carton (NEW!)
PSGI
PSGI in 3 min.
#
PSGI
my
$app
=
sub
{




my
$env
=
shift;




return
[









200,








[
‘Content‐Type’,
‘text/plain’
],








[...
Catalyst    CGI::App           Jifty        Mojolicious   Dancer


                                                  Plack...
Mason           CGI::Application         Jifty               Catalyst




Mason::CGIHandler
                              ...
Catalyst    CGI::App           Jifty        Mojolicious   Dancer


                                                  Plack...
Momentum
Catalyst 5.9
Built-in PSGI/Plack support
CGI::Application 4.5
    Built-in PSGI support
Dancer, Mojolicious
20+
Web Frameworks
25+
Web Servers/Handlers
150+
Plack Middleware
Cloud (PaaS)
Still not convinced?
“FastCGI is good enough”?
    http://xrl.us/psgireddit
Deploying Plack
Web applications
1)
Server Environment
2)
Code Deployment
3)
Application Environment
1)
Server Environment
Writing a PSGI app?
Maypole Mason Mojolicious Sledge Catalyst Spoon
    PageKit AxKit Egg Gantry Continuity Solstice
Mojolicious Tripletail Ko...
Pick one.
Whichever you like.
Deploying a PSGI app?
HTTP::Server::PSGI CGI FastCGI mod_perl
 mod_perl2 Fastpass Starman Starlet Twiggy
HTTP::Server::Simple::PSGI Feersum Coro...
Pick one.
Whichever you like.
“I don’t know which
   I like the most.”
Some hints
Based on my experience
  and your experience
HTTP::Server::PSGI
• Plack Built-in
• Pure Perl
• Single-process, cross platform
• Experimental IPv6, SSL
• Automatic relo...
HTTP::Server::PSGI
• Plack Built-in
• Pure Perl
• Single-process, cross platform
• Experimental IPv6, SSL
• Automatic relo...
HTTP::Server::Simple::PSGI

• Zero non-core dependencies (other than
  HTTP::Server::Simple)
• Single-process, extensible ...
HTTP::Server::Simple::PSGI

• Zero non-core dependencies (other than
  HTTP::Server::Simple)
• Single-process, extensible ...
CGI
• Plack::Handler::CGI
• Almost universally available
• Quite slow and inefficient
• Reasonably easy to run from the she...
CGI
• Plack::Handler::CGI
• Almost universally available
• Quite slow and inefficient
• Reasonably easy to run from the she...
mod_perl
• Plack::Handler::Apache[12]
• Lots of hooks and Apache modules
• Porting from mod_perl to PSGI might be
  tricky...
mod_perl
• Plack::Handler::Apache[12]
• Lots of hooks and Apache modules
• Porting from mod_perl to PSGI might be
  tricky...
Perlbal::Plugin::PSGI

• Pure perl load balancer
• LiveJournal, TypePad etc.
• Reproxying, Plugins etc.
• Danga::Socket (n...
Perlbal::Plugin::PSGI

• Pure perl load balancer
• LiveJournal, TypePad etc.
• Reproxying, Plugins etc.
• Danga::Socket (n...
mod_psgi

• Apache module to run PSGI apps
• No mod_perl hooks
• Just persistent PSGI apps
• Simpler
mod_psgi

• Apache module to run PSGI apps
• No mod_perl hooks
• Just persistent PSGI apps
• Simpler
     Considered EXPER...
nginx_mod_psgi

• nginx native PSGI extension
• https://github.com/yko/ngx_mod_psgi
• Pretty new
nginx_mod_psgi

• nginx native PSGI extension
• https://github.com/yko/ngx_mod_psgi
• Pretty new
     Considered EXPERIMEN...
Mongrel2
• Zed Shaw
• ZeroMQ
• Pretty cool stuff
• lestrrat (Plack::Handler::Mongrel2)
• jockway (AnyEvent::Mongrel2)
Mongrel2
• Zed Shaw
• ZeroMQ
• Pretty cool stuff
• lestrrat (Plack::Handler::Mongrel2)
• jockway (AnyEvent::Mongrel2)
    ...
Recommended Servers?
Standalone HTTP Servers
FastCGI daemons
Put it behind the frontend
        (nginx etc.)
Starman
•   Standalone HTTP

•   Prefork, app preloading

•   Dynamic process management

•   TCP/UNIX Sockets

•   Partia...
Starman (cont.)

•   The Lacuna Expanse

•   perl.org

•   cpanratings.perl.org

•   etc.
Starlet

• Standalone HTTP server
• Prefork, app preloading
• HTTP/1.0
• Max/min spare workers
• Hot deploy via Server::St...
Starlet (cont.)

• Livedoor
• Hatena
• etc.
Twiggy

• Standalone HTTP server
• AnyEvent based
• Tiny memory footprint
Twiggy (cont.)

• mixi
• SAY Media
• beta.metacpan.org
Feersum

• Standalone HTTP server
• EV.xs
• picohttpparser (C library)
• AnyEvent compatible
• Lighting fast
Plack::Handler::FCGI
• Standalone FastCGI daemon
  (or web server mode)
• Preforking
• TCP/UNIX sockets
• FCGI.xs
• Little...
fastpass

• github.com/miyagawa/fastpass
• Standalone FastCGI daemon
• preforking, dynamic process management
• Net::FastC...
FCGI::EV/AE::FCGI

• Standalone FastCGI daemon
• EV/AnyEvent based
• asynchronous, non-blocking
uWSGI
• FastCGI-like protocol
• Optimized for *SGI
• built-in nginx/cherokee support
• AnyEvent support in the works
• Lot...
uWSGI (cont.)


• DotCloud.com
  (more server types coming!)
Proc.             UNIX Graceful
           Proto,   Prefork   Async           TCP/IP                    XS/Perl
          ...
General guideline:
“Traditional” MVC apps?
Lots of RDBMS queries?
Coming from mod_perl?
Preforking servers
   Put it behind nginx.
Lots of I/O bound requests?
New app or can rewrite to use AE?
 Resource limited environment?
Asynchronous servers
     Twiggy or Feersum.
HTTP or FastCGI?
HTTP Standalone☺

• Put it behind frontend (nginx, lighttpd)
• Most web servers support reverse proxy
• As well as load ba...
HTTP Standalone ☹

• You may have to configure X-Forwarded-*
  and ReverseProxy middleware
• Keep-alives can be problematic...
FastCGI ☺

• Many web servers support fastcgi
• No need for X-Forwarded-* configuration
• Potentially faster binary protoco...
FastCGI ☹

• Binary protocol, may not be easy to debug
• Requires C/XS (but see fastpass)
• Hard to get SCRIPT_NAME/PATH_I...
Questions/Suggestions?
2)
Code Deployment
Conventions = good.
Web app convention:
1) PSGI endpoint
2) CPAN dependencies
1)
app.psgi
2)
Makefile.PL
>
git
commit
‐m
‘releasing
v1.0.0’
>
git
tag
v1.0.0
>
git
push
‐‐tags

>
(checking
out
code)
>
cpanm
‐‐installdeps
.
>
(re...
cpanm --installdeps .
<3
Problem
Pulls the latest versions
    of CPAN today.
Many solutions:
Shipwright, MyCPAN, orepan, DPAN
Carton
inspired by bundler
Carton
• App-specific local environment (local::lib)
• Dep-tree analysis, including versions.
• Single-file,VCS friendly
• F...
>
carton
install
>
git
commit
‐m
‘releasing
v1.0.0’





carton.lock
Makefile.PL
>
git
tag
v1.0.0
>
git
push
‐‐tags

>
(ch...
dotCloud will do
all of this for you :)
      DISCLAIMER: I work for dotCloud.
github.com/miyagawa/carton
3)
Application Environment
Useful middleware
 for deployments
SizeLimit
     Port of Apache::SizeLimit
Supported by Starman, Starlet, uWSGI
use
Plack::Builder;

builder
{


enable
“SizeLimit”,




max_unshared_size_in_kb
=>
4096,




check_every_n_requests
=>
5;...
ServerStatus::Lite
   Port of mod_status
     Starlet, Starman
use
Plack::Builder;

builder
{


enable
“ServerStatus::Lite”,




path
=>
‘/server‐status’;


$app;
}
Runtime
Adds X-Runtime: header
use
Plack::Builder;

builder
{


enable
“Runtime”;


$app;
}
use
Plack::Builder;

builder
{


enable
“Runtime”;


$app;
}
%
curl
‐I
http://localhost:5000/
HTTP/1.0
200
OK
Server:
HTTP::Server::PSGI
X‐Runtime:
0.00029
ErrorDocument
 Customize error pages
   500/503/404 etc.
use
Plack::Builder;

builder
{


enable
“ErrorDocument”,




500
=>
‘/home/www/errors/500.html’;


$app;
};
Throttle
Rate-limiting framework
use
Plack::Builder;

builder
{


enable
“Throttle::Hourly”,





max
=>
200,




backend
=>
...,




path
=>
qr!^/api!;


...
Expires
     Port of mod_expires
Cache static files on proxy/clients
use
Plack::Builder;

builder
{


enable
“Expires”,




content_type
=>
qr!^image/!,




expires
=>
‘access
plus
3
months’;...
Rewrite
mod_rewrite-ish URL rewriting
      pure perl syntax
use
Plack::Builder;

builder
{


enable
‘Rewrite’,
rules
=>
sub
{




s{^/here}{/there};









return
301
if
s{^/foo/}{...
Auth::Basic/Digest
   Add Basic authentication
with any Auth::Simple backends
use
Plack::Builder;
use
Authen::Simple::Kerberos;

my
$auth
=
Authen::Simple::Kerberos‐>new(


realm
=>
‘REALM.MYCOMPANY.C...
PSGI Deployment
     Survey
~100 responses
    Thank you!
What category describes
   your apps best?
Intranet
                        9%

                            Personal
                              21%
Small to mid-s...
Where is it hosted?
VPS   Colocation   Own Data Center   Enterprise   Home   Cloud
Operating Systems?
Ubuntu

  Debian

 CentOS

   RHEL

   Linux

FreeBSD

Mac OS X

Windows

  Solaris

            0   10   20   30   40
Perl versions?
60


45


30


15


0
     “5.8”   “5.10”   “5.12”   “5.14”
Web Frameworks?
(in-house)


       Catalyst


    Mojolicious


        Dancer


CGI::Application


     Tatsumaki


         Amon2


   ...
When did you migrate
 or start using PSGI?
2009 Year   2010 Q2   2010 Q4   2011 Q2   Future
Which PSGI server?
Starman

             Starlet

             Twiggy

Plack::Handler::FCGI

         mod_perl 2

 HTTP::Server::PSGI

  H::S...
FastCGI web servers


      mod_fcgid
         8%
lighttpd
  20%             nginx
                  40%




  mod_fastcgi...
Frontend web servers


    nginx

mod_proxy

   perlbal

   Varnish

  lighttpd

    Squid
How did you measure the right # of
  servers and worker processes?
Guess
    Defaults 7%
      6%

                        by RAM
by CPU                   40%
 19%




         by req. time...
How do you keep
logs of your apps?
Log4perl


daemontools


      syslog


    logrotate


Log::Dispatch


 Log::Minimal


   supervisor


        runit


  ...
Results will be posted on
http://blog.plackperl.org/
One more thing...
REPL
InteractiveDebugger
Thanks!
  Check out Booth 527
for FREE DotCloud T-shirt
Deploying Plack Web Applications: OSCON 2011
Deploying Plack Web Applications: OSCON 2011
Deploying Plack Web Applications: OSCON 2011
You’ve finished this document.
Upcoming SlideShare
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Next
Upcoming SlideShare
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Next

43

Share

Deploying Plack Web Applications: OSCON 2011

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

Deploying Plack Web Applications: OSCON 2011

  1. 1. Deploying Plack Web Applications Tatsuhiko Miyagawa O’Reilly OSCON 2011
  2. 2. Me • Tatsuhiko Miyagawa • @miyagawa • Lives in San Francisco, CA • Software Engineer, DotCloud
  3. 3. My Software • Plack • PSGI • cpanminus • carton (NEW!)
  4. 4. PSGI
  5. 5. PSGI in 3 min.
  6. 6. #
PSGI my
$app
=
sub
{ 



my
$env
=
shift; 



return
[
 







200, 







[
‘Content‐Type’,
‘text/plain’
], 







[
‘Hello
World’
], 



]; };
  7. 7. Catalyst CGI::App Jifty Mojolicious Dancer Plack::Middleware PSGI Plack::Handler::* (CGI, FCGI, Apache) Apache lighttpd HTTP::Server::PSGI mod_psgi Perlbal Starman Twiggy uWSGI Corona Feersum
  8. 8. Mason CGI::Application Jifty Catalyst Mason::CGIHandler CGI.pm Catalyst::Engine mod_perl CGI fastcgi HTTP::Server ::Simple Apache IIS lighttpd nginx
  9. 9. Catalyst CGI::App Jifty Mojolicious Dancer Plack::Middleware PSGI Plack::Handler::* (CGI, FCGI, Apache) Apache lighttpd HTTP::Server::PSGI mod_psgi Perlbal Starman Twiggy uWSGI Corona Feersum
  10. 10. Momentum
  11. 11. Catalyst 5.9 Built-in PSGI/Plack support
  12. 12. CGI::Application 4.5 Built-in PSGI support
  13. 13. Dancer, Mojolicious
  14. 14. 20+ Web Frameworks
  15. 15. 25+ Web Servers/Handlers
  16. 16. 150+ Plack Middleware
  17. 17. Cloud (PaaS)
  18. 18. Still not convinced?
  19. 19. “FastCGI is good enough”? http://xrl.us/psgireddit
  20. 20. Deploying Plack Web applications
  21. 21. 1) Server Environment
  22. 22. 2) Code Deployment
  23. 23. 3) Application Environment
  24. 24. 1) Server Environment
  25. 25. Writing a PSGI app?
  26. 26. Maypole Mason Mojolicious Sledge Catalyst Spoon PageKit AxKit Egg Gantry Continuity Solstice Mojolicious Tripletail Konstrukt Reaction Jifty WebGUI OpenInteract Squatting Dancer CGI::Application Ark Angelos Noe Schenker Tatsumaki Amon Apache2::WebApp Web::Simple Apache2::REST SweetPea Hydrant Titanium
  27. 27. Pick one. Whichever you like.
  28. 28. Deploying a PSGI app?
  29. 29. HTTP::Server::PSGI CGI FastCGI mod_perl mod_perl2 Fastpass Starman Starlet Twiggy HTTP::Server::Simple::PSGI Feersum Corona mod_psgi evpsgi nginx_psgi Pelrbal uWSGI FCGI::EV AnyEvent::FCGI AnyEvent::HTTPD Prack/nack Mongrel2
  30. 30. Pick one. Whichever you like.
  31. 31. “I don’t know which I like the most.”
  32. 32. Some hints
  33. 33. Based on my experience and your experience
  34. 34. HTTP::Server::PSGI • Plack Built-in • Pure Perl • Single-process, cross platform • Experimental IPv6, SSL • Automatic reloading with -r
  35. 35. HTTP::Server::PSGI • Plack Built-in • Pure Perl • Single-process, cross platform • Experimental IPv6, SSL • Automatic reloading with -r Great for development and testing
  36. 36. HTTP::Server::Simple::PSGI • Zero non-core dependencies (other than HTTP::Server::Simple) • Single-process, extensible with H::S::S • Works on 5.005_* • Dancer’s default web server
  37. 37. HTTP::Server::Simple::PSGI • Zero non-core dependencies (other than HTTP::Server::Simple) • Single-process, extensible with H::S::S • Works on 5.005_* • Dancer’s default web server Great for embedding e.g. Android
  38. 38. CGI • Plack::Handler::CGI • Almost universally available • Quite slow and inefficient • Reasonably easy to run from the shell
  39. 39. CGI • Plack::Handler::CGI • Almost universally available • Quite slow and inefficient • Reasonably easy to run from the shell Last resort for Win32/IIS laptop web apps
  40. 40. mod_perl • Plack::Handler::Apache[12] • Lots of hooks and Apache modules • Porting from mod_perl to PSGI might be tricky. (There are some tools/attempts)
  41. 41. mod_perl • Plack::Handler::Apache[12] • Lots of hooks and Apache modules • Porting from mod_perl to PSGI might be tricky. (There are some tools/attempts) Not recommended unless you’ve hugely invested in mod_perl
  42. 42. Perlbal::Plugin::PSGI • Pure perl load balancer • LiveJournal, TypePad etc. • Reproxying, Plugins etc. • Danga::Socket (non-blocking)
  43. 43. Perlbal::Plugin::PSGI • Pure perl load balancer • LiveJournal, TypePad etc. • Reproxying, Plugins etc. • Danga::Socket (non-blocking) Considered EXPERIMENTAL
  44. 44. mod_psgi • Apache module to run PSGI apps • No mod_perl hooks • Just persistent PSGI apps • Simpler
  45. 45. mod_psgi • Apache module to run PSGI apps • No mod_perl hooks • Just persistent PSGI apps • Simpler Considered EXPERIMENTAL
  46. 46. nginx_mod_psgi • nginx native PSGI extension • https://github.com/yko/ngx_mod_psgi • Pretty new
  47. 47. nginx_mod_psgi • nginx native PSGI extension • https://github.com/yko/ngx_mod_psgi • Pretty new Considered EXPERIMENTAL
  48. 48. Mongrel2 • Zed Shaw • ZeroMQ • Pretty cool stuff • lestrrat (Plack::Handler::Mongrel2) • jockway (AnyEvent::Mongrel2)
  49. 49. Mongrel2 • Zed Shaw • ZeroMQ • Pretty cool stuff • lestrrat (Plack::Handler::Mongrel2) • jockway (AnyEvent::Mongrel2) Considered EXPERIMENTAL
  50. 50. Recommended Servers?
  51. 51. Standalone HTTP Servers
  52. 52. FastCGI daemons
  53. 53. Put it behind the frontend (nginx etc.)
  54. 54. Starman • Standalone HTTP • Prefork, app preloading • Dynamic process management • TCP/UNIX Sockets • Partial HTTP/1.1 support • Graceful restarts
  55. 55. Starman (cont.) • The Lacuna Expanse • perl.org • cpanratings.perl.org • etc.
  56. 56. Starlet • Standalone HTTP server • Prefork, app preloading • HTTP/1.0 • Max/min spare workers • Hot deploy via Server::Starter
  57. 57. Starlet (cont.) • Livedoor • Hatena • etc.
  58. 58. Twiggy • Standalone HTTP server • AnyEvent based • Tiny memory footprint
  59. 59. Twiggy (cont.) • mixi • SAY Media • beta.metacpan.org
  60. 60. Feersum • Standalone HTTP server • EV.xs • picohttpparser (C library) • AnyEvent compatible • Lighting fast
  61. 61. Plack::Handler::FCGI • Standalone FastCGI daemon (or web server mode) • Preforking • TCP/UNIX sockets • FCGI.xs • Little bit of process management
  62. 62. fastpass • github.com/miyagawa/fastpass • Standalone FastCGI daemon • preforking, dynamic process management • Net::FastCGI (no XS) • TCP/UNIX sockets
  63. 63. FCGI::EV/AE::FCGI • Standalone FastCGI daemon • EV/AnyEvent based • asynchronous, non-blocking
  64. 64. uWSGI • FastCGI-like protocol • Optimized for *SGI • built-in nginx/cherokee support • AnyEvent support in the works • Lots of configurations • harakiri mode
  65. 65. uWSGI (cont.) • DotCloud.com (more server types coming!)
  66. 66. Proc. UNIX Graceful Proto, Prefork Async TCP/IP XS/Perl Mgmt. Sockets Restarts Starman HTTP ✔ ✔ ✔ ✔ ✔ XS Starlet HTTP ✔ ✔ ✔ ✔ XS/PP Twiggy HTTP ✔ ✔ ✔ XS/PP Feersum HTTP ✔ ✔ XS FastCGI FCGI ✔ ✔ ✔ ✔ XS fastpass FCGI ✔ ✔ ✔ ✔ ✔ PP AE::FCGI FCGI ✔ ✔ ✔ PP FCGI::EV FCGI ✔ ✔ ✔ XS uWSGI uWSGI ✔ ✔ ✔ ✔ ✔ C/XS
  67. 67. General guideline:
  68. 68. “Traditional” MVC apps? Lots of RDBMS queries? Coming from mod_perl?
  69. 69. Preforking servers Put it behind nginx.
  70. 70. Lots of I/O bound requests? New app or can rewrite to use AE? Resource limited environment?
  71. 71. Asynchronous servers Twiggy or Feersum.
  72. 72. HTTP or FastCGI?
  73. 73. HTTP Standalone☺ • Put it behind frontend (nginx, lighttpd) • Most web servers support reverse proxy • As well as load balancers (perlbal, varnish) • Easy for human to debug and test • nginx + unix socket workers work well
  74. 74. HTTP Standalone ☹ • You may have to configure X-Forwarded-* and ReverseProxy middleware • Keep-alives can be problematic in dumb servers like mod_proxy on apache2 • Path mismatch on frontend/backend could cause headaches
  75. 75. FastCGI ☺ • Many web servers support fastcgi • No need for X-Forwarded-* configuration • Potentially faster binary protocol between web server and app server • “Hot deploy” via UNIX sockets
  76. 76. FastCGI ☹ • Binary protocol, may not be easy to debug • Requires C/XS (but see fastpass) • Hard to get SCRIPT_NAME/PATH_INFO right (e.g. lighttpd, mod_fcgid)
  77. 77. Questions/Suggestions?
  78. 78. 2) Code Deployment
  79. 79. Conventions = good.
  80. 80. Web app convention:
  81. 81. 1) PSGI endpoint
  82. 82. 2) CPAN dependencies
  83. 83. 1)
app.psgi 2)
Makefile.PL
  84. 84. >
git
commit
‐m
‘releasing
v1.0.0’ >
git
tag
v1.0.0 >
git
push
‐‐tags >
(checking
out
code) >
cpanm
‐‐installdeps
. >
(restart
app
servers
gracefully)
  85. 85. cpanm --installdeps .
  86. 86. <3
  87. 87. Problem
  88. 88. Pulls the latest versions of CPAN today.
  89. 89. Many solutions: Shipwright, MyCPAN, orepan, DPAN
  90. 90. Carton inspired by bundler
  91. 91. Carton • App-specific local environment (local::lib) • Dep-tree analysis, including versions. • Single-file,VCS friendly • Freezing/locking versions • Recreates mirror on deploy • Conservative Updates
  92. 92. >
carton
install >
git
commit
‐m
‘releasing
v1.0.0’
 



carton.lock
Makefile.PL >
git
tag
v1.0.0 >
git
push
‐‐tags >
(checking
out
code) >
carton
install
 >
(restart
app
servers
gracefully)
  93. 93. dotCloud will do all of this for you :) DISCLAIMER: I work for dotCloud.
  94. 94. github.com/miyagawa/carton
  95. 95. 3) Application Environment
  96. 96. Useful middleware for deployments
  97. 97. SizeLimit Port of Apache::SizeLimit Supported by Starman, Starlet, uWSGI
  98. 98. use
Plack::Builder; builder
{ 

enable
“SizeLimit”, 



max_unshared_size_in_kb
=>
4096, 



check_every_n_requests
=>
5; 

$app; }
  99. 99. ServerStatus::Lite Port of mod_status Starlet, Starman
  100. 100. use
Plack::Builder; builder
{ 

enable
“ServerStatus::Lite”, 



path
=>
‘/server‐status’; 

$app; }
  101. 101. Runtime Adds X-Runtime: header
  102. 102. use
Plack::Builder; builder
{ 

enable
“Runtime”; 

$app; }
  103. 103. use
Plack::Builder; builder
{ 

enable
“Runtime”; 

$app; }
  104. 104. %
curl
‐I
http://localhost:5000/ HTTP/1.0
200
OK Server:
HTTP::Server::PSGI X‐Runtime:
0.00029
  105. 105. ErrorDocument Customize error pages 500/503/404 etc.
  106. 106. use
Plack::Builder; builder
{ 

enable
“ErrorDocument”, 



500
=>
‘/home/www/errors/500.html’; 

$app; };
  107. 107. Throttle Rate-limiting framework
  108. 108. use
Plack::Builder; builder
{ 

enable
“Throttle::Hourly”,
 



max
=>
200, 



backend
=>
..., 



path
=>
qr!^/api!; 

$app; }
  109. 109. Expires Port of mod_expires Cache static files on proxy/clients
  110. 110. use
Plack::Builder; builder
{ 

enable
“Expires”, 



content_type
=>
qr!^image/!, 



expires
=>
‘access
plus
3
months’; 

$app; };
  111. 111. Rewrite mod_rewrite-ish URL rewriting pure perl syntax
  112. 112. use
Plack::Builder; builder
{ 

enable
‘Rewrite’,
rules
=>
sub
{ 



s{^/here}{/there}; 



 



return
301
if
s{^/foo/}{/bar/}; 



return
201
if
$_
eq
‘/favicon.ico’; 



return
503
if
‐e
‘/tmp/maint.txt’; 

}; 

$app; }
  113. 113. Auth::Basic/Digest Add Basic authentication with any Auth::Simple backends
  114. 114. use
Plack::Builder; use
Authen::Simple::Kerberos; my
$auth
=
Authen::Simple::Kerberos‐>new( 

realm
=>
‘REALM.MYCOMPANY.COM’, ); builder
{ 

enable
“Auth::Basic”, 



authenticator
=>
$auth; 

$app; };
  115. 115. PSGI Deployment Survey
  116. 116. ~100 responses Thank you!
  117. 117. What category describes your apps best?
  118. 118. Intranet 9% Personal 21% Small to mid-scale 49% Large scale 21%
  119. 119. Where is it hosted?
  120. 120. VPS Colocation Own Data Center Enterprise Home Cloud
  121. 121. Operating Systems?
  122. 122. Ubuntu Debian CentOS RHEL Linux FreeBSD Mac OS X Windows Solaris 0 10 20 30 40
  123. 123. Perl versions?
  124. 124. 60 45 30 15 0 “5.8” “5.10” “5.12” “5.14”
  125. 125. Web Frameworks?
  126. 126. (in-house) Catalyst Mojolicious Dancer CGI::Application Tatsumaki Amon2 Mason 0 10 20 30 40
  127. 127. When did you migrate or start using PSGI?
  128. 128. 2009 Year 2010 Q2 2010 Q4 2011 Q2 Future
  129. 129. Which PSGI server?
  130. 130. Starman Starlet Twiggy Plack::Handler::FCGI mod_perl 2 HTTP::Server::PSGI H::S::Simple::PSGI CGI Feersum uWSGI mod_perl 1.3 0 15 30 45 60
  131. 131. FastCGI web servers mod_fcgid 8% lighttpd 20% nginx 40% mod_fastcgi 33%
  132. 132. Frontend web servers nginx mod_proxy perlbal Varnish lighttpd Squid
  133. 133. How did you measure the right # of servers and worker processes?
  134. 134. Guess Defaults 7% 6% by RAM by CPU 40% 19% by req. time 27%
  135. 135. How do you keep logs of your apps?
  136. 136. Log4perl daemontools syslog logrotate Log::Dispatch Log::Minimal supervisor runit Others
  137. 137. Results will be posted on http://blog.plackperl.org/
  138. 138. One more thing...
  139. 139. REPL InteractiveDebugger
  140. 140. Thanks! Check out Booth 527 for FREE DotCloud T-shirt
  • nikosv

    May. 10, 2018
  • holcapek

    Dec. 16, 2015
  • GuroBokum

    Oct. 15, 2015
  • _bor_

    Dec. 7, 2014
  • boying1

    May. 2, 2014
  • campnou

    Jan. 24, 2014
  • jerryzhang3591

    Jul. 5, 2013
  • nuddlegg

    May. 27, 2013
  • dh7320

    Mar. 29, 2013
  • NobutoHachiya

    Nov. 25, 2012
  • andrefsantos

    Oct. 2, 2012
  • noizex

    Jul. 12, 2012
  • catalinciurea

    Jun. 19, 2012
  • davidlu1001

    Apr. 20, 2012
  • DominixNixNix

    Apr. 3, 2012
  • angelgreyes

    Mar. 18, 2012
  • accepted

    Feb. 10, 2012
  • marseco

    Dec. 17, 2011
  • lornlab

    Dec. 6, 2011
  • pung96

    Nov. 26, 2011

Views

Total views

20,944

On Slideshare

0

From embeds

0

Number of embeds

2,498

Actions

Downloads

0

Shares

0

Comments

0

Likes

43

×