diff --git a/docker-mod-perl.html b/docker-mod-perl.html new file mode 100644 index 0000000..0bb96b4 --- /dev/null +++ b/docker-mod-perl.html @@ -0,0 +1,143 @@ + +
+
+ I've been working under an old Apache mod_perl setup. I wanted to use Mojolicious for some new services,
+ but I needed to stay within mod_perl, so I decided to go all the way and Dockerize it. After scouring the mod_perl documentation,
+ Plack + Mojolicious configs, and finding an image, I hit the ground running and documented my steps.
+
+
+ I love old banners :)
+Thanks to motemen for some nicely pre-configured
+ mod_perl and Apache2 images. We're targetting Perl v5.36, and Apache 2.4.58 here.
+ We'll also add the include statement for our VirtualHost configuration file that we'll make later.
+
+docker run --rm motemen/mod_perl:5.36.0-2.4.58 cat /usr/local/apache2/conf/httpd.conf > httpd.conf
+echo 'Include /usr/local/apache2/conf/mojolicious.conf' >> httpd.conf
+
+
+
+ This will leave you with a httpd.conf that will get picked up by Apache when we run it under docker.
+
+ I couldn't get Apache to run without disabling Event MPM and enabling Prefork MPM. +
+In httpd.conf:
+
+#LoadModule mpm_event_module modules/mod_mpm_event.so
+LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
+
+
+
+ All you need to do is write a Mojo application. In this case, I'm using Mojolicious::Lite but this can
+ be done with the whole MVC setup easily as well. Just make sure you have a sub that returns your app so you can
+ pass it to Plack::Builder.
+
In lib/App.pm:
+
+package App;
+use 5.036;
+use Mojolicious::Lite -signatures;
+
+sub get_app { app; }
+
+get '/' => sub {
+ shift->render( text => "Hello World!" );
+};
+
+1;
+
+
+ Here we write a simple .psgi file that
+ will use our App library and Plack::Builder to
+ create a PSGI application for Plack::Handler::Apache2 to pickup.
+
In app.psgi:
+use 5.036;
+
+use lib 'lib';
+use App;
+use Plack::Builder;
+
+builder {
+ App::get_app->start;
+};
+
+
+ + Very straight-forward, just tell Apache where to find our script, and what handler to use. +
+In mojolicious.conf:
+
+LoadModule perl_module modules/mod_perl.so
+
+<VirtualHost *:80>
+<Location />
+SetHandler perl-script
+PerlResponseHandler Plack::Handler::Apache2
+PerlSetVar psgi_app /app.psgi
+</Location>
+</VirtualHost>
+
+
+
+
+ Now all thats left is making a Dockerfile.
+ We'll use one of motemen's images,
+ and copy all of the pre-reqs over, install some libraries, you know, Docker stuff.
+
In Dockerfile:
+
+FROM motemen/mod_perl:5.36.0-2.4.58-2.0.13
+COPY app.psgi /app.psgi
+COPY lib /usr/local/apache2/lib
+COPY httpd.conf /usr/local/apache2/conf/httpd.conf
+COPY mojolicious.conf /usr/local/apache2/conf/mojolicious.conf
+RUN apt-get update -y && apt-get install -y wget make build-essential
+RUN cpan -iT Plack Mojolicious
+EXPOSE 80
+CMD ["httpd-foreground"]
+
+
+
+Now we can make it go!
+
+$ docker build . -t mod-perl
+$ docker run -p 80:80 mod-perl
+$ curl http://localhost:80/
+
+"Hello World!"
+
+
+ You can make this auto-reload if you use a docker volume for lib/ against /usr/local/apache2/lib/
+ An example is available on my github. +
+mod_perl in Docker
+
-
-
-
+
+
+