1.2. Quais são as opções do arquivo de configuração do Apache? (httpd.conf)

O servidor httpd Apache tem a função de servir páginas html para intranet ou internet e possui grandes qualidades. Entre elas, e de onde o nome do aplicativo se originou, a de ser um programa bastante "patcheável" ("patchy" em inglês, logo o nome Apache veio de "a patchy server") extendendo suas capacidades iniciais por fazer uso de módulos diversos. Estes, adicionam o suporte a php, cgi e outros, e são de suma importância para um servidor http seguro e versátil.

A configuração básica abordada neste documento, tem 3 seções importantes:

     Configuração do servidor principal
     Configuração de um servidor em um domínio virtual
     Habilitação de uma página hospedada no home de usuários
    

Configuração principal (editando o arquivo de configuração)

Os arquivos responsáveis por toda a configuração do httpd são três (acess.conf, srm.conf e httpd.conf), mas apenas um deles importa realmente (httpd.conf), sendo os outros dois consideredos dispensáveis, já que é possível colocar tudo que poderia estar nestes, no principal.

As opções neste arquivo já estão comentadas mas mesmo assim aqui vai uma descrição das mesmas. As principais são:

    # ServerType is either inetd, or standalone.  Inetd mode is only supported
    # on
    # Unix platforms.
    #
    ServerType standalone

Diz ao sistema se o httpd vai ser rodado via script próprio (standalone), ou a partir do arquivo inetd.conf (inetd). (em "inetd" o httpd fica ocioso, enquanto o inetd fica monitorando as requisições, quando houver alguma, ele avisa e o serviço começa a funcionar)

    #
    # ServerRoot: The top of the directory tree under which the server's
    # configuration, error, and log files are kept.
    #
    # NOTE!  If you intend to place this on an NFS (or otherwise network)
    # mounted filesystem then please read the LockFile documentation
    # (available at http://www.apache.org/docs/mod/core.html#lockfile);
    # you will save yourself a lot of trouble.
    #
    # Do NOT add a slash at the end of the directory path.
    #
    ServerRoot /etc/httpd
       

Esta cuida do caminho do diretório onde irão ficar os arquivos de configuração. Pode ser mudado se necessário.

    #
    # Timeout: The number of seconds before receives and sends time out.
    #
    Timeout 300
    

Tempo máximo (em segundos) que o servidor esperará, mantendo uma conexão aberta com o cliente. Se o limite for excedido, ele terá de criar uma nova conexão com o mesmo.

    #
    # KeepAlive: Whether or not to allow persistent connections (more than
    # one request per connection). Set to "Off" to deactivate.
    #
    KeepAlive On
    

Diretamente ligado com a opção acima, define se o processo de manter a conexão com o cliente está ativo ou não.

    #
    # MaxKeepAliveRequests: The maximum number of requests to allow
    # during a persistent connection. Set to 0 to allow an unlimited amount.
    # We recommend you leave this number high, for maximum performance.
    #
    MaxKeepAliveRequests 100
    

Número máximo de conexões mantidas, sem necessidade de renovação. Quanto mais alto o número, melhor a performance (com o hardware adequado).

    
    #
    # KeepAliveTimeout: Number of seconds to wait for the next request from the
    # same client on the same connection.
    #
    KeepAliveTimeout 15

Máximo (de segundos) a espera de nova requisição.

    #
    # Number of servers to start initially --- should be a reasonable ballpark
    # figure.
    #
    StartServers 10
    

Número de servers iniciais, ou seja, logo no início do processo, o httpd poderia responder a 10 conexões simultâneas ao mesmo site.

    #
    # Limit on total number of servers running, i.e., limit on the number
    # of clients who can simultaneously connect --- if this limit is ever
    # reached, clients will be LOCKED OUT, so it should NOT BE SET TOO LOW.
    # It is intended mainly as a brake to keep a runaway server from taking
    # the system with it as it spirals down...
    #
    MaxClients 150
    

Número máximo de conexões simultaneas por clientes ao site. Se for ultrapassada, mostrará a infame mensagem "http server busy".

    #
    # Listen: Allows you to bind Apache to specific IP addresses and/or
    # ports, in addition to the default. See also the <VirtualHost>
    # directive.
    #
    #Listen 3000
    #Listen 12.34.56.78:80

Permite ao __principal__ httpd server, responder em mais de um ip (descomentando o 12.34.56.78:80 por exemplo, habilitaria ao server http escutar em um ip além de seu ip normal (o da própria máquina))

    #
    # BindAddress: You can support virtual hosts with this option. This
    # directive
    # is used to tell the server which IP address to listen to. It can either
    # contain "*", an IP address, or a fully qualified Internet domain name.
    # See also the <VirtualHost> and Listen directives.
    #
    BindAddress 192.168.255.108:80

Esse é importante. Por default a linha BindAddress vem comentada pois como está apresentada acima, habilita o acesso a um dominio virtual (em nosso caso, o ip 192.168.255.108:80 (o :80 seria indicando a porta 80) que será explicado mais além. Para cada virtual host, é necessária uma entrada "BindAddress e um número ip"

    #
    # Dynamic Shared Object (DSO) Support
    #
    # To be able to use the functionality of a module which was built as a DSO
    # you
    # have to place corresponding `LoadModule' lines at this location so the
    # directives contained in it are actually available _before_ they are used.
    # Please read the file README.DSO in the Apache 1.3 distribution for more
    # details about the DSO mechanism and run `httpd -l' for the list of already
    # built-in (statically linked and thus always available) modules in your
    # httpd
    # binary.
    #
    # Note: The order is which modules are loaded is important.  Don't change
    # the order below without expert advice.
    #
    
    # Example:
    # LoadModule foo_module modules/mod_foo.so
    #
    #LoadModule mmap_static_module modules/mod_mmap_static.so
    LoadModule env_module         modules/mod_env.so
    (seguido de uma lista de LoadModule e mais além, AddModule)

Descomentando quaisquer das linhas que comecem com LoadModule ou AddModule, valida o carregamento de módulos feito na inicialização do httpd. Estes funcionam como opções, por exemplo, habilitar ou não o suporte a arquivos cgi no server, etc

    #
    # Port: The port to which the standalone server listens. For
    # ports < 1023, you will need httpd to be run as root initially.
    #
    Port 80
    

O httpd responde por default na porta 80, neste campo você poderá modificá-la se quiser.

    #
    # ServerAdmin: Your address, where problems with the server should be
    # e-mailed.  This address appears on some server-generated pages, such
    # as error documents.
    #
    ServerAdmin root@localhost

O endereço de email para onde será mandado algo se o server acusar erro ou anormalidades

    #
    # ServerName allows you to set a host name which is sent back to clients for
    # your server if it's different than the one the program would get (i.e.,
    # use
    # "www" instead of the host's real name).
    #
    # Note: You cannot just invent host names and hope they work. The name you
    # define here must be a valid DNS name for your host. If you don't
    # understand
    # this, ask your network administrator.
    # If your host doesn't have a registered DNS name, enter its IP address
    # here.
    # You will have to access it by its address (e.g., http://123.45.67.89/)
    # anyway, and this will make redirections work in a sensible way.
    #
    ServerName vader.suptel

Outro importante. Determina o nome do server __principal__. Importante: o nome tem que obrigatoriamente constar em DNS (um ip associado a um nome) pois apenas inventando um, não irá adiantar. O modo de chamá-lo seria http://nome mas se o mesmo não estiver em nenhum DNS, coloque o ip (seria http://numero-ip para chamá-lo então, neste caso).

    #
    # DocumentRoot: The directory out of which you will serve your
    # documents. By default, all requests are taken from this directory, but
    # symbolic links and aliases may be used to point to other locations.
    #
    DocumentRoot "/html"

Determina o caminho onde estarão os arquivos html do servidor __principal__. IMPORTANTE: o diretório deve estar com permissão 755 (chmod 755, sendo leitura, escrita e execução para o dono, leitura e execução para grupo e outros que não sejam do grupo nem donos (others).

    #
    # This should be changed to whatever you set DocumentRoot to.
    #
    <Directory "/html">
    
    #
    # This may also be "None", "All", or any combination of "Indexes",
    # "Includes", "FollowSymLinks", "ExecCGI", or "MultiViews".
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
        Options Indexes FollowSymLinks Includes
    
    #
    # This controls which options the .htaccess files in directories can
    # override. Can also be "All", or any combination of "Options", "FileInfo",
    # "AuthConfig", and "Limit"
    #
        AllowOverride None
    
    #
    # Controls who can get stuff from this server.
    #
        Order allow,deny
        Allow from all
    </Directory>

Este conjunto de campos determinam as opções que os diretórios onde contém documentos htmls a serem acessados irão ter. A primeira "# This should.." deve conter o mesmo diretório que o "DocumentRoot" tem (o /html). IMPORTANTE: TODAS ESTAS DEVERÃO SER COPIADAS (E EDITADAS SE PRECISO) PARA AS PASTAS PRINCIPAIS QUE CONTIVEREM ARQUIVOS HTML DO SERVIDOR PRINCIPAL OU DOMINIO VIRTUAL. Se por exemplo vc tiver apenas um servidor virtual alem do principal que responda no diretorio /vh (veremos como fazer essa associação mais além), você terá de ter as entradas <Directory "/vh"> e todas as abaixo desta, nem que sejam apenas copiadas, abaixo do término da ultima (# Controls who can get stuff from this server.).

    
    #
    # UserDir: The name of the directory which is appended onto a user's home
    # directory if a ~user request is received.
    #
    UserDir public_html

Esta opção é bem útil. Cuida de qual diretório o usuário terá de fazer, se quiser ter uma página em seu home. No caso, como está configurado, ele precisará criar um diretório public_html (o nome pode ser alterado no campo acima) e colocar algo em html alí, podendo ser acessado com http://nome.da.maquina/~nome-do-usuário. IMPORTANTE: COMO MENCIONADO ANTERIORMENTE, ESTE E TODOS OS DIRETÓRIO ANTERIORES PRECISAM TER PERMISSÕES 755 AFIM DE GARANTIR ACESSO.

    
    #
    # Control access to UserDir directories.  The following is an example
    # for a site where these directories are restricted to read-only.
    #
    
    <Directory /home/*/public_html>
        AllowOverride FileInfo AuthConfig Limit
        Options MultiViews Indexes SymLinksIfOwnerMatch
        <Limit GET POST OPTIONS PROPFIND>
            Order allow,deny
            Allow from all
        </Limit>
        <Limit PUT DELETE PATCH PROPPATCH MKCOL COPY MOVE LOCK UNLOCK>        
    Order deny,allow   
        Deny from all
        </Limit>
    </Directory>

Esta opção coordena os direitos de acesso ao diretório public_html dos usuários e vem por padrão, comentada. No caso você deve descomentá-la e modificá-la de acordo com o diretório home de seus usuários (por exemplo, o campo <Directory /home/*/public_html> diz que, no diretório /home, todos que existem dentro dele e que tenham public_html vão ser passíveis de acesso, sob as regras configuradas abaixo desta linha.

    #
    # DirectoryIndex: Name of the file or files to use as a pre-written HTML
    # directory index.  Separate multiple entries with spaces.
    #
    DirectoryIndex index.html index.htm index.cgi

Esta é bastante importante também pois determina quais nomes de arquivos serão válidos para realizar-se a abertura dos mesmos em um browser http. No caso da configuração acima, o server aceitará arquivos de nome index.html, index.htm e index.cgi como arquivos iniciais de uma home page.

    #
    # UseCanonicalName:  (new for 1.3)  With this setting turned on, whenever
    # Apache needs to construct a self-referencing URL (a URL that refers back
    # to the server the response is coming from) it will use ServerName and
    # Port to form a "canonical" name.  With this setting off, Apache will
    # use the hostname:port that the client supplied, when possible.  This
    # also affects SERVER_NAME and SERVER_PORT in CGI scripts.
    #
    UseCanonicalName On

Se ligada, uma pagina que por exemplo se chame http://www.teste.com/teste/ e seja acessada como http://www.teste.com/teste (sem o / no final) seja válida. Se desligada, ele não irá achar.

    #
    # LogLevel: Control the number of messages logged to the error_log.
    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    #
    LogLevel warn

Determina em que nível o httpd irá rodar. A recomendada é a warn pois não causa acúmulo de atividades no apache e é uma das mais usadas.

    #
    # If you want to use name-based virtual hosts you need to define at
    # least one IP address (and port number) for them.
    #
    NameVirtualHost 192.168.255.108:80

Neste, configuramos o ip e porta que o servidor virtual terá. A definição deste é que você não precisa ter vários computadores rodando http servers neles, com apenas um você pode ter www.teste.com e www.teste1.com, cada um abrindo uma página diferente (em diferentes diretórios do cpu) e cada um possuindo um ip (mas ambos apontarão para o mesmo cpu, isso se chama IP ALIAS).

    #
    # VirtualHost example:
    # Almost any Apache directive may go into a VirtualHost container.
    #
    #<VirtualHost ip.address.of.host.some_domain.com>
    #    ServerAdmin webmaster@host.some_domain.com
    #    DocumentRoot /www/docs/host.some_domain.com
    #    ServerName host.some_domain.com
    #    ErrorLog logs/host.some_domain.com-error_log
    #    CustomLog logs/host.some_domain.com-access_log common
    #</VirtualHost>
    
    <VirtualHost teste:80>
        ServerAdmin webmaster@host.some_domain.com
            DocumentRoot /vh
        ServerName teste.suptel
        ErrorLog logs/host.some_domain.com-error_log
        CustomLog logs/host.some_domain.com-access_log common
    </VirtualHost>

Esta é a última mas não menos importante das configurações básicas do apache. Ela cuida do servidor virtual e de suas configurações, sendo que o que está comentado (com um # na frente) dá um exemplo do que deverá ser feito (as linhas descomentadas não estão escritas por padrão, estas apresentadas foram digitadas com base no exemplo). Explicarei cada uma delas:

    <VirtualHost teste:80>

Valida o nome "teste" ao servidor virtual e fala em que porta ele irá atender (80)

    ServerAdmin webmaster@host.some_domain.com

Se o sistema detectar algo de anômalo, um mail será enviado a webmaster@host.some_domain.com

    DocumentRoot /vh

Designa a pasta onde os arquivos html do servidor virtual serão colocados (LEMBRANDO QUE ESTA DEVERÁ TER PERMISSÕES 755 EM SEU CAMINHO INTEIRO COMO MENCIONADO ANTERIORMENTE).

    ServerName teste.suptel

Nome e dominio do servidor virtual.

    ErrorLog logs/host.some_domain.com-error_log

O relatório de erros do servidor virtual vai ser escrito em logs/host.some_domain.com-error_log

    CustomLog logs/host.some_domain.com-access_log common

Log de acessos vai ser escrito em logs/host.some_domain.com-access_log common

    </VirtualHost>

Indica o final da configuração do virtual host.

IMPROTANTE: DEPOIS DE QUALQUER MODIFICAÇÃO NESTE ARQUIVO (INCLUSIVE NA PRIMEIRA), O HTTPD DEVERÁ SER REINICIADO DIGITANDO COMO ROOT:

    [root@localhost /root]# cds

e após:

    [root@localhost /init.d]# ./httpd stop
    [root@localhost /init.d]# ./httpd start

Depois, é necessário informar ao sistema que o mesmo precisa responder num outro ip (192.168.255.108 como definido nas configurações do virtual host) além do ip verdadeiro (pois um virtual host não é nada mais do que fazer um computador responder em outro ip (e outro nome, se assim especificado no dns), direcionando o pedido http para este ip "falso" e associando a pasta de htmls referida ao mesmo).

Vamos utilizar então o linuxconf para adicionar este ip "falso" (técnica chamada de IP ALIAS, anteriormente mencionada).

Entre como root no linuxconf:

    [root@localhost]# linuxconf

Vá em:

    Ambiente de Rede -->
        Apelidos de IP para máquinas virtuais -->
                                               eth0 -->
    
    configure o ip virtual (no caso do nosso, seria 192.168.255.108) e sua
    máscara.
    Depois:
        
          Aceitar
         Sair
        Sair
       Sair
      Ativar as mudanças

Confirme se o novo ip está realmente online usando o comando ping:

[root@localhost]# ping 192.168.255.108

Coloque algum documento html no diretório /html (que de acordo com a configuração feita, é a pasta do server principal, podendo ter subpastas dentro desta) e em /vh (configurada para o virtualhost "teste" e que também pode ter subpastas), todas com as devidas permissões 755 previamente mencionadas.

E, para acessá-los, digite em um browser:

    http://vader.suptel (para o principal já que o nome é o do servidor principal)
    
    ou:
    
    http://teste (que é o nome do virtual host)

O primeiro tem que estar respondendo no documento html válido na pasta /html e o segundo na /vh.

Para uma página no home do usuário, digite (após o usuário ter criado a pasta public_html em seu home e ter dado permissões 755 para a mesma).

    http://nome-da-maquina/~nome-do-usuário
deve responder no html do diretório /home/nome-do-usuário/public_html