Introdução
À medida que sua aplicação ou site cresce, pode chegar um momento em que você ultrapassa a configuração atual do seu servidor. Se você estiver hospedando seu servidor web e banco de dados na mesma máquina, pode ser uma boa ideia separar essas duas funções para que cada uma possa operar em seu próprio hardware e compartilhar a carga de responder às solicitações de seus visitantes.
Neste guia, você irá configurar um servidor de banco de dados MySQL remoto ao qual sua aplicação web pode se conectar. O WordPress é usado como exemplo para ter algo para trabalhar, mas a técnica é amplamente aplicável a qualquer aplicação com suporte do MySQL.
Pré-requisitos
Antes de começar este tutorial, você precisará:
- Dois servidores Ubuntu 20.04. Cada um deve ter um usuário não-root com privilégios sudo e firewall UFW ativado, conforme descrito em nosso tutorial Configuração Inicial do Servidor com Ubuntu 20.04. Um desses servidores irá hospedar seu backend MySQL e será referido como o servidor de banco de dados ao longo deste guia. O outro se conectará ao seu servidor de banco de dados remotamente e atuará como seu servidor web; da mesma forma, será referido como o servidor web ao longo deste guia.
- No seu servidor de banco de dados: MySQL instalado. Siga Como Instalar o MySQL no Ubuntu 20.04 para configurar isso.
- No seu servidor web: Nginx e PHP instalados. O nosso tutorial Como Instalar o Linux, Nginx, MySQL, PHP (stack LEMP) no Ubuntu 20.04 irá orientá-lo através do processo, mas note que você deve pular o Passo 2 deste tutorial, que se concentra na instalação do MySQL, pois você irá instalar o MySQL no seu servidor de banco de dados.
- Opcionalmente (mas altamente recomendado), certificados TLS/SSL do Let’s Encrypt instalados no seu servidor web. Você precisará comprar um nome de domínio e ter registros DNS configurados para o seu servidor, mas os próprios certificados são gratuitos. O nosso guia Como Segurar o Nginx com Let’s Encrypt no Ubuntu 20.04 irá mostrar-lhe como obter estes certificados.
Passo 1 — Configurando o MySQL para Ouvir Conexões Remotas no Servidor de Banco de Dados
Ter os dados armazenados em um servidor separado é uma boa maneira de expandir de forma gradual após atingir o limite de desempenho de uma configuração de uma única máquina. Também fornece a estrutura básica necessária para balanceamento de carga e expandir sua infraestrutura ainda mais em um momento posterior. Após instalar o MySQL seguindo o tutorial pré-requisito, você precisará alterar alguns valores de configuração para permitir conexões de outros computadores.
A maioria das alterações de configuração do servidor MySQL pode ser feita no arquivo mysqld.cnf
, que é armazenado no diretório /etc/mysql/mysql.conf.d/
por padrão. Abra este arquivo no seu servidor de banco de dados com privilégios de root no seu editor preferido. Este exemplo usa nano
:
Este arquivo é dividido em seções denotadas por rótulos entre colchetes ([
e ]
). Procure pela seção rotulada mysqld
:
. . .
[mysqld]
. . .
Dentro desta seção, procure por um parâmetro chamado bind-address
. Isso informa ao software do banco de dados em qual endereço de rede ouvir conexões.
Por padrão, isso está definido como 127.0.0.1
, o que significa que o MySQL está configurado para apenas procurar por conexões locais. Você precisa alterar isso para referenciar um endereço IP externo onde seu servidor pode ser alcançado.
Se ambos os seus servidores estiverem em um datacenter com capacidades de rede privada, use o IP da rede privada do seu servidor de banco de dados. Caso contrário, você pode usar seu endereço IP público:
[mysqld]
. . .
bind-address = db_server_ip
Como você se conectará ao seu banco de dados pela internet, é recomendável que você exija conexões criptografadas para manter seus dados seguros. Se você não criptografar sua conexão MySQL, qualquer pessoa na rede poderá interceptar informações sensíveis entre seus servidores web e de banco de dados. Para criptografar conexões MySQL, adicione a seguinte linha após a linha bind-address
que você acabou de atualizar:
[mysqld]
. . .
require_secure_transport = on
. . .
Salve e feche o arquivo quando terminar. Se estiver usando o nano
, faça isso pressionando CTRL + X
, Y
, e então ENTER
.
Para que as conexões SSL funcionem, você precisará criar algumas chaves e certificados. O MySQL vem com um comando que configurará isso automaticamente. Execute o seguinte comando, que cria os arquivos necessários. Também os torna legíveis pelo servidor MySQL especificando o UID do usuário mysql:
Para forçar o MySQL a atualizar sua configuração e ler as novas informações SSL, reinicie o banco de dados:
Para confirmar que o servidor está agora ouvindo na interface externa, execute o seguinte comando ss
:
Outputtcp LISTEN 0 70 127.0.0.1:33060 0.0.0.0:* users:(("mysqld",pid=4053,fd=22))
tcp LISTEN 0 151 db_server_ip:3306 0.0.0.0:* users:(("mysqld",pid=4053,fd=24))
O comando ss
imprime estatísticas sobre o sistema de rede do seu servidor. Esta saída mostra que um processo chamado mysqld
está conectado ao db_server_ip
na porta 3306
, a porta padrão do MySQL, confirmando que o servidor está ouvindo na interface apropriada.
Em seguida, abra essa porta no firewall para permitir o tráfego:
Essas são todas as alterações de configuração que você precisa fazer no MySQL. Em seguida, você irá configurar um banco de dados e alguns perfis de usuário, dos quais você usará um para acessar o servidor remotamente.
Passo 2 — Configurando um Banco de Dados do WordPress e Credenciais Remotas no Servidor de Banco de Dados
Mesmo que o MySQL agora esteja ouvindo em um endereço IP externo, atualmente não há usuários ou bancos de dados configurados para acesso remoto. Crie um banco de dados para o WordPress e um par de usuários que podem acessá-lo.
Comece conectando-se ao MySQL como usuário root do MySQL:
Observação: Se você tiver a autenticação por senha habilitada, conforme descrito no Passo 3 do tutorial prévio do MySQL, você precisará usar o seguinte comando para acessar o shell do MySQL:
Após executar este comando, será solicitada a senha root do seu MySQL e, após inseri-la, você receberá um novo prompt mysql>
.
A partir do prompt do MySQL, crie um banco de dados que o WordPress usará. Pode ser útil dar a este banco de dados um nome reconhecível para que você possa identificá-lo facilmente mais tarde. Aqui, é nomeado wordpress
:
Agora que você criou seu banco de dados, você precisa criar um par de usuários. Crie um usuário exclusivamente local, bem como um usuário remoto vinculado ao endereço IP do servidor web.
Primeiro, crie seu usuário local, local_db_user, e faça com que esta conta apenas corresponda a tentativas de conexão locais usando localhost na declaração:
Em seguida, conceda a esta conta acesso total ao banco de dados wordpress
:
Este usuário agora pode executar qualquer operação no banco de dados para o WordPress, mas esta conta não pode ser usada remotamente, pois só corresponde a conexões da máquina local. Com isso em mente, crie uma conta complementar que corresponderá exclusivamente a conexões do seu servidor web. Para isso, você precisará do endereço IP do seu servidor web.
Por favor, note que você deve usar um endereço IP que utilize a mesma rede que você configurou no arquivo mysqld.cnf
. Isso significa que se você especificou um IP de rede privada no arquivo mysqld.cnf
, você precisará incluir o IP privado do seu servidor web nos dois comandos seguintes. Se você configurou o MySQL para usar a internet pública, você deve corresponder isso com o endereço IP público do servidor web.
Depois de criar sua conta remota, dê a ela os mesmos privilégios que seu usuário local:
Por último, atualize os privilégios para que o MySQL comece a usá-los:
Em seguida, saia do prompt do MySQL digitando:
Agora que você configurou um novo banco de dados e um usuário habilitado para acesso remoto, pode prosseguir para testar se consegue se conectar ao banco de dados a partir do seu servidor web.
Passo 3 — Testando Conexões Remotas e Locais
Antes de continuar, é melhor verificar se você pode se conectar ao seu banco de dados tanto da máquina local — seu servidor de banco de dados — quanto do seu servidor web.
Primeiro, teste a conexão local a partir do seu servidor de banco de dados tentando fazer login com sua nova conta:
Quando solicitado, insira a senha que você configurou para esta conta.
Se receber um prompt do MySQL, então a conexão local foi bem-sucedida. Você pode sair novamente digitando:
Em seguida, faça login no seu servidor web para testar as conexões remotas:
Você precisará instalar algumas ferramentas de cliente para MySQL no seu servidor web para acessar o banco de dados remoto. Primeiro, atualize o cache de pacotes local se ainda não o fez recentemente:
Em seguida, instale as utilidades de cliente do MySQL:
Depois disso, conecte-se ao seu servidor de banco de dados usando a seguinte sintaxe:
Mais uma vez, você deve garantir que está usando o endereço IP correto para o servidor de banco de dados. Se você configurou o MySQL para ouvir na rede privada, insira o IP da rede privada do seu banco de dados. Caso contrário, insira o endereço IP público do seu servidor de banco de dados.
Você será solicitado a fornecer a senha para sua conta remote_user. Após inseri-la e se tudo estiver funcionando como esperado, você será levado ao prompt do MySQL. Verifique se a conexão está usando SSL com o seguinte comando:
Se a conexão estiver realmente usando SSL, a linha SSL:
indicará isso, como mostrado aqui:
Output--------------
mysql Ver 8.0.29-0ubuntu0.20.04.2 for Linux on x86_64 ((Ubuntu))
Connection id: 14
Current database:
Current user: remote_user@web_server_ip
SSL: Cipher in use is TLS_AES_256_GCM_SHA384
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 8.0.29-0ubuntu0.20.04.2 (Ubuntu)
Protocol version: 10
Connection: db_server_ip via TCP/IP
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4
TCP port: 3306
Binary data as: Hexadecimal
Uptime: 1 hour 8 min 28 sec
Threads: 2 Questions: 69 Slow queries: 0 Opens: 206 Flush tables: 3 Open tables: 125 Queries per second avg: 0.016
--------------
Após verificar que você pode se conectar remotamente, saia do prompt:
Você verificou o acesso local e o acesso do servidor web, mas não verificou se outras conexões serão recusadas. Para uma verificação adicional, tente fazer o mesmo de um terceiro servidor para o qual você não configurou uma conta de usuário específica para garantir que esse outro servidor não tenha acesso concedido.
Observe que, antes de executar o seguinte comando para tentar a conexão, você pode precisar instalar os utilitários de cliente MySQL como fez anteriormente:
Isso não deve ser concluído com sucesso e deve retornar um erro semelhante a este:
OutputERROR 1130 (HY000): Host '203.0.113.12' is not allowed to connect to this MySQL server
Isso é esperado, já que você não criou um usuário MySQL que tenha permissão para se conectar a partir deste servidor, e também desejado, já que você quer ter certeza de que seu servidor de banco de dados negará o acesso de usuários não autorizados ao seu servidor MySQL.
Após testar com sucesso sua conexão remota, você pode prosseguir com a instalação do WordPress no seu servidor web.
Passo 4 — Preparando o Servidor Web para a Instalação do WordPress
Se você seguiu os tutoriais pré-requisitos, deverá ter tanto o Nginx quanto o PHP instalados. O WordPress, e muitos de seus plugins, dependem de várias extensões adicionais do PHP. Antes de instalar o WordPress no seu servidor web, prepare o servidor instalando algumas dessas extensões do PHP para uso com o WordPress:
Nota: Cada plugin do WordPress possui seu próprio conjunto de requisitos. Alguns podem exigir a instalação de pacotes adicionais de extensões do PHP. Verifique a documentação do seu plugin para descobrir seus requisitos de PHP. Se estiverem disponíveis, eles podem ser instalados com o apt, como no exemplo anterior.
Ao terminar de instalar as extensões, reinicie o processo PHP-FPM para que o processador PHP em execução possa aproveitar os recursos recém-instalados:
Em seguida, faça algumas alterações nos arquivos de bloco do servidor Nginx. Com base nos tutoriais pré-requisitos, você deve ter um arquivo de configuração para o seu site no diretório /etc/nginx/sites-available/
. Ele também deve estar configurado para responder ao nome de domínio ou endereço IP do seu servidor e protegido por um certificado TLS/SSL. /etc/nginx/sites-available/seu_domínio
é usado como exemplo de diretório aqui. Substitua o caminho do seu arquivo de configuração, conforme necessário.
Além disso, /var/www/your_domain
será utilizado como o diretório raiz nesta instalação de exemplo do WordPress. Novamente, use o diretório de documentos especificado na sua própria configuração.
Nota: É possível que você esteja utilizando a configuração padrão /etc/nginx/sites-available/default
com /var/www/html
como seu diretório de documentos. Isso é aceitável se você for hospedar apenas um site neste servidor. Caso contrário, é melhor dividir a configuração necessária em partes lógicas, um arquivo por site.
Abra o arquivo do bloco do servidor do seu site com o editor de sua preferência. Este exemplo utiliza o nano
:
Dentro deste bloco de servidor, adicione alguns blocos de localização. Comece criando blocos de localização que correspondam exatamente às solicitações para /favicon.ico
e /robots.txt
, das quais você não deseja registrar solicitações.
Você fará isso usando uma localização de expressão regular para corresponder a quaisquer solicitações de arquivos estáticos, desativar o registro para essas solicitações e marcá-las como altamente armazenáveis em cache, já que esses são recursos normalmente caros de servir. Você pode ajustar esta lista de arquivos estáticos para conter quaisquer outras extensões de arquivo que seu site possa usar:
server {
server_name your_domain www.your_domain;
root /var/www/your_domain;
index index.html index.htm index.php;
location = /favicon.ico { log_not_found off; access_log off; }
location = /robots.txt { log_not_found off; access_log off; allow all; }
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
expires max;
log_not_found off;
}
. . .
}
Dentro do bloco de localização location /
existente, você pode ajustar a lista try_files
. Primeiro, comente a configuração padrão adicionando um sustenido (#
) na linha inicial. Em seguida, adicione as seguintes linhas:
server {
. . .
location / {
#try_files $uri $uri/ =404;
try_files $uri $uri/ /index.php$is_args$args;
}
. . .
}
Com esta nova linha na sua configuração, em vez de retornar um erro 404 como opção padrão, o controle é passado para o arquivo index.php
com os argumentos da solicitação.
No seu conjunto, a parte superior do seu arquivo deve ser semelhante a isto:
server {
server_name your_domain www.your_domain;
root /var/www/your_domain;
index index.html index.htm index.php;
location = /favicon.ico { log_not_found off; access_log off; }
location = /robots.txt { log_not_found off; access_log off; allow all; }
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
expires max;
log_not_found off;
}
location / {
# try_files $uri $uri/ =404;
try_files $uri $uri/ /index.php$is_args$args;
}
...
}
Quando terminar, salve e feche o arquivo.
Verifique a sua configuração por erros de sintaxe digitando:
Se não forem relatados erros, recarregue o Nginx digitando:
Depois de preparar o seu servidor web, está agora pronto para instalar o WordPress.
Passo 5 – Instalando o WordPress no Servidor Web
Para demonstrar as capacidades do seu novo servidor MySQL remoto, você passará pelo processo de instalação e configuração do WordPress — o popular sistema de gerenciamento de conteúdo — no seu servidor web. Com o software do servidor configurado, você pode baixar o WordPress. Por razões de segurança, é sempre recomendado obter a versão mais recente do WordPress diretamente no website do projeto.
Primeiro, mude para um diretório gravável (um temporário como /tmp
é recomendado):
Isto muda o seu diretório de trabalho para a pasta temporária. Em seguida, insira o seguinte comando para baixar a versão mais recente do WordPress como um arquivo compactado:
Extraia o arquivo compactado para criar a estrutura de diretórios do WordPress:
Você estará movendo esses arquivos para a sua raiz de documentos momentaneamente, mas antes de fazer isso, copie o arquivo de configuração de exemplo para o nome de arquivo que o WordPress lê:
Copie todo o conteúdo do diretório para a raiz do seu documento. A bandeira -a
garantirá que suas permissões sejam mantidas, e um ponto no final do seu diretório de origem para indicar que tudo dentro do diretório deve ser copiado (incluindo arquivos ocultos):
Com seus arquivos no lugar, atribua a propriedade ao usuário e grupo www-data. Este é o usuário e grupo que o Nginx executa, e o Nginx precisará ser capaz de ler e escrever arquivos do WordPress para servir o site e realizar atualizações automáticas:
Agora, seus arquivos do WordPress estão no diretório raiz do servidor e têm a propriedade correta. Agora, você está pronto para configurar o WordPress.
Passo 6 — Configurando o Arquivo de Configuração do WordPress
Ao abrir o arquivo de configuração do WordPress, você começará ajustando algumas chaves secretas para fornecer alguma segurança para sua instalação. O WordPress fornece um gerador seguro para esses valores, para que você não precise criar valores por conta própria. Eles são usados apenas internamente, então não prejudicará a usabilidade ter valores complexos e seguros aqui.
Para obter valores seguros do gerador de chaves secretas do WordPress, digite:
Você receberá valores únicos que se assemelham à saída semelhante ao seguinte:
Aviso! É importante que você solicite seus próprios valores exclusivos cada vez. Não copie os valores mostrados aqui!
Outputdefine('AUTH_KEY', 'L4|2Yh(giOtMLHg3#] DO NOT COPY THESE VALUES %G00o|te^5YG@)');
define('SECURE_AUTH_KEY', 'DCs-k+MwB90/-E(=!/ DO NOT COPY THESE VALUES +WBzDq:7U[#Wn9');
define('LOGGED_IN_KEY', '*0kP!|VS.K=;#fPMlO DO NOT COPY THESE VALUES +&[%8xF*,18c @');
define('NONCE_KEY', 'fmFPF?UJi&(j-{8=$- DO NOT COPY THESE VALUES CCZ?Q+_~1ZU~;G');
define('AUTH_SALT', '@qA7f}2utTEFNdnbEa DO NOT COPY THESE VALUES t}Vw+8=K%20s=a');
define('SECURE_AUTH_SALT', '%BW6s+d:7K?-`C%zw4 DO NOT COPY THESE VALUES 70U}PO1ejW+7|8');
define('LOGGED_IN_SALT', '-l>F:-dbcWof%4kKmj DO NOT COPY THESE VALUES 8Ypslin3~d|wLD');
define('NONCE_SALT', '4J(<`4&&F (WiK9K#] DO NOT COPY THESE VALUES ^ZikS`es#Fo:V6');
Estas são linhas de configuração que você pode colar diretamente no seu arquivo de configuração para definir chaves seguras. Copie a saída que você recebeu agora.
Abra o arquivo de configuração do WordPress:
Encontre a seção que contém os valores de exemplo para essas configurações:
. . .
define('AUTH_KEY', 'put your unique phrase here');
define('SECURE_AUTH_KEY', 'put your unique phrase here');
define('LOGGED_IN_KEY', 'put your unique phrase here');
define('NONCE_KEY', 'put your unique phrase here');
define('AUTH_SALT', 'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT', 'put your unique phrase here');
define('NONCE_SALT', 'put your unique phrase here');
. . .
Apague essas linhas e cole os valores que você copiou da linha de comando:
. . .
define('AUTH_KEY', 'VALUES COPIED FROM THE COMMAND LINE');
define('SECURE_AUTH_KEY', 'VALUES COPIED FROM THE COMMAND LINE');
define('LOGGED_IN_KEY', 'VALUES COPIED FROM THE COMMAND LINE');
define('NONCE_KEY', 'VALUES COPIED FROM THE COMMAND LINE');
define('AUTH_SALT', 'VALUES COPIED FROM THE COMMAND LINE');
define('SECURE_AUTH_SALT', 'VALUES COPIED FROM THE COMMAND LINE');
define('LOGGED_IN_SALT', 'VALUES COPIED FROM THE COMMAND LINE');
define('NONCE_SALT', 'VALUES COPIED FROM THE COMMAND LINE');
. . .
Em seguida, modifique algumas das configurações de conexão com o banco de dados no início do arquivo. Você terá que ajustar o nome do banco de dados, o usuário do banco de dados e a senha associada configurada dentro do MySQL.
Insira as informações de conexão para o seu banco de dados remoto. Lembre-se de usar o mesmo endereço IP e credenciais que você usou no teste do banco de dados remoto anteriormente:
. . .
/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');
/** MySQL database username */
define('DB_USER', 'remote_user');
/** MySQL database password */
define('DB_PASSWORD', 'remote_user_password');
/** MySQL hostname */
define('DB_HOST', 'db_server_ip');
. . .
E finalmente, seguindo a linha define( 'DB_COLLATE', '' );
, adicione esta linha destacada que diz ao WordPress para usar uma conexão SSL com seu banco de dados MySQL:
...
define( 'DB_COLLATE', '' );
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
...
Salve e feche o arquivo.
Com sua configuração configurada, o WordPress está instalado e você está pronto para passar pelo seu processo de configuração baseado na web.
Passo 7 — Configurando o WordPress através da Interface Web
O WordPress possui um processo de configuração baseado na web. Conforme você avança nele, serão feitas algumas perguntas e instaladas todas as tabelas necessárias no seu banco de dados. Aqui, você realizará os passos iniciais para configurar o WordPress, que pode ser usado como ponto de partida para construir seu próprio site personalizado que utilize um backend de banco de dados remoto.
Acesse o nome de domínio (ou endereço IP público) associado ao seu servidor web juntamente com um /wp-admin
ao final:
http://your_domain.com/wp-admin
Você será solicitado a selecionar o idioma que deseja utilizar:
Em seguida, você chegará à página principal de configuração.
Selecione um nome para o seu site WordPress e escolha um nome de usuário. É recomendável escolher algo único e evitar nomes de usuário comuns como “admin” por motivos de segurança. Uma senha forte é gerada automaticamente. Salve esta senha ou escolha uma senha forte alternativa.
Informe seu endereço de e-mail e selecione se deseja desencorajar os mecanismos de busca de indexar seu site:
Depois de enviar suas informações, você precisará fazer login na interface de administração do WordPress usando a conta que acabou de criar. Em seguida, você será levado ao painel onde poderá personalizar seu novo site WordPress.
Conclusão
Ao seguir este tutorial, você configurou um banco de dados MySQL para aceitar conexões protegidas por SSL de uma instalação remota do WordPress. Os comandos e técnicas usados neste guia são aplicáveis a qualquer aplicativo da web escrito em qualquer linguagem de programação, mas os detalhes específicos de implementação podem diferir. Consulte a documentação do seu aplicativo ou banco de dados para obter mais informações.