FreeBSD install PHP 7.2 with FPM for Nginx

How do I install install PHP 7.2 with FPM for Nginx web server running on FreeBSD operating system?

Introduction: PHP is an acronym for “PHP: Hypertext Preprocessor.” It is an open source general-purpose scripting language. PHP is handy for web development and to run popular software such as MediaWiki, WordPress, and more. PHP is easy to learn and allows you to write dynamically generated web pages on the fly. This page shows how to install PHP 7.2 on a FreeBSD v11.x Unix box along with Nginx web server.

FreeBSD install PHP 7.2 with FPM for Nginx

The procedure for installing PHP 7.2 on FreeBSD is as follows:

  1. Update FreeBSD ports tree
  2. Install PHP 7.2 binary package: pkg install nginx
  3. Install Nginx binary package
  4. Configure Nginx and PHP 7.2
  5. Turn on PHP-fpm service on FreeBSD
  6. Test the setup

Let us see all steps in details.

1. Update FreeBSD ports tree

You must use the portsnap command
# portsnap fetch update

2. Install PHP 7.2 on FreeBSD

You can install PHP 7.2 using ports or binary package method. Use any one of the following methods.

The ports method

# cd /usr/ports/lang/php72/
# make install clean

The binary package method

Run the pkg command to install it:
# pkg install php72

3. Install PHP 7.2 extensions on FreeBSD

Again PHP extensions can be installed using the ports or pkg method. Use any one of the following ways.

To install the port, run the following command and choose required extensions:
# cd /usr/ports/lang/php72-extensions/ && make install clean

OR add the binary package:
# pkg install php72-extensions

Another option is installing individual PHP extensions as per your web application or software project needs. One can search PHP 7.2 extensions using the pkg command and grep command/egrep command
# pkg search php72 | grep gd
# pkg search php72 | egrep -i --color 'gd|mysqli|openssl'
# pkg search php72 | egrep --color -i -- '-(gd|mysqli|openssl|memcached|opcache|json|mbstring|imagick|xml|zip|composer|igbinary)-'


Simply install it:
# pkg install php72-composer php72-gd php72-json
### OR ###
# pkg install php72-composer-1.6.5 php72-gd-7.2.10 php72-json-7.2.10 php72-mbstring-7.2.10 php72-mysqli-7.2.10 php72-opcache-7.2.10 php72-openssl-7.2.10 php72-pecl-imagick-3.4.3_2 php72-pecl-memcached-3.0.4 php72-xml-7.2.10 php72-zip-7.2.10 php72-pecl-igbinary-2.0.7

4. Configure PHP-FPM

Edit the file /usr/local/etc/php-fpm.d/www.conf
# vi /usr/local/etc/php-fpm.d/www.conf
Find line:
listen = 127.0.0.1:9000
Update it as follows:
listen = /var/run/php72-fpm.sock
Uncomment the following line:
listen.owner = www
listen.group = www
listen.mode = 0660

Save and close the file. Enable php-fpm service:
# sysrc php_fpm_enable=YES
Commands to start, stop, restart php-fpm service on FreeBSD server:
# service php-fpm stop
# service php-fpm start
# service php-fpm restart
# service php-fpm status

A note about PHP 7 config

You need to install php.ini file using the php command:
# cp -v /usr/local/etc/php.ini-production /usr/local/etc/php.ini
/usr/local/etc/php.ini-production -> /usr/local/etc/php.ini

Next, we are going to secure PHP and customize it:
# vi /usr/local/etc/php/99-custom.ini
Add the following config:

display_errors=Off
safe_mode=Off
safe_mode_exec_dir=
safe_mode_allowed_env_vars=PHP_
expose_php=Off
log_errors=On
error_log=/var/log/nginx/php.scripts.log
register_globals=Off
cgi.force_redirect=0
file_uploads=On
allow_url_fopen=Off
sql.safe_mode=Off
disable_functions=show_source, system, shell_exec, passthru, proc_open, proc_nice, exec
max_execution_time=60
memory_limit=60M
upload_max_filesize=2M
post_max_size=2M
cgi.fix_pathinfo=0
sendmail_path=/usr/sbin/sendmail [email protected] -t

display_errors=Off
safe_mode=Off
safe_mode_exec_dir=
safe_mode_allowed_env_vars=PHP_
expose_php=Off
log_errors=On
error_log=/var/log/nginx/php.scripts.log
register_globals=Off
cgi.force_redirect=0
file_uploads=On
allow_url_fopen=Off
sql.safe_mode=Off
disable_functions=show_source, system, shell_exec, passthru, proc_open, proc_nice, exec
max_execution_time=60
memory_limit=60M
upload_max_filesize=2M
post_max_size=2M
cgi.fix_pathinfo=0
sendmail_path=/usr/sbin/sendmail [email protected] -t

Save and close the file. Restart the PHP on FreeBSD:
# service php-fpm restart

5. Configure Nginx to use PHP 7.2 (PHP-FPM)

The final step is connecting Nginx to PHP-FPM service via the FCGI protocol. Edit your Virtual Domain or nginx.conf file as follows:
# cd /usr/local/etc/nginx
# vi nginx.conf

OR
# vi vdomains/http.192.168.2.31.conf
Here is an updated sample config file:

server {
    server_name 192.168.2.31; # use domain name if you have here
    access_log  /var/log/nginx/192.168.2.31.access.log;
    error_log  /var/log/nginx/192.168.2.31.error.log;
 
    root /wwwwiki;
    # php config let nginx talk to php socket
    location ~ [^/].php(/|$) {
        fastcgi_split_path_info ^(.+?.php)(/.*)$;
        if (!-f $document_root$fastcgi_script_name) {
                return 404;
        }
 
        # Mitigate https://httpoxy.org/ vulnerabilities
         fastcgi_param HTTP_PROXY "";
 
        fastcgi_pass unix:/var/run/php72-fpm.sock;
        fastcgi_index index.php;
 
        # include the fastcgi_param setting
        include fastcgi_params;
 
        # SCRIPT_FILENAME parameter is used for PHP FPM determining
        # the script name.
        fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
    }
}

server {
server_name 192.168.2.31; # use domain name if you have here
access_log /var/log/nginx/192.168.2.31.access.log;
error_log /var/log/nginx/192.168.2.31.error.log; root /wwwwiki;
# php config let nginx talk to php socket
location ~ [^/].php(/|$) {
fastcgi_split_path_info ^(.+?.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
} # Mitigate https://httpoxy.org/ vulnerabilities
fastcgi_param HTTP_PROXY ""; fastcgi_pass unix:/var/run/php72-fpm.sock;
fastcgi_index index.php; # include the fastcgi_param setting
include fastcgi_params; # SCRIPT_FILENAME parameter is used for PHP FPM determining
# the script name.
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}

Reload or restart the Nginx server:
# service nginx reload

6. Test the setup

Create a PHP script called test.php in /wwwwiki/
# vi /wwwwiki/test.php
Append the following code that shows information about PHP’s configuration using phpinfo:

<?php
        phpinfo();
?>

<?php
phpinfo();
?>

Save and close the file. Set tight file permissions on DocumentRoot (web server root):
# chown -R wwwwiki:wwwwiki /wwwwiki/
# chmod -R 0555 /wwwwiki/

Fire a web browser and test it:
http://192.168.2.31/test.php
http://your-domain-name-here/test.php


And there you have PHP working as expected and Nginx is talking to PHP-FPM via Unix socket.

How to verify that PHP-fpm running

Use the sockstat command on FreeBSD to list running services, open ports and unix sockets:
# sockstat -46lu | egrep --color 'www|nginx|php'
Also check log files if you get any problems running PHP:
# ls -l /var/log/nginx/
# tail -f /var/log/nginx/192.168.2.31.error.log

Click to enlarge image

Conclusion

This guide demonstrated how to install PHP FPM securely and configured it using unix socket. Now you have fully working Nginx server along with PHP 7.2 for creating dynamic web pages on demand. Next part of the series shows how to install a database server to build a fully functional web server running on a FreeBSD operating system.

This entry is 2 of 3 in the Nginx, MySQL, and PHP (FEMP) Stack on FreeBSD Tutorial series. Keep reading the rest of the series:

  1. FreeBSD Install Nginx Webserver Tutorial
  2. FreeBSD install PHP 7.2 with FPM for Nginx
  3. Install MariaDB Databases on a FreeBSD 11 Unix Server

Posted by: SXI ADMIN

The author is the creator of SXI LLC and a seasoned sysadmin, DevOps engineer, and a trainer for the Linux operating system/Unix shell scripting. Get the latest tutorials on SysAdmin, Linux/Unix and open source topics via RSS/XML feed or weekly email newsletter.