Guia
Como migrar WordPress para VPS com segurança
Migre WordPress da hospedagem compartilhada para VPS com backup, banco, arquivos, Nginx, SSL, DNS e testes seguros, sem perder dados do site.
O que você vai aprender
Tempo estimado: 45-60 minutos. Neste guia, você vai migrar um WordPress de uma hospedagem compartilhada para uma VPS Ubuntu 24.04 com Nginx, PHP-FPM e MariaDB. A ideia é reduzir downtime, preservar arquivos, manter o banco íntegro e testar tudo antes de apontar o DNS. Se você ainda está planejando a infraestrutura, leia também o guia sobre VPS para WordPress para entender recursos comuns de CPU, RAM e armazenamento.
Você vai aprender a:
- Preparar uma VPS limpa para receber WordPress com Nginx, PHP e MariaDB.
- Fazer backup seguro dos arquivos e do banco na hospedagem compartilhada.
- Transferir o conteúdo usando SSH, SCP ou rsync, com verificações simples.
- Criar banco e usuário MySQL com permissões corretas.
- Ajustar wp-config.php, permissões e virtual host do Nginx.
- Testar o site pela máquina local antes da troca oficial de DNS.
- Ativar HTTPS com Certbot e diagnosticar erros comuns após a migração.
O guia usa o domínio fictício de laboratório wp-migracao.test para comandos locais e exemplos. Na sua migração real, substitua esse valor pelo domínio do site. Antes de qualquer mudança pública, mantenha uma cópia completa fora da VPS. Migração é uma operação reversível quando você preserva o backup original e evita alterar DNS antes dos testes.
Pré-requisitos
Você precisa de acesso administrativo à hospedagem compartilhada atual, acesso SSH root ou sudo na VPS e um domínio sob seu controle. Também precisa conseguir exportar o banco pelo phpMyAdmin, painel da hospedagem ou linha de comando. Se a hospedagem compartilhada não oferece SSH, use o Gerenciador de Arquivos do painel para compactar o diretório do WordPress e baixar o .zip ou .tar.gz para seu computador.
Na VPS, este guia assume Ubuntu 24.04. Em Debian os comandos são quase iguais. Em AlmaLinux ou Rocky Linux, os pacotes mudam para dnf, o serviço PHP tem outro nome e o caminho do Nginx pode variar. Execute primeiro uma checagem básica:
lsb_release -a
whoami
ip -4 addr show | grep inet
Saída esperada em uma VPS Ubuntu:
Distributor ID: Ubuntu
Description: Ubuntu 24.04 LTS
Release: 24.04
root
inet 203.0.113.45/24 brd 203.0.113.255 scope global eth0
Você também precisa de um cliente SSH no seu computador. No Linux e macOS ele já costuma existir. No Windows, use PowerShell, Windows Terminal ou WSL. Para editar arquivos na VPS, o guia usa nano, mas você pode usar vim se preferir. Antes de começar, anote três dados: IP público da VPS, nome do banco antigo e prefixo das tabelas do WordPress. Se você ainda está comparando opções, o conteúdo sobre melhor VPS para WordPress ajuda a alinhar capacidade e orçamento.
Passo 1: Preparar a VPS e confirmar o ambiente
Comece atualizando a VPS e instalando os pacotes necessários. Esse passo não altera seu site antigo, apenas prepara o novo servidor. Use uma janela SSH estável e mantenha o terminal aberto até o final. Se você acabou de contratar a VPS, confirme se consegue entrar por SSH antes de configurar qualquer serviço.
sudo apt update
sudo apt install -y nginx mariadb-server php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-zip php-intl unzip rsync certbot python3-certbot-nginx
Você deve ver uma saída parecida com esta:
Reading package lists... Done
Building dependency tree... Done
nginx is already the newest version
mariadb-server is already the newest version
php-fpm is already the newest version
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Agora verifique se Nginx, MariaDB e PHP-FPM estão ativos. Esses comandos são seguros e não fazem alterações destrutivas.
systemctl status nginx --no-pager
systemctl status mariadb --no-pager
systemctl status php8.3-fpm --no-pager
Saída esperada:
Active: active (running)
Crie o diretório onde o WordPress será colocado. O exemplo usa wp-migracao.test, mas você deve usar o domínio real ou um nome de pasta claro.
sudo mkdir -p /var/www/wp-migracao.test/public
sudo chown -R $USER:www-data /var/www/wp-migracao.test
sudo chmod -R 775 /var/www/wp-migracao.test
Verifique:
ls -ld /var/www/wp-migracao.test /var/www/wp-migracao.test/public
Saída esperada:
drwxrwxr-x 3 ubuntu www-data 4096 Aug 10 10:20 /var/www/wp-migracao.test
drwxrwxr-x 2 ubuntu www-data 4096 Aug 10 10:20 /var/www/wp-migracao.test/public
Se o usuário mostrado for root, ajuste com chown novamente. Isso evita problemas futuros de upload de mídia, atualização de plugins e cache.
Passo 2: Fazer backup completo na hospedagem compartilhada
Antes de copiar qualquer coisa, faça backup completo do site antigo. Esse é o ponto de retorno caso algo saia errado. Não apague arquivos na hospedagem compartilhada durante a migração. Você vai apenas compactar e exportar. Se a hospedagem tem SSH, entre nela e descubra o caminho do WordPress:
pwd
ls -la
find . -maxdepth 2 -name wp-config.php
Saída comum em hospedagem compartilhada:
/home/cliente
./public_html/wp-config.php
Entre na pasta e compacte os arquivos. O comando abaixo cria um arquivo .tar.gz sem remover nada. Ele não é destrutivo.
cd ~/public_html
tar -czf ~/wordpress-files-$(date +%F).tar.gz .
ls -lh ~/wordpress-files-$(date +%F).tar.gz
Saída esperada:
-rw-r--r-- 1 cliente cliente 842M Aug 10 10:35 /home/cliente/wordpress-files-2026-08-10.tar.gz
Agora exporte o banco. Se você tem acesso ao wp-config.php, leia as credenciais sem expor a senha em logs públicos:
grep -E "DB_NAME|DB_USER|DB_HOST|table_prefix" wp-config.php
Saída esperada:
define( 'DB_NAME', 'cliente_wp' );
define( 'DB_USER', 'cliente_user' );
define( 'DB_HOST', 'localhost' );
$table_prefix = 'wp_';
Se o provedor permite mysqldump, exporte assim. Digite a senha quando solicitado:
mysqldump -u cliente_user -p cliente_wp > ~/wordpress-db-$(date +%F).sql
ls -lh ~/wordpress-db-$(date +%F).sql
Saída esperada:
Enter password:
-rw-r--r-- 1 cliente cliente 96M Aug 10 10:38 /home/cliente/wordpress-db-2026-08-10.sql
Se não houver SSH, exporte pelo phpMyAdmin usando formato SQL e compactação gzip. Depois baixe o arquivo dos arquivos e o dump do banco para seu computador. Confirme o tamanho dos backups. Arquivo com zero bytes indica falha.
Passo 3: Transferir arquivos e banco para a VPS
Com os backups criados, copie tudo para a VPS. Se você fez o backup direto na hospedagem compartilhada e ela aceita conexão SSH de saída, use scp a partir da VPS ou do seu computador. O caminho mais simples é baixar os arquivos para seu computador e depois enviar para a VPS. No exemplo abaixo, os arquivos estão na pasta Downloads do seu computador.
scp ~/Downloads/wordpress-files-2026-08-10.tar.gz [email protected]:/tmp/
scp ~/Downloads/wordpress-db-2026-08-10.sql [email protected]:/tmp/
Saída esperada:
wordpress-files-2026-08-10.tar.gz 100% 842MB 35.1MB/s 00:24
wordpress-db-2026-08-10.sql 100% 96MB 28.4MB/s 00:04
Entre na VPS e confira integridade básica. Se você gerou sha256sum na origem, compare os hashes. Se não gerou, pelo menos confirme tamanho e tipo dos arquivos.
ssh [email protected]
ls -lh /tmp/wordpress-files-2026-08-10.tar.gz /tmp/wordpress-db-2026-08-10.sql
file /tmp/wordpress-files-2026-08-10.tar.gz
head -n 5 /tmp/wordpress-db-2026-08-10.sql
Saída esperada:
-rw-r--r-- 1 ubuntu ubuntu 842M Aug 10 10:45 /tmp/wordpress-files-2026-08-10.tar.gz
-rw-r--r-- 1 ubuntu ubuntu 96M Aug 10 10:45 /tmp/wordpress-db-2026-08-10.sql
/tmp/wordpress-files-2026-08-10.tar.gz: gzip compressed data
-- MySQL dump
-- Host: localhost
Extraia os arquivos no diretório preparado. Atenção: este comando escreve dentro de /var/www/wp-migracao.test/public. Se essa pasta já tem conteúdo de outro site, pare e faça backup antes. Para uma VPS nova, pode seguir.
tar -xzf /tmp/wordpress-files-2026-08-10.tar.gz -C /var/www/wp-migracao.test/public
ls -la /var/www/wp-migracao.test/public | head
Saída esperada:
-rw-r--r-- 1 ubuntu www-data 405 index.php
-rw-r--r-- 1 ubuntu www-data 19915 license.txt
drwxr-xr-x 9 ubuntu www-data 4096 wp-admin
drwxr-xr-x 6 ubuntu www-data 4096 wp-content
-rw-r--r-- 1 ubuntu www-data 3336 wp-config.php
Se você não vir wp-admin, wp-content e wp-includes, provavelmente compactou a pasta errada. Volte ao backup e ajuste antes de continuar.
Passo 4: Criar banco, usuário e importar o MySQL
Agora crie um banco novo na VPS. Use uma senha forte e exclusiva. O comando abaixo usa MariaDB local. Ele cria o banco wp_migracao, o usuário wp_user e concede permissões apenas nesse banco.
sudo mariadb
No prompt do MariaDB, execute:
CREATE DATABASE wp_migracao CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wp_user'@'localhost' IDENTIFIED BY 'Troque-Esta-Senha-Longa-2026!';
GRANT ALL PRIVILEGES ON wp_migracao.* TO 'wp_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Saída esperada:
Query OK, 1 row affected
Query OK, 0 rows affected
Bye
Importe o dump. Esse comando pode demorar em bancos grandes. Não feche a sessão durante a importação.
mysql -u wp_user -p wp_migracao < /tmp/wordpress-db-2026-08-10.sql
A saída normal é silenciosa. Verifique contando tabelas:
mysql -u wp_user -p -e "SELECT COUNT(*) AS tabelas FROM information_schema.tables WHERE table_schema='wp_migracao';"
Saída esperada:
+---------+
| tabelas |
+---------+
| 18 |
+---------+
Edite o wp-config.php para apontar ao novo banco. Antes, faça backup local do arquivo atual. Isso permite desfazer alterações rapidamente.
cd /var/www/wp-migracao.test/public
cp wp-config.php wp-config.php.bak-$(date +%F-%H%M)
nano wp-config.php
Altere estas linhas:
define( 'DB_NAME', 'wp_migracao' );
define( 'DB_USER', 'wp_user' );
define( 'DB_PASSWORD', 'Troque-Esta-Senha-Longa-2026!' );
define( 'DB_HOST', 'localhost' );
Teste se o PHP consegue carregar a configuração sem erro de sintaxe:
php -l wp-config.php
Saída esperada:
No syntax errors detected in wp-config.php
Se aparecer erro, reabra o arquivo e procure aspas quebradas, ponto e vírgula ausente ou caractere copiado de forma incorreta.
Passo 5: Configurar Nginx, PHP e permissões do WordPress
Crie o virtual host do Nginx. Ele vai servir o WordPress em /var/www/wp-migracao.test/public e encaminhar PHP para o PHP-FPM. Use o nome do domínio real no server_name quando for migrar de verdade.
sudo nano /etc/nginx/sites-available/wp-migracao.test
Cole o bloco abaixo:
server {
listen 80;
server_name wp-migracao.test www.wp-migracao.test;
root /var/www/wp-migracao.test/public;
index index.php index.html;
access_log /var/log/nginx/wp-migracao.access.log;
error_log /var/log/nginx/wp-migracao.error.log;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
location ~* \.(css|js|jpg|jpeg|png|gif|ico|svg|webp)$ {
expires 30d;
access_log off;
}
}
Ative o site e teste a configuração antes de recarregar. Essa validação evita derrubar outros sites por erro de sintaxe.
sudo ln -s /etc/nginx/sites-available/wp-migracao.test /etc/nginx/sites-enabled/wp-migracao.test
sudo nginx -t
Saída esperada:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Recarregue o Nginx:
sudo systemctl reload nginx
Ajuste permissões. Diretórios precisam de execução, arquivos não. O usuário do servidor web deve conseguir escrever em wp-content para uploads, cache e atualizações.
sudo chown -R www-data:www-data /var/www/wp-migracao.test/public
sudo find /var/www/wp-migracao.test/public -type d -exec chmod 755 {} \;
sudo find /var/www/wp-migracao.test/public -type f -exec chmod 644 {} \;
sudo chmod 640 /var/www/wp-migracao.test/public/wp-config.php
Verifique:
sudo -u www-data test -w /var/www/wp-migracao.test/public/wp-content && echo "wp-content gravavel"
ls -l /var/www/wp-migracao.test/public/wp-config.php
Saída esperada:
wp-content gravavel
-rw-r----- 1 www-data www-data 3336 Aug 10 11:05 wp-config.php
Se você planeja hospedar no Brasil, veja também o guia de melhor VPS Brasil para entender latência, localização do datacenter e impacto na experiência do visitante.
Passo 6: Testar pelo arquivo hosts, ativar SSL e trocar DNS
Antes de mudar DNS público, teste a VPS pelo arquivo hosts do seu computador. Isso faz apenas a sua máquina resolver o domínio para o IP novo. O resto da internet continua acessando a hospedagem compartilhada.
No Linux ou macOS, edite:
sudo nano /etc/hosts
No Windows, abra o Bloco de Notas como administrador e edite:
C:\Windows\System32\drivers\etc\hosts
Adicione uma linha com o IP da VPS e seu domínio real. Para o laboratório:
203.0.113.45 wp-migracao.test www.wp-migracao.test
Teste no seu computador:
curl -I http://wp-migracao.test
Saída esperada:
HTTP/1.1 200 OK
Server: nginx
Content-Type: text/html; charset=UTF-8
Abra o site no navegador e navegue por home, painel /wp-admin, posts, páginas, mídia e formulário de contato. Se tudo estiver correto, troque os registros DNS A do domínio para o IP da VPS no painel do registrador ou DNS provider. Aguarde propagação. Quando o domínio real já apontar para a VPS, ative SSL:
sudo certbot --nginx -d wp-migracao.test -d www.wp-migracao.test
Saída esperada:
Successfully received certificate.
Deploying certificate
Successfully deployed certificate for wp-migracao.test to /etc/nginx/sites-enabled/wp-migracao.test
Congratulations! You have successfully enabled HTTPS
Verifique renovação automática:
sudo certbot renew --dry-run
Saída esperada:
Congratulations, all simulated renewals succeeded
Depois de confirmar HTTPS, remova a linha temporária do arquivo hosts. Assim você passa a testar a resolução real via DNS público.
Verificação e testes
Faça uma bateria de testes antes de considerar a migração concluída. Comece pela resolução DNS e pelo cabeçalho HTTP. Rode do seu computador, não apenas da VPS.
dig +short wp-migracao.test
curl -I https://wp-migracao.test
Saída esperada:
203.0.113.45
HTTP/2 200
server: nginx
Na VPS, acompanhe logs enquanto abre páginas no navegador:
sudo tail -f /var/log/nginx/wp-migracao.error.log /var/log/nginx/wp-migracao.access.log
Saída normal no access log:
GET / HTTP/2.0 200
GET /wp-content/uploads/2026/08/imagem.jpg HTTP/2.0 200
GET /wp-admin/ HTTP/2.0 302
Teste o banco usando WP-CLI se você decidir instalar a ferramenta depois. Sem WP-CLI, use o próprio WordPress: faça login, crie um post de rascunho, envie uma imagem pequena e apague o rascunho. Isso confirma sessão, escrita em banco e escrita em disco. Também rode:
df -h
free -m
systemctl is-active nginx mariadb php8.3-fpm
Saída esperada:
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 50G 8.1G 39G 18% /
total used free
Mem: 1968 740 520
active
active
active
Se o site usa cache, CDN ou plugin de segurança, limpe o cache após a troca de DNS. Plugins que gravam caminhos absolutos podem manter referência ao servidor antigo. Nesse caso, revise configurações de cache, uploads, SMTP e integrações externas.
Troubleshooting
Erro ao conectar ao banco de dados: abra wp-config.php e confira DB_NAME, DB_USER, DB_PASSWORD e DB_HOST. Teste a credencial diretamente:
mysql -u wp_user -p -e "SHOW TABLES;" wp_migracao
Se retornar Access denied, recrie a senha ou conceda permissões novamente no MariaDB. Se retornar tabelas, o problema pode estar em aspas quebradas no arquivo PHP.
Tela branca ou erro 500: veja logs do Nginx e PHP. Normalmente é plugin incompatível, extensão PHP ausente ou limite de memória.
sudo tail -n 80 /var/log/nginx/wp-migracao.error.log
sudo journalctl -u php8.3-fpm -n 80 --no-pager
Se aparecer erro de plugin, renomeie temporariamente a pasta dele. Aviso: isso desativa o plugin, mas não apaga dados.
sudo mv /var/www/wp-migracao.test/public/wp-content/plugins/nome-do-plugin /var/www/wp-migracao.test/public/wp-content/plugins/nome-do-plugin.off
Uploads não funcionam: confirme permissão em wp-content/uploads.
sudo -u www-data touch /var/www/wp-migracao.test/public/wp-content/uploads/teste.txt && echo ok
sudo rm /var/www/wp-migracao.test/public/wp-content/uploads/teste.txt
O rm acima remove apenas o arquivo de teste recém-criado. Não use remoções amplas em produção. Se falhar, aplique chown -R www-data:www-data wp-content.
SSL não emite certificado: o domínio precisa apontar para a VPS antes do Certbot. Confira DNS:
dig +short wp-migracao.test
sudo nginx -t
Se o IP não for o da VPS, aguarde propagação ou corrija o registro A.
Próximos passos
Depois da migração, mantenha a hospedagem compartilhada ativa por alguns dias. Não cancele no mesmo dia, pois você pode precisar comparar arquivos, recuperar e-mails, revisar DNS ou confirmar integrações. Configure backup automático na VPS com retenção fora do servidor, por exemplo usando snapshots do provedor e cópia incremental para armazenamento externo.
Instale monitoramento básico de disponibilidade, CPU, RAM e disco. Também revise segurança: desative login SSH por senha, use chaves, configure firewall UFW, mantenha WordPress, temas e plugins atualizados e remova plugins sem uso. Para performance, avalie cache de página, OPcache, compressão Brotli ou gzip e CDN se o público estiver distribuído.
Por fim, documente a migração. Anote data, IP antigo, IP novo, banco criado, usuário do banco, localização dos backups e mudanças de DNS. Essa documentação parece simples, mas economiza muito tempo quando você precisar auditar, escalar a VPS ou repetir o processo em outro site WordPress.
Perguntas frequentes
Posso migrar WordPress para VPS sem downtime?
Você consegue reduzir o downtime para poucos minutos, mas zerar completamente exige sincronização final cuidadosa. Faça backup inicial, restaure na VPS, teste via arquivo hosts e só depois altere o DNS. Durante a propagação, evite publicar novos posts ou receber pedidos no site antigo. Em lojas WooCommerce, coloque o site em modo manutenção durante a sincronização final do banco, exporte novamente o banco antigo e importe na VPS antes de abrir o tráfego público.
Preciso mudar as URLs no banco depois da migração?
Se o domínio continua o mesmo, normalmente não precisa trocar URLs. O que muda é o servidor, não o endereço público do site. Você só precisa ajustar DNS e configurar o virtual host. Se aproveitou a migração para trocar de domínio, use uma ferramenta segura de search-replace que entenda dados serializados do WordPress, como WP-CLI. Não faça substituição direta com editor de texto no dump SQL, pois isso pode quebrar opções serializadas de plugins e temas.
Qual tamanho de VPS usar para WordPress migrado?
Depende do tráfego, plugins, tema e banco. Para um site institucional pequeno, 1 vCPU e 1 GB de RAM podem funcionar com cache bem configurado. Para WooCommerce, LMS ou sites com muitos plugins, comece com 2 vCPU e 2 GB ou 4 GB de RAM. Observe uso real após a migração com `free`, `top`, logs do PHP-FPM e métricas do provedor. Dimensione com folga para picos, backups e atualizações.
O que fazer se a hospedagem compartilhada não tiver SSH?
Use o painel da hospedagem. Compacte os arquivos pelo Gerenciador de Arquivos, baixe o pacote para seu computador e exporte o banco pelo phpMyAdmin em formato SQL, preferencialmente gzip. Depois envie os arquivos para a VPS com `scp` ou SFTP. O processo fica menos automatizado, mas continua seguro. Confira tamanhos dos arquivos baixados, teste a extração local se possível e nunca apague o site antigo antes de validar a VPS em navegador e logs.
Como saber se o DNS já aponta para a VPS?
Use `dig +short seu-dominio.com.br` no seu computador e compare com o IP público da VPS. Também teste em redes diferentes, como internet móvel, porque caches locais e recursivos podem demorar. No navegador, limpe cache ou use aba anônima. Outra verificação útil é olhar o access log do Nginx na VPS enquanto acessa o domínio. Se novas requisições aparecem no log, parte do tráfego já está chegando ao servidor novo.
Devo usar Apache ou Nginx na VPS para WordPress?
Os dois funcionam bem. Nginx costuma ser leve e eficiente para arquivos estáticos e alto volume de conexões, enquanto Apache facilita compatibilidade com regras `.htaccess`. Se o site depende muito de `.htaccess`, você precisará converter regras para Nginx ou usar Apache. Para uma VPS nova, Nginx com PHP-FPM é uma escolha comum e performática. O mais relevante é configurar corretamente cache, permissões, PHP, banco e backups.
Fontes consultadas
- WordPress.org Documentation · coletado em 10/08/2026
- Nginx Admin Guide · coletado em 10/08/2026
- MariaDB Documentation · coletado em 10/08/2026
- Certbot Instructions · coletado em 10/08/2026
- Ubuntu Server Documentation · coletado em 10/08/2026