Nginx com PHP 5 ou 7 em qualquer servidor Ubuntu ou Debian

em Cloud Server Pro, Cloud Server Pro, Desenvolvimento.

É comum todo mundo usar PHP com o famoso servidor web Apache. Nada contra, tenho um grande respeito pelo Apache, mais de 20 anos sendo um dos servidores mais fodas que existem, não é pra qualquer um…

Até hoje é comum a utilização de LAMP, XAMPP e diversos tutoriais ensinando a configurar o seu servidor com o clássico trio Apache + PHP + MySQL, geralmente com o mod_php. É fácil, funciona e todo mundo conhece: uma mão na roda!

Porém, os tempos mudaram e hoje com um servidor pequeno e barato você é capaz de aguentar muitos acessos, de escalar a sua aplicação de maneira tranquila e de no final das contas ter um site rápido pagando bem menos por isso ao optar por novas tecnologias.

Não vou entrar em detalhes sobre o motivo do Nginx + PHP Fastcgi ser muito mais econômico que Apache + mod_php, a internet está cheia de comparações por aí provando isso, fica para outro dia uma explicação mais profunda. O objetivo aqui é mão na massa, então vamos lá!

Para qual Linux é esse tutorial?

Eu não gosto de fazer “Tutorial para o Linux XYZ Versão 467”, então simplificarei: Seguindo estes passos você provavelmente terá sucesso em qualquer servidor Ubuntu ou Debian.

Eu testei e consegui instalar tranquilamente nos seguintes cenários:

  • Ubuntu 12 Precise com PHP 5.3, 5.5, 5.6, 7.0 ou 7.1
  • Ubuntu 14 Trusty com PHP 5.5, 5.6, 7.0 ou 7.1
  • Ubuntu 15 Wily com PHP 5.5, 5.6, 7.0 ou 7.1
  • Ubuntu 16 Xenial com PHP 5.5, 5.6, 7.0 ou 7.1
  • Debian 7 Wheezy com PHP 5.4 ou 5.6
  • Debian 8 Jessie com PHP 5.6 ou 7.0

E aí você pode perguntar: “Mas você testou isso em 21 servidores diferentes?”

Sim, todos os 21 cenários testados em servidores criados do zero. Como? Com Docker! O Adinan Paiva conta mais sobre como ele funciona neste artigo: Como o Docker me ajudou a não dizer: “Na minha máquina funciona”

Então vamos lá, como instalar tudo do zero no seu servidor em 8 passos.

1 – Atualizando o sistema

A primeira coisa é atualizar o servidor, não comece com o pé esquerdo utilizando software defasado com possíveis falhas de segurança. Logue como root na máquina e então:

# atualiza a lista de pacotes
apt-get update
# instala as atualizações diponíveis
apt-get upgrade -y --force-yes

2 – Criando um usuário para a sua aplicação

Nada de sair fazendo tudo como root deixando processos com permissão para tudo, vamos seguir princípios básicos de segurança. Logado como root execute:

# garante que o sudo e o adduser estão instalados
apt-get install sudo adduser -y --force-yes
# cria um usuário para a sua app
adduser user-da-sua-app
# permite ao usuário rodar comandos com o sudo
usermod -a -G sudo user-da-sua-app

Pronto, a partir de agora você deverá deslogar e logar na máquina com o usuário criado (user-da-sua-app) e fazer tudo a partir dele.

3 – Instalando o Nginx

A partir do usuário criado para a sua aplicação, vamos instalar o Nginx:

sudo apt-get install nginx -y --force-yes

Sim, o Nginx é simples assim. =)

4 – Adicionando os Repositórios do PHP-FPM

Para instalar o PHP-FPM, é preciso adicionar o repositório de origem do mesmo. Ao adicionar um repositório é preciso informar o codename da sua distribuição Linux e para fazer isso utilizaremos o lsb_release. Vamos instalá-lo então:

sudo apt-get install lsb-release -y --force-yes

A partir de agora, podemos rodar o seguinte comando para descobrir o codename da sua distribuição:

lsb_release -a | grep Codename | sed -s 's/Codename:\s*//'

No Debian 8 por exemplo, tal comando retornará jessie, no Ubuntu 16 retornará xenial e assim por diante.

Agora que já sabemos o codename, precisamos adicionar uma linha indicando o repositório no arquivo /etc/apt/sources.list. A linha a ser adicionada pode ser vista rodando o seguinte comando:

ubuntu

echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu $(lsb_release -a | grep Codename | sed -s 's/Codename:\s*//') main"

debian

echo "deb http://packages.dotdeb.org $(lsb_release -a | grep Codename | sed -s 's/Codename:\s*//') all"

Tal comando retornará por exemplo:

>> No Ubuntu 16:

deb http://ppa.launchpad.net/ondrej/php/ubuntu xenial main

>> No Debian 8:

deb http://packages.dotdeb.org jessie all

Edite então o /etc/apt/sources.list e adicione a linha apropriada:

sudo vi /etc/apt/sources.list

Se prefrir, os seguintes comandos podem fazer isso automaticamente por você:

ubuntu

echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu $(lsb_release -a | grep Codename | sed -s 's/Codename:\s*//') main" | sudo tee -a /etc/apt/sources.list

debian

echo "deb http://packages.dotdeb.org $(lsb_release -a | grep Codename | sed -s 's/Codename:\s*//') all" | sudo tee -a /etc/apt/sources.list

Após adicionar o repositório, vamos atualizar a lista de pacotes disponíveis:

sudo apt-get update

Pronto, o PHP-FPM está pronto para ser instalado.

5 – Instalando o PHP-FPM

Para verificar quais versões do PHP estão disponíveis, você pode rodar o seguinte comando:

sudo apt-cache search php | grep fpm --color

Ele retornará por exemplo:

php5-fpm – server-side, HTML-embedded scripting language (FPM-CGI binary)
php-fpm – server-side, HTML-embedded scripting language (FPM-CGI binary) (default)
php7.0-fpm – server-side, HTML-embedded scripting language (FPM-CGI binary)

php-fpm – server-side, HTML-embedded scripting language (FPM-CGI binary) (default)
php7.0-fpm – server-side, HTML-embedded scripting language (FPM-CGI binary)
php5.5-fpm – server-side, HTML-embedded scripting language (FPM-CGI binary)
php5.6-fpm – server-side, HTML-embedded scripting language (FPM-CGI binary)
php7.1-fpm – server-side, HTML-embedded scripting language (FPM-CGI binary)

Um aviso: O PHP 7.1 neste momento está como alpha (extremamente experimental), se quiser instalá-lo, use-o por sua conta e risco. ;)

Escolhida a versão do PHP, vamos realizar a instalação. Se você escolheu por exemplo o php7.0-fpm, o comando será:

sudo apt-get install libpcre3 php7.0-fpm -y --force-yes

Note que adicionei a instalação da libpcre3, ela é um pré-requisito para que tudo funcione bem e nem sempre está instalada, então é melhor garantir para não termos problemas.

6 – Configurando o PHP-FPM

Com o PHP-FPM instalado, precisamos alterar algumas configurações. Primeiro localize onde está o arquivo de configurações no seu servidor com o comando:

sudo find /etc/* -name '*www.conf*' | grep php

Tal comando retornará por exemplo:

/etc/php/7.0/fpm/pool.d/www.conf

Agora, edite o arquivo www.conf encontrado:

sudo vi /etc/php/7.0/fpm/pool.d/www.conf
# ou para editar buscando automaticamente o arquivo:
sudo vi $(sudo find /etc/* -name '*www.conf*' | grep php)

Garanta que as seguintes configurações existam nele e que estejam descomentadas com as seguintes propriedades:

; Socket que será aberto pelo PHP-FPM
listen = /var/run/php-fpm.sock
; Indica que o PHP-FPM se comunicará via Socket.
listen.mode = 0660
; Permite a comunicação com o processo do
; Nginx que utiliza o usuário www-data
listen.owner = www-data
listen.group = www-data

7 – Configurando o Nginx

Primeiro crie uma pasta para a sua aplicação e permita que o usuário criado (user-da-sua-app) acesse ela:

    
sudo mkdir -p /var/www/sua-app
sudo chown user-da-sua-app:user-da-sua-app /var/www/sua-app

Agora edite o arquivo /etc/nginx/sites-available/default:

sudo vi /etc/nginx/sites-available/default

E coloque o seguinte conteúdo nele:

server {
    listen   80;
    
    root /var/www/sua-app;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;                
    }
}

E pronto, isto será o suficiente para o Nginx conseguir executar arquivos PHP na pasta criada. Vamos criar um arquivo .php na pasta da sua aplicação para testes:

vi /var/www/sua-app/test.php

Coloque nele o seguinte conteúdo:

<?php phpinfo(); ?>

Feito isso, vamos agora testar se tudo deu certo!

8 – Iniciando o Nginx e o PHP-FPM

Existem 3 formas de subir os serviços do Nginx e do PHP-FPM e elas podem ser vistas com o seguinte comando que mostrará exatamente o que deve ser feito de acordo com o seu servidor:

printf "\n\n-------------------\n\n  sudo service $(find /etc/init.d -name '*nginx*' | awk '{ gsub(/.*\//, "", $0); print $0 }') restart\n  sudo service $(find /etc/init.d -name '*php*fpm*' | awk '{ gsub(/.*\//, "", $0); print $0 }') restart\n\n  sudo $(find /etc/init.d -name '*nginx*') restart\n  sudo $(find /etc/init.d -name '*php*fpm*') restart\n\n  sudo $(find /usr/sbin -name '*nginx*')\n  sudo $(find /usr/sbin -name '*php*fpm*')\n\n-------------------\n\n"

Tal comando retornará por exemplo:

——————-

sudo service nginx restart
sudo service php7.0-fpm restart

sudo /etc/init.d/nginx restart
sudo /etc/init.d/php7.0-fpm restart

sudo /usr/sbin/nginx
sudo /usr/sbin/php-fpm7.0

——————-

O método com service é o mais recomendado. Se não funcionar e o processo não subir, tente com o init.d. Em último caso, se nada der certo, passe para o sbin, que subirá o serviço ou pelo menos retornará maiores informações sobre algum possível problema.

E como você faz para saber se deu certo subir os processos com algum desses comandos? Você pode utilizar o ps aux para conferir. Garanta que ele está instalado:

sudo apt-get install procps -y --force-yes

E então rode:

# verifica o processo do nginx
ps aux | grep nginx
# verifica o processo do php
ps aux | grep php

Tais comandos devem retornar algo como:
Nginx:

root 60 0.0 0.0 125188 1456 ? Ss 03:31 0:00 nginx: master process /usr/sbin/nginx
www-data 61 0.0 0.0 125508 3228 ? S 03:31 0:00 nginx: worker process
www-data 62 0.0 0.0 125508 3228 ? S 03:31 0:00 nginx: worker process
www-data 64 0.0 0.0 125508 3228 ? S 03:31 0:00 nginx: worker process
www-data 65 0.0 0.0 125508 3228 ? S 03:31 0:00 nginx: worker process
user-da+ 99 0.0 0.0 11284 928 ?

PHP:

root 93 0.0 0.1 211796 9404 ? Ss 03:31 0:00 php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf)
www-data 94 0.0 0.0 211796 6260 ? S 03:31 0:00 php-fpm: pool www
www-data 95 0.0 0.0 211796 6260 ? S 03:31 0:00 php-fpm: pool www
user-da+ 101 0.0 0.0 11284 1012 ? S+ 03:32 0:00 grep –color=auto php

Com os serviços rodando, você pode testar tudo acessando no navegador o arquivo test.php criado através do IP do seu servidor: http://ip-do-seu-servidor/test.php

Se tudo deu certo, você deverá ver algo parecido com a seguinte tela:

phpinfo() - PHP 7

É só isso?

Sim, o seu servidor com Nginx utilizando PHP-FPM já está configurado e rodando!

Antes de ficar decepcionado por causa da configuração do Nginx, explico: Criei propositalmente a menor configuração possível para apenas executar arquivos PHP.

Para configurar um domínio, abrir automaticamente o index.php, servir arquivos CSS, JavaScript, imagens, utilizar url rewrite para projetos como WordPress, CodeIgniter, Magento, Laravel, etc. ou definir onde os logs serão salvos e demais opções, é só alterar o arquivo de configurações do Nginx e reiniciá-lo.

E essa parte é simples, basta pesquisar na internet que existirão infinitas referências.

Para uma configuração com foco no WordPress por exemplo, existem exemplos oficias do próprio time do WordPress: https://codex.wordpress.org/Nginx

Para CodeIgniter, existem exemplos no site oficial no Nginx: https://www.nginx.com/resources/wiki/start/topics/recipes/codeigniter/

Laravel? http://laravel-recipes.com/recipes/26/creating-a-nginx-virtualhost

E por aí vai. Boa sorte com o seu novo servidor e até a próxima! =)

Você também pode gostar