nginx

Criando um ambiente de desenvolvimento PHP com WSL

O WSL é uma alternativa interessante para quem precisa configurar um ambiente de desenvolvimento em Linux dentro do Windows. Com ele você pode escolher a sua distribuição Linux preferida e configurar seu ambiente exatamente da mesma forma que você configuraria em uma máquina Linux ou em um servidor, por exemplo.

Nesse artigo vamos criar um ambiente de desenvolvimento PHP completo, com MySQL e Nginx dentro do WSL.

Instalação do WSL

Antes de mais nada, é preciso habilitar o WSL na sua máquina e instalar a distribuição de sua escolha. Se você ainda não conhece o WSL ou tem dúvidas se sua máquina tem suporte a ele, recomendo a leitura do artigo O que é Windows Subsystem for Linux (WSL)? para saber mais e acompanhar o processo de instalação.

Para esse tutorial vou utilizar o Ubuntu 18.04. Os comandos apresentados aqui podem não funcionar com outras distribuições, mas você pode utilizar esse artigo para ter uma ideia geral.

Instalando o Nginx

Para iniciar vamos iniciar nosso terminal com o WSL e instalar o Nginx. Ele está disponível via apt-get e pode ser instalado com os comandos abaixo como sudo:

sudo apt-get update
sudo apt-get install nginx

Aproveite esse momento e instale utilitários como o git para versionamento de código e um editor de textos de sua preferência, como o vim:

sudo apt-get install git vim

Depois é necessário habilitar o serviço do Nginx dentro do WSL, antes disso verifique se a porta 80 da sua máquina está liberada. Você pode executar o seguinte comando PowerShell como administrador para descobrir isso:

Get-Process -Id (Get-NetTCPConnection -LocalPort 80).OwningProcess

Se o comando retornar erro, a porta 80 está liberada para uso:

Verificando a porta 80 com PowerShell

Feito isso, volte para seu terminal do WSL e execute o comando:

sudo service nginx start

Com isso seu localhost já estará funcionando:

Página inicial do nginx

Como o WSL não suporta o gerenciamento de serviços usando systemd, sempre que você reiniciar a máquina e iniciar uma nova sessão com o WSL, você precisa iniciar o serviço do Nginx novamente. Veremos como resolver isso logo mais.

Instalando o MySQL

O MySQL 5.7 pode ser instalado a partir do apt-get no Ubuntu 18.04:

sudo apt-get install mysql-server

Como também aconteceu com o Nginx, é preciso iniciar o serviço do MySQL manualmente:

sudo service mysql start

Para acessar sua instância do MySQL, é preciso criar um novo usuário no seu banco de dados para ser utilizado junto com sua aplicação. No seu terminal inicie o cliente do MySQL executando sudo mysql e execute a seguinte query:

GRANT ALL ON *.* TO 'admin'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

Isso irá criar um usuário chamado admin com a senha password. Esse usuário será acessível apenas pelo endereço localhost. Troque o usuário e senha para algo mais seguro e digite exit para sair do cliente do MySQL.

Teste a conexão com o MySQL utilizando algum cliente, você pode utilizar o MySQL Workbench por exemplo:

Teste da conexão com o MySQL

Instalando o PHP

Agora vamos de fato instalar o PHP e configurá-lo para funcionar com o Nginx. É preciso instalar o PHP-FPM (FastCGI Process Manager) para que o Nginx consiga delegar as requisições recebidas para as páginas a serem interpretadas com PHP. Como estamos utilizando o MySQL como banco de dados, é interessante instalar a extensão do MySQL também:

sudo apt-get install php-fpm php-mysql

Com isso será instalado a versão 7.2 do PHP juntamente com o FPM e as extensões do MySQL:

Versão do php

Depois de instalado, inicie o serviço do PHP-FPM:

sudo service php7.2-fpm start

Configurando nosso site

Por fim, vamos configurar nosso site para ser executado com PHP. Crie um arquivo em /etc/nginx/sites-available/localhost com o seguinte conteúdo:

server {
  listen 80;
  root /var/www/html;
  index index.php index.html index.htm index.nginx-debian.html;
  server_name localhost;

  location / {
    try_files $uri $uri/ =404;
  }

  location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
  }

  location ~ /\.ht {
    deny all;
  }
}

Habilite o site criado para utilizar a nova configuração através de um link simbólico (conhecido também como symlink) no diretório /etc/nginx/sites-enabled e remova a configuração de site padrão com os seguintes comandos:

sudo ln -s /etc/nginx/sites-available/localhost /etc/nginx/sites-enabled/
sudo unlink /etc/nginx/sites-enabled/default

Reinicie o serviço do Nginx para ler essas novas configurações:

sudo service nginx restart

E crie o arquivo /var/www/html/index.php com o seguinte conteúdo:

<?php 
phpinfo();

No meu caso, eu precisei alterar o dono do diretório /var/www/html para poder criar esse arquivo:

sudo chown -R $USER: /var/www/html

Com isso, você deve conseguir ver a configuração do PHP no seu navegador:

Configurações do php

Configurando os serviços para iniciarem automaticamente

Devido a algumas limitações na arquitetura do WSL, não é possível iniciar serviços automaticamente pelo systemd. Para contornar isso podemos iniciar esses serviços a partir do nosso arquivo .bashrc e desabilitar a necessidade de perguntar a senha do sudo para esses serviços.

Lembrando que essa prática não é recomendada em ambientes de produção. Em produção utilize o systemd e nunca permita que serviços que precisam de permissões elevadas rodem sem precisar inserir uma senha.

Adicione as seguintes linhas no seu arquivo /etc/sudoers:

%sudo ALL=NOPASSWD: /etc/init.d/mysql
%sudo ALL=NOPASSWD: /etc/init.d/nginx
%sudo ALL=NOPASSWD: /etc/init.d/php7.2-fpm

E no seu arquivo do ~/.bashrc inclua o seguinte:

sudo /etc/init.d/nginx start
sudo /etc/init.d/mysql start
sudo /etc/init.d/php7.2-fpm start

Com isso, sempre que iniciar seu terminal do WSL os serviços serão iniciados automaticamente. Caso esteja utilizando alguma linguagem diferente, a ideia é a mesma: inclua os serviços necessário no .bashrc e desabilite a senha para esses serviços no /etc/sudoers.

Configurando sua IDE

Após tudo configurado, chegou a hora de configurarmos nossa IDE para utilizar o WSL. Da forma que configuramos nosso ambiente, os scripts PHP estão dentro da estrutura de arquivos do WSL.

Como o WSL não suporta ferramentas com interface gráfica, não podemos instalar nossa IDE.

Podemos resolver isso de algumas formas. Uma delas é salvar nossos arquivos nos diretórios do Windows e dentro do WSL configurar o Nginx para apontar para um diretório dentro de /mnt/c/. Esse diretório é mapeado diretamente com o C: do seu sistema e permite o WSL ter acesso a esses arquivos.

Caso você utilize o VS Code, uma melhor alternativa é utilizar os arquivos salvos diretamente dentro da estrutura do WSL. Existe uma extensão ainda em preview chamada Remote Development. Com ela é possível se conectar com sistemas externos através de SSH, Container ou WSL para trabalhar diretamente com o sistema de arquivos dessas soluções.

Para utilizar o Remote Development com o WSL, instale a extensão Remote – WSL no seu VS code e reinicie o mesmo.

Extensão Remote - WSL

Ao reiniciar, repare no canto esquerdo um novo ícone verde. A partir dele é possível abrir uma nova janela do VS Code com acesso ao sistema de arquivos da sua distribuição no WSL:

Nova janela com acesso ao WSL

Ao abrir essa nova janela, será instalado um agente dentro do WSL que permite a conexão com o VS Code. O ícone verde indicará o nome da sua distribuição que o VS Code está conectado. Ao abrir um diretório você navegará no sistema de arquivos do WSL.

Abra o diretório /var/www/html e podemos observar que nosso index.php está acessível:

Abrir diretório

Arquivos no WSL

Esse agente que é instalado no WSL permite uma melhor integração com o VS Code. Com ele é possível dentro do terminal do WSL abrir qualquer diretório que você esteja navegando utilizando o comando code . e também é possível instalar extensões do VS Code para executarem diretamente dentro do WSL, como por exemplo as extensões de intellisense e debug para PHP:

Extensões instalados no WSL

Para a extensão intellisense do PHP funcionar, é preciso que o executável do PHP esteja disponível no sistema. Instalando essa extensão dentro do WSL você consegue utilizar do executável já disponível no WSL, concentrando todas as funcionalidades necessárias para o seu ambiente em um único lugar.

Conclusão

Aprendemos nesse artigo como criar do zero um ambiente de desenvolvimento para PHP dentro do WSL. Esse ambiente pode ser uma alternativa para quem precisa executar um projeto em ambiente Linux dentro do Windows. Vimos também como configurar o VS Code para acessar diretamente os arquivos dentro do sistema de arquivos do WSL, tornando uma experiência muito próxima com a que teríamos com o Linux.

JUNTE-SE A MAIS DE 150.000 PROGRAMADORES