[dancer-users] Multiple apps with Plack and Apache

janet davis oscarjwoofer at gmail.com
Thu Jul 14 07:55:14 BST 2016


Thanks Amelia (and Chad),

I think I'm goint to stick with the proxy method using Starman behind
Apache which seems to work well.  Plack::Builder also works nicely to
combine apps as you have suggested.

It would be interesting to know if anyone is running a number of Dancer
apps via Apache using the plack handler method as documented in the current
deployment guide and how they are finding that performance wise.



On Wed, Jul 13, 2016 at 11:51 PM, Amelia Ireland <aireland at lbl.gov> wrote:

> What do your app.psgi scripts look like? Would it be feasible to combine
> them into a single file that mounts all your apps?
>
> e.g.
> use Plack::Builder;
>
> builder {
> mount "/app1" => $app1->();
> mount "/app2" => $app2->();
> };
>
> If you haven't found it yet, the PSGI/Plack advent calendar has a lot of
> useful recipes for running and mounting different apps on the same server:
> http://advent.plackperl.org/2009/12/index.html
>
>
> On 13 July 2016 at 11:25, janet davis <oscarjwoofer at gmail.com> wrote:
>
>> Yes, it would be fantastic if this method worked and I have tried but I
>> get the following error when switching between app1 and app2.  Yes Perl
>> 5.14 sadly, we are due to update to Debian 8 shortly which will bring us up
>> to 5.20.2.
>>
>> Error while loading /var/www/webapp/app2/bin/app.psgi: Can't locate
>> app2.pm in @INC (@INC contains: /var/www/webapp/app1/bin/../lib
>> /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2
>> /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14
>> /usr/local/lib/site_perl . /etc/apache2) at
>> /var/www/webapp/app2/bin/app.psgi line 8.\nBEGIN failed--compilation
>> aborted at /var/www/webapp/app2/bin/app.psgi line 8.
>>
>> App2 will work after a refresh, but them going back to App1 I get:
>>
>> and
>>
>> Error while loading /var/www/webapp/app1/bin/app.psgi: Can't locate
>> app1.pm in @INC (@INC contains: /var/www/webapp/app2/bin/../lib
>> /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2
>> /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14
>> /usr/local/lib/site_perl . /etc/apache2) at
>> /var/www/webapp/app1/bin/app.psgi line 8.\nBEGIN failed--compilation
>> aborted at /var/www/webapp/app1/bin/app.psgi line 8
>>
>> Here's my Apache config:
>> <Location /app1>
>>                 SetHandler perl-script
>>                 PerlResponseHandler
>> Plack::Handler::Apache2
>>                 PerlSetVar psgi_app
>> /var/www/webapp/app1/bin/app.psgi
>> </Location>
>>
>>  <Location
>> /app2>
>>                 SetHandler
>> perl-script
>>                 PerlResponseHandler
>> Plack::Handler::Apache2
>>                 PerlSetVar psgi_app
>> /var/www/webapp/app2/bin/app.psgi
>> </Location>
>>
>> On Wed, Jul 13, 2016 at 5:14 PM, Chad Wallace <
>> cwallace at lodgingcompany.com> wrote:
>>
>>> On Wed, 13 Jul 2016 14:28:23 +0100
>>> janet davis <oscarjwoofer at gmail.com> wrote:
>>>
>>> > Thanks for both of your input, it has really helped a lot.
>>>
>>> You're welcome!  But I have another suggestion...
>>>
>>> After re-reading your original post, I looked up the
>>> Plack::Handler::Apache2 option, and it looks like it might be better.
>>> It's at least worth exploring.
>>>
>>>  From the example in the deployment guide you mentioned, it looks like
>>>  all you'd have to do to your existing virtual host is add a <Location>
>>>  section for each of your apps, like this:
>>>
>>> <VirtualHost>
>>>     ServerName www.myserver
>>>
>>>     [...]
>>>
>>>     <Location /app1>
>>>         SetHandler perl-script
>>>         PerlResponseHandler Plack::Handler::Apache2
>>>         PerlSetVar psgi_app /websites/app1/app.psgi
>>>     </Location>
>>>     <Location /app2>
>>>         SetHandler perl-script
>>>         PerlResponseHandler Plack::Handler::Apache2
>>>         PerlSetVar psgi_app /websites/app2/app.psgi
>>>     </Location>
>>>     <Location /app3>
>>>         SetHandler perl-script
>>>         PerlResponseHandler Plack::Handler::Apache2
>>>         PerlSetVar psgi_app /websites/app3/app.psgi
>>>     </Location>
>>>
>>>     [...]
>>>
>>> </VirtualHost>
>>>
>>> That way, your plack apps will start and stop with your apache server.
>>>
>>> I don't have any experience with this approach, so hopefully someone
>>> else can weigh in on the pros and cons.  It seems much simpler to me.
>>>
>>> One drawback I can think of is that your apache processes would all
>>> load a copy of perl, Plack, Dancer and all the rest.  It may be better
>>> for memory usage to use the proxy method, especially if you have dozens
>>> of apache workers, but only need a few Dancer workers.  The impact of
>>> that would depend on the relative weight of your existing website vs.
>>> the new apps, and also whether you already use mod_perl and a lot of
>>> the same modules....
>>>
>>> You should definitely try both methods and see which is best.  And be
>>> sure to let us know what you find!
>>>
>>>
>>> > On Wed, Jul 13, 2016 at 12:25 AM, Chad Wallace
>>> > <cwallace at lodgingcompany.com> wrote:
>>> >
>>> > > On Tue, 12 Jul 2016 22:07:56 +0100
>>> > > janet davis <oscarjwoofer at gmail.com> wrote:
>>> > >
>>> > > > The only problem is the uri_base doesn't point to the public
>>> > > > directory in my application root it points to / so no css/js etc.
>>> > > >
>>> > > > I have:
>>> > > > ProxyPass /app1 http://localhost:5000
>>> > > > ProxyPassReverse /app1 http://localhost:5000
>>> > > > And I can reach app1 on myserver.com/app1
>>> > > >
>>> > > > Is there anywhere in the config that I can specify the correct
>>> > > > uri_base per app?
>>> > >
>>> > > There's the behind_proxy config option (see Dancer2::Config).
>>> > >
>>> > > > I will try using Plack Builder with some example apps.  Are there
>>> > > > any performance implications if I run a lot of Dancer apps in
>>> > > > this way (15+) alongside my cgi scripts?  I don't want to go down
>>> > > > this route and then discover that I have issues with server
>>> > > > resources.
>>> > >
>>> > > I'm guessing you'll get better performance with them combined.  They
>>> > > should at least use less memory that way, because the single process
>>> > > would load all modules only once, rather than loading one process
>>> > > per app, each with its own copy of perl, Plack, Dancer, Moo, etc.
>>> > >
>>> > > Adding the mounts with Plack::Builder probably doesn't add too much
>>> > > overhead.  From what I've seen, Plack and Dancer are both designed
>>> > > to perform and scale well.
>>> > >
>>> > > You could test both methods and compare the results.
>>> > >
>>> > >
>>> > > > On Tue, Jul 12, 2016 at 9:21 PM, Chad Wallace
>>> > > > <cwallace at lodgingcompany.com> wrote:
>>> > > >
>>> > > > > On Tue, 12 Jul 2016 19:55:31 +0100
>>> > > > > janet davis <oscarjwoofer at gmail.com> wrote:
>>> > > > >
>>> > > > > > Hi there,
>>> > > > > >
>>> > > > > > I have a web server running Apache with a single vhost that
>>> > > > > > serves a lot of Perl cgi scripts from cgi-bin.
>>> > > > > >
>>> > > > > > I've been trying out Dancer, which I really like, but I can't
>>> > > > > > figure out the best way to deploy apps in my Apache
>>> > > > > > environment. I want to keep my Apache cgi configuration to
>>> > > > > > serve legacy scripts but I want to start building new
>>> > > > > > projects based on psgi in something like Dancer.
>>> > > > > >
>>> > > > > > I want Apache to use www.myserver/cgi-bin/appname/script.pl
>>> > > > > > for old code (which currently works) and www.myserver/app1
>>> > > > > > for newer Dancer based apps. Please don't think I'm being
>>> > > > > > lazy by asking, I have read the documentation and looked at
>>> > > > > > the example for deploying multiple apps via fcgi but I am
>>> > > > > > still confused as I have limited experience with Apache - I
>>> > > > > > am working on that. What's the best way to set this up,
>>> > > > > > bearing in mind that I may want to run say 10-15 Dancer apps
>>> > > > > > from my server alongside my cgi-scripts? Do I have to set up
>>> > > > > > a vhost for each app?  I have Apache::Plack::Handler but I'm
>>> > > > > > not sure whether I should be using Plack::Builder to mount my
>>> > > > > > apps (which is mentioned in an older Dancer Cookbook, but not
>>> > > > > > the current deployment guide. Can someone help me get on the
>>> > > > > > right track please?
>>> > > > >
>>> > > > > I'm not sure it matches what you currently have in mind, but
>>> > > > > what I would do is set up www.myserver/app1 with mod_proxy to a
>>> > > > > standalone Plack/Dancer process for the app.  You would need
>>> > > > > something like this in your VirtualHost for each app:
>>> > > > >
>>> > > > >     ProxyPass  /app1  http://localhost:5000/app1
>>> > > > >
>>> > > > > You'd also have to manage starting, stopping and reloading each
>>> > > > > of your apps on its own, with a dedicated port, like 5000 in
>>> > > > > the line above.
>>> > > > >
>>> > > > > If you wanted to combine your apps into one, you can do that
>>> > > > > with Plack::Builder in a single app.psgi script.  Then you get
>>> > > > > the benefit of only having one script to start and stop, and
>>> > > > > one port. I currently do that with one of my apps to separate
>>> > > > > the AJAX-specific stuff, based on code I found in
>>> > > > > Dancer2::Cookbook[1]:
>>> > > > >
>>> > > > > #!/usr/bin/env perl
>>> > > > >
>>> > > > > use strict;
>>> > > > > use warnings;
>>> > > > >
>>> > > > > use FindBin;
>>> > > > > use lib "$FindBin::Bin/../lib";
>>> > > > >
>>> > > > > use Plack::Builder;
>>> > > > > use newtlc;
>>> > > > > use newtlc::API;
>>> > > > >
>>> > > > > builder {
>>> > > > >     mount '/'    => newtlc->to_app;
>>> > > > >     mount '/api' => newtlc::API->to_app;
>>> > > > > };
>>> > > > >
>>> > > > >
>>> > > > > [1]
>>> > > > >
>>> > > > >
>>> > >
>>> https://metacpan.org/pod/distribution/Dancer2/lib/Dancer2/Cookbook.pod#App-specific-feature
>>> > >
>>> > >
>>> > > --
>>> > >
>>> > > C. Chad Wallace, B.Sc.
>>> > > The Lodging Company
>>> > > http://www.lodgingcompany.com/
>>> > > OpenPGP Public Key ID: 0x262208A0
>>> > >
>>> > > _______________________________________________
>>> > > dancer-users mailing list
>>> > > dancer-users at dancer.pm
>>> > > http://lists.preshweb.co.uk/mailman/listinfo/dancer-users
>>> > >
>>>
>>>
>>> --
>>>
>>> C. Chad Wallace, B.Sc.
>>> The Lodging Company
>>> http://www.lodgingcompany.com/
>>> OpenPGP Public Key ID: 0x262208A0
>>>
>>> _______________________________________________
>>> dancer-users mailing list
>>> dancer-users at dancer.pm
>>> http://lists.preshweb.co.uk/mailman/listinfo/dancer-users
>>>
>>
>>
>> _______________________________________________
>> dancer-users mailing list
>> dancer-users at dancer.pm
>> http://lists.preshweb.co.uk/mailman/listinfo/dancer-users
>>
>>
>
> _______________________________________________
> dancer-users mailing list
> dancer-users at dancer.pm
> http://lists.preshweb.co.uk/mailman/listinfo/dancer-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.preshweb.co.uk/pipermail/dancer-users/attachments/20160714/d30dce1c/attachment.html>


More information about the dancer-users mailing list