我有一个拥有20个不同SSL证书的网站。 当前的configuration文件相当长,并有很多重复,因为我有20个<VirtualHost *:443>
块,对于ServerAdmin
, DocumentRoot
, ErrorLog
等大多数相同的值。
唯一不同的值是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上使用不同的证书。