Operate Mojolicious in a subdirectory
When deploying multiple applications in a production environment, it is recommended to deploy with reverse proxy + subdomain if subdomain operation is possible. Even if you don't think it's difficult, if you set up a virtual host for each subdomain, you don't need to change the application.
But if you use Mojolicious, you can operate it in a subdirectory. I will introduce how to operate with reverse proxy + subdirectory. The http server is Apache.
First is the Apache configuration file.
<VirtualHost *: 80>
ServerName perlcodesample.com
<Proxy *>
Order deny, allow
Allow from all
</Proxy>
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / app1 http: // localhost: 3000 / app1 keepalive = On
ProxyPassReverse / app1 http: // localhost: 3000 / app1
ProxyPass / app2 http: // localhost: 3001 / app2 keepalive = On
ProxyPassReverse / app2 http: // localhost: 3001 / app2
RequestHeader set X-ProxyPassReverse-UsePrefix "On"
RequestHeader set X-Forwarded-HTTPS "0"
</VirtualHost>
The reverse proxy is set for each subdirectory. X-ProxyPassReverse-UsePrefix is an application-specific HTTP header.
Below is the application. I am rewriting the URL using before_dispatch. This is necessary for methods such as Mojolicious's router and url_for to recognize the correct URL.
use Mojolicious::Lite;
app->hook(before_dispatch => sub {
my $self = shift;
my $use_prefix
= $self->req->headers->header('X-ProxyPassReverse-UsePrefix');
if (defined $use_prefix && lc $use_prefix eq'on') {
my $prefix = shift @{$self->req->url->path->parts};
$self->req->url->base->path->parse("/ $prefix");
}
});
get'/' =>'index';
get'/ foo' =>'foo';
app->start;
__DATA__
@@index.html.ep
URL: <a href="<%=url_for'/foo'%> "> Foo</a>
@@foo.html.ep
Foo
If you write the application in this way, you can operate it in a subdirectory.
Mojolicious Tutorial