Alta Performance de Aplicações PHP com Nginx Thiago Paes
Thiago Paes 10+ anos como desenvolvedor Evangelista Software Livre Trabalha no Vale1Convite Twitter: @mrprompt GitHub:  http://github.com/mrprompt Página: http://thiagopaes.com.br
 
Apresentando Nginx - "Engine X" - é um servidor e proxy  reverso HTTP de alta performance, gratuito e  open-source, bem como um servidor proxy para IMAP/POP3.  Escrito por Igor Sysoev em 2005, Nginx agora hospeda entre 1% e 4% de todos os domínios do mundo, dentre eles, sites de grande visitação como WordPress, Hulu, Github, Ohloh, SourceForge e TorrentReactor. Mesmo ainda em beta, o Nginx é conhecido por sua estabilidade, rico conjunto de características, facilidades, simples configuração e baixo consumo de recursos.
Onde Utilizar
Onde utilizar Máquinas com poucos recursos Economia de verba$ Aplicações de pequeno a médio porte Servir conteúdo estático – CDN
Quem utiliza ?
Quem utiliza ? Segundo a W2Techs, aproxidamente 51% de 1 milhão de grandes sites na web (segundo relatórios da Alexa) usam NginX de alguma forma em sua estrutura. NginX ja é o terceiro webserver mais utilizado, logo após Apache (70.2%) e IIS (20.5%). Alguns sites: Rambler – o segundo site mais visitado da Rússia.
Alexa Top 500:
WordPress
FC2
YouPorn :P
TorrentReactor
Ultimate Guitar
Scribd
Badoo
Facebook (?!?)
Instalação
Instalação Ubuntu apt-get install nginx php5-fpm php5-memcached
Fonte
wget  http://nginx.org/download/nginx-x.x.x.tar.gz tar zxvf nginx-x.x.x.tar.gz cd nginx-x.x.x ./configure make make install
Windows ?!?!?
Configurando o NginX
Configurando o NginX # /etc/nginx/sites-available/default server {   listen  80; ## listen for ipv4   listen  [::]:80 default ipv6only=on; ## listen for ipv6   server_name  localhost;   access_log  /var/log/nginx/localhost.access.log;   location / {   root  /var/www;   index  index.html index.htm;   autoindex on;   }   … }
PHP-FPM
O que é PHP-FPM é um versão Daemon do PHP, que pode ser utilizado via proxy pelos servidores HTTP.
Configurando
Configurando o PHP-FPM # /etc/php5/fpm/pool.d/www.conf … listen = 127.0.0.1:9000 … user = www-data group = www-data … pm = dynamic pm.max_children = 15 pm.start_servers = 2 … # /etc/nginx/sites-available/default server {   …   location ~ \.php$ {   fastcgi_pass  127.0.0.1:9000;   fastcgi_index  index.php;    fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;    include  fastcgi_params;    }   … }
Nginx + CakePHP
Nginx + CakePHP # /etc/nginx/sites-available/default Server{   ...   location / {   root /var/www/app/webroot;   index index.php;   autoindex on;   if (-f $request_filename) {   break;   }   if (!-f $request_filename) {   rewrite ^/(.+)$ /index.php?url=$1 last;   break;   }   }   ... }
Nginx + Zend Framework
Nginx + Zend Framework # /etc/nginx/sites-available/default Server {   ...   location / {   root /var/www/public;   index index.php;   autoindex on;   if (!-e $request_filename) {   rewrite ^/(.*)$ /index.php? Last;   break;   }   }   ... }
Nginx + Apache
Porque?
Balanceamento de carga
Liberando o Apache de servir conteúdo estático você ganha uma performance considerável
CDN (Content Delivery Network)
Chamadas a conteúdo estático ”externo” à aplicação são entregues mais rápidas, pois diminuem as requisições ao servidor HTTP
Configurando
Nginx + Apache # /etc/apache2/ports.conf NameVirtualHost *:8080 Listen 8080 <IfModule mod_ssl.c>   Listen 443 </IfModule> <IfModule mod_gnutls.c>   Listen 443 </IfModule> # /etc/apache2/sites-enabled/default <VirtualHost *:8080>   ServerAdmin  [email_address]   ServerName  www.empresa.com.br   DocumentRoot /var/www/   ...  </VirtualHost>
Nginx + Apache # /etc/nginx/sites-enabled/default upstream servers  {   ip_hash;   server 127.0.0.1:8080;   server srv2.exemplo.com.br; } server {   listen  80; ## listen for ipv4   listen  [::]:80 default ipv6only=on; ## listen for ipv6   server_name  www.empresa.com.br ;   access_log  /var/log/nginx/d-a.proxy.log;   # Servir diretamente os diretórios:  /images/ + /css/ + /js/   location ^~ /(images|css|js) {   root  /var/www/;   access_log  /var/log/nginx/d-a.direct.log ;   }   # Servir diretamente arquivos com extensão:   location ~* \.(js|css|rdf|xml|ico|txt|gif|jpg|png|jpeg)$ {   root  /var/www/;   access_log  /var/log/nginx/d-a.direct.log;   }   # Para qualquer outra requisição não servida anteriormente, enviar para o Pool servers.   Location / {   proxy_pass  http://servers ;   proxy_redirect  off;   proxy_set_header  Host  $host;   proxy_set_header  X-Real-IP  $remote_addr;   proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;   client_max_body_size  10m;   client_body_buffer_size  128k;   proxy_connect_timeout  90;   proxy_send_timeout  90;   proxy_read_timeout  90;   proxy_buffer_size  4k;   proxy_buffers  4 32k;   proxy_busy_buffers_size  64k;   proxy_temp_file_write_size 64k;   } }
Restringindo Acesso
Restringindo Acesso # /etc/nginx/sites-available/default Server {   …   location ~ ^/(conf|templates|logs)/ {   deny all;   }   ... }
Autenticação HTTP

Alta Performance de Aplicações PHP com Nginx

  • 1.
    Alta Performance deAplicações PHP com Nginx Thiago Paes
  • 2.
    Thiago Paes 10+anos como desenvolvedor Evangelista Software Livre Trabalha no Vale1Convite Twitter: @mrprompt GitHub: http://github.com/mrprompt Página: http://thiagopaes.com.br
  • 3.
  • 4.
    Apresentando Nginx -&quot;Engine X&quot; - é um servidor e proxy reverso HTTP de alta performance, gratuito e open-source, bem como um servidor proxy para IMAP/POP3. Escrito por Igor Sysoev em 2005, Nginx agora hospeda entre 1% e 4% de todos os domínios do mundo, dentre eles, sites de grande visitação como WordPress, Hulu, Github, Ohloh, SourceForge e TorrentReactor. Mesmo ainda em beta, o Nginx é conhecido por sua estabilidade, rico conjunto de características, facilidades, simples configuração e baixo consumo de recursos.
  • 5.
  • 6.
    Onde utilizar Máquinascom poucos recursos Economia de verba$ Aplicações de pequeno a médio porte Servir conteúdo estático – CDN
  • 7.
  • 8.
    Quem utiliza ?Segundo a W2Techs, aproxidamente 51% de 1 milhão de grandes sites na web (segundo relatórios da Alexa) usam NginX de alguma forma em sua estrutura. NginX ja é o terceiro webserver mais utilizado, logo após Apache (70.2%) e IIS (20.5%). Alguns sites: Rambler – o segundo site mais visitado da Rússia.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
    Instalação Ubuntu apt-getinstall nginx php5-fpm php5-memcached
  • 20.
  • 21.
    wget http://nginx.org/download/nginx-x.x.x.tar.gztar zxvf nginx-x.x.x.tar.gz cd nginx-x.x.x ./configure make make install
  • 22.
  • 23.
  • 24.
    Configurando o NginX# /etc/nginx/sites-available/default server { listen 80; ## listen for ipv4 listen [::]:80 default ipv6only=on; ## listen for ipv6 server_name localhost; access_log /var/log/nginx/localhost.access.log; location / { root /var/www; index index.html index.htm; autoindex on; } … }
  • 25.
  • 26.
    O que éPHP-FPM é um versão Daemon do PHP, que pode ser utilizado via proxy pelos servidores HTTP.
  • 27.
  • 28.
    Configurando o PHP-FPM# /etc/php5/fpm/pool.d/www.conf … listen = 127.0.0.1:9000 … user = www-data group = www-data … pm = dynamic pm.max_children = 15 pm.start_servers = 2 … # /etc/nginx/sites-available/default server { … location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name; include fastcgi_params; } … }
  • 29.
  • 30.
    Nginx + CakePHP# /etc/nginx/sites-available/default Server{ ... location / { root /var/www/app/webroot; index index.php; autoindex on; if (-f $request_filename) { break; } if (!-f $request_filename) { rewrite ^/(.+)$ /index.php?url=$1 last; break; } } ... }
  • 31.
    Nginx + ZendFramework
  • 32.
    Nginx + ZendFramework # /etc/nginx/sites-available/default Server { ... location / { root /var/www/public; index index.php; autoindex on; if (!-e $request_filename) { rewrite ^/(.*)$ /index.php? Last; break; } } ... }
  • 33.
  • 34.
  • 35.
  • 36.
    Liberando o Apachede servir conteúdo estático você ganha uma performance considerável
  • 37.
  • 38.
    Chamadas a conteúdoestático ”externo” à aplicação são entregues mais rápidas, pois diminuem as requisições ao servidor HTTP
  • 39.
  • 40.
    Nginx + Apache# /etc/apache2/ports.conf NameVirtualHost *:8080 Listen 8080 <IfModule mod_ssl.c> Listen 443 </IfModule> <IfModule mod_gnutls.c> Listen 443 </IfModule> # /etc/apache2/sites-enabled/default <VirtualHost *:8080> ServerAdmin [email_address] ServerName www.empresa.com.br DocumentRoot /var/www/ ... </VirtualHost>
  • 41.
    Nginx + Apache# /etc/nginx/sites-enabled/default upstream servers { ip_hash; server 127.0.0.1:8080; server srv2.exemplo.com.br; } server { listen 80; ## listen for ipv4 listen [::]:80 default ipv6only=on; ## listen for ipv6 server_name www.empresa.com.br ; access_log /var/log/nginx/d-a.proxy.log; # Servir diretamente os diretórios: /images/ + /css/ + /js/ location ^~ /(images|css|js) { root /var/www/; access_log /var/log/nginx/d-a.direct.log ; } # Servir diretamente arquivos com extensão: location ~* \.(js|css|rdf|xml|ico|txt|gif|jpg|png|jpeg)$ { root /var/www/; access_log /var/log/nginx/d-a.direct.log; } # Para qualquer outra requisição não servida anteriormente, enviar para o Pool servers. Location / { proxy_pass http://servers ; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; } }
  • 42.
  • 43.
    Restringindo Acesso #/etc/nginx/sites-available/default Server { … location ~ ^/(conf|templates|logs)/ { deny all; } ... }
  • 44.