MV Melhor VPS

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.

Revisão editorial: Concluída
⏱ Tempo estimado: 45-60 minutos
📊 Dificuldade: Intermediário

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