The Community Forums

Interact with an entire community of cPanel & WHM users!
  1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

HOW-TO: Apache + phpsuexec + php4 (cgi) + php5 (cgi)

Discussion in 'EasyApache' started by ispro, Oct 29, 2005.

  1. ispro

    ispro Well-Known Member

    Joined:
    Apr 8, 2004
    Messages:
    628
    Likes Received:
    1
    Trophy Points:
    18
    HOW-TO: Apache + (phpsuexec, not required) + php4 (mod_php4 or cgi) + php5 (cgi) *NEW

    06/20/2007 - Fixed the command to copy php5 CGI binary as it is named as php5-cgi since 5.2.1
    06/15/2007 - HOW-TO updated with new php5 wrapper which works on per-directory basis, also php5 versions updated to 5.2.3

    This setup works!

    I'm using Apache 1.3.37 + phpsuexec coming with cPanel + custom php 4.4.7 compiled as cgi (actually you may use the Apache Update via WHM to compile working php4 in cgi mode/phpsuexec) + custom php 5.2.3 compiled as cgi (it is easy to do as well, I will explain)

    php5 works the same as php4 and it saves the permissions and etc. E.g. no problems with nobody as well.

    HOW-TO

    1. Make sure you has Apache installed and workind with php4. It doesn't matter if you run mod_php4 or php4/phpsuexec, but I recommend to have phpsuexec based install (Warning: if you are running mod_php4 and would like to switch to phpsuexec, read the threads in this forum or you may end up with numerous broken scripts!);

    2. You would need to compile php 5. To do this use the SSH sessing logged as root.
    Then execute preparation commands (based on cPanel for better compatibility):
    Code:
    /scripts/checkccompiler
    rm -rf /home/cpphpbuild
    mkdir /home/cpphpbuild
    cd /home/cpphpbuild
    wget http://layer1.cpanel.net/buildapache/1/php-5.2.3.tar.gz
    tar xfzv php-5.2.3.tar.gz
    cd php-5.2.3
    
    Make sure that we do enabled Sendmail support:
    Code:
    echo "#define HAVE_SENDMAIL 1" >> /home/cpphpbuild/php-5.2.3/main/php_config.h
    
    It is recommended to apply the mail-header patch which allows to track the script which sent an email. You may skip this step.
    Code:
    wget http://choon.net/opensource/php/php-5.2.3-mail-header.patch
    patch -p1 < /home/cpphpbuild/php-5.2.3/php-5.2.3-mail-header.patch
    
    Then one of the most important steps. It is the configuring of the php. It would be better if you undestand these options. You may use the configure from your existing php. To get them type the following:
    Code:
    php -i | grep configure | sed "s/'//g" | sed "s/'//g"
    
    As you may see there are two same sed, however they are diferent! The second single quote should looks like & # 0 3 9 ; (without spaces!!) and this is for some cases when single quote sign shown as the code.
    You will get the almost clean configure you are currently using. The several important hints on this.
    a) REMOVE the "--with-apxs=/usr/local/apache/bin/apxs" from the line. We are going to compile CGI version and it WILL broke the Apache!

    b) Make sure you have the following prefixes and suffixes to install to the proper directories - otherwise currently installed php could be broken:
    --prefix=/usr/local/php5 --exec-prefix=/usr/local/php5 --program-suffix=5

    c) Add the necessary options for proper CGI redirects from Apache:
    --enable-force-cgi-redirect --enable-discard-path

    The result line will looks like this (please, do not use it - it has no CURL and PostgreSQL support - you better to follow steps above):
    Code:
    ./configure --prefix=/usr/local/php5 --exec-prefix=/usr/local/php5 --program-suffix=5 --with-xml --enable-bcmath --enable-calendar --enable-ftp --with-gd --enable-exif --with-jpeg-dir=/usr --with-png-dir=/usr --with-xpm-dir=/usr/X11R6 --with-imap --with-imap-ssl --with-kerberos --enable-mbstring --with-mbstring=all --enable-mbstr-enc-trans --with-mcrypt --with-mhash --enable-magic-quotes --with-mysql=/usr --with-openssl --enable-discard-path --with-pear --enable-sockets --enable-track-vars --with-ttf --with-freetype-dir=/usr --enable-versioning --with-zlib --with-pspell --with-gettext --enable-inline-optimization --disable-debug --enable-force-cgi-redirect --enable-discard-path
    
    So, we are ready to start the compiling. Execute "make install" and it starts...
    If the process fails for any reason, carefully read the errors - usually they are self-explaining. In MOST cases errors are because of the inproper configure params.

    Then run the cPanel script to complete:
    /scripts/findphpversion

    The compiled version of php should be copied to the cPanel cgi-sys:
    Code:
    cp -f /usr/local/php5/bin/php-cgi5 /usr/local/cpanel/cgi-sys/php5
    chown root:wheel /usr/local/cpanel/cgi-sys/php5
    
    Our installation has no php.ini file yet. On MOST systems Zend Optimizer installed. In this case you may just create the symlink:
    Code:
    ln -s /usr/local/Zend/etc/php.ini /usr/local/php5/lib/php.ini
    
    Otherwise copy the default php.ini and edit it if needed:
    Code:
    cp -p /home/cpphpbuild/php-5.2.3/php.ini-recommended /usr/local/php5/lib/php.ini
    chown root.root /usr/local/php5/lib/php.ini
    chmod 644 /usr/local/php5/lib/php.ini
    
    It is recommended to add the following line to the php.ini at the bottom (it is a MUST if you compile php4 instead php5!). Note that this line will broke regular php4. As a common rule - if you are using the same php.ini, do not add this line:
    Code:
    cgi.fix_pathinfo        = 1     ; needed for CGI/FastCGI mode
    
    Now we need to add several lines to Apache.

    Run editor (you may use "vi" or "pico -w"):
    pico -w /usr/local/apache/conf/httpd.conf

    Scroll down (better use the built-in search) to the "<IfModule mod_dir.c>"
    There we should to add index.php5 after index.jp, but before index.php4. Result would looks like this:
    Code:
    <IfModule mod_dir.c>
    DirectoryIndex index.html index.wml index.cgi index.shtml index.jsp index.js index.jp index.php5 iindex.php4 index.php3 index.php index.phtml ndex.htm default.htm default.html home.htm
    </IfModule>
    
    This to allow index.php5 as index file.

    Continue editing. Find the "AddType application/x-httpd-php .phtml" and after it add this:
    Code:
    Action application/x-httpd-php5 "/cgi-sys/php5"
    AddHandler application/x-httpd-php5 .php5
    
    This is the directives for Apache to use own php5 for files with extensions .php5

    Check if we could find this line "ScriptAlias /cgi-sys/ /usr/local/cpanel/cgi-sys/"
    If not - add it or our directive will not work. By default cPanel add this line. Just to warn you.

    Save the file and quit.

    Verify that you not broke the Apache config by running:
    Code:
    service httpd configtest
    
    You SHOULD to get "Syntax OK" at the end and possible some minor warnings about "NameVirtualHost directive" - it is OK.
    Warning: if you get ERROR - DO NOT RESTART APACHE AND LOCATE THE ISSUE. Otherwise Apache will not start at all!

    When you make sure it is OK restart the Apache:
    Code:
    service httpd stop
    service httpd startssl
    
    Check that Apache come ok:
    Code:
    lynx --dump http://localhost/whm-server-status;
    
    It will show you the Apache status.

    Well, I should congratulate you - you have done it!

    To test php5 upload the simple php file with the following content to any of your sites and name this file phpinfo.php AND ANOTHER COPY phpinfo.php5:
    Code:
    <?php
    phpinfo();
    ?>
    
    Then launch browser and point to phpinfo.php file first to see that php4 still OK, then open phpinfo.php5 to see that php5 is OK.

    DONE!

    PHP5 WRAPPER:
    As php5 compiled in the cgi mode customers cannot to use .htaccess directives like php_admin, php_value, php_flag. In phpsuexec setup (for main php) it is overridden by allowing customers place custom php.ini with the variables.

    However if you build the php5 as the secondary php it will not have such ability. So how to solve it? To write very simple wrapper to pass php.ini line of the current directory if exists.

    The steps to be done after php5 setup.

    Moving php5 binary:
    Code:
    mv /usr/local/cpanel/cgi-sys/php5 /usr/local/cpanel/cgi-sys/php5.bin
    
    Then creating wrapper file in the /usr/local/cpanel/cgi-sys/php5 with the following content:
    Code:
    #!/bin/bash
    
    # This will fake the name & path and hide the /usr/local/cpanel/cgi-sys/php5 path!
    export SCRIPT_NAME=$REQUEST_URI
    export SCRIPT_FILENAME=$PATH_TRANSLATED
    export PWD=`echo $PATH_TRANSLATED|egrep -o "(.*?/)"`
    
    if [ -f "$PWD/php.ini" ]; then
    exec /usr/local/cpanel/cgi-sys/php5.bin -c $PWD
    else
    exec /usr/local/cpanel/cgi-sys/php5.bin
    fi
    
    Save the file and change the permissons:

    Code:
    chown root:wheel /usr/local/cpanel/cgi-sys/php5*;
    chmod 755 /usr/local/cpanel/cgi-sys/php5*;
    
    We are done! By default php5 will use the global php.ini, but if the customer has the own php.ini in its folder php5 will use it instead (corrected on 06/15/2007, before php.ini should be placed at public_html only).

    Simple as that!

    ADDONS:
    If you need to use php5 for applications hardcoded with .php extensions you could to add the magic line to the VirtualHost directive of this account:
    AddHandler application/x-httpd-php5 .php .php4 .php3 .phtml
    (.php5 already using php5, but you may add it if you wish)

    This will redirect all php, php3, php4 and php5 (as it set default globally) to the php5.

    If you need to leave the option of running php4 on .php4 files do this:
    AddHandler application/x-httpd-php5 .php .php3 .phtml .php5

    But for those lazy folks there are an option to have these AddHandlers in the .htaccess files!
    Just add the respective line (example, with no quotes: "AddHandler application/x-httpd-php5 .php .php4 .php3 .phtml") to the .htaccess and this directory and all its subdirectories would be able to use the php5 for chosen files!

    This is awesome when you need to test some scripts. In this way create two directories:
    /public_html/directory1
    /public_html/directory2
    And in the directory2 place .htaccess with:
    AddHandler application/x-httpd-php5 .php .php4 .php3 .phtml

    As a result you run php4 on .php in the directory1 and run php5 on .php in the directory2!

    So it is very flexible and it all depends on how you would like to process php.

    P.S. Anyone who would like this setup, but not sure how to proceed - I may perform the compile works for your server(s) at a low rate on the working server with no service interruption. mod_php4 + php5/cgi combo will works as well (tested). PM me for information.
     
    #1 ispro, Oct 29, 2005
    Last edited: Jun 27, 2007
  2. rhenderson

    rhenderson Well-Known Member

    Joined:
    Apr 21, 2005
    Messages:
    785
    Likes Received:
    0
    Trophy Points:
    16
    Location:
    Oklahoma
    cPanel Access Level:
    Root Administrator
    Isn't there a way through .htaccess or a local php.ini to set it where you would not have to rename all the files to .php5 ??

    It is not to hard to rename but when includes in the source are linked to a php file instead of php5 it breaks
     
  3. ispro

    ispro Well-Known Member

    Joined:
    Apr 8, 2004
    Messages:
    628
    Likes Received:
    1
    Trophy Points:
    18
    ANSWER UPDATED! Refer to the original post (first post on this thread), at the bottom.
     
    #3 ispro, Oct 31, 2005
    Last edited: Nov 2, 2005
  4. web12

    web12 Well-Known Member

    Joined:
    Nov 20, 2002
    Messages:
    240
    Likes Received:
    0
    Trophy Points:
    16
    hmm not sure what ive done wrong here.

    must say I completed this no problem at all on 1 server, then the second one seemed to have compiled without any errors, but when I run the phpinfo script for php5 I get

    No input file specified.

    in the browser window.

    Ive re-traced my steps and all seems correct. anyone got any ideas?
     
  5. astopy

    astopy Well-Known Member

    Joined:
    Apr 3, 2003
    Messages:
    165
    Likes Received:
    0
    Trophy Points:
    16
    cPanel Access Level:
    Root Administrator
    You should just be able to put this in .htaccess to enable it on a per-directory basis:
    Code:
    AddType application/x-httpd-php5 .php
    I haven't set any of this up yet though, so I can't test it myself.
     
  6. webignition

    webignition Well-Known Member

    Joined:
    Jan 22, 2005
    Messages:
    1,880
    Likes Received:
    0
    Trophy Points:
    36
    Can anyone confirm if this does work within a .htaccess file on a per-directory basis?
     
  7. ispro

    ispro Well-Known Member

    Joined:
    Apr 8, 2004
    Messages:
    628
    Likes Received:
    1
    Trophy Points:
    18
    You are a LITTLE wrong.

    You should to use AddHandler for php as cgi:
    AddHandler application/x-httpd-php5 .php .php4 .php3 .phtml

    Not forget that this works on recurse basis. E.g. for every subdirectory under the main subdirectory.

    This is confirmed thing on Apache + phpsuexec + php4 cgi + php5 cgi
     
  8. ispro

    ispro Well-Known Member

    Joined:
    Apr 8, 2004
    Messages:
    628
    Likes Received:
    1
    Trophy Points:
    18
    Run the following:
    /usr/local/php5/bin/php5 -i |grep configure

    I bet that you have NO '--enable-force-cgi-redirect' '--enable-discard-path'

    This is the common issue.
    I may take a look at your case for free. PM me.

    P.S. I have slightly updated the HOWTO in the VirtualHost section.
     
    #8 ispro, Nov 2, 2005
    Last edited: Nov 2, 2005
  9. web12

    web12 Well-Known Member

    Joined:
    Nov 20, 2002
    Messages:
    240
    Likes Received:
    0
    Trophy Points:
    16
    ok... problem fixed!

    Not sure why though, but if I put the phpinfo page into a different site on the same server it works as expected.... strange that the php extension would work fine but the php5 wouldnt in the old account though.
     
  10. ispro

    ispro Well-Known Member

    Joined:
    Apr 8, 2004
    Messages:
    628
    Likes Received:
    1
    Trophy Points:
    18
    So, the issue in the Apache settings for chosen VirtualHost?..

    You may PM me these settings just for make sure...

    P.S. Please, remove ALL your posts about that problem like I did to clean up this thread...
    Anyway, your issue is not reproduceable and this wouldn't be useful for others...
     
  11. web12

    web12 Well-Known Member

    Joined:
    Nov 20, 2002
    Messages:
    240
    Likes Received:
    0
    Trophy Points:
    16
    OK, messages all tidied up.

    No need to worry about the other virtualhost as its just for the server hostname entry. The domain I actually wanted this to work on is working, so thats great!

    Thanks again for your time, you are a star. :)
     
  12. rhenderson

    rhenderson Well-Known Member

    Joined:
    Apr 21, 2005
    Messages:
    785
    Likes Received:
    0
    Trophy Points:
    16
    Location:
    Oklahoma
    cPanel Access Level:
    Root Administrator
    Actually I did it the other way around since I was running php5 already and followed the instructions to try to get php4 to work as a cgi by changing the names from php5 to php4 lol It almost worked... I get this error when running a .php4 file

    Warning: Unexpected character in input: '' (ASCII=21) state=1 in /usr/local/cpanel/cgi-sys/php4 on line 1183

    Warning: Unexpected character in input: '' (ASCII=8) state=1 in /usr/local/cpanel/cgi-sys/php4 on line 1183

    Warning: Unexpected character in input: '' (ASCII=2) state=1 in /usr/local/cpanel/cgi-sys/php4 on line 1183

    Parse error: parse error, unexpected T_STRING in /usr/local/cpanel/cgi-sys/php4 on line 1183

    Any ideas?
     
  13. rhenderson

    rhenderson Well-Known Member

    Joined:
    Apr 21, 2005
    Messages:
    785
    Likes Received:
    0
    Trophy Points:
    16
    Location:
    Oklahoma
    cPanel Access Level:
    Root Administrator
    Okay fixed the above if anyone else has problems with doing the same setup I did which was php4 as cgi

    In the /usr/local/php4/lib/php.ini right under

    ;;;;;;;;;;;;;;;;;;;;;;;;;
    ; Paths and Directories ;
    ;;;;;;;;;;;;;;;;;;;;;;;;;

    I added

    cgi.fix_pathinfo=1


    All is good
     
  14. ispro

    ispro Well-Known Member

    Joined:
    Apr 8, 2004
    Messages:
    628
    Likes Received:
    1
    Trophy Points:
    18
    You did found solution before I saw your question :)

    Yes, it is a correct way to fix these issues. It is also recommended to add to php5 (cgi) as well. I updated the HOWTO on this.
     
  15. ispro

    ispro Well-Known Member

    Joined:
    Apr 8, 2004
    Messages:
    628
    Likes Received:
    1
    Trophy Points:
    18
    You need to check the configure process. During it you will probably see the reason.
     
  16. Earendil

    Earendil Well-Known Member

    Joined:
    Jun 10, 2004
    Messages:
    102
    Likes Received:
    0
    Trophy Points:
    16
    I'm having the exact same problem, $_POST remains empty, no matter what I try.
    This happens on 3 different boxes.
    I should mention though, that this is php4 as CGI instead of php5.

    Minimal configure:

    './configure' '--prefix=/usr/local/php4' '--exec-prefix=/usr/local/php4' '--program-suffix=4' '--enable-force-cgi-redirect--enable-discard-path'
     
  17. Earendil

    Earendil Well-Known Member

    Joined:
    Jun 10, 2004
    Messages:
    102
    Likes Received:
    0
    Trophy Points:
    16
    $HTTP_RAW_POST_DATA is empty as well (I did set the php.ini to populate it).
     
    #17 Earendil, Nov 5, 2005
    Last edited: Nov 5, 2005
  18. ispro

    ispro Well-Known Member

    Joined:
    Apr 8, 2004
    Messages:
    628
    Likes Received:
    1
    Trophy Points:
    18
    Could you add the phpinfo() to your test page and send this link?

    Just to verify what is wrong...

    Also, your php.ini should conists
    cgi.fix_pathinfo=1

    In most error cases I was contacted it were human errors...
     
  19. Earendil

    Earendil Well-Known Member

    Joined:
    Jun 10, 2004
    Messages:
    102
    Likes Received:
    0
    Trophy Points:
    16
    I pm'd you the URL's, php.ini does contain that line, otherwise it won't work at all.
    It does work, $_GET works just fine.... just $_POST (as far as I can see).
     
  20. vwiley1

    vwiley1 Well-Known Member

    Joined:
    Oct 4, 2003
    Messages:
    87
    Likes Received:
    0
    Trophy Points:
    6
    I contacted ispro and had him do this setup on my server. I was previously using 2 apaches w/ the mod_proxy solution for PHP5.

    ispro configured everything a few days in advance, and then did the install at the time I chose. After the install he did not leave me high and dry, he stuck around and watched the apache logs for errors and helped fix errors as they arose.

    He also commented out all the ProxyPass lines in the httpd.conf, and fixed all the .htaccess files on the server by removing php_value's and php_flag's. He made sure that all the domains that were currently on PHP5 remained on PHP5 under this new setup.

    His service was nothing less than exceptional! If someone doesn't want to go through the hassle I would definently reccommend him.

    Thanks Again for the awesome setup, it will save me alot of time!

    Vince Wiley
     
Loading...

Share This Page