【问题标题】:Apache server -- multiple directories, different error logsApache服务器——多个目录,不同的错误日志
【发布时间】:2012-05-10 19:45:27
【问题描述】:

我在 /var/www 中有两个目录(例如 /var/www/app1 和 /var/www/app2),我希望将它们的错误日志发送到不同的文件。两者都在同一个域下,所以我认为我不能将它们放在不同的虚拟主机下。因此,例如,我将访问它们:

http://localhost/app1

http://localhost/app2

我看到了这个页面:

Generate access logs for different subdirectories in Apache

谁的解决方案非常适合访问日志。但是,“env”参数似乎不适用于 ErrorLog 指令。

在这个“发现”之前,我正在研究这个,这似乎是错误的:

<VirtualHost *:80>
  ServerAdmin ray@localhost

  DocumentRoot /var/www/app1

  <Directory />
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order deny,allow
    allow from all
  </Directory>

  ErrorLog ${APACHE_LOG_DIR}/app1/error.log

  LogLevel warn

  CustomLog ${APACHE_LOG_DIR}/app1/access.log combined
</VirtualHost>

我有点迷茫我应该做什么。也就是说,如果有某种方法可以让 ErrorLog 工作,或者我应该继续尝试为每个目录配置一个虚拟主机。任何帮助,将不胜感激!谢谢!

【问题讨论】:

  • 我有同样的问题,我正在寻找解决方案,我认为通过每个文件夹创建一个虚拟主机并在内部进行代理可能可行,这只是一个理论:D 例如:PublicDomain.com/folder 显示内容folder.localhost

标签: apache2 error-log


【解决方案1】:

为每个目录设置自定义 ID,您可以按目录分隔日志,如下所示:

<Directory app1>
    SetEnv app1
</Directory>
<Directory app2>
    SetEnv app2
</Directory>
CustomLog ${APACHE_LOG_DIR}/site1.log combined env=app1
CustomLog ${APACHE_LOG_DIR}/site2.log combined env=app2

【讨论】:

  • env=subwebsite1 实际上是 env=app1 吗?否则,“subwebsite1”如何与“app1”匹配?
  • @YakovL 你说得对,我编辑了我的答案。
  • 好的,谢谢。您知道反向代理是否可以使用类似的东西? (stackoverflow.com/q/68923480/3995261)
  • @YakovL 抱歉,我不知道。
【解决方案2】:

最后我做到了,首先为每个文件夹创建内部子域,并使用 proxypass 传递子域内容。

启用 apache 模组:

a2enmod authz_core dir proxy proxy_http

/etc/hosts

127.0.0.1       localhost
127.0.0.1       a.localhost
127.0.0.1       b.localhost

/etc/apache2/sites-available/default.conf

<VirtualHost *:80>
        ServerName localhost
        ServerAdmin fake@mail.com
        DocumentRoot "/dev/null"

        ProxyPass /a http://a.localhost/
        ProxyPassReverse /a http://a.localhost/
        ProxyPass /b http://b.localhost/
        ProxyPassReverse /b http://b.localhost/

        LogLevel debug

        ErrorLog ${APACHE_LOG_DIR}/default-error.log
        CustomLog ${APACHE_LOG_DIR}/default-access.log combined

</VirtualHost>

/etc/apache2/sites-available/a.conf

<VirtualHost *:80>
        ServerName a.localhost
        ServerAdmin fake@mail.com
        DocumentRoot "/Publikoa/a"

        <Directory "/Publikoa/a">
                DirectoryIndex index.html
                Require all granted
        </Directory>

        LogLevel debug

        ErrorLog ${APACHE_LOG_DIR}/a-error.log
        CustomLog ${APACHE_LOG_DIR}/a-access.log combined

</VirtualHost>

/etc/apache2/sites-available/b.conf

<VirtualHost *:80>
        ServerName b.localhost
        ServerAdmin fake@mail.com
        DocumentRoot "/Publikoa/b"

        <Directory "Publikoa/b">
                DirectoryIndex index.html
                Require all granted
        </Directory>

        LogLevel debug

        ErrorLog ${APACHE_LOG_DIR}/b-error.log
        CustomLog ${APACHE_LOG_DIR}/b-access.log combined

</VirtualHost>

启用网站:

a2ensite default a b

重启apache:

/etc/init.d/apache2 restart

【讨论】:

    【解决方案3】:

    为什么在VirtualHost 上下文中为/ 设置Directory 选项?使用&lt;Directory /var/www/app1&gt; 而不是&lt;Directory /&gt;

    由于Apache ErrorLog directive docs,它的上下文是server config, virtual host——这意味着只能为整个服务器或VirtalHost定义ErrorLog,而不是Directory。所以如果你想将不同的日志发送到不同的文件,尝试使用SetEnvIf来设置一个Env变量。根据您所在的目录,它应该类似于SetEnvIf Request_URI ^\/a1\/ a1SetEnvIf Request_URI ^\/a2\/ !a1。然后根据a1环境变量写入日志。

    【讨论】:

    • 感谢您纠正我的“目录”错误!至于ErrorLog,我确实发现了环境如何工作以分离出访问日志。但它似乎不适用于错误日志。我的理解正确吗? (当我尝试时,Apache 正在解析配置文件时出现错误。)我猜你是对的——错误日志是针对整个服务器或虚拟主机的。根据您发送的链接,我想另一种选择是将每个错误日志条目通过管道传输到脚本...非常感谢您的帮助!
    • 是的,我也搜索过,似乎 ErrorLog 文件无法与 SetEnvIf 分隔。不客气。
    猜你喜欢
    • 2020-03-14
    • 2012-06-27
    • 1970-01-01
    • 2011-01-15
    • 2012-03-14
    • 2012-04-12
    • 2020-03-03
    • 2014-02-26
    • 1970-01-01
    相关资源
    最近更新 更多