De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Alexandro Silva
Data de Publicação: 07 de março de 2012
O Nginx (pronuncia-se "engine-x") é um webserver e proxy reverso para os protocolos http, smtp, pop3 e imap focado em alta performance. Sua utilização vêm crescendo bastante rapidamente, numa pesquisa realizada em janeiro deste ano pela Netcraft ele ocupa o 2o. lugar entre os servidores webs ativos na internet.
Neste post apresentarei como configurar o Nginx com suporte ao PHP e todos os ajustes de segurança necessários.
NOTA: Informações importantes encontram-se nos comentários dos arquivos de configuração.
Para obter as versões mais recente usaremos os pacotes disponíveis no repositório squeeze-backports
deb http://backports.debian.org/debian-backports squeeze-backports main
aptitude install -t squeeze-backports nginx spawn-fcgi ṕhp5-cgi
Configurando o vhost
vim /etc/nginx/sites-available/www.acme.com
#O dominio acme.com é um alias para www.acme.com
server {
server_name www.acme.com acme.com;
access_log /var/log/nginx/www.acme.com.access.log;
error_log /var/log/nginx/www.acme.com.error.log;
root /var/www/acme/;
location / {
index index.php;
}
#Restrigindo o acesso ao ambiente administrativo
location /admin {
root /var/www/acme/;
index index.php;
allow 200.222.222.222;
deny all;
}
#Negando o acesso a alguns arquivos
location =/*.txt {
deny all;
log_not_found off;
access_log off;
}
location =/xmlrpc.php{
deny all;
log_not_found off;
access_log off;
}
location =/readme.html {
deny all;
log_not_found off;
access_log off;
}
#Habilitando o suporte ao PHP
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/acme$fastcgi_script_name;
}
}
Hardening do Nginx
user www-data;
#Total de threads. Configure de acordo com a quantidade de CPU existente, acima de 2 CPUs = 4.
worker_processes 4;
pid /var/run/nginx.pid;
events {
#Juntamente com o work_processes permite calcular o máx. de clientes (max clients = worker_processes * worker_connections)
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
access_log /var/log/nginx/access.log;
sendfile on;
tcp_nodelay on;
gzip on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
# Protecao contra DoS
client_body_buffer_size 1K;
client_header_buffer_size 1k;
client_max_body_size 2M;
large_client_header_buffers 2 1k;
client_body_timeout 10;
client_header_timeout 10;
keepalive_timeout 5 5;
send_timeout 10;
# Oculta banner
server_tokens off;
}
# Linita o maximo de conexões concorrentes por IP
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn addr 10;
Script de inicialização do PHP-Fastcgi
vim /etc/init.d/php-fastcgi
RETVAL=0
case "$1" in
start)
$PHP_SCRIPT
RETVAL=$?
;;
stop)
killall php5-cgi
RETVAL=$?
;;
restart)
killall php5-cgi
$PHP_SCRIPT
RETVAL=$?
;;
*)
echo "Usage: php-fastcgi {start|stop|restart}"
exit 1
;;
esac
exit $RETVAL
Adicionando nos Runlevels
update-rc.d php-fastcgi defaults
Habilitando o vhost e iniciando os serviços
cd /etc/nginx/sites-enabled ln -s ../sites-available/www.acme.com
invoke-rc.d nginx start && invoke-rc.d php-fastcgi start
Considerações finais
As melhores práticas de segurança do PHP já foram abordadas nos posts anteriores [1] [2]
Como pudemos constatar sua implementação é aparente fácil, o site do [projeto http://nginx.org/] é bastante rico em documentação.
O Nginx é muito utilizado como proxy reverso tornando-se um frontend para balaceamento de carga suportando diversos protocolos, existe também um módulo de WAF chamado Naxsi, esta e outras soluções serão tratadas nos próximos posts.
Referências