apache2configuration中的inheritance

我有一个拥有20个不同SSL证书的网站。 当前的configuration文件相当长,并有很多重复,因为我有20个<VirtualHost *:443>块,对于ServerAdminDocumentRootErrorLog等大多数相同的值。

唯一不同的值是ServerName, ServerAlias, SSLCertificateFile, SSLCertificateKeyFile

是否有一个DRY(不要重复自己)解决scheme这个configuration集?

从apache 2.4你可以使用mod_macro

用法示例:

 a2enmod macro 

创build一个文件/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> 

启用conf

 a2enconf 001-macro.conf 

在你的VHostconfiguration例如写:

 Use VHostHTTP www.example.com 

上面的一些macros需要一些指令才能工作。

/etc/apache2/apache2.conf

 PassEnv hostname PassEnv doc_root PassEnv safe_doc_root 

/etc/apache2/envvars

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

重新启动Apache

 systemctl restart apache2 

这只是我早期实验的一个例子。 我也会检查一下,比如说,更好的适合。

在上面的macros中,每个主机名都有一个证书。 当然你需要适应这个在VHosts上使用不同的证书。

请参阅https://httpd.apache.org/docs/2.4/mod/mod_macro.html