Herança na configuração do apache2

2

Eu tenho um site com 20 certificados SSL diferentes servidos com o SNI. O arquivo de configuração atual é bastante longo e tem muitas duplicatas, pois tenho 20% de blocos<VirtualHost *:443>, com valores praticamente idênticos, para ServerAdmin , DocumentRoot , ErrorLog , etc.

Os únicos valores diferentes são ServerName, ServerAlias, SSLCertificateFile, SSLCertificateKeyFile .

Existe uma solução DRY (Don't Repeat Yourself) para este conjunto de configurações?

    
por iTayb 27.12.2016 / 13:47

1 resposta

1

Do apache 2.4 você pode usar mod_macro

Exemplo de uso:

a2enmod macro

Crie um arquivo /etc/apache2/conf-available/001-macro.conf :

<IfModule !macro_module>
  Error "mod_macro is required. To enable it run:  a2enmod macro"
</IfModule>

<Macro VHostLog $domain $port>
  LogLevel warn
  ErrorLog ${APACHE_LOG_DIR}/error_$domain_$port.log
  CustomLog ${APACHE_LOG_DIR}/access_$domain_$port.log vhost_combined
</Macro>

<Macro RedirectTo $protocol $domain>
  <If "'${well_known_enabled}' == 'On' && %{REQUEST_URI} =~ m#^/\.well-known(/|$)#">
    # Do nothing
  </If>
  <ElseIf "tolower(req('Host')) != '$domain' || tolower(%{REQUEST_SCHEME}) != '$protocol'">
    Redirect permanent / $protocol://$domain/
  </ElseIf>
</Macro>

<Macro EnableSSL>
  <IfModule !ssl_module>
    Error "mod_ssl is required. To enable it run:  a2enmod ssl"
  </IfModule>
  SSLEngine On
  SSLCertificateFile /opt/letsencrypt/${hostname}-fullchain.crt
  SSLCertificateKeyFile /opt/letsencrypt/${hostname}.key
</Macro>

<Macro DirGrantAll $dir>
  <Directory "$dir">
    Require all granted
  </Directory>
</Macro>

### VHostStandard

<Macro VHost $port $domain>
  Use VHostCustom $port $domain ${doc_root}/$domain
  Use DirGrantAll ${doc_root}/$domain
</Macro>

<Macro VHostHTTP $domain>
  Use VHostCustomHTTP $domain ${doc_root}/$domain
  Use DirGrantAll ${doc_root}/$domain
</Macro>

<Macro VHostHTTPS $domain>
  Use VHostCustomHTTPS $domain ${doc_root}/$domain
  Use DirGrantAll ${doc_root}/$domain
</Macro>

### VHostCustom

<Macro VHostCustom $port $domain $dir>
  ServerName $domain
  DocumentRoot "$dir"
  Use VHostLog $domain $port
</Macro>

<Macro VHostCustomHTTP $domain $dir>
  Use VHostCustom 80 $domain $dir
</Macro>

<Macro VHostCustomHTTPS $domain $dir>
  Use VHostCustom 443 $domain $dir
  Use EnableSSL
</Macro>

### VHostRedirect

<Macro VHostRedirect $port $server $redirect_protocol $redirect_domain>
  Use VHostCustom $port $server ${safe_doc_root}
  <Location />
    Require all granted
  </Location>
  Use RedirectTo $redirect_protocol $redirect_domain
</Macro>

<Macro VHostRedirectHTTP $server $redirect_protocol $redirect_domain>
  Use VHostRedirect 80 $server $redirect_protocol $redirect_domain
</Macro>

<Macro VHostRedirectHTTPS $server $redirect_protocol $redirect_domain>
  Use VHostRedirect 443 $server $redirect_protocol $redirect_domain
</Macro>

### VHostAlias
<Macro VHostAlias $port $server $redirect_protocol $redirect_domain>
  <VirtualHost *:$port>
    Use VHostRedirect $port $server $redirect_protocol $redirect_domain
  </VirtualHost>
</Macro>

<Macro VHostAliasHTTP $server $redirect_protocol $redirect_domain>
  Use VHostAlias 80 $server $redirect_protocol $redirect_domain
</Macro>

<Macro VHostAliasHTTPS $server $redirect_protocol $redirect_domain>
  Use VHostAlias 443 $server $redirect_protocol $redirect_domain
</Macro>

Ativar o conf

a2enconf 001-macro.conf

Na sua configuração do VHost, por exemplo, escreva:

Use VHostHTTP www.example.com

Algumas diretivas são necessárias para que algumas das macros acima funcionem.

Em /etc/apache2/apache2.conf :

PassEnv hostname
PassEnv doc_root
PassEnv safe_doc_root

Em /etc/apache2/envvars :

export hostname=$(hostname -s)
export doc_root=/var/www/html
export safe_doc_root=/var/www/empty

Reinicie o apache

systemctl restart apache2

Este é apenas um exemplo da minha experimentação inicial. Também verificarei se, por exemplo, ansible seria mais adequado.

Nas macros acima, tenho sempre um certificado por nome de host. Claro que você precisa adaptar isso para usar certificados diferentes no VHosts.

Veja o link

    
por 27.12.2016 / 16:44