From cd5891e6057c80833a3fccc46bf4a4c7fc584879 Mon Sep 17 00:00:00 2001 From: Rawley Date: Tue, 31 Oct 2023 14:07:50 -0600 Subject: [PATCH] mod_perl article --- docker-mod-perl.html | 143 +++++++++++++++++++++++++++++++++++++++++++ index.html | 18 +++--- mod_perl.gif | Bin 0 -> 9904 bytes 3 files changed, 154 insertions(+), 7 deletions(-) create mode 100644 docker-mod-perl.html create mode 100644 mod_perl.gif 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 @@ + + + Running mod_perl with Mojolicious in Docker + + + + + +
+ << back +

Running mod_perl with Mojolicious in Docker

+

+ 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. +

+ + mod_perl banner + +

I love old banners :)

+

Generate your config

+

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. +

+

Enable Prefork MPM instead of Event MPM

+

+ 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
+                
+            
+

Write your application

+

+ 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;
+                
+

Write your Plack shim

+

+ 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;
+};
+                
+            
+

Write your mod_perl Apache config

+

+ 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>
+                
+            
+ +

Write your Dockerfile

+

+ 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"]
+                
+            
+ +

Run with Docker

+

Now we can make it go!

+
+$ docker build . -t mod-perl
+$ docker run -p 80:80 mod-perl
+$ curl http://localhost:80/
+
+"Hello World!"
+                
+            
+

Running with auto-reloading (for development)

+

You can make this auto-reload if you use a docker volume for lib/ against /usr/local/apache2/lib/

+

An example?

+

+ An example is available on my github. +

+
+ + diff --git a/index.html b/index.html index 4b4d497..4b75648 100644 --- a/index.html +++ b/index.html @@ -1,8 +1,9 @@ -' + - rawley.xyz - + rawley.xyz + +
@@ -18,11 +19,14 @@

Sitemap

@@ -39,9 +43,9 @@ - - - + + +
diff --git a/mod_perl.gif b/mod_perl.gif new file mode 100644 index 0000000000000000000000000000000000000000..89bd46bf9faa4be7266976fae453f26df7a99a53 GIT binary patch literal 9904 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