我正在尝试设置一个运行 Apache + mod_fcgid + mod_security chroot 的 Web 服务器,但要使其正常工作却很难。 Apache 是从官方 CentOS 存储库安装的,mod_fcgid 和 mod_security 是从 EPEL 存储库安装的。
起初,我什至无法在启用 chroot 的情况下启动 Apache,但我已经修复了很多问题,但仍有一些问题需要解决。
第一个问题,当我尝试在 Apache 停止时启动它时,它启动时没有任何问题,但是,当我尝试在运行时重新启动它时,这就是我得到的结果;
$ service httpd restart
Stopping httpd: [FAILED]
Starting httpd: (98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
[FAILED]
阿帕奇错误日志;
[Mon Jun 17 07:47:51 2013] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Mon Jun 17 07:47:52 2013] [notice] ModSecurity: chroot checkpoint #1 (pid=954 ppid=953)
[Mon Jun 17 07:47:52 2013] [notice] ModSecurity for Apache/2.7.3 (http://www.modsecurity.org/) configured.
[Mon Jun 17 07:47:52 2013] [notice] ModSecurity: APR compiled version="1.3.9"; loaded version="1.3.9"
[Mon Jun 17 07:47:52 2013] [notice] ModSecurity: PCRE compiled version="7.8 "; loaded version="7.8 2008-09-05"
[Mon Jun 17 07:47:52 2013] [notice] ModSecurity: LUA compiled version="Lua 5.1"
[Mon Jun 17 07:47:52 2013] [notice] ModSecurity: LIBXML compiled version="2.7.6"
[Mon Jun 17 07:47:52 2013] [notice] Digest: generating secret for digest authentication ...
[Mon Jun 17 07:47:52 2013] [notice] Digest: done
[Mon Jun 17 07:47:53 2013] [notice] ModSecurity: chroot checkpoint #2 (pid=955 ppid=1)
[Mon Jun 17 07:47:53 2013] [notice] ModSecurity: chroot successful, path=/var/www
[Mon Jun 17 07:47:53 2013] [notice] Apache/2.2.15 (Unix) DAV/2 mod_fcgid/2.3.7 configured -- resuming normal operations
第二个问题是,常规 HTML 文件的运行没有问题,但 PHP 页面则不然。
mod_安全日志;
--98586c48-A--
[17/Jun/2013:08:01:37 --0400] Ub76oUJVtI0AAAPEDiYAAAAG CLIENT_IP_GOES_HERE 51722 SERVER_IP_GOES_HERE 80
--98586c48-B--
GET /testphp.php HTTP/1.1
Host: hostname
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
Cookie: PHPSESSID=5a9jqak7dt30l2vvrs9c74lo81
Connection: keep-alive
Cache-Control: max-age=0
--98586c48-F--
HTTP/1.1 500 Internal Server Error
Content-Length: 543
Connection: close
Content-Type: text/html; charset=iso-8859-1
--98586c48-E--
--98586c48-H--
Apache-Error: [file "fcgid_proc_unix.c"] [line 637] [level 4] [status 104] mod_fcgid: error reading data from FastCGI server
Apache-Error: [file "/builddir/build/BUILD/httpd-2.2.15/server/util_script.c"] [line 435] [level 19] Premature end of script headers: testphp.php
Apache-Handler: fcgid-script
Stopwatch: 1371470497629709 2809 (- - -)
Stopwatch2: 1371470497629709 2809; combined=25, p1=3, p2=10, p3=1, p4=1, p5=9, sr=0, sw=1, l=0, gc=0
Response-Body-Transformed: Dechunked
Producer: ModSecurity for Apache/2.7.3 (http://www.modsecurity.org/).
Server: Apache
Engine-Mode: "ENABLED"
--98586c48-Z--
我哪里错了?我缺少什么?
答案1
首要问题
第一个问题相对容易。这意味着另一个守护程序/服务已经在使用端口 80,这是 Apache 希望用于侦听来自浏览器的连接的 TCP 端口。
此命令将向您显示正在使用它的内容:
$ netstat -tapn |grep :80
例如:
$ netstat -tapn |grep :80
tcp 0 0 :::80 :::* LISTEN 13415/httpd
tcp 0 0 ::ffff:127.0.0.1:80 ::ffff:127.0.0.1:35880 TIME_WAIT -
tcp 0 0 ::ffff:127.0.0.1:80 ::ffff:127.0.0.1:35909 TIME_WAIT -
tcp 0 0 ::ffff:192.168.1.105:80 ::ffff:192.168.1.6:40061 TIME_WAIT -
tcp 0 0 ::ffff:192.168.1.105:80 ::ffff:192.168.1.6:40060 TIME_WAIT -
在这里我们可以看到 Apache (httpd) 已经在运行,它的进程 ID 是 13415。
您可以杀死它或找出正在侦听端口 80 的其他内容。
第二期
对于你的第二个问题,我认为发生的情况是你已经运行了一台 Apache 服务器,只是不是你想象的那样。因此,杀死它,看看你的第二个问题是否消失。
如果没有,那么您需要从 CentOS 存储库安装一些额外的软件包。特别是 PHP 以及您的特定应用程序所需的任何其他内容。
顺便说一句,请确保您以 root 身份或使用sudo
命令停止/启动 Apache 服务。普通用户无法停止/启动此服务。
第三期
suEXEC
正如OP指出的那样,在chrooted监狱中使用不直接受支持suEXEC
,因此有必要对其进行修补。当前版本的suEXEC
.
这是一个非常好的教程,介绍了总体架构以这种方式设置 Apache 以及重新编译的步骤,suEXEC
以便它可以支持 chroot。