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
|
|
|
Procedimento
Recomendamos uma instância ECS com pelo menos 2 GiB de memória.
Etapa 1: Prepare a instância
Configure o acesso público, abra a porta 80 no grupo de segurança e atualize os pacotes do sistema.
-
Configure o acesso público.
Certifique-se de que sua instância ECS tenha um endereço IP público ou um Elastic IP Address (EIP). Consulte Enable public access for an instance.
-
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 o tráfego TCP na porta 80. Consulte Add a security group rule.
-
Atualize os pacotes do sistema.
Alibaba Cloud Linux 3 / CentOS 8
-
Acesse a instância ECS.
Acesse ECS console - Instances. No canto superior esquerdo, selecione a região e o grupo de recursos do recurso de destino.
Na página de detalhes da instância, clique em Connect e selecione Workbench. Siga as instruções na tela para acessar.
-
Atualize todos os pacotes.
sudo dnf update -y
Alibaba Cloud Linux 2 / CentOS 7
-
Acesse a instância ECS.
Acesse ECS console - Instances. No canto superior esquerdo, selecione a região e o grupo de recursos do recurso de destino.
Na página de detalhes da instância, clique em Connect e selecione Workbench. Siga as instruções na tela para acessar.
-
Atualize todos os pacotes.
sudo yum update -y
Ubuntu
-
Acesse a instância ECS.
Acesse ECS console - Instances. No canto superior esquerdo, selecione a região e o grupo de recursos do recurso de destino.
Na página de detalhes da instância, clique em Connect e selecione Workbench. Siga as instruções na tela para acessar.
-
Atualize todos os pacotes.
sudo apt update -y && sudo apt upgrade -y
-
Etapa 2: Instale o Nginx
-
Adicione o repositório do Nginx e instale o Nginx.
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 nginxAlibaba 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 nginxUbuntu
# 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 -
Inicie o Nginx e ative-o na inicialização.
A flag
enable --nowinicia o serviço e o ativa na inicialização.sudo systemctl enable --now nginx 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: Instale o MySQL
-
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-serverAlibaba 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-serverUbuntu
# 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 -
Inicie o MySQL e ative-o na inicialização.
Alibaba Cloud Linux / CentOS
sudo systemctl enable --now mysqldUbuntu
sudo systemctl enable --now mysql -
Aplique o hardening de segurança.
A configuração padrão do MySQL permite usuários anônimos e acesso remoto como root. Execute o script de segurança para aplicar hardening na instalação.
-
Obtenha a senha inicial de root.
Esta etapa se aplica apenas ao Alibaba Cloud Linux e 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 -
Execute o script de segurança.
Execute
sudo mysql_secure_installatione siga as instruções:-
Redefina a senha de root: Use a senha temporária para acessar 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.
Remova os usuários anônimos: Insira Y.
Desative o acesso remoto como root: Insira Y.
Remova o banco de dados de teste: Insira Y.
Recarregue as tabelas de privilégios: Insira Y.
-
-
Etapa 4: Instale o PHP
Instale o PHP, o PHP-FPM e a extensão do MySQL.
-
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-mysqlndAlibaba 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-mysqlndUbuntu
# 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 -
Inicie o PHP-FPM e ative-o na inicialização.
Alibaba Cloud Linux / CentOS
sudo systemctl enable --now php-fpmUbuntu
sudo systemctl enable --now php8.2-fpm
Etapa 5: Configure o Nginx para processar PHP
Por padrão, o Nginx entrega apenas arquivos estáticos. Configure-o para encaminhar solicitações .php ao PHP-FPM, de modo que as páginas PHP sejam renderizadas em vez de baixadas.
-
Faça o 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 -
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" -
Configure o Nginx para encaminhar solicitações
.phpao PHP-FPM.Substitua
<PHP_FPM_ADDRESS>pelo endereço de comunicação da 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, comounix:/run/php-fpm/www.sock.Se a saída for um endereço IP e uma 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 -
Teste o arquivo de configuração.
sudo nginx -tSe 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
-
Reinicie o Nginx para aplicar a nova configuração.
sudo systemctl restart nginx
Etapa 6: Verifique a stack
Crie arquivos de teste para confirmar se o Nginx encaminha solicitações PHP e se o PHP consegue se conectar ao MySQL.
-
Verifique o processamento de PHP pelo Nginx.
-
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 -
Verifique no navegador: Acesse
http://<ECS_PUBLIC_IP>/phpinfo.php.Sucesso: A página exibe os detalhes do ambiente PHP.
Falha: A página exibe "File not found" ou o navegador baixa o arquivo.
Limpe o arquivo de teste: Exclua este arquivo após a verificação. A página
phpinfoexpõe informações confidenciais do servidor.
-
-
Verifique a conectividade entre PHP e MySQL.
Crie um script PHP para testar a conectividade do banco de dados usando a extensão mysqlnd.
-
Crie um banco de dados e um usuário. Acesse o MySQL com a senha de
rootdefinida em Step 3.sudo mysql -u root -pNo prompt
mysql>, crie um banco de dados chamadowebapp, um usuário chamadowebusere conceda a ele 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; -
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!"; ?> EOFVerifique 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 do banco de dados em texto simples. Exclua-o imediatamente após o teste.
-
FAQ
Timeout no navegador ou "site can't be reached"
Esse erro geralmente indica um problema de rede. Solucione o problema na seguinte ordem:
Grupo de segurança: Verifique se o grupo de segurança permite tráfego de entrada na porta 80.
Firewall: Verifique se o firewall do SO (como
firewalldouufw) permite tráfego na porta 80.Serviço Nginx: Execute
sudo systemctl status nginxpara verificar se o Nginx está em execução. Caso contrário, verifique os logs comsudo journalctl -xeu nginx.Conflito de porta: Verifique se a porta 80 está ocupada por outro aplicativo. Consulte Troubleshoot port connectivity issues for an ECS instance.
O navegador exibe "502 Bad Gateway"
Esse erro significa que o Nginx não consegue se comunicar com o PHP-FPM.
Serviço PHP-FPM: Execute
sudo systemctl status php-fpm(ouphp8.2-fpmno Ubuntu) para verificar se o serviço está em execução.Caminho do socket: Verifique se o caminho
unix:na diretivafastcgi_passcorresponde ao caminholistenna configuração do PHP-FPM.SELinux/AppArmor: No CentOS ou Alibaba Cloud Linux, o SELinux pode bloquear a comunicação entre o Nginx e o PHP-FPM. Execute
sestatuse verifique se há negações em/var/log/audit/audit.log.Permissões do socket: Verifique se o usuário do Nginx tem acesso de leitura e gravação ao arquivo de socket.
Ative o acesso remoto ao MySQL
Por padrão, o MySQL proíbe acesso remoto. Para ativá-lo, crie um usuário dedicado para acesso remoto em vez de usar o root. Consulte Add a user for remote MySQL access.