Todos os produtos
Search
Central de documentação

Elastic Compute Service:Deploy an LNMP stack

Última atualização: Jul 05, 2026

Instale e configure manualmente o Nginx, o MySQL e o PHP em uma instância ECS para executar sites dinâmicos, como WordPress ou Magento, com controle total sobre cada componente.

Arquitetura da solução

image
  1. O navegador do usuário envia uma solicitação HTTP para a porta 80 da instância ECS.

  2. O Nginx recebe e roteia as solicitações. Ele serve ativos estáticos, como HTML, CSS e imagens, diretamente e encaminha solicitações PHP (arquivos terminados em .php) para o PHP-FPM via FastCGI.

  3. O PHP-FPM executa o código PHP. Se o código precisar de acesso ao banco de dados, ele se conecta ao MySQL.

  4. O MySQL executa consultas SQL do script PHP e retorna os resultados.

  5. O PHP-FPM gera HTML a partir do resultado e o devolve ao Nginx, que envia a resposta ao navegador.

Procedimento

Recomendamos uma instância ECS com pelo menos 2 GiB de memória.

Etapa 1: Preparar a instância

Configure o acesso público, abra a porta 80 no grupo de segurança e atualize os pacotes do sistema.

  1. Configure o acesso público.

    Verifique se sua instância ECS possui um endereço IP público ou um Elastic IP Address (EIP). Consulte Ativar acesso público para uma instância.

  2. Adicione uma regra de grupo de segurança.

    No grupo de segurança da sua instância ECS, adicione uma regra de entrada para permitir tráfego TCP na porta 80. Consulte Adicionar uma regra de grupo de segurança.

  3. Atualize os pacotes do sistema.

    Alibaba Cloud Linux 3 / CentOS 8

    1. Faça logon na instância ECS.

      1. Acesse ECS console - Instances. No canto superior esquerdo, selecione a região e o grupo de recursos de destino.

      2. Na página de detalhes da instância, clique em Connect e selecione Workbench. Siga as instruções na tela para fazer logon.

    2. Atualize todos os pacotes.

      sudo dnf update -y

    Alibaba Cloud Linux 2 / CentOS 7

    1. Faça logon na instância ECS.

      1. Acesse ECS console - Instances. No canto superior esquerdo, selecione a região e o grupo de recursos de destino.

      2. Na página de detalhes da instância, clique em Connect e selecione Workbench. Siga as instruções na tela para fazer logon.

    2. Atualize todos os pacotes.

      sudo yum update -y

    Ubuntu

    1. Faça logon na instância ECS.

      1. Acesse ECS console - Instances. No canto superior esquerdo, selecione a região e o grupo de recursos de destino.

      2. Na página de detalhes da instância, clique em Connect e selecione Workbench. Siga as instruções na tela para fazer logon.

    2. Atualize todos os pacotes.

      sudo apt update -y && sudo apt upgrade -y
    3. Etapa 2: Instalar o Nginx

      1. Adicione o repositório do Nginx e instale-o.

        Alibaba Cloud Linux 3 / CentOS 8

        # Add the official Nginx repository.
        sudo tee /etc/yum.repos.d/nginx.repo <<-'EOF'
        [nginx-stable]
        name=nginx stable repo
        baseurl=https://nginx.org/packages/centos/8/$basearch/
        gpgcheck=1
        enabled=1
        gpgkey=https://nginx.org/keys/nginx_signing.key
        module_hotfixes=true
        EOF
        
        # Install Nginx.
        sudo dnf -y install nginx

        Alibaba Cloud Linux 2 / CentOS 7

        # Add the official Nginx repository.
        sudo tee /etc/yum.repos.d/nginx.repo <<-'EOF'
        [nginx-stable]
        name=nginx stable repo
        baseurl=https://nginx.org/packages/centos/7/$basearch/
        gpgcheck=1
        enabled=1
        gpgkey=https://nginx.org/keys/nginx_signing.key
        module_hotfixes=true
        EOF
        
        # Install Nginx.
        sudo yum -y install nginx

        Ubuntu

        # Install dependencies for Nginx.
        sudo apt install -y curl gnupg2 ca-certificates lsb-release ubuntu-keyring
        
        # Import the official Nginx signing key to verify package authenticity.
        curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
        
        # Set up the APT repository for Nginx.
        echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
        
        # Install Nginx.
        sudo apt update
        sudo apt install -y nginx
      2. Inicie o Nginx e ative-o na inicialização.

        O sinalizador enable --now inicia o serviço e o ativa na inicialização.
        sudo systemctl enable --now nginx
      3. Verifique se o Nginx está em execução. Execute curl http://127.0.0.1. Se a saída contiver o HTML da página de boas-vindas do Nginx, a instalação foi bem-sucedida.

      Etapa 3: Instalar o MySQL

      1. Instale o MySQL.

        Alibaba Cloud Linux 3 / CentOS 8

        # Alibaba Cloud Linux 3 requires compat-openssl10 for compatibility with older OpenSSL versions.
        if [ -f /etc/os-release ]; then
            . /etc/os-release
            if [ "$ID" = "alinux" ] && [ "$VERSION_ID" = "3" ]; then
                sudo yum install -y compat-openssl10
            fi
        fi
        
        # Add the YUM repository for MySQL 8.4.
        sudo rpm -Uvh https://repo.mysql.com/mysql84-community-release-el8-1.noarch.rpm
        
        # Install the MySQL service.
        sudo dnf install -y mysql-server

        Alibaba Cloud Linux 2 / CentOS 7

        # Add the repository for MySQL 8.4.
        sudo rpm -Uvh https://repo.mysql.com/mysql84-community-release-el7-1.noarch.rpm
        
        # Install the MySQL service.
        sudo yum install -y mysql-server

        Ubuntu

        # The default Ubuntu repository includes MySQL, so you can install it directly.
        # Ubuntu 20.04 and later versions install MySQL 8.0 by default.
        # Ubuntu 18.04 and earlier versions install MySQL 5.x by default.
        sudo apt install -y mysql-server
      2. Inicie o MySQL e ative-o na inicialização.

        Alibaba Cloud Linux / CentOS

        sudo systemctl enable --now mysqld

        Ubuntu

        sudo systemctl enable --now mysql
      3. Reforce a segurança da instalação.

        A configuração padrão do MySQL permite usuários anônimos e logon remoto como root. Execute o script de segurança para proteger a instalação.

        1. Obtenha a senha inicial do root.

          Esta etapa aplica-se apenas ao Alibaba Cloud Linux e ao CentOS. O Ubuntu usa autenticação baseada em socket para o root por padrão.

          # Extract and display the temporary password from the log.
          sudo grep 'temporary password' /var/log/mysqld.log
        2. Execute o script de segurança.

          Execute sudo mysql_secure_installation e siga as instruções:

          1. Redefina a senha do root: use a senha temporária para fazer logon e defina uma nova senha.

            Use uma senha forte com pelo menos 12 caracteres, incluindo letras maiúsculas, minúsculas, números e caracteres especiais.
          2. Remova usuários anônimos: insira Y.

          3. Desative o logon remoto como root: insira Y.

          4. Remova o banco de dados de teste: insira Y.

          5. Recarregue as tabelas de privilégios: insira Y.

      Etapa 4: Instalar o PHP

      Instale o PHP, o PHP-FPM e a extensão do MySQL.

      1. Adicione um repositório PHP e instale o PHP.

        Alibaba Cloud Linux 3 / CentOS 8

        # Add the Remi repository.
        cat > /etc/yum.repos.d/remi.repo << 'EOF'
        [remi]
        name=Remi\'s RPM Repository for Enterprise Linux 8 - x86_64
        baseurl=https://rpms.remirepo.net/enterprise/8/remi/x86_64/
        enabled=1
        gpgcheck=1
        gpgkey=https://rpms.remirepo.net/RPM-GPG-KEY-remi2024
        
        [remi-safe]
        name=Remi Safe Repository
        baseurl=https://rpms.remirepo.net/enterprise/8/safe/x86_64/
        enabled=1
        gpgcheck=1
        gpgkey=https://rpms.remirepo.net/RPM-GPG-KEY-remi2024
        EOF
        
        # Import the GPG key.
        rpm --import https://rpms.remirepo.net/RPM-GPG-KEY-remi2024
        
        # Install yum-utils.
        dnf install -y yum-utils
        
        # Install PHP, PHP-FPM, and the MySQL extension.
        dnf install -y php php-fpm php-mysqlnd

        Alibaba Cloud Linux 2 / CentOS 7

        # Install the Remi repository.
        sudo yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm
        
        # Install yum-utils and enable the PHP 8.2 repository.
        sudo yum install -y yum-utils
        sudo yum-config-manager --enable remi-php82
        
        # Install PHP, PHP-FPM, and the MySQL extension.
        sudo yum install -y php php-fpm php-mysqlnd

        Ubuntu

        # Install the tool for managing PPAs.
        sudo apt install -y software-properties-common
        
        # Add the ondrej/php PPA repository.
        sudo add-apt-repository -y ppa:ondrej/php
        
        # Install PHP 8.2, PHP-FPM, and the MySQL extension.
        sudo apt install -y php8.2 php8.2-fpm php8.2-mysql
      2. Inicie o PHP-FPM e ative-o na inicialização.

        Alibaba Cloud Linux / CentOS

        sudo systemctl enable --now php-fpm

        Ubuntu

        sudo systemctl enable --now php8.2-fpm

      Etapa 5: Configurar o Nginx para processar PHP

      Por padrão, o Nginx serve apenas arquivos estáticos. Configure-o para encaminhar solicitações .php ao PHP-FPM, garantindo que as páginas PHP sejam renderizadas em vez de baixadas.

      1. Faça backup do arquivo de configuração padrão do Nginx.

        sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak
      2. Obtenha o endereço de comunicação do serviço PHP-FPM.

        O Nginx usa esse endereço para encaminhar solicitações PHP ao PHP-FPM.

        Alibaba Cloud Linux / CentOS

        PHP_FPM_LISTEN=$(sudo sed -n 's/^\s*listen\s*=\s*//p' /etc/php-fpm.d/www.conf | head -n 1)
        echo "$PHP_FPM_LISTEN"

        Ubuntu

        PHP_FPM_LISTEN=$(sudo sed -n 's/^\s*listen\s*=\s*//p' /etc/php/8.2/fpm/pool.d/www.conf | head -n 1)
        echo "$PHP_FPM_LISTEN"
      3. Configure o Nginx para encaminhar solicitações .php ao PHP-FPM.

        Substitua <PHP_FPM_ADDRESS> pelo endereço de comunicação obtido na etapa anterior e execute o comando.

        • Se a saída for um caminho de arquivo (por exemplo, /run/php-fpm/www.sock), o serviço usa um socket Unix. O formato do endereço é unix:FILE_PATH, como unix:/run/php-fpm/www.sock.

        • Se a saída for um endereço IP e porta (por exemplo, 127.0.0.1:9000), o serviço usa um socket TCP. Use o endereço IP e a porta diretamente como endereço de comunicação.

        sudo tee /etc/nginx/conf.d/default.conf <<-'EOF'
        server {
            listen       80;
            server_name  localhost;
            root /usr/share/nginx/html;
        
            # Set the default index files.
            index index.php index.html index.htm;
        
            location / {
                try_files $uri $uri/ /index.php?$query_string;
            }
        
            # Forward .php requests to PHP-FPM.
            location ~ \.php$ {
                fastcgi_pass   <PHP_FPM_ADDRESS>;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include        fastcgi_params;
            }
        
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   /usr/share/nginx/html;
            }
        }
        EOF
      4. Teste o arquivo de configuração.

        sudo nginx -t
        • Se a saída contiver successful, a configuração está correta. Prossiga para a próxima etapa.

        • Se a saída contiver failed, verifique se você substituiu o endereço corretamente ou restaure o backup:

          sudo mv /etc/nginx/conf.d/default.conf.bak /etc/nginx/conf.d/default.conf
      5. Reinicie o Nginx para aplicar a nova configuração.

        sudo systemctl restart nginx
      6. Etapa 6: Verificar a pilha

        Crie arquivos de teste para confirmar que o Nginx encaminha solicitações PHP e que o PHP consegue se conectar ao MySQL.

        1. Verifique o processamento de PHP pelo Nginx.

          1. Crie um arquivo de teste: gere um arquivo com phpinfo() para exibir a configuração do PHP.

            echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/html/phpinfo.php
          2. Verifique no navegador: acesse http://<ECS_PUBLIC_IP>/phpinfo.php.

            • Sucesso: a página exibe detalhes do ambiente PHP.

            • Falha: a página exibe "File not found" ou o navegador baixa o arquivo.

          3. Limpe o arquivo de teste: exclua este arquivo após a verificação. A página phpinfo expõe informações confidenciais do servidor.

        2. Verifique a conectividade entre PHP e MySQL.

          Crie um script PHP para testar a conectividade com o banco de dados usando a extensão mysqlnd.

          1. Crie um banco de dados e um usuário. Faça logon no MySQL com a senha root definida na Etapa 3.

            sudo mysql -u root -p

            No prompt mysql>, crie um banco de dados chamado webapp, um usuário chamado webuser e conceda ao usuário todos os privilégios nesse banco de dados.

            CREATE DATABASE webapp;
            /* Replace <YourPassword> with a strong password. */
            CREATE USER 'webuser'@'localhost' IDENTIFIED BY '<YourPassword>';
            GRANT ALL PRIVILEGES ON webapp.* TO 'webuser'@'localhost';
            FLUSH PRIVILEGES;
            EXIT;
          2. Crie um arquivo de teste de conexão com o banco de dados. Substitua <YourPassword> pela senha do usuário da etapa anterior e execute o comando.

            sudo tee /usr/share/nginx/html/test.php <<-'EOF'
            <?php
            $servername = "localhost";
            $username = "webuser";
            $password = "<YourPassword>";
            $dbname = "webapp";
            // Create a connection
            $conn = new mysqli($servername, $username, $password, $dbname);
            // Check the connection
            if ($conn->connect_error) {
                die("Database connection failed: " . $conn->connect_error);
            }
            echo "Database connection successful!";
            ?>
            EOF
            • Verifique no navegador: acesse http://<ECS_PUBLIC_IP>/test.php. Se a página exibir Database connection successful!, a conexão funciona.

            • Limpe o arquivo de teste: este script contém credenciais de banco de dados em texto simples. Exclua-o imediatamente após o teste.

        Perguntas frequentes

        Timeout no navegador ou "site não pode ser alcançado"

        Esse erro geralmente indica um problema de rede. Solucione o problema na seguinte ordem:

        1. Grupo de segurança: verifique se o grupo de segurança permite tráfego de entrada na porta 80.

        2. Firewall: verifique se o firewall do sistema operacional (como firewalld ou ufw) permite tráfego na porta 80.

        3. Serviço Nginx: execute sudo systemctl status nginx para verificar se o Nginx está em execução. Caso contrário, verifique os logs com sudo journalctl -xeu nginx.

        4. Conflito de porta: verifique se a porta 80 está ocupada por outro aplicativo. Consulte Solucionar problemas de conectividade de porta para uma instância ECS.

        O navegador exibe "502 Bad Gateway"

        Esse erro significa que o Nginx não consegue se comunicar com o PHP-FPM.

        1. Serviço PHP-FPM: execute sudo systemctl status php-fpm (ou php8.2-fpm no Ubuntu) para verificar se o serviço está em execução.

        2. Caminho do socket: verifique se o caminho unix: na diretiva fastcgi_pass corresponde ao caminho listen na configuração do PHP-FPM.

        3. SELinux/AppArmor: no CentOS ou Alibaba Cloud Linux, o SELinux pode bloquear a comunicação entre Nginx e PHP-FPM. Execute sestatus e verifique /var/log/audit/audit.log em busca de negações.

        4. Permissões do socket: verifique se o usuário do Nginx tem acesso de leitura/gravação ao arquivo de socket.

        Ativar acesso remoto ao MySQL

        Por padrão, o MySQL proíbe logon remoto. Para ativá-lo, crie um usuário dedicado para acesso remoto em vez de usar o root. Consulte Adicionar um usuário para acesso remoto ao MySQL.