Configuração do Ambiente LNMP no macOS com Homebrew

A instalação do servidor web é realizada com um único comando:

brew install nginx

Para versões específicas, edite a fórmula com brew edit nginx e altere a URL de download no início do arquivo.

Após a instalação, os comandos de gerenciamento são:

# Iniciar o serviço
sudo nginx

# Operações de controle
nginx -s reload   # Recarregar configuração
nginx -s stop     # Parar
nginx -s quit     # Encerrar graciosamente
nginx -s reopen   # Reiniciar

# Validação
nginx -t

O servidor escuta na porta 8080 por padrão. Para alterar para a porta 80, modifique o arquivo /usr/local/etc/nginx/nginx.conf:

server {
    listen 80;
    root /usr/local/var/www;
}

O diretório raiz padrão fica em /usr/local/Cellar/nginx/[versão]/html.

Execução automática do Nginx

Configure o serviço para iniciar com o sistema:

mkdir -p ~/Library/LaunchAgents
cp /usr/local/Cellar/nginx/*/homebrew.mxcl.nginx.plist ~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist

Para portas abaixo de 1024 (como a 80), conceda privilégios elevados:

sudo chown root:wheel /usr/local/opt/nginx/bin/nginx
sudo chmod u+s /usr/local/opt/nginx/bin/nginx

Utilizaremos o MariaDB, fork compatível com MySQL:

brew install mariadb

Inicialize a estrutura de dados:

mysql_install_db \
  --verbose \
  --user=$(whoami) \
  --basedir="$(brew --prefix mariadb)" \
  --datadir=/usr/local/var/mysql \
  --tmpdir=/tmp

Após a inicialização, o acesso é permitido sem autenticação. Defina a senha do administrador:

/usr/local/opt/mariadb/bin/mysqladmin -u root password 'sua-senha-segura'

Execute o script de segurança para remover acessos anônimos e o banco de teste:

/usr/local/opt/mariadb/bin/mysql_secure_installation

A partir de então, conecte-se com:

mysql -u root -p

Configuração de serviço e parâmetros

Ative a inicialização automática:

mkdir -p ~/Library/LaunchAgents
cp /usr/local/Cellar/mariadb/*/homebrew.mxcl.mariadb.plist ~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mariadb.plist

Para interromper o serviço:

launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.mariadb.plist

Exemplo de configuração em /usr/local/etc/my.cnf:

[mysqld]
port = 3306
server_id = 1
character-set-server = utf8mb4
default-storage-engine = InnoDB
socket = /tmp/mysql.sock
max_connections = 50
innodb_buffer_pool_size = 256M

[client]
port = 3306
default-character-set = utf8mb4

O macOS inclui uma instalação básica de PHP, mas sem extensões essenciais. Para uma versão completa, adicione os repositórios especializados:

brew tap homebrew/dupes
brew tap shivammathur/php

Liste as versões disponíveis:

brew search php

Instale a versão desejada com suporte a FPM. Exemplo com PHP 8.2:

brew install php@8.2 --with-fpm

Para verificar todas as opções de compilação:

brew options php@8.2

Ajuste de variáveis de ambiente

Como o sistema possui PHP nativo, priorize a versão do Homebrew adicionando ao ~/.zshrc (ou ~/.bash_profile):

export PATH="$(brew --prefix php@8.2)/bin:$PATH"

Aplique as alterações:

source ~/.zshrc

Gerenciamento do serviço PHP-FPM

Arquivos de configuração:

  • /usr/local/etc/php/8.2/php.ini — Configurações gerais
  • /usr/local/etc/php/8.2/php-fpm.d/www.conf — Pool de processos

Inicie manualmente:

php-fpm

Para execução em background, altere em php-fpm.conf:

daemonize = yes

Valide alterações:

php-fpm -t

Configuração de inicialização automática:

mkdir -p ~/Library/LaunchAgents
cp /usr/local/Cellar/php@8.2/*/homebrew.mxcl.php@8.2.plist ~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php@8.2.plist

Script de controle personalizado

Crie ~/bin/fpmctl para gerenciar o processo:

#!/usr/bin/env bash

acao=$1
arquivo_pid="/usr/local/var/run/php-fpm.pid"

iniciar() {
    if [[ -f "$arquivo_pid" ]] && kill -0 $(cat "$arquivo_pid") 2>/dev/null; then
        echo "PHP-FPM já está em execução"
        return
    fi
    php-fpm
    echo "PHP-FPM iniciado"
}

parar() {
    if [[ ! -f "$arquivo_pid" ]]; then
        echo "Arquivo PID não encontrado"
        return
    fi
    local pid=$(cat "$arquivo_pid")
    kill -QUIT "$pid" 2>/dev/null || kill -TERM "$pid" 2>/dev/null
    rm -f "$arquivo_pid"
    echo "PHP-FPM encerrado"
}

case "$acao" in
    start)  iniciar ;;
    stop)   parar ;;
    restart) parar; sleep 1; iniciar ;;
    status) 
        if [[ -f "$arquivo_pid" ]] && kill -0 $(cat "$arquivo_pid") 2>/dev/null; then
            echo "PHP-FPM ativo (PID: $(cat $arquivo_pid))"
        else
            echo "PHP-FPM inativo"
        fi
        ;;
    *) echo "Uso: fpmctl {start|stop|restart|status}" ;;
esac

Torne executável:

chmod +x ~/bin/fpmctl

Edite /usr/local/etc/nginx/nginx.conf para processar arquivos PHP:

server {
    listen 80;
    server_name localhost;
    root /usr/local/var/www;
    index index.php index.html;

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_intercept_errors on;
    }

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

Crie um arquivo de teste:

echo '<?php phpinfo(); ?>' > /usr/local/var/www/info.php

Reinicie o Nginx e acesse http://localhost/info.php.

Resolução de problemas comuns

Erro de hash SHA256 durante download do PHP:

Error: SHA256 mismatch
Expected: ...
Actual: ...

Solução: Limpe o cache e utilize mirror alternativo editando a fórmula:

rm /Library/Caches/Homebrew/php@8.2-*
brew edit shivammathur/php/php@8.2

Altere a URL do source para um mirror confiável como https://www.php.net/distributions/ ou espelhos regionais.

Porta 9000 ocupada:

lsof -i :9000
kill -9 $(lsof -t -i:9000)

Ou modifique a porta no www.conf:

listen = 127.0.0.1:9001

Atualize correspondemente no Nginx.

Tags: nginx MariaDB PHP-FPM homebrew macOS

Publicado em 8-10 22:22