Ubuntu Apache2环境下SSL站点配置独立日志文件问题
解决同一域名下子目录站点的SSL独立日志配置问题
首先得指出你之前踩的坑:Apache的ServerName指令只能设置纯域名(比如mydomain.com),不能包含URL路径(像mydomain.com/site1这种格式完全不被Apache识别),所以你那两个带路径的<VirtualHost *:443>配置根本不会被匹配到,日志自然无法分开。
下面给你两种可行的解决方案,根据你的需求选就行:
方案一:同一VirtualHost内用条件化日志(无需修改域名)
如果不想改动现有域名结构,我们可以利用SetEnvIf标记不同子目录的请求,再让CustomLog根据标记写入对应日志。访问日志可以完美分开,错误日志如果不需要严格拆分,用主日志配合标记也能区分,或者你也可以用更复杂的方式拆分(后面会提)。
配置示例:
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName mydomain.com DocumentRoot /var/www/html # 给/site1和/site2开头的请求打上环境变量标记 SetEnvIf Request_URI "^/site1(/.*)?$" SITE=site1 SetEnvIf Request_URI "^/site2(/.*)?$" SITE=site2 # 主错误日志(如果需要拆分错误日志,可以用管道日志配合脚本,不过日常用主日志也足够) ErrorLog ${APACHE_LOG_DIR}/site_error.log # 根据环境变量写入独立访问日志 CustomLog ${APACHE_LOG_DIR}/site1_access.log combined env=SITE=site1 CustomLog ${APACHE_LOG_DIR}/site2_access.log combined env=SITE=site2 # 可选:处理不属于这两个站点的请求日志 CustomLog ${APACHE_LOG_DIR}/other_access.log combined env=!SITE # 配置子目录的Alias和访问权限(确保站点可正常访问) Alias /site1 /var/www/html/site1 <Directory /var/www/html/site1> Options FollowSymLinks AllowOverride All Require all granted </Directory> Alias /site2 /var/www/html/site2 <Directory /var/www/html/site2> Options FollowSymLinks AllowOverride All Require all granted </Directory> # SSL证书相关配置 SSLCertificateFile /etc/letsencrypt/live/mydomain.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/mydomain.com/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf </VirtualHost> </IfModule>
配置说明:
SetEnvIf会检查请求的URI,给所有以/site1或/site2开头的请求加上对应的环境变量。CustomLog的env参数会只在环境变量匹配时,将日志写入对应文件,实现访问日志独立。- 如果一定要拆分错误日志,可以借助
mod_unique_id和自定义日志处理脚本,但这个步骤相对繁琐,对于大多数场景,主错误日志里的请求已经带有URI路径,足够区分是哪个站点的错误。
方案二:使用子域名配置独立VirtualHost(更清晰的长期方案)
如果你可以修改DNS记录,推荐用子域名(比如site1.mydomain.com和site2.mydomain.com)来区分站点,这样每个站点可以拥有独立的VirtualHost,日志配置会更直观,未来扩展也更方便。
步骤:
- 修改DNS记录:添加两个A记录,
site1.mydomain.com和site2.mydomain.com都指向你的服务器IP。 - 更新Let's Encrypt证书:重新申请证书,包含这两个子域名:
sudo certbot certonly --apache -d mydomain.com -d site1.mydomain.com -d site2.mydomain.com - 配置SSL VirtualHost:
<IfModule mod_ssl.c> # site1的独立VirtualHost <VirtualHost *:443> ServerName site1.mydomain.com DocumentRoot /var/www/html/site1 ErrorLog ${APACHE_LOG_DIR}/site1_error.log CustomLog ${APACHE_LOG_DIR}/site1_access.log combined SSLCertificateFile /etc/letsencrypt/live/mydomain.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/mydomain.com/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf </VirtualHost> # site2的独立VirtualHost <VirtualHost *:443> ServerName site2.mydomain.com DocumentRoot /var/www/html/site2 ErrorLog ${APACHE_LOG_DIR}/site2_error.log CustomLog ${APACHE_LOG_DIR}/site2_access.log combined SSLCertificateFile /etc/letsencrypt/live/mydomain.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/mydomain.com/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf </VirtualHost> # 主域名的VirtualHost(保留原有访问入口) <VirtualHost *:443> ServerName mydomain.com DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/site_error.log CustomLog ${APACHE_LOG_DIR}/site_access.log combined SSLCertificateFile /etc/letsencrypt/live/mydomain.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/mydomain.com/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf </VirtualHost> </IfModule>
配置说明:
每个子域名对应独立的VirtualHost,你可以直接在各自的块里配置独立的ErrorLog和CustomLog,完全和你之前HTTP的配置逻辑一致,理解和维护起来都更简单。
不管选哪种方案,配置完成后记得重启Apache生效:
sudo systemctl restart apache2
内容的提问来源于stack exchange,提问作者Fran
相关产品推荐
相关产品推荐

