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?
- Obtém o endereço IP da máquina WSL 2
- Remove regras de encaminhamento de porta anteriores
- Adiciona regras de encaminhamento de porta
- Remove regras de firewall adicionadas anteriormente
- Adicionar novas regras ao firewall
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.
- Abra o Agendador de Tarefas
- Clique em Nova Tarefa
- Digite um nome para a tarefa e marque a opção "Executar com privilégios mais altos"
- Na guia Disparadores clique em "Novo" e escolha "Ao fazer logon", selecione um atraso entre 5 e 15 segundos
- Na guia Ações escolha a ação "Iniciar um programa" e na caixa "Programa/script" escolha o arquivo
.cmd
que você criou acima. - 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.
- Abra o Windows Explorer
- Clique com o botão direito no arquivo .ps1 que você criou
- Escolha Abrir com
- Clique em Mais Aplicativos
- Role até achar a opção Procurar outro aplicativo neste PC e clique nela
- Informe o caminho para o PowerShell, provavelmente estará no caminho
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
- 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