fastcgi and php with ispconfig

Discussion in 'Installation/Configuration' started by tosser, May 31, 2006.

  1. tosser

    tosser New Member

    Howtos about fastcgi and php that are used or consulted:

    Apache2 Install
    In the first step you install apache2-mpm-worker
    apt-get install apache2-common apache2-mpm-worker apache2-threaded-dev
    restart the apache, but without mod_php. mod_php runs not with apache2-mpm-worker! If you want to use mod_php and fastcgi then you need apache2-mpm-prefork!
    /etc/init.d/apache2 restart

    Build Suexec
    then you load the apache sources to compile a new suexec for fastcgi

    cd /root
    apt-get source apache2-common
    cd apache2-2.0.54
    cd upstream
    cd tarballs
    tar zxf httpd-2.0.51.tar.gz
    cd httpd-2.0.54
    cd support
    vi suexec.h
    edit the follow lines:
    #define AP_HTTPD_USER "www"
    #define AP_HTTPD_USER "www-data"
    #define AP_LOG_EXEC DEFAULT_EXP_LOGFILEDIR "/suexec_log" /* Need me? */
    #define AP_LOG_EXEC "/var/log/apache2/suexec.log" /* Need me? */
    #define AP_DOC_ROOT "/var/www"
    edit suexec.c
    vi suexec.c
    then insert the red market text into
      [COLOR="Red"]/* no file owner check[/COLOR]
        if ((uid != dir_info.st_uid) ||
            (gid != dir_info.st_gid) ||
            (uid != prg_info.st_uid) ||
            (gid != prg_info.st_gid)) {
            log_err("target uid/gid (%ld/%ld) mismatch "
                    "with directory (%ld/%ld) or program (%ld/%ld)\n",
                    uid, gid,
                    dir_info.st_uid, dir_info.st_gid,
                    prg_info.st_uid, prg_info.st_gid);

    You need the apache2-header-files to compile suexec
    cp -p /usr/include/apache2/* .
    cp -p /usr/include/apr-0/* .
    make suexec
    then you must have:
    ls -l suexec
    -rwxr-xr-x  1 root root 20565 Aug  5 23:37 suexec
    copy the suexec for fcgi to /usr/lib/apache2

    cp suexec /usr/lib/apache2/suexec-fcgi
    chmod 4755 /usr/lib/apache2/suexec-fcgi
    you can delete the files, that you has downloaded with apt-source

    Compile PHP (next step you can install by debian packages without compiling)
    $ cd
    mkdir php5
    cd php5
    tar zxf php-5.1.4.tar.gz
    cd php-5.1.4.tar.gz
    ./configure --enable-memory-limit --enable-force-cgi-redirect  \
    --enable-track-vars --with-pcre-regex --with-mysql --without-sqlite \
    --without-mm --enable-fastcgi --prefix=/home/_USER_/php5
    make install
    Important for php5 compilation and fastcgi:
    apt-get install libmysqlclient14-dev libxml2-dev
    ./configure with: –enable-fastcgi –without-mm

    if any packages missed use
    apt-cache search "MISSED"
    apt-get install "THE NEEDED PACKAGE

    Inofficial Debain Packages for PHP5:
    echo "deb php5.1 sarge" >> /etc/apt/sources.list
    echo "deb-src php5.1 sarge" >> /etc/apt/sources.list
    apt-get update
    apt-get install php5.0 php5.0-common php5.0-fcgi apache2-mpm-worker
    apt-get install apache2-mpm-worker because debian would like to remove it and install apache2-mpm-prefork again.

    you musst edit the "/etc/apt/source.list" and include the non-free sector. It show like that:
    apt-get update
    apt-get install libapache2-mod-fastcgi
    then you edit the "/etc/apache2/mods-avaible/fastcgi.conf" with you favorit editor
    vi /etc/apache2/mods-available/fastcgi.conf
    it musst show like:

    now you must install ispconfig, if you didn't have it or you modify it by own

    fast-cgi start script
    You need a fast-cgi starter for all web hosts:
    cd /root/ispconfig/scripts
    vi php-fcgi-starter
    my php-fcgi-starter (with apache php5.1-fcgi package):
    it must have root permissions:
    chmod 755 php-fcgi-starter
    chown root:root php-fcgi-starter
    that the webuser can excute it (by suexec) but can't edit it!

    ispconfig copy this to /var/www/web*/ if you activate php for this web, but you must modify ispconfig:

    modify ISPConfig
    you must patch the config.lib.php
    cd /root/ispconfig/scripts/lib
    then you must patch config.lib.php with the patch file in the attachemend.
    Copy the patch file into /root/ispconfig/scripts/lib.

    patch config.lib.php < fcgi_patch.txt
    By the first php activate for a web Account, it will be create a .php-fcgi-starter for this user. If you wish to modify php for this user, then you must create a new php.ini for this user or change it for all. And edit the fast-cgi-starter script for this user.
    php_admin_flag in the apache config didn't run and the php_sage_mod button in ispconfig didn't act after the patch/ with fastcgi!

    I'm pleased to get feedback and better solutions ;)
    and I hope that fastcgi find a way into the default installation of ispconfig :)

    Attached Files:

    Last edited: Jun 25, 2006
  2. falko

    falko Super Moderator Howtoforge Staff

    Thanks for the nice walkthrough! :) I've copied it also to the Tips/trickd forum.
  3. tosser

    tosser New Member

    I have update the howto, with a better solution.
    so you can can activate or disable it with the php button.
  4. tom

    tom Member


    1: Why you build a new suexec binary does'nt it work even whith the usual suexec installation?

    In that german tutorial it tells the need to build an own suexec binary only if somebody does'nt have a filesysthem whitout the possibility to set the immutable-bit.

    2. How are you define the FastCgiServer for different vhosts?
    Last edited: Jun 26, 2006
  5. tosser

    tosser New Member

    I build a new suexec, because it is easier to add a new web account in ispconfig. and it make it easier to edit the script as root.
    but you can also set the immutable-bit in /root/ispconfig/scripts/lib/config.lib.php. then ISPC. set it automatically after copy the php-fcgi-starter into the user folder.

    all web accounts with php have a .php-fcgi-starter script. there can you set some paramaters for fcgi/php (like a php.ini).
    in the vhost for this webs ispconfig create a ScriptAlias to the startscript.
    like this:
    ScriptAlias /php/ /var/www/web1/
    and in the fastcgi config define the php start script with this parameter:
    Action php-fastcgi /php/.php-fcgi-starter
    so you start a fcgi-server for the different vhosts.

    for example:
    fastcgi start it for web1 in /var/www/web1/.php-fcgi-starter
    and web2 in /var/www/web2/.php-fcgi-starter
    Last edited: Jun 26, 2006
  6. tom

    tom Member

    It is great an more secure to use php-fcgi rather than the usual php. That's the reason why I want to use fcgi. I dont realy understand how to use and define
    the "FastCgiServer" for different vhosts (That's me second question) because php-fcgi is still working without a defined "FastCgiServer"?
  7. tosser

    tosser New Member

    The FastCGIServer is php-fcgi.
    you define it dynamic for all vhosts. with execute php-fcgi in the php-starter-script and not with a static parameter in the fastcgi.conf!
  8. tom

    tom Member

    ok, thanks! The diffenrent is between static and dynamic, aha:)
    So I had defined a static FastCGIServer and a dynamic one?

    I created the fastcgi.conf like:
    <IfModule mod_fastcgi.c>
     FastCgiIpcDir /var/lib/apache2/fastcgi
      AddHandler fastcgi-script .fcgi
      FastCgiWrapper /usr/lib/apache2/suexec2
      FastCgiServer /var/www/php-fcgi-scripts/web1/php-fcgi-starter -user web1_admin -group web1
     FastCgiServer /var/www/php-fcgi-scripts/web2/php-fcgi-starter -user web2_admin -group web2
       AddHandler php-fastcgi .php
    <Location /cgi-bin/php-fcgi-starter>
            SetHandler fastcgi-script
            Options +ExecCGI
    Action php-fastcgi /cgi-bin/php-fcgi-starter
    AddType application/x-httpd-php .php
    and the starter script like:
    export PHPRC
    exec /var/www/php-fcgi-scripts/php5-fcgi-hard/bin/php
    and for the vhosts (include in isp httpd.conf options field):
    ScriptAlias /cgi-bin/ /var/www/php-fcgi-scripts/web1/
    <Directory '/var/www/php-fcgi-scripts/web1'>
    AllowOverride None
    Options +ExecCGI -MultiViews -Indexes
    Order allow,deny
    Allow from all
    You mean this
    [B]  FastCgiServer /var/www/php-fcgi-scripts/web1/php-fcgi-starter -user web1_admin -group web1
     FastCgiServer /var/www/php-fcgi-scripts/web2/php-fcgi-starter -user web2_admin -group web2[/B]
    I have to take off because it's I've already defined the FastCgiServer dynamicly by
    PHPRC="/var/www/php-fcgi-scripts/web1", right?
    Last edited: Jun 27, 2006
  9. tosser

    tosser New Member

    PHPRC define the path to configurations like php.ini
    FastCgiServer is for an static starter and you can't define two FastCgiServer!

    for your vhosts with a own start script you need no fastcgiserver paramter in you config. you can define one fastcgiserver but you mustn't du that.

    please read, there are a general howto for fastcgi with php

    does you use ispconfig for manage your vhosts etc.?
  10. tom

    tom Member

    Yes, I no...
    Yes, I use this entries in the ISPConifg Vhosts:
    ScriptAlias /cgi-bin/ /var/www/php-fcgi-scripts/web1/
    and it works fine.

    Thanks for the hint of the needless FastCgiServer.

    I think this entry is ok for get the right permissions for the fcgi-user in the vhosts. It is defined in
    And I think I only need to define it once there and no more in any vhost separate,right?
    Last edited: Jun 28, 2006
  11. tosser

    tosser New Member

    yes, you need only suexec.
  12. meemu

    meemu New Member

    now sadly outdated

    Not quite sure why this is but it looks this is outdated now. The current (non-free) libapache2-mod-fastcgi depends on apache2.2-common. This should break the self-compiled suexec-fcgi.

    I notice that current debian packages of php4/5-cgi are fcgi enabled. Why not use those instead of compiling your own?

    Has anyone tried mod_fcgid instead of fastcgi? It's looking good (debian package and all that) but I cna't configure it like your example for fastcgi...

    I'll keep exploring but would appreciate any help!
  13. meemu

    meemu New Member

    blame it on debian

    Just found out that this is because debian have switched stable to etch. I'll try with the newer versions of the packages.
  14. Whitenoise

    Whitenoise New Member


    great tutorial, thx.

    Unfortunately the patch does not work with the latest ISPC release.

    I would also suggest to:

    to prevent any modifies to the file attributes of the file and its content.
  15. Melchior

    Melchior New Member


    for all those preferring to use FastCgi I want to supply my little tweaked version of this great post (thx Tosser).

    Also if you've got problems to execute the outdated patch this could help you.

    The following instructions are only about patching ISPConfig to support FastCgi.

    I added

    - support that every Vhost will automatically gets copied his own php.ini file into webroot directory.
    - new var directory to Vhost that contains sessions and uploaded_tmp files

    Please note:

    - use on own risk
    - only apache2 support (you can easily add apache1)
    - only FASTCGI-Support (can't be switched)
    - You've to controll the config.lib.php and make your custom changes (CHOWN: Webserver-User, CHMOD: your rights!)
    - If you want to regenerate the .php.ini // .php-fcgi-starter // var folder - just delete them and run a vhost change.

    here we go:

    1. open config.lib.php

    2. find "if($web["web_php"]){"

    3. delete this complete if condition including bracket content { ... }

    4. and inner in this exact place this:
        	$php = '';
            $php = "ScriptAlias /php/ ".$mod->system->server_conf["server_path_httpd_root"]."/"."web".$web["doc_id"]."/\n";
         	$fcgip = $mod->system->server_conf["server_path_httpd_root"]."/"."web".$web["doc_id"];
         	// COPY /var/www/webX/.php-fcgi-starter AND fill in right webId
         	$fgiFile = $fcgip."/.php-fcgi-starter";
    		if(!file_exists($fgiFile)) {
    			exec("cp -p /root/ispconfig/scripts/php-fcgi-starter $fgiFile && chown root:root $fgiFile");
    			$contentCgiFile = $mod->file->rf($fgiFile);
          		$contentCgiFile = str_replace("{WEB_ID}", "web".$web["doc_id"], $contentCgiFile);
        		$mod->file->wf($fgiFile, $contentCgiFile);
    		// COPY /etc/php5/ispconfig_fastcgi_default/php.ini TO /var/www/webX/.php.ini AND fill in right webId
    		$phpIniFile = $fcgip."/.php.ini";
    		if(!file_exists($phpIniFile)) {
    			exec("cp -p /etc/php5/ispconfig_fastcgi_default/php.ini $phpIniFile && chown root:root $phpIniFile");
    			$contentPhpIniFile = $mod->file->rf($phpIniFile);
          		$contentPhpIniFile = str_replace("{WEB_ID}", "web".$web["doc_id"], $contentPhpIniFile);
        		$mod->file->wf($phpIniFile, $contentPhpIniFile);
        	if(!is_dir("$fcgip/var/uploads_tmp")) {
    			exec("mkdir -p $fcgip/var/uploads_tmp");
        	if(!is_dir("$fcgip/var/sessions")) {
    			exec("mkdir -p $fcgip/var/sessions");
    		exec("chown -R webserv:web".$web["doc_id"]." $fcgip/var");
    		exec("chmod -R 775 $fcgip/var");
    		// "/var/www/{WEB_ID}/var/uploads_tmp/"
    		// var/www/{WEB_ID}/var/sessions"
        	if($go_info["server"]["apache2_php"] == 'addtype' or $go_info["server"]["apache2_php"] == 'both') {
    			$php .= "AddType application/x-httpd-php .php .php3 .php4 .php5\n";
        } else {
          $php = "";
    5. in /root/ispconfig/scripts/ create or replace php-fcgi-starter with chmod 755 (!) this (new) content

    export PHPRC
    exec /usr/lib/cgi-bin/php5

    6. create /etc/php5/ispconfig_fastcgi_default and place in here php.ini with this sample config (if you want)
    ;;;;;;;;;;;;;;;;;;; PHP INI FOR {WEB_ID} ;;;;;;;;;;;;;;;;;;;
    error_reporting = E_ALL & ~E_NOTICE
    display_errors = On
    display_startup_errors = On
    log_errors = On
    log_errors_max_len = 1024
    error_log = /var/www/{WEB_ID}/log/phperrors.log
    ignore_repeated_errors = Off
    ignore_repeated_source = Off
    report_memleaks = On
    register_globals = Off
    register_long_arrays = On
    magic_quotes_gpc = Off
    magic_quotes_runtime = Off
    default_mimetype = "text/html"
    default_charset = "utf-8"
    post_max_size = 50M
    file_uploads = On
    upload_tmp_dir = "/var/www/{WEB_ID}/var/uploads_tmp/"
    upload_max_filesize = 60M
    max_execution_time = 600    ; Maximum execution time of each script, in seconds (30)
    max_input_time = 600		; Maximum amount of time each script may spend parsing request data (60)
    memory_limit = 60M      	; Maximum amount of memory a script may consume (8MB)
    session.auto_start 0
    session.save_path = "/var/www/{WEB_ID}/var/sessions"
    session.use_cookies = 1 = PHPSESSID_{WEB_ID}
    session.cookie_lifetime = 0
    ;;;;;;;;;;;;;;;;;;; APPENDIX, SELECT IF WANTED ;;;;;;;;;;;;;;;;;;;
    ;error_log = filename
    ;error_log = syslog
    ;date.timezone = 
    ;iconv.input_encoding = "utf-8"
    ;iconv.internal_encoding = "utf-8"
    ;iconv.output_encoding = "utf-8"
    ;session.gc_maxlifetime = 5
    ;session.gc_probability = 1
    ;session.gc_divisor = 1000
    ;session.cookie_path = /
    ;session.cookie_domain =
    ;session.cache_limiter = nocache
    ;session.cache_expire = 180
    ;safe_mode = Off
    ;safe_mode_gid = Off
    ;safe_mode_include_dir =
    ;safe_mode_exec_dir =
    ;safe_mode_allowed_env_vars = PHP_
    ;safe_mode_protected_env_vars = LD_LIBRARY_PATH
    ;open_basedir =
    ;apc.mode = on
    ;apc.rfc1867 = on
    ;apc.max_file_size = 128M

    Hope it works for you!

    Last edited: Jan 18, 2009

Share This Page