Optimización de servidor web
Con
Nginx y PHP-FPM
Yannick Warnier
@ywarnier
http://t3n.de/news/wp-content/uploads/2016/03/nginx-hoster-benchmark-nginx-vs-apache.jpg
PHP-FPM
● FastCGI Process Manager
● Implementación alternativa de PHP FastCGI
● Con funcionalidades adicionales utiles para sitios de
todos tamaños, en particular sitios muy activos
● Integrado en PHP desde PHP 5.4 en Nov 2011
PHP-FPM
● Gestión de procesos avanzada
● Posibilidad workers con uid/ambientes distintos
● ...y php.ini distintos
● Soporte de upload acelerado
● Slow log
● ...
PHP-FPM + Nginx
Apache + modPHP
Apache
HDD / SSD
DB
Mod-PHP
Apache + modPHP
Apache
HDD / SSD
DB
Mod-PHP
Apache + modPHP
Apache
HDD / SSD
DB
Mod-PHP
Apache + modPHP
Apache
HDD / SSD
DB
Mod-PHP
Nginx + PHP-FPM
Nginx
HDD / SSD
DB
PHP-FPM
PHP-FPM
PHP-FPM
Nginx + PHP-FPM
Nginx
HDD / SSD
DB
PHP-FPM
PHP-FPM
PHP-FPM
Nginx + PHP-FPM
Nginx
Asíncrono
HDD / SSD
DB
PHP-FPM
PHP-FPM
PHP-FPM
Nginx + PHP-FPM
Nginx
Asíncrono
HDD / SSD
DB
PHP-FPM
PHP-FPM
PHP-FPM
Nginx + PHP-FPM
Nginx
Asíncrono
HDD / SSD
DB
PHP-FPM
PHP-FPM
PHP-FPM
Instalar PHP-FPM
Configurar PHP-FPM
user@server:~$ sudo vim /etc/php/7.1/fpm/
conf.d/       php­fpm.conf  php.ini       pool.d/   
user@server:~$ sudo vim /etc/php/7.1/fpm/php.ini
[PHP]
;;;;;;;;;;;;;;;;;;;
; About php.ini   ;
;;;;;;;;;;;;;;;;;;;
; PHP's initialization file, generally called php.ini, is responsible for
; configuring many of the aspects of PHP's behavior.
; PHP attempts to find and load this configuration from a number of locations.
; The following is a summary of its search order:
Configurar PHP-FPM
user@server:~$ sudo vim /etc/php/7.1/fpm/pool.d/www.conf
; Start a new pool named 'www'.
; the variable $pool can be used in any directive and will be replaced by the
; pool name ('www' here)
[www]
; …
user = www­data
group = www­data
; …
listen = /run/php/php7.1­fpm.sock
listen.owner = www­data
listen.group = www­data
; …
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.process_idle_timeout = 10s;
Configurar PHP-FPM
user@server:~$ sudo vim /etc/php/7.1/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.process_idle_timeout = 10s;
pm.max_requests = 500
access.log = log/$pool.access.log
slowlog = log/$pool.log.slow
request_slowlog_timeout = 0
Configurar PHP-FPM
user@server:~$ sudo vim /etc/php/7.1/fpm/pool.d/www.conf
;php_admin_value[sendmail_path] = /usr/sbin/sendmail ­t 
­i ­f www@my.domain.com
;php_flag[display_errors] = off
;php_admin_value[error_log] = /var/log/fpm­php.www.log
;php_admin_flag[log_errors] = on
;php_admin_value[memory_limit] = 32M
En resumen: todo por defecto!
Configurar Nginx
- sudo apt-get install nginx-full
- sudo vim /etc/nginx/nginx.conf
user www­data;
worker_processes auto;
pid /run/nginx.pid;
events {
    worker_connections 768;
    # multi_accept on;
}
Configurar Nginx
- sudo apt-get install nginx-full
- sudo vim /etc/nginx/nginx.conf
http {
    ##
    # Basic Settings
    ##
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;
Configurar Nginx
- sudo apt-get install nginx-full
- sudo vim /etc/nginx/sites-available/default
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    index index.html index.htm index.nginx­debian.html;
    server_name _;
    location / {
        try_files $uri $uri/ =404;
    }
Configurar Nginx
- sudo apt-get install nginx-full
- sudo vim /etc/nginx/sites-available/default
server {
    # ...
    # pass the PHP scripts to FastCGI server
    # listening on 127.0.0.1:9000
    #
    location ~ .php$ {
       include snippets/fastcgi­php.conf;
       # With php7.1­fpm:
       fastcgi_pass unix:/run/php/php7.1­fpm.sock;
    }
Configurar Nginx
- sudo service php-fpm restart
- sudo service apache2 stop (si tiene Apache)
- sudo service nginx restart
Ventajas
- Asíncrono (libevent)
- Balanceador de carga (directiva “upstream”)
- Reverse Proxy (caché)
- Soporte SSL completo
- Soporte moderación
- limit_conn / limit_conn_zone
- limit_rate
- limit_req / limit_req_zone
- max_conns (upstream)
- queue
- Compresión
@ywarnier
BeezNest

Introducción a Nginx y PHP FPM