Project

General

Profile

TutorialLighttpdAndPHP » History » Revision 78

Revision 77 (Anonymous, 2008-12-17 04:06) → Revision 78/91 (algrasti, 2009-08-07 13:35)

h1. Setting up PHP with Lighttpd 

 {{>toc}} 

 h2. Introduction 


 Lighttpd supports PHP through both CGI and FastCGI. As the name suggests, FastCGI is preferable. 



 h2. Performance 


 In all our tests it has shown better performance than Apache 1.3.x + mod_php4. See http://www.lighttpd.net/benchmark/ for the results. 


 h2. Does it support opcode cachers? 

 like APC, TurckMM, XCache and friends 

 YES! Even if their docs say they do not work in CGI. Under lighttpd, PHP is usually run as FastCGI which supports those opcode cachers like mod_php4 in Apache. 

 * http://pecl.php.net/apc 
 * http://eaccelerator.net/ (Successor of Turck mmCache) 
 * "XCache":http://xcache.lighttpd.net/, "XCache FAQ":http://xcache.lighttpd.net/wiki/Faq (new, well tested, running with FastCGI) 

 (more to add) 

 You might be interested in reading the "Support for FASTCGI mode?":http://sourceforge.net/forum/forum.php?thread_id=1205624&forum_id=416741 thread from eAccelerator Open Discussion Forum. 


 h1. Installation 




 h3. Windows 




 h4. PHP in CGI Mode 


 First you need to install "Lighttpd for Windows":http://en.wlmp-project.net/downloads.php. Then you need to edit C:\lighttpd\etc\lighttpd.conf, uncomment the "mod_cgi" line and add this line: 

 <pre> 

 cgi.assign = ( ".php" => "c:/php/php-cgi.exe" ) 
 </pre> 

 Be careful, there cannot be any space in the path to PHP-CGI in the above snippet. Save lighttpd.conf and restart lighttpd. Open your browser and go to "http://localhost/":http://localhost/, you should have a welcome page. You can put your PHP files in C:\lighttpd\htdocs - To test PHP, just create a file named index.php, save it in the Lighttpd root directory (C:\lighttpd\htdocs) and paste this content into this file: 

 <pre> 

 <?php 
 phpinfo(); 
 ?> 
 </pre> 

 Accessing "http://localhost/":http://localhost/, you should get a page that lists all PHP variables and information. 
 Please note that FastCGI doesn't work on Windows at this time. Good luck! 


 h4. PHP in Fast CGI Mode 


 Download the complete WLAMP package or the latest LightTPD build for Win32 from from http://wlmp.dtech.hu/down_lighty.php?lang=en  
 If you choose the later you must get the latest PHP package from http://www.php.net/downloads.php 
 Unpack the distribution so you have a directory structure similar to this: 
 c:\LightTPD 
 c:\PHP 

 Goto c:\LightTPD\lighttpd-inc.conf if you use the default setup or edit your lighttpd configuration file and uncomment the line "mod_fastcgi" and add the following line: 

 <pre> 

 fastcgi.server = ( ".php" =>( "localhost" =>("host" => "127.0.0.1","port" => 521 ))) 
 </pre> 

 Host and port points to the ip address and port where the fastcgi daemon will be listening. I have not tried this, but i guess it should work if you have two machines and you put the fastcgi daemon in other machine. In the above lines Lighttpd and PHP FastCGI are on the same machine. 

 Next start the php-cgi daemon from the php directory: 
 c:\php\php-cgi.exe -b 127.0.0.1:521 
 And then (re)start the LightTPD web server. 

 You can put your PHP files in C:\lighttpd\htdocs - To test PHP, just create a file named index.php, save it in the Lighttpd root directory (C:\lighttpd\htdocs) and paste this content into this file: 

 <pre> 

 <?php 
 phpinfo(); 
 ?> 
 </pre> 

 Accessing "http://localhost/":http://localhost/, you should get a page that lists all PHP variables and information. 

 If not, you may have to "explicitly set the docroot":http://forum.lighttpd.net/topic/1164. 

 If all is OK you could write a batch file to start/stop the server and the PHP daemon at the same time. Please note that you should have the RunHiddenConsole.exe in your path, also this files should be placed in c:\LightTPD 

 Start-LightTPD.bat 

 <pre> 

 @ECHO OFF 
 ECHO Starting PHP FastCGI... 
 RunHiddenConsole.exe ..\PHP\php-cgi.exe -b 127.0.0.1:521 
 ECHO Starting LightTPD... 
 ECHO. 
 lighttpd.exe -v 
 ECHO. 
 lighttpd.exe -f conf\lighttpd-srv.conf -m lib 
 EXIT 
 </pre> 


 Stop-LightTPD.bat 

 <pre> 

 @ECHO OFF 
 ECHO Stopping LightTPD... 
 bin\process.exe -k lighttpd.exe >nul 
 ECHO Stopping PHP FastCGI... 
 bin\process.exe -k php-cgi.exe >nul 
 ECHO. 
 EXIT 
 </pre> 



 h3. Unix Systems 


 '''Startingpoint:''' Lighttpd is already [wiki:TutorialInstallation installed and working] 

 First of all you need a PHP which is providing FastCGI support. Depending on your  
 distribution you might already have it: 

 h3. !ArchLinux 

 Read http://wiki.archlinux.org/index.php/Fastcgi_and_lighttpd  


 h3. FreeBSD 


 <pre> 

 #!ShellExample 
 $ cd /usr/ports/lang/php5 
 # make install clean 
 </pre> 

 Be sure to check the "use as FastCGI" option in the configuration screen. If you don't see the configuration screen, you're either using an old version of ports tree, or need to execute "make config". If you're using PHP 4 or an early version of PHP 5, you may have to use www/php4-cgi or a similar port instead of the new master port. 


 h3. PC-BSD 

 Download the "self-executable setup wizard":http://www.pbidir.com/search.php?str=lighttpd, double-click the file, and follow the instructions of the setup wizard. You will have a "www" directory under your home directory to put your web pages. You'll have the possibility to launch lighttpd at system startup automatically, and to support one or several users. Once you're done, just open http://localhost/ in your favorite browser and you should see the welcome screen. 


 h3. Gentoo 

 Make sure the USE flag 'cgi' is enabled. 

 <pre> 

 #!ShellExample 
 $ emerge -av dev-lang/php 
 </pre> 

 If it is not, add the USE flag your /etc/make.conf or just to the dev-lang/php ebuild. 

 <pre> 

 #!ShellExample 
 # echo dev-lang/php cgi >> /etc/portage/package.use 
 </pre> 

 XCache is also in the official tree (as of 2007-02-03), so emerge dev-php5/xcache should simply work out-of-the-box as well. 


 h3. Debian / Ubuntu 

 Debian/Ubuntu provides a fastcgi enabled version. 

 <pre> 

 #!ShellExample 
 # apt-get install php4-cgi 
 </pre> 

 If you're using php5-cgi, all you need is change your "bin-path" at your "configuration":http://trac.lighttpd.net/trac/wiki/TutorialLighttpdAndPHP#Configuration (Debian uses /usr/bin/php4-cgi as default). 

 h3. pkgsrc (NetBSD, DragonFlyBSD and others) 

 Add 

 <pre> 

 PKG_OPTIONS.php = fastcgi 
 </pre> 

 to your mk.conf. PHP can found in www/php4 and lang/php5. The fastcgi binary is located in /usr/pkg/libexec/cgi-bin/php 

 h3. Others 

 Download a source tar-ball from http://www.php.net/ and configure it with at least this settings: 

 <pre> 

 #!ShellExample 
 $ ./configure \ 
    --enable-fastcgi \ 
    --enable-discard-path \ 
    --enable-force-cgi-redirect 
 </pre> 

 If you want to have the same PHP as you are using in a mod_php configuration somewhere else call 

 <pre> 

 #!php 
 <?php phpinfo(); ?> 
 </pre> 

 * copy the configure options from the output of the script 
 * remove the @`@--with-apxs@`@ and @`@--with-apxs2@`@ options 
 * add the three options from above. 
 Build PHP now by callings @`@make@`@ and @`@make install@`@ and see if you can find a php binary which is responding: 

 <pre> 

 #!ShellExample 
 $ php -v 
 PHP 5.0.3 (cgi-fcgi) (built: Dec 21 2004 12:59:18) 
 Copyright (c) 1997-2004 The PHP Group 
 Zend Engine v2.0.3, Copyright (c) 1998-2004 Zend Technologies 
     with eAccelerator v0.9.3, Copyright (c) 2004-2005 eAccelerator, by eAccelerator 
 </pre> 

 or something like this. The @`@(cgi-fcgi)@`@ is the important part. The binary might also be called @`@php-cgi@`@. 
 so do something like php-cgi -v to see the (cgi-fcgi) banner. 

 <pre> 

 #!ShellExample 
 $ php-cgi -v 
 PHP 4.4.2 (cgi-fcgi) (built: Jul 21 2006 15:45:58) 
 Copyright (c) 1997-2006 The PHP Group 
 Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies 
 </pre> 



 If you still can't find it follow this hint:  

 <pre> 

 #!ShellExample 
 $ ls sapi/cgi/php* 
 </pre> 

 h2. Configuration 

 Add this line: 


 <pre> 
 cgi.fix_pathinfo = 1 
 </pre> 

 to your php.ini, and make sure mod_fastcgi is loaded in your lighttpd.conf: 
 <pre> 
 server.modules = ( 
                    "mod_fastcgi", 
                  ) 
 </pre> 


 Then add this basic section to the same file: 

 <pre> 

 fastcgi.server = ( ".php" => ((  
                      "bin-path" => "/path/to/php-cgi", 
                      "socket" => "/tmp/php.socket" 
                  ))) 
 </pre> 



 A little bit more advance is this setting which tries the tune some more options. If you need PATH_INFO the broken-scriptfilename is  
 for you. 

 <pre> 

 fastcgi.server = ( ".php" => ((  
                      "bin-path" => "/path/to/php-cgi", 
                      "socket" => "/tmp/php.socket", 
                      "max-procs" => 2, 
                      "bin-environment" => (  
                        "PHP_FCGI_CHILDREN" => "16", 
                        "PHP_FCGI_MAX_REQUESTS" => "10000" 
                      ), 
                      "bin-copy-environment" => ( 
                        "PATH", "SHELL", "USER" 
                      ), 
                      "broken-scriptfilename" => "enable" 
                  ))) 
 </pre> 


 It is important to set '''"max-procs"''' to 1 if you're using any php opcode cacher, unless you know what you're doing. Increase PHP_FCGI_CHILDREN if you want more childs serving the request. 

 Please read the configuration section for more background  
 * [[lighttpd:Docs:Configuration]] 
 * [[lighttpd:Docs:ModFastCGI]] 
 and use  
 http://trac.lighttpd.net/trac/browser/tags/lighttpd-1.4.11/doc/lighttpd.conf as starting point for the configuration. 


 h2. Per directory PHP Config 

 If you're used to use Apache .htaccess files to set PHP options for each directory, see HowToPhpHtaccess : 

 ''When using a cgi version of php (plain old cgi or fast-cgi) apache can't pass 
 any php settings from htaccess files it parses. This can be solved by giving  
 each user its own php.ini file, but I didn't like that solution. 
 This extension parses these configuration files (in most cases .htaccess) and 
 changes the settings. It will search all directories for a configuration file  
 from the docroot until the directory where the request scripts is found. A cache 
 is implemented to minimize the performance impact.'' 

 "Download htscanner":http://pecl.php.net/htscanner 


 h2. See Also 


 * [[HowToSetupFastCgiIndividualPermissions|How to setup fastcgi and php with individual permissions]] 
 * [[HowToInstallOnFreeBSD|How to setup PHP and Lighty in FreeBSD]] 
 * [[fastcgi-php-starter-for-freebsd|Handy External Spawning FastCGI PHP Processes in FreeBSD]] 
 * [[HowToFightDeepLinking|Using a PHP to control remote linking]] 
 * [[X-LIGHTTPD-send-file|X-LIGHTTPD-send-file (or X-Sendfile for lighty v1.5): See what it can do for you on large file-downloads]] 


 h2. External links 

 * "Howto: Lighttpd FasCGI PHP, MySQL chroot jail installation under Debian Linux":http://www.cyberciti.biz/tips/howto-setup-lighttpd-php-mysql-chrooted-jail.html  
 * "lighttpd php-fastcgi config with its own php.ini":http://www.bigbold.com/snippets/posts/show/321