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.

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.

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.
- Habilita suporte HSTS para o site e todos os seus subdomínios.
- Habilita filtragem XSS.
- Impede a detecção de Conteúdo/MIME.
- Impede que seu site seja carregado dentro de um IFRAME.
- Impede que seu site seja incluído em testes de rastreamento FLOC.
- Adiciona uma política de segurança de conteúdo sobre como os agentes de usuário tratam URLs inseguras.
- 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.
- 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.
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.