Apache / httpd / var / www / html / .cgi脚本会引发500个内部服务器错误

我今天安装了一个新的CentOS 7 x86_64 LAMP服务器。

我在c中编译了一个简单的CGI脚本,我把它命名为test.cgi,并为.cgi脚本启用了AddHandler。 然而,每次我尝试从我的/ var / www / html目录加载/test.cgi页面时,任何简单的.cgi脚本都会给我一个500内部服务器错误页面。

我testing了脚本在/ var / www / cgi-bin目录下工作正常。 我的服务器正在运行selinux,而apache / httpd正在使用suEXEC。

编辑:也没有创build任何额外的用户灯安装后,所以在这里我使用root来做所有的事情。 然而,我试图修复给Apache的用户/ var / www / html目录的所有权,这并没有修复悲伤。

这里是错误日志,你可以看到它给了我一个'Permission Denied'错误:

[Mon Jul 21 15:28:14.336626 2014] [core:notice] [pid 22704] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0 [Mon Jul 21 15:28:14.339766 2014] [suexec:notice] [pid 22704] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec) [Mon Jul 21 15:28:14.495631 2014] [auth_digest:notice] [pid 22704] AH01757: generating secret for digest authentication ... [Mon Jul 21 15:28:14.498690 2014] [lbmethod_heartbeat:notice] [pid 22704] AH02282: No slotmem from mod_heartmonitor [Mon Jul 21 15:28:14.765072 2014] [mpm_prefork:notice] [pid 22704] AH00163: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16 configured -- resuming normal operations [Mon Jul 21 15:28:14.765186 2014] [core:notice] [pid 22704] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND' [Mon Jul 21 15:28:16.027553 2014] [cgi:error] [pid 22706] [client 192.168.0.68:52930] AH01215: (13)Permission denied: exec of '/var/www/html/index.cgi' failed [Mon Jul 21 15:28:16.030595 2014] [cgi:error] [pid 22706] [client 192.168.0.68:52930] End of script output before headers: index.cgi [Mon Jul 21 15:45:01.586229 2014] [mpm_prefork:notice] [pid 22704] AH00170: caught SIGWINCH, shutting down gracefully 

这是我的/ var / www / html apacheconfiguration:

 <Directory "/var/www/html"> # # Possible values for the Options directive are "None", "All", # or any combination of: # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews # # Note that "MultiViews" must be named *explicitly* --- "Options All" # doesn't give it to you. # # The Options directive is both complicated and important. Please see # http://httpd.apache.org/docs/2.4/mod/core.html#options # for more information. # Options ExecCGI FollowSymLinks # # AllowOverride controls what directives may be placed in .htaccess files. # It can be "All", "None", or any combination of the keywords: # Options FileInfo AuthConfig Limit # AllowOverride All # # Controls who can get stuff from this server. # Require all granted </Directory> 

当然,我使用: AddHandler cgi-script .cgi .pl来激活CGI

这是我简单的test.c文件:

 #include <stdio.h> int main(void) { puts("Content-Type: text/html; charset=ISO-8859-1\n"); fputs("Hello, World!", stdout); return 0; } 

输出是正确的: Content-Type: text/html; charset=ISO-8859-1\n\nHello, World! Content-Type: text/html; charset=ISO-8859-1\n\nHello, World!

我也编译它与海湾合作委员会,然后给它的权限777 test.cgi你知道我需要做什么来解决这个问题吗?

在此先感谢Zorgatone

Solutions Collecting From Web of "Apache / httpd / var / www / html / .cgi脚本会引发500个内部服务器错误"

我不确定这是否是一个可行的解决方案,但是我通过将SELinux更改为宽容来解决问题。 以下是您感兴趣的步骤。

 vi /etc/selinux/config 

更改以下行:

 SELINUX=enforcing 

至:

 SELINUX=permissive 

我刚刚解决了重新安装服务器,重新做了一遍,禁用selinux和iptables,因为我已经有一个外部防火墙。

感谢任何帮助我的人;)

这很可能是一个SELinux问题(Tom Sweeney 回答提供了一个解决方案,使用一个宽松的SELinux和你自己接受的答案 ,你表示完全禁用SELinux)。 另一种方法是为您的CGI文件配置适当的SELinux类型(可能还有其他策略更改)。


首先,安装SELinux策略管理工具(如果尚未完成的话):

 sudo yum install policycoreutils-python 

假设您想允许/var/www/html目录中的所有基于CGI的文件,可以使用以下命令将httpd_sys_script_exec_t上下文应用于当前和将来的CGI文件:

 sudo semanage fcontext -a -t httpd_sys_script_exec_t '/var/www/html(/.*)?/.*\.cgi' 

接下来,恢复任何现有的CGI文件的内容:

 sudo restorecon -Rv /var/www/html/ 

您还需要允许Apache允许使用以下方法执行CGI脚本:

 sudo setsebool -P httpd_enable_cgi 1 

你应该做的。 请注意,如果您的CGI脚本需要读取/写入系统中其他文件的内容,则还必须将httpd_sys_rw_content_t上下文应用于这些文件(请参阅下面的示例)。


刚刚遇到这个问题,尝试在CentOS 7(x86_64)系统上安装Bugzilla(使用CGI)。 监视我的httpd错误日志( sudo tail -f /var/log/httpd/error_log )时,观察到以下错误:

 [cgi:error] [pid 1825] [client ...:56481] AH01215: (13)Permission denied: exec of '/var/www/html/bugzilla/index.cgi' failed [cgi:error] [pid 1825] [client ...:56481] End of script output before headers: index.cgi 

检查应用于我的Bugzilla安装的上下文,我看到以下内容:

 $ ls -Z /var/www/html/bugzilla/ ... -rwxr-x---. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 index.cgi ... 

然后,我使用以下命令来允许执行Bugzilla的CGI脚本以及访问所述CGI脚本以读取./data目录中的内容:

 sudo yum install policycoreutils-python sudo semanage fcontext -a -t httpd_sys_script_exec_t '/var/www/html/bugzilla(/.*)?/.*\.cgi' sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/bugzilla/data(/.*)?' sudo restorecon -Rv /var/www/html/bugzilla/ sudo setsebool -P httpd_enable_cgi 1 

检查应用的上下文显示期望的结果:

 $ ls -Z /var/www/html/bugzilla/ ... -rwxr-x---. apache apache unconfined_u:object_r:httpd_sys_script_exec_t:s0 index.cgi ... 

Bugzilla现在应该可用。 Bugzilla提供的所有功能可能还有其他策略可以应用。 但是,我不知道是否需要任何额外的政策。