NGINX com PHP no CentOS

Nginx é um servidor web de alta performance e que tem mostrado ótimos resultados em diversos casos como o wordpress por exemplo.
Pesquisando no google você pode encontrar vários casos de sucesso com o Nginx, desde implementações como proxy reverso ou um servidor de alta requisição com baixíssimo uso de cpu etc.



Motivos para se usar o Nginx não faltam em blogs pela web, nem comparações com o Apache,
porém esse não é o intuito deste post.


Podemos fazer o Nginx interagir com o php através do FastCGI, infelizmente não existe um módulo nativo para integrar o FastCGI no Nginx, porém podemos utilizar o pacote do Lighttp =D


Atualmente estou utilizando a Versão 6 do CentOS, que infelizmente não possuí o nginx em seu repositório oficial. Portanto irei utilizar o repositório EPEL (Extra Packages for Enterprise Linux) um repositório mantido por empacotadores voluntários, porém com um nível rigoroso de qualidade para que o pacote se torno disponível.  


Primeiramente devemos habilitar o repositório em nosso sistema, execute como root o comando abaixo de acordo com sua arquitetura:


32 bits:

 rpm -ivh http://mirror.optus.net/epel/6/i386/epel-release-6-7.noarch.rpm

64 bits:


 rpm -ivh http://mirror.optus.net/epel/6/x86_64/epel-release-6-7.noarch.rpm

Agora instale o Nginx:

# yum install nginx

Como eu havia dito não há um pacote padrão do fastcgi para o nginx, por isso iremos utilizar o pacote do lighttp e alguns pacotes do php como php-mysql para integração com o banco, porém você poderá instalar pacotes adicionais caso deseje. 



# yum install lighttpd-fastcgi php-cli php-mysql php-gd

Após a instalação dos pacotes, vamos começar a configuração do Nginx, edite o arquivo /etc/nginx/nginx.conf




# vi /etc/nginx/nginx.conf

Para quem configurou o apache alguma vez, perceberá como é muito mais fácil configurar o nginx, os Virtual Hosts são especificados dentro das chaves { } Server, especificamente em servername _; caso deseje poderá especificar seu domínio na frente de servername.


Voltando a configuração, na seção Location / (linha 76 do arquivo) o conteúdo estará assim:




location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }


O diretório especificado em root é obviamente o DocumentRoot do servidor web, onde o conteúdo a ser publicado deverá estar contido, você pode altera-lo e especificar um outro diretório sem problema. porém neste tutorial irei deixar o diretório padrão mesmo. 


Nesta parte adicione index.php na frente de index ficando assim:



 location / {
            root   /usr/share/nginx/html;
            index index.php  index.html index.htm;
        }


Agora a parte mais importante para funcionar o PHP é a seção location ~ \.php$ (linha 101)


Por padrão essa seção vem comentada assim:






 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #   root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  scripts/$fastcgi_script_name;
        #    include        fastcgi_params;
        #}


Descomente as linhas removendo os # da frente e na linha que contém fastcgi_param SCRIPTFILENAME você deverá acrescentar o path completo do DocumentRoot, exemplo:



fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;


Essa parte é muito importante caso você não especifique corretamente seu DocumentRoot o nginx não conseguirá interpretar seus arquivos em php, portante preste atenção e adicione corretamente seu DocumentRoot. 


Preste atenção na linha contendo  fastcgi_pass   127.0.0.1:9000  essa linha informa em qual ip e porta o nginx está esperando que o fastcgi esteja sendo executado, caso deseje poderá escolher outro ip e outra porta a ser utilizada pelo fastcgi, pois iremos inicia-lo mais adiante onde você poderá especificar o ip e porta desejada, porém irei continuar o tutorial com esse endereço padrão.


Feito as alterações o conteúdo deverá estar assim:



 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
           root           html;
           fastcgi_pass   127.0.0.1:9000;
           fastcgi_index  index.php;
           fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html/$fastcgi_script_name;
          include        fastcgi_params;
        }


Edite o arquivo /etc/php.ini:




# vi /etc/php.ini


E no final do arquivo adicione a seguinte linha:


cgi.fix_pathinfo = 1



Agora iremos iniciar o fastcgi, seu executável fica localizado em /usr/share/spawn-fcgi você poderá verificar todas opções e parâmetros disponíveis para o mesmo executando o comando:


# spawn-fcgi --help

Como eu havia informado, você pode especificar em qual ip e porta o fastcgi será executado, caso você tenha alterado o endereço padrão no arquivo /etc/nginx/nginx.conf , utilize os próximos comandos com o endereço que você informou.


Inicie o fastcgi com o comando: 



# /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u nginx -g nginx -f /usr/bin/php-cgi -P /var/run/fastcgi-php.pid

O comando acima informe que queremos utilizar o localhost como endereço ip (-a), na porta 9000 (-p) para o usuário nginx (-u) para o grupo nginx (-g) para aplicação php-cgi (-f) com o arquivo de pid fastcgi-php.pid (-P) 


Todos esses parâmetros podem ser verificados com spawn-fcgi --help =D!


Obviamente você não gostaria de ter que digitar este comando toda vez que efetuar um reboot para iniciar o fastcgi, então para que ele inicie automaticamente em cada reboot do sistema adicione o comando acima no final do arquivo /etc/rc.local :




# vi /etc/rc.local

E adicione o comando no final do arquivo:


 /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u nginx -g nginx -f /usr/bin/php-cgi -P /var/run/fastcgi-php.pid

Agora vamos verificar se está tudo funcionando corretamente, reinicie o nginx:



/etc/init.d/nginx restart

Através do navegador acesse o endereço ip do seu servidor ou o localhost caso esteja utilizando o navegador no próprio servidor, no meu caso acessei o endereço 7.7.7.18 


Você provavelmente verá o conteúdo abaixo:



Caso não consiga visualizar o conteúdo da imagem acima, verifique se você efetuou alguma configuração errada no arquivo /etc/nginx/nginx.conf e tente reiniciar o serviço novamente. 

Agora vamos verificar se o fastcgi está funcionando e o php está sendo interpretado, crie o info.php em /usr/share/nginx/html ou no DocumentRoot que você especificou: 


# vi /usr/share/nginx/html/info.php

E adicione o seguinte conteúdo:



<?php phpinfo() ; ?>

Salve o arquivo e acesse o ip do seu servidor /info.php . No meu caso 7.7.7.18/info.php





Caso você consiga visualizar o mesmo conteúdo da imagem acima, o nginx está interpretando php normalmente =D . Se você não conseguiu visualizar, reveja as configurações que você efetuou e reinicie o php e o nginx novamente, verifique atentamente se você especificou o DocumentRoot correto em fastcgi_param no arquivo /etc/nginx/nginx.conf.


Se tiver dúvidas ou deseje verificar mais configurações possíveis para o nginx clique aqui.



3 Comentário(s) em “NGINX com PHP no CentOS”

  1. Muito bom, vou estar usando o nginx no meu próximo projeto, tenho visto que seu desempenho é muito melhor que o apache pela internet, então estou decidido a usá-lo. Obrigado pelo tutorial

    [Responder comentário]

Deixe um comentário