Servidor Web · 10 min read · Oct 30, 2025

Como Instalar e Configurar o Servidor Web Caddy com PHP no Fedora 34 / CentOS 8

Caddy é um servidor web de código aberto escrito na linguagem Go. Ele oferece suporte a HTTP/3, TLS v1.3, configuração automática de SSL com Let’s Encrypt, proxy reverso e suporta vários plugins para estender sua funcionalidade. Ele tem a vantagem de toda a sua configuração ser servida a partir de um único arquivo, não importa quantos sites você precise hospedar.

Este tutorial cobrirá a instalação e configuração do Caddy e PHP em servidores baseados no Fedora 34 e CentOS 8. Vamos abordar como hospedar sites únicos e múltiplos e como usar proxy reverso junto com algumas outras funcionalidades de segurança.

Pré-requisitos

  • Servidor baseado no Fedora 34 ou CentOS 8
  • Um usuário não-root com privilégios sudo
  • Um nome de domínio apontando para o endereço IP do servidor
  • SELinux está desativado. shell $ sudo setenforce 0
  • Certifique-se de que tudo está atualizado. shell $ sudo dnf update

Passo 1 - Configurando o Firewall

O primeiro passo é configurar o Firewall para abrir as portas HTTP e HTTPS. Fedora e CentOS vêm com o firewall Firewalld pré-instalado.

Verifique se o firewall está em execução.

$ sudo firewall-cmd --state

Você deve obter a seguinte saída.

running

Verifique os serviços/portas atualmente permitidos.

$ sudo firewall-cmd --permanent --list-services

Deve mostrar a seguinte saída.

dhcpv6-client mdns ssh

Permita as portas HTTP e HTTPS.

$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https

Verifique novamente o status do firewall.

$ sudo firewall-cmd --permanent --list-services

Você deve ver uma saída semelhante.

dhcpv6-client http https mdns ssh

Recarregue o Firewall.

$ sudo systemctl reload firewalld

Passo 2 - Instalar o Caddy

O primeiro passo é instalar o servidor. Os passos de instalação permanecem os mesmos para o Fedora 34 e CentOS 8.

$ sudo dnf install 'dnf-command(copr)'
$ sudo dnf copr enable @caddy/caddy
$ sudo dnf install caddy

Você pode verificar a instalação pelo seguinte comando.

$ caddy version
v2.4.3 h1:Y1FaV2N4WO3rBqxSYA8UZsZTQdN+PwcoOcAiZTM8C0I=

Passo 3 - Noções Básicas de Configuração do Caddy

O Caddy usa JSON como o formato principal para armazenar ou escrever configurações. É a maneira mais flexível de escrever a configuração e suporta todos os recursos do Caddy. Mas se você não sabe como escrever arquivos JSON, o Caddy oferece uma maneira mais fácil na forma de Caddyfile.

O pacote Fedora / CentOS inclui um Caddyfile em /etc/caddy/Caddyfile. Ele deve parecer com o seguinte (ignorando os comentários)

:80 {
        root * /usr/share/caddy
        file_server
}

Ative e inicie o daemon do caddy.

$ sudo systemctl enable --now caddy

Você pode abrir a URL http://youripaddress para verificar. Você deve ver a seguinte página de boas-vindas.

Página de Boas-Vindas do Caddy

O Caddy oferece muitos recursos e configurações, então vamos apenas com os importantes para servir nosso site. A configuração padrão serve via HTTP, que é especificado como :80. A diretiva root informa ao Caddy para procurar os arquivos a serem servidos no diretório /usr/share/caddy.

A diretiva file_server informa ao Caddy para agir como um servidor de arquivos, o que significa que ele servirá apenas arquivos estáticos no endereço padrão.

Configurando o Caddy para um site HTML básico

Vamos criar um arquivo de configuração básico do caddy para servir um site estático.

Crie um diretório para hospedar seu site e armazenar seus arquivos de log.

$ sudo mkdir -p /var/www/example.com/html
$ sudo mkdir /var/log/caddy

Defina a propriedade do diretório para o Caddy.

$ sudo chown caddy:caddy /var/www/example.com/html -R
$ sudo chown caddy:caddy /var/log/caddy

Crie um arquivo HTML para testar e abra-o para edição.

$ sudo nano /var/www/example.com/html/index.html

Adicione o seguinte código.




Olá do Caddy!


Olá, do Caddy!

Pressione Ctrl + X para fechar o editor e pressione Y quando solicitado a salvar o arquivo.

Abra o Caddyfile para edição.

$ sudo nano /etc/caddy/Caddyfile

Substitua o código existente pelo seguinte.

example.com {
    root * /var/www/example.com/html
    file_server
    encode gzip

    log {
        output file /var/log/caddy/example.access.log
    }

    @static {
        file
        path *.ico *.css *.js *.gif *.jpg *.jpeg *.png *.svg *.woff *.pdf *.webp
    }
    header @static Cache-Control max-age=5184000

    tls [email protected]
}

Pressione Ctrl + X para fechar o editor e pressione Y quando solicitado a salvar o arquivo.

Vamos passar por todas as diretivas no arquivo. A diretiva encode gzip informa ao Caddy para comprimir os arquivos usando compressão Gzip.

A diretiva log gera o log de acesso para o site no arquivo /var/log/caddy/example.access.log. Por padrão, o Caddy rotaciona arquivos de log quando eles atingem 100 MB. Os arquivos rotacionados são excluídos após 90 dias ou quando há mais de 10 logs rotacionados. Você pode alterar os parâmetros padrão da seguinte maneira.

log {
    output file /var/log/caddy/example.access.log {
        roll_size 10MB
        roll_keep 5
        roll_keep_for 240h
    }
}

No código acima, os arquivos de log rotacionados são limitados a 10 MB e excluídos após 10 dias (240 horas) ou quando há mais de 5 logs rotacionados.

O Caddy gerará e instalará automaticamente o certificado SSL sem qualquer intervenção. A diretiva tls permite que forneçamos opções extras para configurar HTTPS, como o endereço de e-mail usado para obter relatórios do Let’s Encrypt.

A diretiva header habilita o Cache-control em todos os arquivos estáticos (imagens/javascript/arquivos CSS). Você pode adicionar mais extensões de arquivo ou copiar o código para definir uma duração diferente para diferentes formatos de arquivo. Você terá que mudar o valor static para algo diferente porque esse é um nome de referência.

Uma vez terminado, você pode validar sua configuração usando o seguinte comando.

$ caddy validate --adapter caddyfile --config /etc/caddy/Caddyfile

Temos que usar a opção --adapter caddyfile porque, por padrão, o comando apenas valida configurações JSON.

Se você receber o seguinte aviso, pode corrigi-lo facilmente com um único comando.

WARN    input is not formatted with 'caddy fmt' {"adapter": "caddyfile", "file": "/etc/caddy/Caddyfile", "line": 2}

Execute o seguinte comando para corrigir o erro.

$ caddy fmt --overwrite /etc/caddy/Caddyfile

O comando acima formata e sobrescreve o Caddyfile.

Reinicie o Caddy para habilitar a configuração. Você precisará reiniciar o servidor toda vez que fizer uma alteração na configuração.

$ sudo systemctl restart caddy

Abra no seu navegador e você deve ver a seguinte página, o que significa que a configuração está funcionando.

Configurando Múltiplos Sites no Caddy

Você pode configurar vários sites em um único arquivo caddy. Para fazer isso, crie blocos separados para cada site da seguinte maneira.

example1.com {
    root * /var/www/example1.com/html
    ...
}

example2.com {
    root * /var/www/example2.com/html
    ...
}

Esse método é bom para alguns sites, mas um único pode ficar bastante grande e difícil de manter se você estiver hospedando vários sites.

Crie o diretório /etc/caddy/caddyconf.

$ sudo mkdir /etc/caddy/caddyconf

Agora você pode importar os arquivos de configuração do diretório em seu /etc/caddy/Caddyfile no topo do arquivo.

import caddyconf/*.conf

O passo final é criar arquivos de configuração individuais para cada site.

Configurando sites PHP

Até agora, falamos apenas sobre servir sites estáticos usando o Caddy. Você pode usar o Caddy tão facilmente para servir sites PHP dinâmicos também. Para habilitar o suporte ao PHP, adicione o seguinte código dentro do seu bloco de site.

example1.com {
    root * /var/www/example1.com/html
    ...
    php_fastcgi unix//run/php-fpm/www.sock
}

Você também precisará instalar o PHP.

$ sudo dnf install php-fpm php-cli php-gd

Você pode instalar qualquer módulo PHP adicional que precisar. Você também precisará configurar o arquivo /etc/php-fpm.d/www.conf. Abra o arquivo para edição.

$ sudo nano /etc/php-fpm.d/www.conf

Precisamos definir o usuário/grupo Unix dos processos PHP como caddy. Encontre as linhas user=apache e group=apache no arquivo e altere-as para nginx.

...
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = caddy
; RPM: Keep a group allowed to write in log dir.
group = caddy
...

Encontre a linha listen.acl_users = apache,nginx e altere seu valor para o seguinte.

...
listen.acl_users = apache,nginx,caddy
...

Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.

Inicie o processo PHP-fpm.

$ sudo systemctl start php-fpm

Para testar sua configuração PHP, crie um arquivo test.php na pasta html.

$ sudo nano /var/www/example.com/html/test.php

Adicione o seguinte conteúdo a ele e salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.

Acesse http://example.com/test.php em seu navegador, e você deve ver o seguinte.

Página de Teste PHP do Caddy

Configurando Proxy Reverso

O Caddy também pode ser usado como um servidor proxy reverso. Para configurá-lo, use o seguinte código.

example1.com {
    ...
    reverse_proxy localhost:8000 {
        header_up Host {http.reverse_proxy.header.X-Forwarded-Host}
    }
}

Passo 4 - Opções Globais do Caddy

O Caddyfile permite que você defina algumas opções que serão aplicáveis globalmente, ou seja, elas se aplicarão a todos os seus sites. É benéfico definir opções globais para que você não precise redeclarar em cada bloco de servidor.

Você deve incluir as opções globais no topo do seu Caddyfile. Existem muitas opções que você pode definir globalmente. Vamos passar por algumas importantes apenas. Para o resto, você deve consultar a documentação do Caddy.

Aqui estão algumas opções padrão que você pode usar em seu Caddyfile.

{ 
    # Opções TLS
    email [email protected]

    servers :443 {
        protocol {
            experimental_http3
        }
        max_header_size 5mb
    }
    
    servers :80 {
        protocol {
            allow_h2c
        }
        max_header_size 5mb
    }
}

No código acima, email especifica o ID de e-mail usado para registrar o certificado SSL com a autoridade Let’s Encrypt. O OCSP stapling melhora o desempenho de sites HTTPS fornecendo informações de revogação de certificados aos navegadores automaticamente. A opção max_header_size especifica o tamanho dos cabeçalhos de solicitação HTTP do cliente a serem analisados.

Também habilitamos o protocolo HTTP/3 para sites HTTPS e suporte a HTTP/2 para sites HTTP. Esses são recursos experimentais e provavelmente serão removidos eventualmente, então tenha cuidado antes de habilitá-los.

Passo 5 - Aumentando a Segurança

Habilitando Autenticação HTTP

Você pode habilitar autenticação HTTP simples para certos diretórios. Primeiro, você precisa criar credenciais de autenticação para isso.

O Caddy aceita apenas senhas hash na configuração. Portanto, você precisa criar uma senha hash primeiro. Execute o seguinte comando para fazer isso.

$ caddy hash-password
Enter password:
Confirm password:
JDJhJDEwJEVCNmdaNEg2Ti5iejRMYkF3MFZhZ3VtV3E1SzBWZEZ5Q3VWc0tzOEJwZE9TaFlZdEVkZDhX

Uma vez que você tenha a senha pronta, insira o seguinte código em seu Caddyfile.

basicauth /secret/* {
    John JDJhJDEwJEVCNmdaNEg2Ti5iejRMYkF3MFZhZ3VtV3E1SzBWZEZ5Q3VWc0tzOEJwZE9TaFlZdEVkZDhX
}

O comando acima protegerá o diretório /secret com as credenciais que você acabou de criar.

Fortalecendo a Segurança do Site e habilitando HSTS

Existem outras configurações de segurança que você pode adicionar para proteger seus sites. Para isso, criaremos outro arquivo /etc/caddy/caddy_security.conf.

$ sudo nano /etc/caddy/caddy_security.conf

Adicione o seguinte código a ele.

header {
    Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
    X-Xss-Protection "1; mode=block"
    X-Content-Type-Options "nosniff"
    X-Frame-Options "DENY"
    Permissions-Policy "interest-cohort=()"
    Content-Security-Policy "upgrade-insecure-requests"
    Referrer-Policy "strict-origin-when-cross-origin"
    Cache-Control "public, max-age=15, must-revalidate"
    Feature-Policy "accelerometer 'none'; ambient-light-sensor 'none'; autoplay 'self'; camera 'none'; encrypted-media 'none'; fullscreen 'self'; geolocation 'none'; gyroscope 'none'; magnetometer 'none'; microphone 'none'; midi 'none'; payment 'none'; picture-in-picture *; speaker 'none'; sync-xhr 'none'; usb 'none'; vr 'none'"
}

O código acima habilita/implementa o seguinte.

  1. Habilita suporte HSTS para o site e todos os seus subdomínios.
  2. Habilita filtragem XSS.
  3. Impede a detecção de Conteúdo/MIME.
  4. Impede que seu site seja carregado dentro de um IFRAME.
  5. Impede que seu site seja incluído em testes de rastreamento FLOC.
  6. Adiciona uma política de segurança de conteúdo sobre como os agentes de usuário tratam URLs inseguras.
  7. Implementa uma política de referência para que apenas a referência seja enviada para solicitações de origem cruzada se o protocolo disser o mesmo.
  8. A Política de Recursos fornece um mecanismo para habilitar e desabilitar certos recursos do navegador.

Em seguida, importe o arquivo em qualquer um dos blocos de site que você deseja.

example.com {
    ...
    import /etc/caddy/caddy_security.conf
}

Reinicie o servidor para implementar a alteração.

Conclusão

Isso conclui o tutorial sobre como instalar e configurar o servidor web Caddy em servidores baseados no Fedora 34 / CentOS 8. Se você tiver alguma dúvida, poste nos comentários abaixo.

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.