Configurando o Apache/MySQL do WSL para iniciar automaticamente com o Windows e conseguir acessá-lo em outros computadores e celulares da rede local

Para configurar o Apache instalado no WSL (com Linux Ubuntu) para ser acessado de todos os dispositivos da sua rede local precisaremos instalar inicialmente o net-tools para que possamos acessar informações sobre o adaptador de rede do WSL com o comando:

apt install net-tools

Sempre que o WSL inicia ele recebe um novo endereço IP local, isso pode ser visto usando o comando ifconfig, na informação logo depois de inet. Para descobrir esse endereço IP automaticamente, adicionar permissão no firewall do Windows e remover as regras antigas, usaremos um script escrito por Edwindijas disponível em um comentário no issue https://github.com/microsoft/WSL/issues/4150

Abra o bloco de notas e cole o script abaixo:

$remoteport = bash.exe -c "ifconfig eth0 | grep 'inet '"
$found = $remoteport -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';

if( $found ){
  $remoteport = $matches[0];
} else{
  echo "Não foi possível encontrar o endereço IP do WSL 2";
  exit;
}

#[Ports]

#Todas as portas que você deseja encaminhar separadas por vírgula
$ports=@(80,443,10000,3000,5000);

#[Static ip]
#Você pode alterar o endereço para sua configuração de ip para ouvir um endereço específico
$addr='192.168.0.2';
$ports_a = $ports -join ",";

#Remove regras de exceção de firewall
iex "Remove-NetFireWallRule -DisplayName 'Desbloqueio do firewall para WSL 2' ";

#Adiciona regras de exceção para regras de entrada e saída
iex "New-NetFireWallRule -DisplayName 'Desbloqueio do firewall para WSL 2' -Direction Outbound -LocalPort $ports_a -Action Allow -Protocol TCP";
iex "New-NetFireWallRule -DisplayName 'Desbloqueio do firewall para WSL 2' -Direction Inbound -LocalPort $ports_a -Action Allow -Protocol TCP";

for( $i = 0; $i -lt $ports.length; $i++ ){
  $port = $ports[$i];
  iex "netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr";
  iex "netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addr connectport=$port connectaddress=$remoteport";
}

#Iniciando os serviços
wsl sudo service apache2 start
wsl sudo service mysql start
wsl sudo service memcached start

Salve o arquivo com a extensão .ps1

O que isso faz?

Criando um script de comandos do Windows

Agora vamos criar um novo arquivo, dessa vez .cmd para executar o script acima. O código dele é bem simples:

powerShell D:\wsl\Seta_Configuracoes_de_Rede_WSL.ps1 >> "D:\wsl\LogPowerShell.log"

Nota: Para que o comando seja executado em segundo plano você pode adicionar o código -windowstyle hidden logo após o comando powerShell, ficando o arquivo assim:

powerShell -windowstyle hidden D:\wsl\Seta_Configuracoes_de_Rede_WSL.ps1 >> "D:\wsl\LogPowerShell.log"

Agora criamos uma tarefa para ser executada sempre que você fizer login no Windows.

  1. Abra o Agendador de Tarefas
  2. Clique em Nova Tarefa
  3. Digite um nome para a tarefa e marque a opção "Executar com privilégios mais altos"
  4. Na guia Disparadores clique em "Novo" e escolha "Ao fazer logon", selecione um atraso entre 5 e 15 segundos
  5. Na guia Ações escolha a ação "Iniciar um programa" e na caixa "Programa/script" escolha o arquivo .cmd que você criou acima.
  6. Se estiver usando o notebook, lembre-se de desmarcar a opção "Iniciar a tarefa somente se o computador estiver ligado na rede elétrica" que fica na Guia Condições

Permitindo que o PowerShell execute o script carregado

Por padrão o PowerShell vem com a políticas de execução no modo restrito, isso impede que sejam executados scripts não seguros. Você pode verificar isso com o comando get-executionpolicy. Caso a política esteja restrita (Restricted) será necessário deixar ela irrestrita (Unrestricted). Você pode fazer isso digitando o comando abaixo no PowerShell:

set-executionpolicy Unrestricted

Agora você já pode fechar o PowerShell ou o terminal do Windows.

Defina o Windows para abrir arquivos .ps1 com o PowerShell.

  1. Abra o Windows Explorer
  2. Clique com o botão direito no arquivo .ps1 que você criou
  3. Escolha Abrir com
  4. Clique em Mais Aplicativos
  5. Role até achar a opção Procurar outro aplicativo neste PC e clique nela
  6. Informe o caminho para o PowerShell, provavelmente estará no caminho C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
  7. Deixe a opção "Sempre usar este aplicativo para abrir arquivos .ps1" marcada

Liberando serviços para serem executados sem senha

Para permitir que os serviços do Linux sejam iniciados sem pedir senha, temos que editar o arquivo /etc/sudoers. Abra o mesmo usando o comando:

sudo nano /etc/sudoers

Acrestando as linhas abaixo no final do arquivo. Note que você estará permitindo que os serviços cron, ssh, mysql, apache2, memcached possam ser iniciados sem senha de root.

%sudo   ALL=(ALL) NOPASSWD: /etc/init.d/apache2 start
%sudo   ALL=(ALL) NOPASSWD: /etc/init.d/mysql start
%sudo   ALL=(ALL) NOPASSWD: /etc/init.d/memcached start

Agora salve o arquivo, feche o nano e reinicie o computador para verificar se tudo ficou funcionando.

Usuário root como padrão

Caso a alterativa acima não tenha funcionado, ou seja, continua sendo necessária a senha para iniciar os serviços do Apache, MySQL, etc. você pode alterar o usuário padrão do WSL para root, para isso basta digitar o comando abaixo no PowerShell:

Ubuntu config --default-user root

Note que Ubuntu é o nome da sua distribuição Linux atual, ela pode ser vista usando o comando

wsl -l -v