Since your application is fully loaded in memory,
every Apache process will be rather large.
This means a large Apache process will be tied up while serving static files,
large files,
or dealing with slow clients.
For this reason,
it is best to run a two-tiered web architecture with a lightweight frontend server passing dynamic requests to a large backend mod_perl server.

Any changes made to the code of your app require a full restart of Apache.
Catalyst does not support Apache::Reload or StatINC.
This is another good reason to run a frontend web server where you can set up an ErrorDocument 502 page to report that your app is down for maintenance.

If you have two different applications which run on the same machine,
and each application needs a different versions of a library,
the only way to do this is to have per-vhost perl interpreters (with different library paths).
This is entirely possible,
but nullifies all the memory sharing benefits that you get from having multiple applications sharing the same interpreter.

Both Apache 1.3 and Apache 2 are supported,
although Apache 2 is highly recommended.
With Apache 2,
make sure you are using the prefork MPM and not the worker MPM.
The reason for this is that many Perl modules are not thread-safe and may have problems running within the threaded worker environment.
Catalyst is thread-safe however,
so if you know what you're doing,
you may be able to run using worker.

The most important line here is PerlModule MyApp. This causes mod_perl to preload your entire application into shared memory, including all of your controller, model, and view classes and configuration. If you have -Debug mode enabled, you will see the startup output scroll by when you first start Apache.

Also, there have been reports that the block above should instead be (but this has not been confirmed):