0

出于测试目的,我想在本地运行 Apache(最终以非 root 用户身份)并将 Apache 配置文件保存在我的中央存储库中。根据 Apache 文档(http://httpd.apache.org/docs/2.2/configuring.html),我可以使用开关设置配置文件,使用-f开关设置 ServerRoot -dhttp://httpd.apache.org/ docs/2.2/programs/httpd.html)。

现在我的问题是,当我尝试启动 Apache 时

sudo apache2 -d $(pwd)/testApacheRootDir/ -f $(pwd)/testApacheRootDir/testingApacheConf -k start

该进程在没有实际启动 Apache(并且没有任何)错误消息的情况下退出。

我知道配置文件已被读取,因为如果文件中有错误,上述命令将打印错误消息。Apache 实际上也使用 ServerRoot 目录,因为(空)error_log文件是在$(pwd)/testApacheRootDir/logs/.

我的 Apache 配置文件如下所示:

Listen 80

NameVirtualHost localhost:80

<VirtualHost localhost:80>
DocumentRoot /var/www/cms
ServerName cms.testing
</VirtualHost>

<VirtualHost localhost:80>
DocumentRoot /var/www/vendor
ServerName vendor.testing
</VirtualHost>

apache2 -V打印:

Server version: Apache/2.2.22 (Ubuntu)
Server built:   Nov  6 2012 20:27:25
Server's Module Magic Number: 20051115:30
Server loaded:  APR 1.4.6, APR-Util 1.4.1
Compiled using: APR 1.4.6, APR-Util 1.4.1
Architecture:   64-bit
Server MPM:     Worker
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/worker"
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=128
 -D HTTPD_ROOT="/etc/apache2"
 -D SUEXEC_BIN="/usr/lib/apache2/suexec"
 -D DEFAULT_PIDLOG="/var/run/apache2.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="mime.types"
 -D SERVER_CONFIG_FILE="apache2.conf"

你有什么建议可能是错的吗?

4

2 回答 2

1

我不知道为什么错误消息永远不会写入日志文件或控制台输出,但缺少的是用户指令。添加后

User    www-data
Group   www-data

一切正常。

于 2013-01-14T08:31:49.440 回答
1

Apache 有时会在解析配置文件之后但在初始化日志记录之前遇到错误。在这种情况下,错误消息会打印到stderr,但在您启动 Apache 时会隐藏该进程的任何输出。尝试像这样运行它:

apache2 -X -d $(pwd)/testApacheRootDir/ -f $(pwd)/testApacheRootDir/testingApacheConf

-X标志使 Apache 在前台运行:

-X 在调试模式下运行 httpd。只会启动一名工作人员,并且服务器不会从控制台分离。

这应该允许您查看打印到的任何错误消息stderr

如果这不起作用,这是一个大锤子:

在 的控制下运行 Apache strace,然后检查跟踪文件以查看是否可以发现问题。像这样启动 Apache:

strace -o trace -f -s 1024 apache2 -X -d $(pwd)/testApacheRootDir/ -f $(pwd)/testApacheRootDir/testingApacheConf

这会将系统调用跟踪写入名为trace. 检查这个文件(可能从底部开始)是否有任何write包含错误消息的系统调用,或系统调用中的错误(例如,ENOENT因为您的配置中指定的目录丢失或输入错误等)。

-f标志要求strace跟随分叉,-s 1024这意味着它将在对write等的调用中记录多达 1024 个字符。

于 2013-01-10T15:45:14.897 回答