httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Marcus Merz" <mm...@gmx.de>
Subject Re: mod_fcgid: Problem serving binary content with Apache 2.2.13 - PHP 5.2.9
Date Wed, 23 Sep 2009 18:33:17 GMT
Hi Jeff,

after another evening, this is what i came up with:

Goals:
1. I do not want to mess around with /etc/apache2/conf.d/mod_fcgid.conf
2. I do not want to be forced to always use mod_fcgid on virtual hosts that are configured
for mod_cgi (from Plesk)

I achieve this by doing all necessary changes in /srv/www/vhosts/<domain.tld>/conf/vhost.conf
(in case of a subdomain ist could also be /srv/www/vhosts/domain.tld/subdomains/<subdomain>/conf/vhost.conf)
and amending the respective httpd.include file (in /srv/www/vhosts/<domain.tld>/conf
as well).

The downside is, that this httpd.include file gets generated by Plesk whenever you change
anything for that virtual host or a subdomain for that virtual host. There is an event manager
in Plesk where you can specify to run a specific script after an event has taken place like
'hosting domain create/update' to reverse any changes to httpd.include but it would require
more work and knowledge to write such a script, i.e. cutting the respective <IfModule mod_fcgid.c>
container (see below) and adding necessary code either in httpd.include or a vhost.conf file.
Certainly it is doable, though.

Fine.

[btw, maybe it was my fault but using your replacement code 1:1 causes every file (tested
with php or jpeg) to be offered for download by the browser (tested on 2 different computers
with FF 3.5.3, IE 6 and IE 8)]

To get mod_fcgid running with this watermark script and not to interfere with virtual hosts
configured to use mod_cgi, i did amend/extend a couple of things, plus, i did add FCGIWrapper
statement back in which might be useless but i wanted to know whether that directive is part
of the problem. Actually it is not. The problem starts when using 'SetHandler fcgid-sript'
instead of an Alias/Action combination.

/etc/apache2/conf.d/mod_fcgid.conf is back to 'out-of-the-box' configuration. I only added

PassHeader Authorization
PHP_Fix_Pathinfo_Enable 1

like before.


My httpd.include is:

<VirtualHost <IP>:80>
...
        <Directory  /srv/www/vhosts/domain.tld/httpdocs>
        <IfModule mod_perl.c>
        <Files ~ (\.pl$)>
                SetHandler perl-script
                PerlHandler ModPerl::Registry
                Options ExecCGI
                allow from all
                PerlSendHeader On
        </Files>
        </IfModule>
        <IfModule mod_python.c>
        <Files ~ (\.py$)>
                SetHandler python-program
                PythonHandler   mod_python.cgihandler
        </Files>
        </IfModule>
        <IfModule mod_fcgid.c>
                <Files ~ (\.fcgi)>
                        SetHandler fcgid-script
                        Options +FollowSymLinks +ExecCGI
                </Files>
        </IfModule>
#       <IfModule mod_fcgid.c>
#       <Files ~ (\.php)>
#               SetHandler fcgid-script
#               FCGIWrapper /usr/bin/php-cgi5 .php
#               Options +ExecCGI
#               allow from all
#       </Files>
#       </IfModule>
                Options -Includes -ExecCGI
        </Directory>
        Include /srv/www/vhosts/domain.tld/conf/vhost.conf
</VirtualHost>

so you could skip/delete the second <IfModule mod_fcgid.c> container from httpd.include.

The included vhost.conf file then contains:
---
Alias /phpfcgidpath/ "/usr/bin/"
Action php-fcgid /phpfcgidpath/php-cgi5
  <Location /phpfcgidpath/>
    SetHandler fcgid-script
    Options +ExecCGI
  </Location>
  <Files ~ (\.php)>
          SetHandler php-fcgid
          FCGIWrapper /usr/bin/php-cgi5 .php
          Options +ExecCGI
          allow from all
  </Files>
---

The first two statements are basically similiar to the /etc/apache2/conf.d/php_cgi.conf (and
needed as i did replace /phppath/ with /phpfcgidpath/ for which there is no ScriptAlias and
Action statement in any other *.conf file):
---
scriptAlias /phppath/ "/usr/bin/"
Action php-script /phppath/php-cgi5
---

As i wanted to have a testconfig which does not interfere with mod_cgi, i changed from /phppath/
to /phpfcgidpath/ and did use Alias instead of ScriptAlias because you used it in your replacement
bit. In the end it does not really matter.

This causes only virtual hosts which have this additional statement in its vhost.conf to use
mod_fcgid and the watermark image works with this configuration.

As soon as you change the SetHandler statement in the vhost.conf from:

  <Files ~ (\.php)>
          SetHandler php-fcgid
          FCGIWrapper /usr/bin/php-cgi5 .php
          Options +ExecCGI
          allow from all
  </Files>

to 

  <Files ~ (\.php)>
          SetHandler fcgid-script
          FCGIWrapper /usr/bin/php-cgi5 .php
          Options +ExecCGI
          allow from all
  </Files>

(which is the default from Plesk in httpd.include when switching to FastCGI-Application),
PHP tries to parse the jpg file again. This is expected as changing the SetHandler directive
as shown, the Alias and Action directive are not used anymore as we do not use the Handler
php-fcgid anymore and we are back to square one.


Using this 'workaround' does have one other side-effect:

As we are using a Alias (or ScriptAlias) directive, now, when we call an URL from a .htaccess
protected directory -AuthType Basic in connection with PassHeader Authrization-, the _SERVER["REMOTE_USER"]
variable is empty and _ENV["REDIRECT_REMOTE_USER"] is used instead. This is not really a problem,
but when you try to use PHP Auth, you have to adopt your scripts not only to test for REMOTE_USER
but also for REDIRECT_REMOTE_USER like

<?php
if (!isset($_SERVER["REMOTE_USER"]) && !isset($_SERVER["REDIRECT_REMOTE_USER"])) {
    echo "Not authenticated";
    } else {
    <do something else>
}
?>

As i am curious, i would like to know what the difference in the mod_fcgid source code is
to cause such a different behaviour. Obviously you can get it to work by the use of the Alias
/ Action combination with the SetHandler directive but when using it as shown in the docs
(and implemented by Plesk and a couple of other GUI's i would guess) then this watermark script
(and variations of them) fail(s).

HTH,
Marcus

Mime
View raw message