Jump to content

# Apache HTTP Server (Português)

From ArchWiki

Artigos relacionados

- XAMPP
- /mod_perl
- /mod_fcgid
- /mod_gnutls
- /mod_python
- /mod_wsgi

O Apache HTTP Server, ou simplesmente Apache, é um web server muito popular desenvolvido por Apache Software Foundation.

Este artigo descreve como configurar o Apache e como opcionalmente integrá-lo com PHP.

## Instalação

Instale o pacote apache.

## Configuração

Os arquivos de configuração do Apache estão localizados em `/etc/httpd/conf`. O principal arquivo de configuração é `/etc/httpd/conf/httpd.conf`, que inclui vários outros arquivos de configuração. O principal arquivo de configuração deve ser o suficiente para uma configuração simples. Por padrão, será fornecido o diretório `/srv/http` para qualquer um que queira acessar seu website.

Para iniciar o Apache, inicie `httpd.service` usando o systemd.

O Apache deverá estar executando agora. Teste-o visitando o endereço http://localhost/ em um navegador da web. Isto deverá exibir uma simples página web inicial.

Para configurações adicionais, veja as seções a seguir.

### Opções avançadas

Veja a lista completa de diretivas de configuração do Apache e o guia de referência rápido.

Estas opções em `/etc/httpd/conf/httpd.conf` poderão ser interessantes:

    User http

  Por razões de segurança, assim que o Apache é iniciado pelo usuário root (diretamente ou via scripts de inicialização) ele altera para este identificador de usuário. A identificação padrão é http, a qual é automaticamente criada durante a instalação.

    Listen 80

  Esta é a porta a qual o Apache irá monitorar. Para acesso da internet através de roteador, você terá que fazer um encaminhamento de porta.

  Se desejar configurar Apache para desenvolvimento local, talvez queira que somente o seu computador seja capaz de acessá-lo. Para isso, altere esta linha para `Listen 127.0.0.1:80`.

    ServerAdmin you@example.com

  Este será o endereço de email apresentado em, por exemplo, páginas de erro.

    DocumentRoot "/srv/http"

  Este é o endereço onde deverão ser localizadas suas páginas web..

  Altere, se desejar, mas não se esqueça de também alterar `<Directory "/srv/http">` para onde você apontou seu `DocumentRoot`, caso contrário você irá obter um erro 403 (que é de falta de privilégios) ao tentar acessar sua nova raiz de páginas. Não se esqueça de alterar a linha `Require all denied` para `Require all granted`, caso contrário você obterá um erro 403. Lembre-se de que o diretório e seus diretórios-pai devem ter permissão de execução para outros (o que pode ser alterado com `chmod o+x /path/to/DocumentRoot`), do contrário também obterá um erro 403.

    AllowOverride None

  Esta diretiva na seção `<Directory>` faz com que o Apache completamente ignore arquivos `.htaccess`. Perceba que este é o comportamento padrão para o Apache 2.4, então você deverá explicitamente permitir sobreposições caso planeje usar arquivos `.htaccess`. Caso planeje usar `mod_rewrite` ou outras configurações em `.htaccess` files, você será capaz de permitir tais diretivas declaradas em cada arquivo que irá sobrepor as configurações do servidor. Para mais informações, consulte a documentação do Apache.

Dica Se houver problemas com suas configurações do Apache, você poderá checá-las com: `apachectl configtest`

Mais configurações que podem ser encontradas em `/etc/httpd/conf/extra/httpd-default.conf`:

Desativar a assinatura do servidor:

    ServerSignature Off

Para ocultar informações do servidor e versão do PHP:

    ServerTokens Prod

### Diretórios do usuário

Diretórios do usuário estão disponíveis por padrão através de http://localhost/~yourusername/ e exibem o conteúdo de `~/public_html` (isto pode ser alterado em `/etc/httpd/conf/extra/httpd-userdir.conf`).

Se não desejar que diretórios do usuário estejam disponíveis através da web, apenas comente a seguinte linha em `/etc/httpd/conf/httpd.conf`:

    Include conf/extra/httpd-userdir.conf

Você deverá ter certeza de que seu diretório home está com suas permissões configuradas corretamente para que o Apache possa alcançá-lo. Seu diretório home e `~/public_html` devem ser executáveis para outros ("para todo o mundo"):

    $ chmod o+x ~
    $ chmod o+x ~/public_html
    $ chmod -R o+r ~/public_html

Reinicie `httpd.service` para aplicar quaisquer alterações. Veja também umask (Português)#Definir o valor da máscara.

### TLS

Atenção Se você for implantar TLS, certifique-se de seguir o guia de weakdh.org para evitar vulnerabilidades. Para mais informações, veja Server-side TLS.

Primeiramente, obtain a certificate. Caso tenha seu próprio domínio público, você poderá usar Transport Layer Security#ACME clients.

Em `/etc/httpd/conf/httpd.conf`, descomente as três linhas a seguir:

    LoadModule ssl_module modules/mod_ssl.so
    LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
    Include conf/extra/httpd-ssl.conf

Se estiver usando `certbot --apache`, a linha a seguir também deverá ser descomentada:

    LoadModule rewrite_module modules/mod_rewrite.so

Após obter uma chave e um certificado, certifique-se que as linhas `SSLCertificateFile` e `SSLCertificateKeyFile` em `/etc/httpd/conf/extra/httpd-ssl.conf` apontam para a chave e o certificado. Se uma cadeia de certificados CA também foi gerada, adicione seu nome de arquivo em `SSLCertificateChainFile`.

Finalmente, reinicie `httpd.service` para aplicar quaisquer alteralções.

Dica A Mozilla tem um artigo chamado SSL/TLS article muito útil bem como uma ferramenta chamada automated tool para ajudar a criar uma configuração segura.

### Hosts virtuais

Note Você precisará adicionar uma seção `<VirtualHost *:443>` para suporte ao SSL em hosts virtuais. Veja #Gerenciando vários hosts virtuais para um exemplo de arquivo.

Se desejar ter mais de um host, descomente a seguinte linha em `/etc/httpd/conf/httpd.conf`:

    Include conf/extra/httpd-vhosts.conf

Em `/etc/httpd/conf/extra/httpd-vhosts.conf` configure seus hosts virtuais. O arquivo padrão contém um exemplo elaborado que o ajudará.

Para testar os hosts virtuais em sua máquina local, adicione seus respectivos nomes no arquivo `/etc/hosts`:

    127.0.0.1 nomedodominio1.dom
    127.0.0.1 nomedodominio2.dom

Reinicie `httpd.service` para aplicar as alterações.

#### Gerenciando vários hosts virtuais

Caso tenha uma grande quantidade de hosts virtuais, você poderá querer facilmente desativá-los e ativá-los. Para isso, é recomendado criar um arquivo de configuração para cada host virtual e armazená-los em uma pasta, por exemplo: `/etc/httpd/conf/vhosts`.

Primeiro, crie a pasta:

    # mkdir /etc/httpd/conf/vhosts

Então coloque cada arquivo de configuração nela:

    # nano /etc/httpd/conf/vhosts/nomedodominio1.dom
    # nano /etc/httpd/conf/vhosts/nomedodominio2.dom
    ...

No último passo, use `Include` para incluir cada arquivo de configuração em seu `/etc/httpd/conf/httpd.conf`:

    #Enabled Vhosts:
    Include conf/vhosts/nomedodominio1.dom
    Include conf/vhosts/nomedodominio2.dom

Você poderá ativar e desativar seus hosts virtuais apenas comentando ou descomentando-os.

Um arquivo muito simples de um host virtual é semelhante a este:

    /etc/httpd/conf/vhosts/nomedodominio1.dom

    <VirtualHost *:80>
        ServerAdmin webmaster@nomedodominio1.dom
        DocumentRoot "/home/user/http/nomedodominio1.dom"
        ServerName nomedodominio1.dom
        ServerAlias nomedodominio1.dom
        ErrorLog "/var/log/httpd/nomedodominio1.dom-error_log"
        CustomLog "/var/log/httpd/nomedodominio1.dom-access_log" common

        <Directory "/home/user/http/nomedodominio1.dom">
            Require all granted
        </Directory>
    </VirtualHost>

    <VirtualHost *:443>
        ServerAdmin webmaster@nomedodominio1.dom
        DocumentRoot "/home/user/http/nomedodominio1.dom"
        ServerName nomedodominio1.dom:443
        ServerAlias nomedodominio1.dom:443
        SSLEngine on
        SSLCertificateFile "/etc/httpd/conf/server.crt"
        SSLCertificateKeyFile "/etc/httpd/conf/server.key"
        ErrorLog "/var/log/httpd/nomedodominio1.dom-error_log"
        CustomLog "/var/log/httpd/nomedodominio1.dom-access_log" common

        <Directory "/home/user/http/nomedodominio1.dom">
            Require all granted
        </Directory>
    </VirtualHost>

## Extensões

### PHP

Primeiro, instale o PHP, então siga uma das próximas subseções abaixo. Finalmente, teste a instalação como descrito no final da subseção.

#### Usando libphp

Este método é provavelmente o mais fácil, mas também o menos escalável: é adequado para um baixo número de requisições. Ele também requer que você altere o módulo mpm, o que poderá causar problemas com outras extensões (por exemplo, não é compatível com #HTTP/2).

Instale php7-apache[link quebrado: package not found] para PHP 7 ou php-apache para PHP 8, o que for apropriado.

Em `/etc/httpd/conf/httpd.conf`, comente a linha:

    #LoadModule mpm_event_module modules/mod_mpm_event.so

e descomente a linha:

    LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

Note O passo acima é requerido, porque `libphp.so` incluído com o pacote não funciona com `mod_mpm_event`, mas em vez disso, irá funcionar apenas com `mod_mpm_prefork`. (FS#39218)

Do contrário, você obterá o seguinte erro:

    Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe.  You need to recompile PHP.
    AH00013: Pre-configuration failed
    httpd.service: control process exited, code=exited status=1

Como alternativa, você pode usar `mod_proxy_fcgi` (veja #Usando php-fpm e mod_proxy_fcgi abaixo).

Para habilitar o PHP, adicione as seguintes linhas ao `/etc/httpd/conf/httpd.conf`:

- Adicione esta ao final da lista `LoadModule`:

    LoadModule php_module modules/libphp.so
    AddHandler php-script .php

- Adicione esta ao final da lista `Include`:

    Include conf/extra/php_module.conf

Reinicie `httpd.service` usando systemd.

#### Usando apache2-mpm-worker e mod_fcgid

Este método fornece uma melhor performance e melhor consumo de memória ao lidar com múltiplas requisições.

Instale mod_fcgidAUR e php-cgi.

Crie o diretório necessário e um link simbólico para o wrapper PHP:

    # mkdir /srv/http/fcgid-bin
    # ln -s /usr/bin/php-cgi /srv/http/fcgid-bin/php-fcgid-wrapper

Crie `/etc/httpd/conf/extra/php-fcgid.conf` com o seguinte conteúdo:

    /etc/httpd/conf/extra/php-fcgid.conf

    # Required modules: fcgid_module

    <IfModule fcgid_module>
        AddHandler php-fcgid .php
        AddType application/x-httpd-php .php
        Action php-fcgid /fcgid-bin/php-fcgid-wrapper
        ScriptAlias /fcgid-bin/ /srv/http/fcgid-bin/
        SocketPath /var/run/httpd/fcgidsock
        SharememPath /var/run/httpd/fcgid_shm
            # If you don't allow bigger requests many applications may fail (such as WordPress login)
            FcgidMaxRequestLen 536870912
            # Path to php.ini – defaults to /etc/phpX/cgi
            DefaultInitEnv PHPRC=/etc/php/
            # Number of PHP childs that will be launched. Leave undefined to let PHP decide.
            #DefaultInitEnv PHP_FCGI_CHILDREN 3
            # Maximum requests before a process is stopped and a new one is launched
            #DefaultInitEnv PHP_FCGI_MAX_REQUESTS 5000
        <Location /fcgid-bin/>
            SetHandler fcgid-script
            Options +ExecCGI
        </Location>
    </IfModule>

Altere `/etc/httpd/conf/httpd.conf`:

- Descomente o carregamento de actions_module:

      LoadModule actions_module modules/mod_actions.so

- Carregue o módulo FCGID após o carregamento do módulo unixd (do qual é dependente) - você talvez queira colocá-lo dentro do bloco `<IfModule unixd_module>`:

      LoadModule fcgid_module modules/mod_fcgid.so

- Certifique-se de que a inclusão da configuração do MPM está descomentada (não vem comentado na versão padrão instalada deste arquivo):

      Include conf/extra/httpd-mpm.conf

- Adicione uma inclusão para a sua nova configuração do FCGID:

      Include conf/extra/php-fcgid.conf

Reinicie `httpd.service`.

#### Usando php-fpm e mod_proxy_fcgi

Este método fornece "uma implementação alternativa do PHP FastCGI com alguns recursos adicionais (geralmente) úteis para sites com alto nível de requisições" [1].

Note Diferente da configuração difundida com ProxyPass, a configuração do proxy com SetHandler respeita outras diretivas do Apache, como DirectoryIndex. Isto garante uma melhor compatibilidade com software desenvolvido para libphp, mod_fastcgi e mod_fcgid. Caso queira testar com ProxyPass, experimente com uma linha semelhante a esta:

    ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php-fpm/php-fpm.sock|fcgi://localhost/srv/http/$1

Instale php-fpm.

Habilite os módulos de proxy:

    /etc/httpd/conf/httpd.conf

    LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

Crie `/etc/httpd/conf/extra/php-fpm.conf` com o seguinte conteúdo:

    DirectoryIndex index.php index.html
    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php-fpm/php-fpm.sock|fcgi://localhost/"
    </FilesMatch>

E inclua-o no final de `/etc/httpd/conf/httpd.conf`:

    Include conf/extra/php-fpm.conf

Note O pipe entre `sock` e `fcgi` não admite espaços ao seu redor! `localhost` pode ser substituído por qualquer string. Mais informações aqui

Você pode configurar o PHP-FPM em `/etc/php/php-fpm.d/www.conf`, mas a configuração padrão deverá funcionar adequadamente.

Inicie e habilite `php-fpm.service`. Reinicie `httpd.service`.

#### Teste a instalação do PHP

Para testar se o PHP foi configurado corretamente, crie um arquivo chamado `test.php` no diretório `DocumentRoot` de seu Apache (por exemplo, `/srv/http/` ou `~<username>/public_html/`) com o seguinte conteúdo:

    <?php phpinfo(); ?>

Então vá para http://localhost/test.php ou http://localhost/~<username>/test.php conforme o caso.

### HTTP/2

Note

- Enquanto Apache suporta HTTP/2 não-criptografado sobre TCP (`h2c`), navegadores comuns não o fazem. Portanto, para uso com o último, #TLS precisa ser ativado primeiro.
- Se os clientes de suporte não usam HTTP/2 em vez de HTTP/1.1 e o gerador de configurações da Mozilla (o qual já tem incluída a linha `Protocols` abaixo) foi utilizado para realizar a configuração do #TLS, tente usar `Include` para incluí-lo em `httpd-ssl.conf` após a saída do último.
- Maneiras de testar a inclusão `curl -sI https://your.website`.

Para habilitar o suporte ao HTTP/2 sobre TLS, descomente a seguinte linha em `httpd.conf`:

    LoadModule http2_module modules/mod_http2.so

E adicione a seguinte linha:

    Protocols h2 http/1.1

Para depuração, você poderá definir apenas o módulo (em vez de todo o servidor) usando `debug` ou `info`:

    <IfModule http2_module>
        LogLevel http2:info
    </IfModule>

Para mais informações – incluindo configurações adicionais do HTTP/2 – veja a mod_http2 documentação.

Atenção O módulo `http2_module` não é compatível com o módulo `mpm_prefork_module` cujas configurações antigas são largamente usadas para configurar o PHP. Considere usar php-fpm em vez disso.

## Soluções de problemas

### Logs e Status do Apache

Veja o status do Apache usando o systemctl.

Logs do Apache podem ser encontrados em `/var/log/httpd/`

### Error: PID file /run/httpd/httpd.pid not readable (yet?) após inicializar

Comente a linha `unique_id_module` em `httpd.conf`: `#LoadModule unique_id_module modules/mod_unique_id.so`

### Diretório /run/httpd não é criado durante o boot

Se `systemd-tmpfiles --create` como usuário root resulta em algo como "unsafe path transition", verifique as definições de propriedade de seu diretório root.

    ls -la /
    chown root:root /

### Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe.

Se durante o carregamento de `php_module` o serviço `httpd.service` falha e você obtém um erro como este no log diário (journal) do sistema:

    Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe.  You need to recompile PHP.

Isto ocorre porque o PHP inclui suporte para um módulo que não é threadsafe, e você está tentando usar um MPM em modo threaded. Uma solução para corrigir isto é usar um módulo MPM non-threaded. Tente substituir `mpm_event_module` com `mpm_prefork_module`:

    /etc/httpd/conf/httpd.conf

    LoadModule mpm_event_module modules/mod_mpm_event.so
    LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

e reinicie `httpd.service`.

### AH00534: httpd: Configuration error: No MPM loaded.

Você poderá encontrar este erro após uma atualização recente. Trata-se apenas de uma recente alteração em `httpd.conf` que você pode não ter reproduzido em sua configuração local. Para corrigir, descomente a seguinte linha:

    /etc/httpd/conf/httpd.conf

    LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

E reinicie `httpd.service`.

### AH00072: make_sock: could not bind to address

Isto pode ser causado por várias razões. A mais comum delas é devido a algo estar já usando a porta fornecida, verifique via netstat se isto não está ocorrendo:

    # netstat -lnp | grep -e :80 -e :443

Se você obtiver alguma saída, pare o serviço indicado que está usando a porta ou encerre o processo que está causando o limite da porta e tente novamente.

Outra possível causa é o fato do Apache não puder ser iniciado como root por alguma razão - tente iniciá-lo manualmente e veja se você continua obtendo o erro AH00072.

    # httpd -k start

Finalmente, você tembém pode obter um erro com sua configuração por comandar `Listen` duas vezes sobre a mesma porta. A configuração a seguir é um exemplo de uma configuração incorreta que irá ocasionar o problema:

    Listen 0.0.0.0:80
    Listen [::]:80

### AH01071: Got error 'Primary script unknown'

Isto pode ser causado por `ProtectHome=true` no arquivo unit do systemd relacionado ao php-fpm se você estiver usando arquivos fornecidos em `/home`, como ocorre em um ambiente de host virtual. Você pode desabilitar este recurso editando o arquivo de unit do php-fpm e reiniciando php-fpm. Alternativamente, mova seu `DocumentRoot`.

### Alterar max_execution_time no php.ini não surte qualquer efeito

Se você alterou `max_execution_time` no arquivo `php.ini` para um valor superior a 30 (segundos), você acabará obtendo uma resposta `503 Service Unavailable` do Apache após 30 segundos. Para solucionar isto, adicione uma diretiva `ProxyTimeout` no `httpd.conf` antes do bloco `<FilesMatch \.php$>`:

    /etc/httpd/conf/httpd.conf

    ProxyTimeout 300

e reinicie `httpd.service`.

### PHP-FPM: erros não estão sendo registrados individualmente para cada host virtual

Caso tenha múltiplos hosts virtuais, você talvez queira que cada um tenha seu próprio log de erros em arquivos separados (usando a diretiva ErrorLog do Apache). Se isto não funcionar para você, confirme que PHP-FPM está configurado para registrar erros em seu syslog:

    /etc/php/php-fpm.conf

    error_log = syslog

Também é possível que a configuração do pool esteja sobrepondo. Verifique se a seguinte linha está comentada:

    /etc/php/php-fpm.d/www.conf

    ;php_admin_value[error_log] = /var/log/fpm-php.www.log

## Veja também

- Apache Official Website
- Apache documentation
- Apache wiki
- Apache documentation - Security Tips
- Apache Wiki - Troubleshooting
- Apache on wiki.debian.org

Categories:

- Web server (Português)
- Apache (Português)

Hidden category:

- Pages with broken package links

Apache HTTP Server (Português)
Add topic