Instalar WordPress com Ubuntu 22.04, NGINX, MariaDB e PHP 8.2

Tutorial passo-a-passo em palavras fáceis para iniciantes absolutos

Neste artigo, vai aprender através do processo de instalação manual do WordPress num servidor Ubuntu 22.04 usando NGINX, MariaDB, e PHP 8.2. Estas pilhas irão fornecer uma plataforma poderosa e eficiente para executar o seu site WordPress com uma velocidade surpreendente.

Siga estes 3 passos e veja o vídeo. Precisa de ajuda? Contacte-me.😊

  1. Configuração do DNS Cloudflare
  2. Obter o Ubuntu Server
  3. Implantação de LEMP Stack

Agora antes de começar, aqui vai uma dica rápida. Use Search and Replace Extension para mudar em massa o exemplo.com para o seu próprio domínio nesta página web.

Dica de poupança de tempo para os utilizadores do Google Chrome.
search replace

Parte A: Manter os Nameservers activos

Vamos utilizar Cloudflare DNS para obter o certificado Let’s Encrypt Wildcard SSL. Complete este passo primeiro para desfrutar de migração de tempo zero.

Verificar Nameservers actuais

Parte B: Preparar um servidor Ubuntu 22.04 LTS Server

Ubuntu
Logótipo Ubuntu

1. Inscreva-se na Vultr para obter $100 Créditos grátis (Válido por 30 dias)

Como alguém que já experimentou tantas empresas de servidores Cloud, a minha experiência diz que não se pode errar com a Vultr. Estes tipos são genuínos e atenciosos quando se trata de apoio e serviços.

vultr

⚡ Desempenho

  • NVME / SSD
  • 3.7 GHz CPU
  • Velocidade de rede até 5Gbps
  • Datacenter na América, Europe, Asia, Austraillia
  • IPV6 pronto

💡 Características

  • Iniciante – Painel Amigável
  • Um clique para Snapshot
  • Cópias de segurança automáticas (pagas)
  • Firewall Nuvem Livre
  • Protecção DDoS (Paid)
  • Virtualização a 100% KVM

⚙ Apoio

  • PayPal/Cartão
  • Suporte de bilhetes 24/7
  • Documentação

Criar um novo Servidor VPS

Basta clicar no botão “mais” para começar

Deploy New Server

3. Escolher Servidor de Alta Frequência

Choose Server

Depois disto, pode seleccionar a opção AMD High Performance ou Intel High Frequency em Tecnologia de CPU & Armazenamento. Tem o CPU e o Disco NVMe mais rápido de sempre. Se o orçamento for menor, então vá com o plano Regular com CPU Intel, no qual obterá o disco SSD.

4. Escolha uma localização de servidor

Escolha uma localização de servidor que esteja próxima ao seu público-alvo.

vultr server region 1

5. Selecione o sistema operacional Ubuntu 22.04 x64

Cloud Operating System

Long Term Support (LTS) is a product lifecycle management policy in which a stable version of computer software is maintained for a longer period of time than the standard edition.

ubuntu releases 2

6. Escolha um tamanho de servidor

server size

O plano de $6/mo seria um óptimo ponto de partida para um novo blogue. Pode actualizar a qualquer momento, de acordo com os requisitos.

Dica: Se estiver a migrar, verifique o tamanho total da instalação em Informação sobre saúde do Sítio.

Site health info

Habilitar IPV6, Backup

vultr enable backup ipv6

8. Acrescentar uma chave SSH

Este é um passo recomendado e opcional para o reforço da segurança.

Add SSH key
  • Clique em Adicionar novo botão para adicionar uma nova chave SSH para submeter a sua chave 🔒Public.
  • Gerar Chaves usando o método abaixo conforme o seu SO.
win os
  • Descarregar a aplicação PuTTy.
  • Procura de PuTTygen no menu Iniciar
  • Clique em Gerar botão e passe o ponteiro do rato
  • Copiar chave pública e fornecer à Vultr
  • Introduza a frase-chave
  • Guardar 🔑Private Chave no local mais seguro.
  • Isto pode ser usado para login no SSH ou SFTP.
linux 2
  • Executar: ssh-keygen -t rsa. Para uma chave mais segura 4096-bit, correr: ssh-keygen -t rsa -b 4096
  • Prima enter quando lhe for perguntado onde pretende guardar a chave (isto irá utilizar a localização predefinida).
  • Introduza uma frase-chave para a sua chave.
  • Run cat ~/.ssh/id_rsa.pub – isto dar-lhe-á a chave no formato adequado para colar no painel de controlo.
  • Certifique-se de que faz cópias de segurança do ficheiro ~/.ssh/id_rsa. Isto não pode ser recuperado se for perdido.

Seleccione a sua chave SSH

Seguindo estas etapas, anexará a sua chave pública à sua nova Instância. Depois, poderá iniciar sessão no SSH utilizando a palavra-passe de texto simples e a chave SSH ambas.

select SSH public key

9. Ligar a regra da Firewall Web à Instância do Servidor

Firewall
  1. Clique em Gerir e criar um novo Grupo Firewall.
  2. Permitir a porta TCP 22 para SSH. 80 para HTTP e 443 HTTPS para IPV4 e IPV6, ambas as regras.
  3. Uma vez feito, ligue o grupo Firewall à sua Instância.
firewall status
Aceitar ligação TCP apenas a partir de 22, 80, 443
Link Firewall Group
Link firewall rule to new instance

10. Digite Hostname e clique em Deploy Now

server hostname label

Verá agora a instalação em curso

Instance Installing

Ir para a página de Nova Instância

Copiar endereço IP, nome de utilizador e palavra-passe. A sua porta padrão é 22.

new instance info page

12. Desactivar Password Login

Por razões de segurança, recomenda-se desactivar a autenticação por senha e permitir apenas a autenticação com base em chaves.

  1. Editar o ficheiro de configuração nano /etc/ssh/sshd_config
  2. Encontrar (CTRL + W) e pesquisar PasswordAuthentication
  3. Mudança de valor de sim para não
  4. Para salvar o tipo, CTRL + O
  5. Reiniciar o serviço SSH usando o comando sudo service ssh restart
disable password auth
Desactivar a autenticação por palavra-passe

A partir da próxima vez, só poderá usar SSH através da chave, conforme mostrado no vídeo.

Para Linux ou Mac, utilizar Terminal com comando como este

ssh [email protected] -p 22 -i id_rsa

Passo 13. Desactivar o UFW

Quando se implementa uma nova instância na VULTR, esta vem com a UFW (Uncomplicated Firewall) activada que mantém todas as portas bloqueadas excepto a porta SSH 22. Isto pode retornar ERR_CONNECTION_REFUSED Error no navegador. Para corrigir isto, eu sugeriria manter o UFW desactivado.

ufw disable

Explicação suficiente para as coisas básicas. Agora, vou acelerar o processo original para a instalação do WordPress na pilha de LEMP.

Parte C. Implantar WordPress no LEMP Stack

1. Actualização de repositórios

Digite abaixo o comando e prima a tecla enter

sudo -s
apt update && apt upgrade -y && apt dist-upgrade && apt autoclean && apt autoremove -y && reboot

ou

wget -qO update https://dl.gulshankumar.net/update && chmod +x update

Da próxima vez, usar sempre abaixo o comando de atalho para actualizar.

./update

2. Instalar o MariaDB com segurança

Faça novamente login e entre com o seguinte comando

sudo apt install mariadb-server -y && sudo mysql_secure_installation

Responder às perguntas abaixo

  • Enter current password for root (enter for none): Prima a tecla Enter
  • Switch to unix_socket authentication [Y/n]: Prima N e entre
  • Set root password? [Y/n]: Prima a tecla Enter.
  • New password: Digite a sua palavra-passe, pode usar Dashlane para gerar. Direito de clicar em colar.
  • Re-enter new password: Digite novamente a sua palavra-passe.

Após a definição bem sucedida da senha, verá

Password updated successfully!
Reloading privilege tables..
... Success!

Além disso, é necessário responder às seguintes perguntas.

  • Remove anonymous users? [Y/n]: Prima Y e entre
  • Disallow root login remotely? [Y/n]: Prima Y e entre
  • Remove test database and access to it? [Y/n]: Prima Y e entre
  • Reload privilege tables now? [Y/n]: Prima Y e entre

3. Criar uma nova base de dados para WordPress

Inicie sessão no MySQL, prima a tecla enter quando pedir a palavra-passe.

mysql -u root -p

Criar uma nova base de dados, e conceder privilégios para utilizar o seu utilizador com palavra-passe. É aqui que o WordPress armazena toda a informação de correio, páginas, temas, plugin, etc.

create database wordpress;
grant all on wordpress.* to [email protected] identified by '5pY8CKJxDRJEGQNkX7';
flush privileges;
exit;

Onde o seu …
database is wordpress
username is gulshan
password is 5pY8CKJxDRJEGQNkX7

Dica: Considere o uso de credencial de login única

4. Instalar PHP 8.2, NGINX e definir Permissão

sudo add-apt-repository ppa:ondrej/php -y && apt update && apt install php8.2-fpm php8.2-common php8.2-mysql php8.2-xml php8.2-xmlrpc php8.2-curl php8.2-gd php8.2-imagick php8.2-cli php8.2-dev php8.2-imap php8.2-mbstring php8.2-soap php8.2-zip php8.2-bcmath -y && sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php/8.2/fpm/php.ini && service php8.2-fpm restart && apt install nginx -y && chown -R www-data:www-data /var/www/ && chmod -R 755 /var/www

Ajustar a configuração PHP

A maioria dos temas e plugins extravagantes requer uma configuração PHP de alta qualidade para funcionar. Por conseguinte, devemos fazer estas alterações.

sed -i 's/memory_limit = 128M/memory_limit = 512M/g' /etc/php/8.2/fpm/php.ini
sed -i 's/post_max_size = 8M/post_max_size = 128M/g' /etc/php/8.2/fpm/php.ini
sed -i 's/max_file_uploads = 20/max_file_uploads = 30/g' /etc/php/8.2/fpm/php.ini
sed -i 's/max_execution_time = 30/max_execution_time = 900/g' /etc/php/8.2/fpm/php.ini
sed -i 's/max_input_time = 60/max_input_time = 3000/g' /etc/php/8.2/fpm/php.ini
sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 128M/g' /etc/php/8.2/fpm/php.ini
service php8.2-fpm restart

5. Instalar Wildcard Let’s Encrypt SSL Certificate

Criar um ficheiro cloudflare.ini dentro de /root/.secrets/directório.

mkdir -p /root/.secrets/ && cd /root/.secrets/ && nano cloudflare.ini

Adicionar código abaixo e guardar usando CTRL+O e sair usando CTRL+X

dns_cloudflare_email = "[email protected]"
dns_cloudflare_api_key = "XXXXXXXXXXXXXXXXX"

Encontre o seu e-mail Cloudflare e chave API Global em “O Meu Perfil” > Tokens API > Chave API Global

chmod 0400 /root/.secrets/cloudflare.ini

Instalar Certbot e DNS Authenticator de acordo com OS e servidor web HTTP

snap install --beta --classic certbot
snap set certbot trust-plugin-with-root=ok
snap install --beta certbot-dns-cloudflare
snap connect certbot:plugin certbot-dns-cloudflare

Obter Certificado SSL Wildcard

certbot certonly --dns-cloudflare --dns-cloudflare-credentials /root/.secrets/cloudflare.ini -d example.com,*.example.com --preferred-challenges dns-01

Definir Renovação Automática usando Cron Job

  • Type crontab -e
  • Type 1 for nano editor
  • Enter below command and save
0 0 * * *  /etc/init.d/nginx reload >/dev/null 2>&1

Renovação de testes

certbot renew --dry-run

6. Configurar bloco de servidor Nginx

Isto é importante onde precisa de configurar o seu domínio, como NGINX deve tratar os seus pedidos HTTP.

Eliminar blocos de servidores predefinidos.

rm /etc/nginx/sites-available/default && rm /etc/nginx/sites-enabled/default

Criar um novo bloco de servidor

cd /etc/nginx/sites-available/
nano example.com
  1. Substituir exemplo.com por domínio próprio
  2. Introduza o código abaixo e prima CTRL+O para guardar e CTRL+X para sair.

Geral (Sem Caching de Página)

server {
    listen         80;
    return 301 https://$host$request_uri;
}
server {
# Document Root
root /var/www/html;
index index.php index.html index.htm;
server_name .example.com;
client_max_body_size 0;

    listen [::]:443 ssl http2 ipv6only=on;
    listen 443 ssl http2;
        ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
        ssl_prefer_server_ciphers on;
        ssl_session_cache   shared:SSL:20m;
        ssl_session_timeout 20m;
        ssl_ciphers 'TLS13+AESGCM+AES128:EECDH+AES128';


error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;

# Block XMLRPC
location = /xmlrpc.php {
    deny all;
}

location / {
    try_files $uri $uri/ /index.php$is_args$args;
}

location ~* \.php$ {
if ($uri !~ "^/uploads/") {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
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|svg|ico|woff2|eot|jpeg|webp|jpg|js|png)$ {
expires 1y;
log_not_found off;
}

# Enable Gzip compression.
gzip on;

# Disable Gzip on IE6.
gzip_disable "msie6";

# Allow proxies to cache both compressed and regular version of file.
# Avoids clients that don't support Gzip outputting gibberish.
gzip_vary on;

# Compress data, even when the client connects through a proxy.
gzip_proxied any;

# The level of compression to apply to files. A higher compression level increases
# CPU usage. Level 5 is a happy medium resulting in roughly 75% compression.
gzip_comp_level 5;

# Compress the following MIME types.
gzip_types
 application/atom+xml
 application/javascript
 application/json
 application/ld+json
 application/manifest+json
 application/rss+xml
 application/vnd.geo+json
 application/vnd.ms-fontobject
 application/x-font-ttf
 application/x-web-app-manifest+json
 application/xhtml+xml
 application/xml
 font/opentype
 image/bmp
 image/svg+xml
 image/x-icon
 text/cache-manifest
 text/css
 text/plain
 text/vcard
 text/vnd.rim.location.xloc
 text/vtt
 text/x-component
 text/x-cross-domain-policy;
}

Para o facilitador de cache

server {
    listen         80;
    return 301 https://$host$request_uri;
}
server {
# Document Root
root /var/www/html;
index index.php index.html index.htm;
server_name .example.com;
client_max_body_size 0;

    listen [::]:443 ssl http2 ipv6only=on;
    listen 443 ssl http2;
        ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
        ssl_prefer_server_ciphers on;
        ssl_session_cache   shared:SSL:20m;
        ssl_session_timeout 20m;
        ssl_ciphers 'TLS13+AESGCM+AES128:EECDH+AES128';


error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;


# Block XMLRPC
location = /xmlrpc.php {
    deny all;
}


# Rules for Cache Enabler Plugin - Static File Serving

    set $cache_uri $request_uri;

    # bypass cache if POST requests or URLs with a query string
    if ($request_method = POST) {
    set $cache_uri 'nullcache';
    }

    if ($query_string != '') {
    set $cache_uri 'nullcache';
    }

    # bypass cache if URLs containing the following strings
    if ($request_uri ~* '(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(index)?.xml|[a-z0-9-]+-sitemap([0-9]+)?.xml)') {
    set $cache_uri 'nullcache';
    }

    # bypass cache if cookies contain the following strings
    if ($http_cookie ~* '(wp-postpass|wordpress_logged_in|comment_author)_') {
    set $cache_uri 'nullcache';
    }

    # custom installation subdirectory
    set $custom_subdir '';

    # default HTML file
    set $cache_enabler_uri '${custom_subdir}/wp-content/cache/cache-enabler/${http_host}${cache_uri}${scheme}-index.html';

    # WebP HTML file
    if ($http_accept ~* 'image/webp') {
    set $cache_enabler_uri '${custom_subdir}/wp-content/cache/cache-enabler/${http_host}${cache_uri}${scheme}-index-webp.html';
    }

    location / {
    gzip_static on; # this directive is not required but recommended
    try_files $cache_enabler_uri $uri $uri/ $custom_subdir/index.php?$args;
    }

location ~* \.php$ {
if ($uri !~ "^/uploads/") {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
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|svg|ico|jpeg|webp|woff2|eot|jpg|js|png)$ {
expires 1y;
log_not_found off;
}

# Enable Gzip compression.
gzip on;

# Disable Gzip on IE6.
gzip_disable "msie6";

# Allow proxies to cache both compressed and regular version of file.
# Avoids clients that don't support Gzip outputting gibberish.
gzip_vary on;

# Compress data, even when the client connects through a proxy.
gzip_proxied any;

# The level of compression to apply to files. A higher compression level increases
# CPU usage. Level 5 is a happy medium resulting in roughly 75% compression.
gzip_comp_level 5;

# Compress the following MIME types.
gzip_types
 application/atom+xml
 application/javascript
 application/json
 application/ld+json
 application/manifest+json
 application/rss+xml
 application/vnd.geo+json
 application/vnd.ms-fontobject
 application/x-font-ttf
 application/x-web-app-manifest+json
 application/xhtml+xml
 application/xml
 font/opentype
 image/bmp
 image/svg+xml
 image/x-icon
 text/cache-manifest
 text/css
 text/plain
 text/vcard
 text/vnd.rim.location.xloc
 text/vtt
 text/x-component
 text/x-cross-domain-policy;
}
  • É necessário instalar o plugin Cache Enabler para usufruir dos benefícios da cache.

FastCGI (Recomendado)

Se quiser usar FastCGI Cache, em vez disso implemente abaixo o Bloco de Servidor.

# NGINX Cache path
fastcgi_cache_path /var/run/nginx-cache levels=1:2 keys_zone=WORDPRESS:100m inactive=6h;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

server {
    listen         80;
    return 301 https://$host$request_uri;
}
server {
root /var/www/html;
index index.php index.html index.htm;
server_name .example.com;
client_max_body_size 0;

    listen [::]:443 ssl http2 ipv6only=on;
    listen 443 ssl http2;
        ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
        ssl_prefer_server_ciphers on;
        ssl_session_cache   shared:SSL:20m;
        ssl_session_timeout 20m;
        ssl_ciphers 'TLS13+AESGCM+AES128:EECDH+AES128';

error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;


set $skip_cache 0;
    if ($request_method = POST) {set $skip_cache 1;}
    if ($request_uri ~* "/wp-admin/|/xmlrpc.php|/wp-.*.php|index.php|sitemap(_index)?.xml") {set $skip_cache 1;}
    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {set $skip_cache 1;}
    if ($query_string = "unapproved*") {set $skip_cache 1;}
    if ($cookie_woocommerce_items_in_cart = "1" ){ set $skip_cache 1;}
    if ($request_uri ~* "/(cart|checkout|my-account)/*$") {set $skip_cache 1;}

# Block XMLRPC
location = /xmlrpc.php {
    deny all;
}

location / {
try_files $uri $uri/ /index.php$is_args$args;
}

location ~* \.php$ {

 if ($uri !~ "^/uploads/") {
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        }

        try_files                       $uri =404;
        include                         /etc/nginx/fastcgi_params;
        fastcgi_param                   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass                    unix:/run/php/php8.2-fpm.sock;
        fastcgi_index                   index.php;
                fastcgi_cache_bypass $skip_cache;
                fastcgi_no_cache $skip_cache;
                fastcgi_cache WORDPRESS;
                fastcgi_cache_valid 200 30d;
                fastcgi_cache_valid 301 302 303 307 308 404 410 451 1m;
                add_header X-Cache $upstream_cache_status;

}

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|svg|webp|woff2|eot|jpeg|jpg|js|png)$ {
expires 1y;
log_not_found off;
}

# Enable Gzip compression.
gzip on;

# Disable Gzip on IE6.
gzip_disable "msie6";

# Allow proxies to cache both compressed and regular version of file.
# Avoids clients that don't support Gzip outputting gibberish.
gzip_vary on;

# Compress data, even when the client connects through a proxy.
gzip_proxied any;

# The level of compression to apply to files. A higher compression level increases
# CPU usage. Level 5 is a happy medium resulting in roughly 75% compression.
gzip_comp_level 5;

# Compress the following MIME types.
gzip_types
 application/atom+xml
 application/javascript
 application/json
 application/ld+json
 application/manifest+json
 application/rss+xml
 application/vnd.geo+json
 application/vnd.ms-fontobject
 application/x-font-ttf
 application/x-web-app-manifest+json
 application/xhtml+xml
 application/xml
 font/opentype
 image/bmp
 image/svg+xml
 image/x-icon
 text/cache-manifest
 text/css
 text/plain
 text/vcard
 text/vnd.rim.location.xloc
 text/vtt
 text/x-component
 text/x-cross-domain-policy;
}

Para guardar, prima a tecla CTRL+O e Enter. Em seguida, sair do nano editor usando o comando CTRL+X.

No caso de FastCGI, é necessário utilizar o plugin ‘NGINX Helper‘. Funciona também com o URL codificado Hindi. Tenha em mente que não suporta AMP. Eu pessoalmente não uso AMP. (Recomendado)

Alternativamente, a cache NGINX funciona para purgar a URL AMP mas não suporta a URL codificada Hindi. Em configurações, deve manter o caminho da cache /var/run/nginx-cache/

Cuidado!

  • Por exemplo, se estiver a utilizar o tema Newspaper e servir um tema móvel separado, por favor, colar sem o método FastCGI e utilizar um plugin WP Rocket porque pode servir um cache móvel separado fora da caixa.

7. Criar ligações simbólicas entre dois directórios

Se falhar este passo, pode obter ERR_CONNECTION_REFUSED

Para activar o bloco do servidor, crie uma ligação simbólica do seu ficheiro NGINX Server Block do directório /etc/nginx/sites-available/ para /etc/nginx/sites-enabled

Antes de correr abaixo do comando, substitua por favor exemplo.com para possuir o domínio.

ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

Configuração de teste

nginx -t

Reiniciar e actualizar

service nginx restart && service php8.2-fpm restart && service mysql restart && apt-get update && apt upgrade -y

8. Instalar WordPress

Download WordPress files in /var/www/html directory and set permission.

cd /var/www/html && wget https://pt.wordpress.org/latest-pt_PT.tar.gz && tar -xvzf latest-pt_PT.tar.gz && mv -v wordpress/* /var/www/html && rm -rf index.nginx-debian.html latest-pt_PT.tar.gz wordpress && chown -R www-data:www-data /var/www/ && sudo chmod -R 755 /var/www

Para actualizar a permissão no futuro, use o comando abaixo

chown -R www-data:www-data /var/www/ && sudo chmod -R 755 /var/www

9. Actualização do DNS

Se estiver a alojar o WordPress localmente, quiser contornar o proxy ou quiser realizar uma migração sem tempo de paragem, este passo é útil. Eu geralmente prefiro no caso da área WordPress Dev estática 😉

  • Se estiver a alojar o WordPress localmente, quiser contornar o proxy ou quiser realizar uma migração sem tempo de paragem, este passo é útil. Eu geralmente prefiro no caso da área WordPress Dev estática

Para Windows

  • Ir para propriedades de ‪C:\Windows\System32\drivers\etc\hosts
  • Alterar a permissão “Segurança” para controlo total do seu nome de utilizador actual
  • Agora pode editar livremente o ficheiro anfitrião sob o seu utilizador do Sistema e guardá-lo.
# Para a mesma máquina pode ter o endereço do local de acolhimento outro IP público
127.0.0.1 example.com
127.0.0.1 www.example.com

Este é o aspecto que deve ter.

Para Mac ou Linux

Pode editar o ficheiro anfitrião usando o comando abaixo

sudo nano /etc/hosts

Actualização do DNS com Cloudflare

  • Se tudo estiver perfeito e quiser fazer o seu site ao vivo, inicie sessão no Cloudflare DNS e actualize o novo IP
A@IPV4 address
AAAA@IPV6 address
CNAMEwwwexample.com

onde @ denota domínio nú example.com

9. Visite o seu nome de domínio para configurar o WordPress

Se quiser manter o domínio da versão não-www para o seu WordPress, então visite a versão não-wwww.

https://example.com
  • Fornecer credencial de login na base de dados para iniciar a configuração do WordPress
  • Instalação em execução
  • Preencha os detalhes básicos do seu novo site e instale o WordPress.
  • Iniciar sessão no WordPress
  • Se utilizou FastCGI server block então a primeira coisa que deve fazer é instalar NGINX Cache plugin e configurar /var/www/cache como caminho de cache.

Outras coisas necessárias

Utilize os Serviços SMTP plugin para o envio de e-mail do WordPress, caso contrário não poderá receber a ligação de redefinição de palavra-passe, formulário de contacto 7 mensagens.

Finalmente, a instalação do WordPress foi concluída. Mantenha sempre o backup.

Aprecio muito o vosso precioso tempo na leitura deste artigo. Vejo-o no próximo tutorial!

WordPress List - Subscription Form
Quer mais?
Imagine receber Tutoriais todos os dias! Isso é FELICITATÓRIO. Subscreva agora.

Deixe um comentário

68 comentários em “Instalar WordPress com Ubuntu 22.04, NGINX, MariaDB e PHP 8.2”

  1. Thanks a lot Gulshan. You save my breath

    I search everywhere but not find any good article

    You explained very well along with security concern

    well done

    Responder
  2. Thank you for your tutorial, its the first one that actually showed me the wordpress setup page.

    When I went to upload a plugin I received this message. “The uploaded file exceeds the upload_max_filesize directive in php.ini”

    How do I increase the max filesize?

    Responder
  3. Hello Gulshan Bro, First i want to say you that this is very beautiful and required post. I am really appreciating your work. but i have a problem can you please tell me
    i have a droplet with digitalocean ($5/month plan) and i want to host multiple wordpress sites only with nginx(lemp ubuntu 18.04).
    In simple i mean that this tutorial is complete to install a single wordpress and i did it but tell host it in some other sites

    Responder
    • Hey Rohit,

      Assuming, second site is example2.org

      You need to follow steps this way.

      1. create a new directory and add WordPress (Ref: steps 31)

      cd /var/www/
      mkdir example2
      wget https://wordpress.org/latest.tar.gz
      tar -xvzf latest.tar.gz
      mv -v wordpress/* /var/www/example2
      rm -rf index.nginx-debian.html latest.tar.gz wordpress
      chown -R www-data:www-data /var/www/
      sudo chmod -R 755 /var/www

      2. Create a new Server block with root path located to new directory as created in step 1.


      cd /etc/nginx/sites-available/
      nano gulshankumar-org

      server {
      listen 80;
      root /var/www/example2;
      index index.php index.html index.htm;
      server_name example2.org www.example2.org;
      ...

      3. Point your example2.org domain to DNS, then install SSL

      certbot --nginx -d example2.org -d www.example2.org

      4. Create new MySQL database
      sudo mysql -u root -p
      create database example2;
      grant all on example2.* to [email protected] identified by 'TYPE HERE PASSWORD';
      flush privileges;
      exit;

      5. Proceed to Installation by visiting your site https://example2.org

      Let me know if you have any additional question. You can always visit our forum for quick assistance.

      Thanks & Regards,
      Gulshan

      Responder
      • Hello Gulshan you written a comprehensive guide i highly appreciate your work. Can you help me with an error? Actually i have two websites the first website i have already hosted on Vultr following the above guide.

        But when try to host a another WordPress website iam getting error. I followed the above steps you mentioned in comments. But still not able to fix it. The error is my website not working after hosting another WordPress website.

        If possible please guide me step by step instructions. It will help me alot. Thanks in advance.

        Responder
    • If your WordPress General Settings has www version, server will do automatically. No additional action is required. In case you started WordPress installation at non-www version, then you need to migrate by changing at Database level.

      Responder
  4. Hey Gulshan,
    In the 7th step while texting ngnix I got
    nginx: [emerg] open() “/etc/nginx/sites-enabled/example.com” failed (2: No such file or directory) in /etc/nginx/nginx.conf:62
    nginx: configuration file /etc/nginx/nginx.conf test failed

    This error. How I can solve it? also what the error.

    Responder
    • Please delete your existing server block and create again at sites-available and symlink at sites-enabled directory. The step 6 and 7 cover that clearly. Consider following patiently without any error. If you still face any problem, do let me know. Thanks for taking to leave your valuable comment.

      Responder
  5. How to check if fastcgi cache is working or not? while running sudo curl -I https://example.com it is not showing x-cache parameter

    Responder
  6. Hi Gulshan, I am also receiving the test failed error on step 7. I have tried several times now on different setup and still stuck here. Please could you help?

    Responder
    • Please carefully read the post and then copy-paste code in Terminal. Sometime you need to replace with your own domain. Doing mistake can return error. Else, no wise. I use this guide everyday for myself. I am not aware about any problem.

      In case of trouble
      1. Run test using nginx -t
      2. Check logs to get proper hint tail -f /var/log/nginx/error.log

      3. Delete existing or earlier created virtualhost
      rm /etc/nginx/sites-available/default && rm /etc/nginx/sites-enabled/default
      4. Make sure to replace example.com at all places, a) when you create conf file, its naming. b) when you add conf file and c) when you create symlink, check your command its conf file name must match with first process.

      I feel in most cases, chances are you did not replaced server_name .example.com; to own domain, or you did not obtained SSL. All steps are written in serial order as it should be.

      Responder
  7. This article is like Life-Saver for one of my website. I was about to move from Google Cloud to Digital Ocean because the trial was expired and I also wanted to use DigitaOcean because it is in-expensive yet powerful and gives great experience.

    Previously, I used webinoly stack which was straightforward for installing WordPress but later on I got to know from Gulshan that there are so many issues with that stack so, this time I was going to do it manually. I checked the official guide by Digital ocean but end up with many confusion and issues. Then, I fortunately asked Gulshan for help and he recommended this article for me.

    I installed WordPress easily and very fast even fast that Webinoly stack. Thanks a lot Gulshan for writing this amazing article. Hats off to you bro!!🎩

    Responder
  8. The FastCGI server block config throws 404 Errors.

    fastcgi_pass unix:/run/php/php7.4-fpm-example.sock;
    should be:
    fastcgi_pass unix:/run/php/php7.4-fpm.sock;

    And it is missing config for location /
    This config must be defined:

    location / {
    try_files $uri $uri/ /index.php$is_args$args;
    }

    Responder
  9. Hey bro what is your thoughts on EasyEngine and SlickStack etc or one click app instead to automate? what is your favorite and will you make any tut bro

    Responder
  10. What do you think about Plesk Panel?
    It is easy to install plesk and create a wordpress site.
    Easy to find trial keys and we can use it unlimited.
    If it expires sites goes on ftp works and only plesk panel does not work but there are too much trial keys
    It has nginx cache.

    Do you recommend why and why not?
    Thanks

    Responder
  11. Can we create multi wordpress sites on different domain in the same machine with this
    method?

    I think only changement is in the FastCGI?

    server {
    root /var/www/aaa.com/wordpress;
    index index.php index.html index.htm;
    server_name .aaa.com;
    client_max_body_size 0;

    server {
    root /var/www/bbb.com/wordpress;
    index index.php index.html index.htm;
    server_name .bbb.com;
    client_max_body_size 0;

    server {
    root /var/www/ccc.com/wordpress;
    index index.php index.html index.htm;
    server_name .ccc.com;
    client_max_body_size 0;

    is this make a problem cache path is the same path for 3 web site? /var/www/cache

    Is this method works?
    1 machine 3 different domain and wordpress?

    Thanks

    Responder
  12. I have 2 questions

    1) What if i have 2 domains on different cloudflare accounts?

    Create a cloudflare.ini file inside /root/.secrets/ directory.
    mkdir -p /root/.secrets/ && cd /root/.secrets/ && nano cloudflare.ini
    Add below code and save using CTRL+O and exit using CTRL+X
    dns_cloudflare_email = “[email protected]
    dns_cloudflare_api_key = “XXXXXXXXXXXXXXXXX”

    /root/.secrets/1domaincloudfare.ini
    /root/.secrets/2domaincloudfare.ini

    certbot certonly –dns-cloudflare –dns-cloudflare-credentials 1domaincloudfare.ini -d example.com,*.1domain.com –preferred-challenges dns-01
    certbot certonly –dns-cloudflare –dns-cloudflare-credentials 2domaincloudfare.ini -d example.com,*.2domain.com –preferred-challenges dns-01

    Do this work?

    2) If we have 2 domains in the same account on cloudflare can we use 1 cloudflare.ini

    certbot certonly –dns-cloudflare –dns-cloudflare-credentials /root/.secrets/cloudflare.ini -d 1domain.com,*.example.com –preferred-challenges dns-01
    certbot certonly –dns-cloudflare –dns-cloudflare-credentials /root/.secrets/cloudflare.ini -d 2domain.com,*.example.com –preferred-challenges
    dns-01

    3) If we dont use cloudflare what will our ns for domain?
    CLoud VPNs IP?

    ns1= 68.28.65.84
    ns2= 68.28.65.84

    Is this right?

    thanks for your replies

    Responder
  13. which is the best & compatible server side cache plugin If I use FastCGI server block code along with Nginx Cache plugin..

    W3 Total Cache or WP Rocket

    Responder
  14. I finally installed wordpress with this guide. But I see only www version but not the non-www version. Is there any changes that I need to do.

    Redirects to www version even If I enter non-www version.

    Responder
    • You need to point DNS records for both hostnames. Second, make sure dot is not missing from the beginning of example.com in this code – server_name .example.com; in the NGINX connfig at step 6. Another thing, Redirect from www to non-www or vice-versa (as neccessary) is taken care automatically from WordPress. You do not need to put any extra code for it.

      Responder
  15. For Nginx cache helper (I take this info from offical site
    There’s a ‘purge all’ button? Does it purge the whole site?
    Yes, it does. It physically empties the cache directory. It is set by default to /var/run/nginx-cache/.

    So the default is /var/run/nginx-cache/
    can we change fastcgi_cache_path /var/www/cache to /var/run/nginx-cache/ ?

    Thanks

    Responder
    • Se o seu directório de cache for diferente, pode anulá-lo no seu wp-config.php, adicionando.

      define('RT_WP_NGINX_HELPER_CACHE_PATH','/var/wwww/nginx-cache/')

      Responder
  16. location ~* .(css|gif|ico|svg|jpeg|jpg|js|png)$ {
    expires 1y;
    log_not_found off;
    }

    is this code for page caching?
    I use cloudflare so it has page cache too.
    If i use that can i remove it from codes?
    Can you please explain what is this code for?

    Thanks

    Responder
    • That code is for setting up 1 year browser caching for static files. You may use Cloudflare Page caching as normally you do. There shouldn’t be any problem.

      Responder
  17. Exactly followed the same steps, but at the end i am getting 502 bad gateway. I built some sites with the same steps before, however i don’t know what changed now.

    Responder