Nginx 1.4.x on Unix systems

This documentation will cover installing and configuring PHP with PHP-FPM for a Nginx 1.4.x HTTP server.

This guide will assume that you have built Nginx from source and therefore all binaries and configuration files are located at /usr/local/nginx. If this is not the case and you have obtained Nginx through other means then please refer to the » Nginx Wiki in order to translate this manual to your setup.

This guide will cover the basics of configuring an Nginx server to process PHP applications and serve them on port 80, it is recommended that you study the Nginx and PHP-FPM documentation if you wish to optimise your setup past the scope of this documentation.

Please note that throughout this documentation version numbers have been replaced with an 'x' to ensure this documentation stays correct in the future, please replace these as necessary with the corresponding version numbers.

  1. It is recommended that you visit the Nginx Wiki » install page in order to obtain and install Nginx on your system.

  2. Obtain and unpack the PHP source:

    tar zxf php-x.x.x
    
  3. Configure and build PHP. This is where you customize PHP with various options, like which extensions will be enabled. Run ./configure --help for a list of available options. In our example we'll do a simple configure with PHP-FPM and MySQLi support.

    cd ../php-x.x.x
    ./configure --enable-fpm --with-mysqli
    make
    sudo make install
    
  4. Obtain and move configuration files to their correct locations

    cp php.ini-development /usr/local/php/php.ini
    cp /usr/local/etc/php-fpm.d/www.conf.default /usr/local/etc/php-fpm.d/www.conf
    cp sapi/fpm/php-fpm /usr/local/bin
    
  5. It is important that we prevent Nginx from passing requests to the PHP-FPM backend if the file does not exist, allowing us to prevent arbitrarily script injection.

    We can fix this by setting the cgi.fix_pathinfo directive to 0 within our php.ini file.

    Load up php.ini:

    vim /usr/local/php/php.ini
    

    Locate cgi.fix_pathinfo= and modify it as follows:

    cgi.fix_pathinfo=0
    
  6. php-fpm.conf must be modified to specify that php-fpm must run as the user www-data and the group www-data before we can start the service:

    vim /usr/local/etc/php-fpm.d/www.conf
    

    Find and modify the following:

    ; Unix user/group of processes
    ; Note: The user is mandatory. If the group is not set, the default user's group
    ;       will be used.
    user = www-data
    group = www-data
    

    The php-fpm service can now be started:

    /usr/local/bin/php-fpm
    

    This guide will not configure php-fpm any further, if you are interested in further configuring php-fpm then please consult the documentation.

  7. Nginx must now be configured to support the processing of PHP applications:

    vim /usr/local/nginx/conf/nginx.conf
    

    Modify the default location block to be aware it must attempt to serve .php files:

    location / {
        root   html;
        index  index.php index.html index.htm;
    }

    The next step is to ensure that .php files are passed to the PHP-FPM backend. Below the commented default PHP location block, enter the following:

    location ~* \.php$ {
        fastcgi_index   index.php;
        fastcgi_pass    127.0.0.1:9000;
        include         fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
    }

    Restart Nginx.

    sudo /usr/local/nginx/sbin/nginx -s stop
    sudo /usr/local/nginx/sbin/nginx
    
  8. Create a test file

    rm /usr/local/nginx/html/index.html
    echo "<?php phpinfo(); ?>" >> /usr/local/nginx/html/index.php
    

    Now navigate to http://localhost. The phpinfo() should now be shown.

Following the steps above you will have a running Nginx web server with support for PHP as an FPM SAPI module. Of course there are many more configuration options available for Nginx and PHP. For more information type ./configure --help in the corresponding source tree.

add a note

User Contributed Notes 8 notes

up
41
Lenny
9 years ago
Building from source is not easy if something is a bit different, and I had a hard time with some directory and configuration options. I was floundering around the web until I found this site that translated from Chinese. No one else had the solution.  I couldn't get php fpm to start until I changed the directory (Item 2.ERROR: Unable to globalize). I had other issues listed but I was able to solve them. Please don't delete this, it is very useful info.The original site  (it is in Chinese, not my site, but I want to give credit):(there is some more there, you can goto the site)blog.dream1987.top/?paged=2Installation problems:1. configure: error:. Xml2-config not found Please check your libxml2 installation.solution:apt-get install libxml2-dev 2.Warning: Declaration of PEAR_Installer :: download () should be compatible with & PEAR_Downloader :: download ($ params) in phar: ///root/php-7.0.0alpha1/pear/install-pear-nozlib.phar/PEAR /Installer.php on line 43Warning: Declaration of PEAR_PackageFile_Parser_v2 :: parse () should be compatible with PEAR_XMLParser :: parse ($ data) in phar: ///root/php-7.0.0alpha1/pear/install-pear-nozlib.phar/PEAR/PackageFile/ Parser / v2.php on line 113 [PEAR] Archive_Tar - already installed: 1.3.13 [PEAR] Console_Getopt - already installed: 1.3.1 [PEAR] Structures_Graph- already installed: 1.0.4Warning: Declaration of PEAR_Task_Replace :: init () should be compatible with PEAR_Task_Common :: init ($ xml, $ fileAttributes, $ lastVersion) in phar: ///root/php-7.0.0alpha1/pear/install-pear-nozlib. phar / PEAR / Task / Replace.php on line 31 [PEAR] XML_Util - already installed: 1.2.3Warning: Declaration of PEAR_Task_Windowseol :: init () should be compatible with PEAR_Task_Common :: init ($ xml, $ fileAttributes, $ lastVersion) in phar: ///root/php-7.0.0alpha1/pear/install-pear-nozlib. phar / PEAR / Task / Windowseol.php on line 76Warning: Declaration of PEAR_Task_Unixeol :: init () should be compatible with PEAR_Task_Common :: init ($ xml, $ fileAttributes, $ lastVersion) in phar: ///root/php-7.0.0alpha1/pear/install-pear-nozlib. phar / PEAR / Task / Unixeol.php on line 76 [PEAR] PEAR - already installed: 1.9.5solution:Workaround not found (http://pear.php.net/bugs/bug.php?id=20554)3. Start php-fpm1.ERROR: failed to open configuration file '/usr/local/etc/php-fpm.conf': No such file or directory (2) ERROR: failed to load configuration file '/usr/local/etc/php-fpm.conf' ERROR: FPM initialization failedsolution:Php-fpm.conf copy files from the source file to that location.cp /root/php-7.0.0alpha1/sapi/fpm/php-fpm.conf /usr/local/etc/php-fpm.conf2.ERROR: Unable to globalize '/usr/local/NONE/etc/php-fpm.d/*.conf' (ret = 2) from /usr/local/etc/php-fpm.conf at line 125. ERROR: failed to load configuration file '/usr/local/etc/php-fpm.conf' ERROR: FPM initialization failedsolution:Edit /usr/local/etc/php-fpm.conf document introduced * .conf part, change to the correct path include = / usr / local / etc / php-fpm.d / *. ConfIf there is no /usr/local/etc/php-fpm.d directory, create the directory.3.WARNING: Nothing matches the include pattern '/usr/local/etc/php-fpm.d/*.conf' from /usr/local/etc/php-fpm.conf at line 125. ERROR:. No pool defined at least one pool section must be specified in config file ERROR: failed to post process the configuration ERROR: FPM initialization failedsolution:cp www.conf.default www.conf4.ERROR: [pool www] can not get gid for group 'nobody' ERROR: FPM initialization failedsolution:Www.conf open files, user and group users into nginx default settings, usually the default is www-data.
up
8
uanaoeng at outlook dot com
6 years ago
When I run the following command to start the php-fpm:/usr/local/bin/php-fpmI got the following error information:Unable to globalize '/usr/local/NONE/etc/php-fpm.d/*.conf' (ret=2) from /usr/local/etc/php-fpm.conf at line 143.To fix this error, do:change the string "include=NONE/etc/php-fpm.d/*.conf" to "include=etc/php-fpm.d/*.conf" in the file "/usr/local/etc/php-fpm.conf" with text editor.After that, I try to start the php-fpm again and got error information again:Nothing matches the include pattern '/usr/local/etc/php-fpm.d/*.conf' from /usr/local/etc/php-fpm.conf at line 143.To fix this error, do:cp /usr/local/etc/php-fpm.d/www.conf.default /usr/local/etc/php-fpm.d/www.conf
up
9
Leon Nguyen vnlab
4 years ago
To maximize the server performance with highest speed, with fewest resources, i have decided to compile PHP 8 manually from minimal Linux/Unix-based OS (my Linux distro is rpm-based packages) My system has successfully powered up by PHP 8.0.9 - with Opcache/JIT enabled & other several PHP extension module. Here is several experience that may save you several hours of research.1. Before step (3) - Configure and build PHP - to ensure that no errors occurs, you can refer to my prerequisites library. sudo dnf install \gcc gcc-c++ make cmake autoconfig \zlib zlib-devel pcre pcre-devel \libxml2-devel libxslt-devel \bzip2-devel curl-devel libzip-devel\sqlite-devel \systemd-devel \openssl-devel \libffi-devel \libpng libpng-devel libwebp libwebp-devel libjpeg libjpeg-devel libXpm libXpm-devel \freetype-devel \gmp-devel \libldb-devel \libc-client libc-client-devel \openldap openldap-devel \oniguruma oniguruma-devel \net-snmp-devel readline-devel unixODBC-devel \uw-imap uw-imap-devel uw-imap-static uw-imap-utils \libicu-devel \enchant2 enchant2-devel \gd gd-devel \libsodium libsodium-devel \libtidy libtidy-develYou may not receive error when issuing ./configure, make && make install. Even when you manually build your PHP extension package later. 2. At step 5 - before modifying php.ini - you may double-check whether the current PHP is reading which php.ini file by this commandphp -ini | grep php.ini # My result. It is different from tutorial. Configuration File (php.ini) Path => /usr/local/libLoaded Configuration File => /usr/local/lib/php.ini
up
2
timy.shark
3 years ago
Great effort for this tutorial, thanks a ton, here are my notes if may help anyone, considering default install on WSL2 containerNote: composer added for Laravel framework.These are NOT to be copy and pasted as it is, need to be selective as there are annotations beside some commands,Also I've commented # some of the defaults written by the original editor due to mismatch to my current environment.sha256sum  php-x.x.x.tar.gz => e847745fd66fc8c57fac993a609fefcded93fddccd225f0620a26bb5ae5753c3     tar zxf php-x.x.x    sudo apt install build-essential    sudo apt install -y composer nginx pkgconf libxml2-dev  libsqlite3-dev zlib1g-dev    cd php-x.x.x    ./configure --enable-fpm --with-mysqli <==Thank you for installing PHP.        make <== takes a while     sudo make test <== optional as recommended    sudo make install <= /usr/local/bin /usr/local/php    sudo cp php.ini-development /usr/local/lib/php.ini    sudo cp /usr/local/etc/php-fpm.d/www.conf.default /usr/local/etc/php-fpm.d/www.conf    sudo cp sapi/fpm/php-fpm /usr/local/bin    sudo vim /usr/local/php/php.ini <= cgi.fix_pathinfo=0    sudo vim /usr/local/etc/php-fpm.d/www.conf <= user=www-data group=www-data    sudo vim sapi/fpm/php-fpm.conf <= edit include=etc/php-fpm.d/*.conf  <- relative path    sudo cp sapi/fpm/php-fpm.conf /usr/local/etc    /usr/local/bin/php -v <= $PATH$ uses /usr/local/bin at first /usr/local/lib/php.ini    sudo /usr/local/bin/php-fpm <= start the service    sudo vim /etc/nginx/sites-available/default <= edit the following under server {}    location / {    #root   html;        #index  index.php index.html index.htm;}    location ~* \.php$ {    #fastcgi_index   index.php;    fastcgi_pass    127.0.0.1:9000;    include         fastcgi_params;    fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;    fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;}        *Restart nginx (root /var/www/html) if root path doesn't exist, default is: /usr/share/nginx/html    sudo nginx -t <= Test Nginx conf files    sudo service nginx reload    sudo service nginx stop    sudo service nginx start <= [OK]    php-fpm needs to be in a service, or kill process manually ps -aux | grep php-fpm ; kill <pid>
up
5
Akash Kumar Sharma
9 years ago
If you get "File not found" error then add "root ROOT_DIR_LOCATION" directive to PHP location block i.e. "location ~* \.php$ { }" , where ROOT_DIR_LOCATION is root directory like "/usr/share/nginx/html" .
up
2
nguyentienlong88 at gmail dot com
9 years ago
at step 3, after command "sudo make install"if there is problem with pear.php.net (https). Need to change this line (from https to http) in MakefilePEAR_INSTALLER_URL = http://pear.php.net/install-pear-nozlib.phar
up
3
1097625354 at qq dot com
6 years ago
cp php/php.ini-development        php/lib/php.inicp php/etc/php-fpm.conf.default       php/etc/php-fpm.confcp php/etc/php-fpm.d/www.conf.default     php/etc/php-fpm.d/www.conf
up
1
610010559 at qq dot com
5 years ago
in linux system, if you want to add php-fpm service to system service;  it is easy to do that, because php offer the relate shell script:after make and make install;enter the source code package sapi/fpm/init.d.php-fpm ; type the code in the linux system.  cp sapi/fpm/init.d.php-fpm  /etc/init.d/php-fpmthen you can use "php-fpm {start|stop|force-quit|restart|reload|status|configtest} "  command  to control your php-fpm program more convenient .
To Top