Nginx

Nginx

Installing and setting up Nginx

First install Nginx:

emerge -a nginx

Nginx configuration

All Nginx settings, as well as those of the sites that run on Nginx are contained in the /etc/nginx/nginx.conf file. Configure the option which allows the site parameters not to be written in the same nginx.conf file.

/etc/nginx/nginx.conf

user nginx nginx;
# worker processes number
worker_processes 4;

error_log /var/log/nginx/error_log info;

events {
    worker_connections 1024;
    use epoll;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format main
        '$remote_addr - $remote_user [$time_local] '
        '"$request" $status $bytes_sent '
        '"$http_referer" "$http_user_agent" '
        '"$gzip_ratio"';

    client_header_timeout 10m;
    client_body_timeout 10m;
    send_timeout 10m;

    connection_pool_size 256;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 2k;
    request_pool_size 4k;

    gzip off;

    # hide nginx version
    server_tokens off;
    output_buffers 1 32k;
    postpone_output 1460;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    keepalive_timeout 75 20;

    ignore_invalid_headers on;

    index index.html;

    # конфигурационные файлы сайтов
    include /etc/nginx/sites-enabled/*.conf;
}

Create a path for configuration files with site parameters:

mkdir /etc/nginx/sites-enabled

Create a config file for localhost:

/etc/nginx/sites-enabled/local.conf

server {
    # Host port
    listen 80;
    # Host name to be accessed
    server_name localhost;
    # Log path
    access_log /var/log/nginx/localhost.access_log main;
    error_log /var/log/nginx/localhost.error_log info;
    # Root directory
    root /var/calculate/www/localhost/htdocs;
}

Create an index file to check the health of the server:

mkdir -p /var/calculate/www/localhost/htdocs

echo 'Hello!' > /var/calculate/www/localhost/htdocs/index.html

Nginx commands

The www-servers/nginx package includes an init script for a web server service management.

To start the service, run:

/etc/init.d/nginx start

To stop the service:

/etc/init.d/nginx stop

To restart the service

/etc/init.d/nginx restart

To reload the configuration at operation time:

/etc/init.d/nginx reload

To add nginx to the default start level:

rc-update add nginx

Checking Nginx configuration and operation

Note

Before restarting Nginx, always check the modifications by runnin nginx -t:

nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

If this was successful, reread the Nginx configuration:

/etc/init.d/nginx reload

Use the command line web client curl to check that nginx is up and running:

curl http://localhost

Hello!

Installing and configuring Php-fpm for Nginx

Install PHP:

emerge -a php

After displaying all information for installing PHP, you must agree with the default version of PHP. You can cancel the installation and specify the required version of PHP at the next installation try.
To view information about all available and working extensions, run:

php -m

Setting up Php-fpm

To provide PHP support, add the following to the configuration of the site running under Nginx. In the example below, Nginx exchanges information with the PHP process via a UNIX socket. In the server block, add the location block, which will describe the rules for working with PHP:

/etc/nginx/sites-enabled/local.conf

server {
  ...
  location ~ \.php$ {
    try_files $uri =404;
    include /etc/nginx/fastcgi.conf;
    fastcgi_pass unix:/run/php-fpm.socket;
  }
}

Using a UNIX socket to allow Nginx communicate with PHP is the preferred and recommended option!

Note

In this example, you have the path for the PHP 7.1 version. If you use a different version, edit the path.

Save the original pool configuration file:

cp /etc/php/fpm-php7.1/fpm.d/www.conf /etc/php/fpm-php7.1/fpm.d/www.conf_orig

Edit the pool for handling the sites for which this socket will be specified in the configuration:

/etc/php/fpm-php7.1/fpm.d/www.conf
[www]
...
; 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 = nginx
group = nginx

; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific IPv4 address on
;                            a specific port;
;   '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all addresses
;                            (IPv6 and IPv4-mapped) on a specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = /run/php-fpm.socket

; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server. Many
; BSD-derived systems allow connections regardless of permissions.
; Default Values: user and group are set as the running user
;                 mode is set to 0660
listen.owner = nginx
listen.group = nginx
;listen.mode = 0660

; The number of child processes to be created when pm is set to 'static' and the
; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'.
; This value sets the limit on the number of simultaneous requests that will be
; served. Equivalent to the ApacheMaxClients directive with mpm_prefork.
; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP
; CGI. The below defaults are based on a server without much resources. Don't
; forget to tweak pm.* to fit your needs.
; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand'
; Note: This value is mandatory.
pm.max_children = 20

Make the necessary changes in the comfiguraiton file, prohibiting the execution of arbitrary code on the server with the rights of a PHP process when downloading the file and specifying a time zone:

/etc/php/fpm-php7.1/php.ini

[PHP]
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
cgi.fix_pathinfo=0

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = "Europe/Moscow"

Php-fpm commands

To start the service, run:

/etc/init.d/php-fpm start

To stop the service:

/etc/init.d/php-fpm stop

To restart the service

/etc/init.d/php-fpm restart

Add php-fpm to autostart:

rc-update add php-fpm

Testing Nginx with PHP code

Apply the settings:

/etc/nginx/sites-enabled/local.conf

# localhost
server {
    listen 80;
    server_name lempcss.example.org;
    access_log /var/log/nginx/lempcss.example.org.access_log main;
    error_log /var/log/nginx/lempcss.example.org.error_log info;
    root /var/calculate/www/localhost/htdocs;
    location ~ \.php$ {
        # Check for non existing scripts or for error 404
        # Without this line, nginx will immediately send any requests ending with .php to php-fpm
        try_files $uri =404;
        include /etc/nginx/fastcgi.conf;
        fastcgi_pass unix:/run/php-fpm.socket;
        }
}

Create a file and put the code for outputting information about PHP in it:

echo '<?php phpinfo(); ?>' > /var/calculate/www/localhost/htdocs/info.php

Edit access rights for all files in the root folder of the site:

chown -R nginx:nginx /var/calculate/www/localhost/htdocs

Add the corresponding entry to DNS. In the absence of DNS, you can add the entry to the static table of names of the computer from which the site will be accessed.

For Linux based systems, edit the list of domain names:

/etc/hosts

192.168.0.1  lempcss.example.org

Check that Nginx has been configured correctly and re-read the file:

nginx -t && /etc/init.d/nginx reload

Now start Php-fpm:

/etc/init.d/php-fpm start

Type http://lempcss.example.org/info.php in your browser. If everything is OK, you will see a page with complete info on PHP.