Subject: | Configuring cache, especially to avoid crashes with multiple httpd daemons |
UploadProgress dies a nasty death when more than one httpd server is run.
This is because both servers try to create the same FastMmap cache file.
Things get very ugly - eventually both servers die during startup with
something like:
Syntax error on line 95 of /etc/httpd/conf/httpd-common.conf:
Create of share file /tmp/Apache2-UploadProgress failed: File exists at
/usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/Cache/FastMmap.pm
line 629.\nCompilation failed in require at (eval 2) line 3.\n
In addition, in a secure environment, one would like to place the cache
file somewhere else - the TODO notes this as an open issue.
The code actually supports doing the right thing - but the documentation
doesn't explain how. Here's the secret:
These environment variables control the cache location, page size, and
number of pages:
UPLOADPROGRESS_SHARE_FILE
full path to memory cache, default = <tmpdir>/Apache2-UploadProgress
UPLOADPROGRESS_PAGE_SIZE
Page size for memory cache, default = '64k'
UPLOADPROGRESS_NUM_PAGES
Number of memory cache pages, default = 89
See Cache::FastMmap for what the last two mean.
Setting these environment variables in your httpd startup script isn't
sufficient, because by default MOD_PERL won't pass them to the handler.
To fix this, include these lines in your httpd.conf file:
PerlPassEnv UPLOADPROGRESS_SHARE_FILE
PerlPassEnv UPLOADPROGRESS_PAGE_SIZE
PerlPassEnv UPLOADPROGRESS_NUM_PAGES
Put them before
PerlLoadModule Apache2::UploadProgress
Then, define/export as needed in your httpd startup script (such as
/etc/sysconfig/httpd.conf)
And magically, they will be obeyed.
The key to resolving the multiple server issue is to use a
server-specific file for UPLOADPROGRESS_SHARE_FILE.
It is not necessary to define all three in your shell script.
Verified with Perl 5.8.8, Apache 2.2.6 (Fedora), mod_perl/2.0.2
Please update the documentation so that I'm the last person who has to
debug this himself!