# Server-side processing using php-fpm

PHP is a popular scripting language that is often used to create dynamic web pages. However, PHP can be resource-intensive, especially on high-traffic websites. This is where NGINX and php-fpm come in.

NGINX is a high-performance web server that can handle a lot of traffic. php-fpm is a PHP FastCGI implementation that can offload the processing of PHP scripts from NGINX. This can improve performance and reduce the load on the web server.

To use NGINX and php-fpm to process PHP scripts, you need to configure both servers.

## Install NGINX and php-fpm

Here is the command to install both nginx and php-fpm on Ubuntu or Debian:

```bash
sudo apt install nginx php-fpm
```

### Check if php-fpm is running

```bash
sudo systemctl list-units | grep php
```

### Configuring NGINX

To configure NGINX to use php-fpm, you need to add the following lines to your nginx.conf file:

```nginx
location / {
    fastcgi_pass unix:/var/run/php-fpm.sock;
}
```

This tells NGINX to pass all requests for PHP scripts to the php-fpm socket at `/var/run/php-fpm.sock`.

### Configuring php-fpm

To configure php-fpm to listen on the Unix socket, you need to add the following lines to your php-fpm.conf file:

```nginx
listen = /var/run/php-fpm.sock
```

This tells php-fpm to listen on the Unix socket at `/var/run/php-fpm.sock`.

Once you have configured NGINX and php-fpm, you need to restart both servers.

To restart NGINX, you can run the following command:

`sudo service nginx restart`

To restart php-fpm, you can run the following command:

`sudo service php-fpm restart`

Once both servers are restarted, you can test your configuration by creating a simple PHP script and accessing it through your web browser.

The following is a simple PHP script that you can use to test your configuration:

```php
<?php
echo "Hello, world!";
?>
```

Save this file as `index.php` in the root directory of your web server. Then, access it through your web browser by going to the following URL:

" [http://localhost/index.php](http://localhost/index.php) "

If you see the message "Hello, world!", then your configuration is working correctly.

Using NGINX and php-fpm together can improve the performance of your PHP applications by offloading the processing of PHP scripts from the web server. This can be especially beneficial for high-traffic websites.

### Server Block with PHP processing

Look for these config:

* index directive, index.php
    
* location block
    
    * fastcgi is a protocol for transferring binary data
        
        * include `/etc/nginx/fastcgi.conf`
            
    * pass to a UNIX socket, a file that listens for binary data.
        

```nginx
server {

    listen 80;
    server_name 167.99.93.26;

    root /sites/demo;

    index index.php index.html;

    location / {
      try_files $uri $uri/ =404;
    }

    location ~\.php$ {
      # Pass php requests to the php-fpm service (fastcgi)
      include fastcgi.conf;
      fastcgi_pass unix:/run/php/php7.1-fpm.sock;
    }

  }
```

## Testing and Troubleshooting

You may test the PHP processing by loading a PHP info file:

```nginx
echo '<?php phpinfo(); ?>' > info.php
```

Open the file in the browser using http://URL/info.php

### 502 Bad Gateway

First, check the error logs:

```nginx
tail -n 1 /var/log/nginx/error.log
```

Error: Permission denied while connecting to php-fpm socket.

Check the user with which the NGINX process and the php-fpm process runs:

```nginx
ps aux | grep nginx
ps aux | grep php
```

See that the nginx and php-fpm processes run as the same user.

Add the user directive to the NGINX config to match the user of the php-fpm process:

```nginx
user www-data;
```

Reload NGINX and check again.

## Additional resources

* How to Configure PHP-FPM with NGINX: [https://www.digitalocean.com/community/tutorials/php-fpm-nginx](https://www.digitalocean.com/community/tutorials/php-fpm-nginx)
    
* How to Setup PHP on Nginx with FastCGI (PHP-FPM) example: [https://www.theserverside.com/blog/Coffee-Talk-Java-News-Stories-and-Opinions/Nginx-PHP-FPM-config-example](https://www.theserverside.com/blog/Coffee-Talk-Java-News-Stories-and-Opinions/Nginx-PHP-FPM-config-example))
