如何配置 Apache 2 来运行 Perl CGI 脚本?
- 2024-10-17 08:47:00
- admin 原创
- 72
问题描述:
我想配置运行 Apache 2Kubuntu
以执行 Perl CGI 脚本。我尝试了通过谷歌搜索找到的一些步骤,但似乎没有任何效果。
实现这一目标的正确方法是什么?
解决方案 1:
这篇文章旨在拯救那些无法在 Ubuntu 上正确设置 Apache2 for Perl 的人。(特定于您的 Linux 机器的系统配置将在方括号中提及,如 [this])。
Apache 2 设置不当可能导致的后果:
浏览器尝试下载.pl 文件而不是执行并给出结果。
禁止。
内部服务器错误。
如果一个人以合理的智慧遵循下面描述的步骤,他/她就可以克服上述错误。
在开始步骤之前。转到/etc/hosts
文件并添加 IP 地址/域名`例如:
127.0.0.1 www.BECK.com
步骤 1:安装apache2
步骤 2:安装mod_perl
步骤 3:配置apache2
打开sites-available/default
并添加以下内容,
<Files ~ ".(pl|cgi)$">
SetHandler perl-script
PerlResponseHandler ModPerl::PerlRun
Options +ExecCGI
PerlSendHeader On
</Files>
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory [path-to-store-your-website-files-like-.html-(perl-scripts-should-be-stored-in-cgi-bin] >
####(The Perl/CGI scripts can be stored out of the cgi-bin directory, but that's a story for another day. Let's concentrate on washing out the issue at hand)
####
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ [path-where-you-want-your-.pl-and-.cgi-files]
<Directory [path-where-you-want-your-.pl-and-.cgi-files]>
AllowOverride None
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
AddHandler cgi-script .pl
Order allow,deny
allow from all
</Directory>
<Files ~ ".(pl|cgi)$">
SetHandler perl-script
PerlResponseHandler ModPerl::PerlRun
Options +ExecCGI
PerlSendHeader On
</Files>
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory [path-to-store-your-website-files-like-.html-(perl-scripts-should-be-stored-in-cgi-bin] >
####(The Perl/CGI scripts can be stored out of the cgi-bin directory, but that's a story for another day. Let's concentrate on washing out the issue at hand)
####
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ [path-where-you-want-your-.pl-and-.cgi-files]
<Directory [path-where-you-want-your-.pl-and-.cgi-files]>
AllowOverride None
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
AddHandler cgi-script .pl
Order allow,deny
allow from all
</Directory>
步骤4:
将以下行添加到您的/etc/apache2/apache2.conf
文件中。
AddHandler cgi-script .cgi .pl
<Files ~ ".pl$">
Options +ExecCGI
</Files>
<Files ~ ".cgi$">
Options +ExecCGI
</Files>
<IfModule mod_perl.c>
<IfModule mod_alias.c>
Alias /perl/ /home/sly/host/perl/
</IfModule>
<Location /perl>
SetHandler perl-script
PerlHandler Apache::Registry
Options +ExecCGI
</Location>
</IfModule>
<Files ~ ".pl$">
Options +ExecCGI
</Files>
步骤5:
非常重要,或者至少我是这样认为的,只有完成这一步之后,我才能让它工作。
AddHandler cgi-script .cgi .pl
<Files ~ ".pl$">
Options +ExecCGI
</Files>
<Files ~ ".cgi$">
Options +ExecCGI
</Files>
<IfModule mod_perl.c>
<IfModule mod_alias.c>
Alias /perl/ /home/sly/host/perl/
</IfModule>
<Location /perl>
SetHandler perl-script
PerlHandler Apache::Registry
Options +ExecCGI
</Location>
</IfModule>
<Files ~ ".pl$">
Options +ExecCGI
</Files>
第 6 步
非常重要,或者至少我是这样认为的,只有完成这一步之后,我才能让它工作。
将以下内容添加到您的/etc/apache2/sites-enabled/000-default
文件中
<Files ~ ".(pl|cgi)$">
SetHandler perl-script
PerlResponseHandler ModPerl::PerlRun
Options +ExecCGI
PerlSendHeader On
</Files>
步骤7:
现在,将您的 Perl 脚本作为 test.pl 添加到您之前在步骤 3 中提到的位置,即 [ path-where-you-want-your-.pl-and-.cgi-files ]。
.pl
使用授予文件权限chmod
,然后在浏览器的地址栏中键入webaddress/cgi-bin/test.pl
,就这样,你就得到了它。
(现在,这篇文章中的许多内容都是多余的。请忽略它。)
解决方案 2:
您需要查看 Apache 错误日志以查看“内部服务器错误”是什么。根据我的经验,最可能的情况有四种:
CGI 程序位于未启用 CGI 执行的目录中。解决方案:
ExecCGI
通过 httpd.conf 或 .htaccess 文件将选项添加到该目录。Apache 仅配置为从专用
cgi-bin
目录运行 CGI。解决方案:将 CGI 程序移至该目录或AddHandler cgi-script .cgi
在 httpd.conf 中添加语句。CGI程序没有被设置为可执行文件。解决方案(假设是*nix类型的操作系统):
chmod +x my_prog.cgi
CGI 程序退出时未发送标头。解决方案:从命令行运行该程序并验证 a) 它确实运行而不是因编译时错误而终止,以及 b) 它生成正确的输出,其中至少应包含标头
Content-Type
和最后一个标头后面的空白行。
解决方案 3:
(尽管我没有要求使用 perl,但谷歌搜索还是让我找到了这个问题)
我在运行脚本时遇到了问题(尽管是 bash 而不是 perl)。Apache 的配置是,ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
但是 Apache 错误日志显示是File does not exist: /var/www/cgi-bin/test.html
。
尝试将脚本放入两者中/usr/lib/cgi-bin/
,/var/www/cgi-bin/
但都没有起作用。
经过长时间的谷歌搜索后,我终于找到了答案,sudo a2enmod cgi
并且使用 一切都水到渠成了/usr/lib/cgi-bin/
。
解决方案 4:
如果您已成功安装 Apache 网络服务器和 Perl,请按照以下步骤在 ubuntu 系统上使用 perl 运行 cgi 脚本。
在开始 CGI 脚本之前,必须配置 apache 服务器,使其能够识别 CGI 目录(保存 cgi 程序的位置)并允许在该目录中执行程序。
在 Ubuntu 中,cgi-bin 目录通常位于路径 /usr/lib 中,如果不存在,请使用以下命令创建 cgi-bin 目录。cgi -bin应该位于这个路径本身中。
mkdir /usr/lib/cgi-bin
发出以下命令来检查目录的权限状态。
ls -l /usr/lib | less
检查权限是否为“drwxr-xr-x 2 root root 4096 2011-11-23 09:08 cgi-bin”,如果是,转到步骤 3。
如果没有,请发出以下命令来确保我们的 cgi-bin 目录具有适当的权限。
sudo chmod 755 /usr/lib/cgi-bin
sudo chmod root.root /usr/lib/cgi-bin
赋予cgi-bin目录执行权限
sudo chmod 755 /usr/lib/cgi-bin
这样,您的 cgi-bin 目录就准备就绪了。这是您放置所有要执行的 cgi 脚本的地方。我们的下一步是配置 apache 以识别 cgi-bin 目录并允许将其中的所有程序作为 cgi 脚本执行。
配置 Apache 使用 perl 运行 CGI 脚本
需要在 apache 服务器的配置文件中添加一个指令,以便它知道 CGI 的存在及其目录的位置。首先转到 apache 配置文件的位置,并使用您喜欢的文本编辑器打开它
cd /etc/apache2/sites-available/
sudo gedit 000-default.conf
将以下内容复制到文件 000-default.conf 中的“DocumentRoot /var/www/html/”和“ErrorLog ${APACHE_LOG_DIR}/error.log”代码行之间
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Require all granted
使用以下代码重新启动 apache 服务器
sudo service apache2 restart
现在我们需要启用 cgi 模块,该模块在较新版本的 ubuntu 中默认存在
sudo a2enmod cgi.load
sudo a2enmod cgid.load
此时我们可以重新加载 apache 网络服务器,以便它再次读取配置文件。
sudo service apache2 reload
apache 的配置部分已经结束,现在让我们用示例 cgi perl 程序来检查它。
测试一下
进入 cgi-bin 目录并创建一个扩展名为 .pl 的 cgi 文件
cd /usr/lib/cgi-bin/
sudo gedit test.pl
将下面的代码复制到test.pl上并保存。
#!/usr/bin/perl -w
print “Content-type: text/html
”;
print “CGI working perfectly!!
”;
现在授予test.pl执行权限。
sudo chmod 755 test.pl
现在在您的网络浏览器中打开该文件http://Localhost/cgi-bin/test.pl
如果您看到输出“CGI 工作正常”,那么您就可以开始了。现在将所有程序转储到 cgi-bin 目录中并开始使用它们。
注意:不要忘记为 cgi-bin 中的新程序提供 chmod 755 权限,以便成功运行它而不会出现任何内部服务器错误。
解决方案 5:
从Ubuntu 12.04(Precise Pangolin)开始(可能还有之前的一两个版本),您只需通过 Synaptic 安装apache2
并将mod-perl
您的 CGI 脚本放在 /usr/lib/cgi-bin 中即可。
解决方案 6:
处理 CGI 脚本有两种方法,SetHandler
和AddHandler
。
SetHandler cgi-script
适用于给定上下文中的所有文件,无论它们如何命名,甚至index.html
或style.css
。
AddHandler cgi-script .pl
类似,但适用于给.pl
定上下文中以 结尾的文件。您可以根据需要选择其他扩展名或多个扩展名。
此外,必须加载并Options +ExecCGI
配置 CGI 模块。要激活该模块,请发出
a2enmod cgi
并重新启动或重新加载 Apache。最后,Perl CGI 脚本必须是可执行的。因此必须设置执行位
chmod a+x script.pl
它应该以
#! /usr/bin/perl
作为其第一行。
当你在任何指令之外使用SetHandler
或AddHandler
(和Options +ExecCGI
) 时,它将全局应用于所有文件。但你可以通过将这些指令包含在其中来将上下文限制为子集,例如Directory
<Directory /path/to/some/cgi-dir>
SetHandler cgi-script
Options +ExecCGI
</Directory>
现在SetHandler
仅适用于 /path/to/some/cgi-dir 内的文件,而不是网站的所有文件。当然,或指令AddHandler
内部也是如此。然后它适用于 /path/to/some/cgi-dir 内的文件,以 结尾。Directory
`Location`.pl
解决方案 7:
我猜你已经看过mod_perl了?
您是否尝试过以下教程?
编辑:关于您的帖子 - 也许您可以在.cgi
文件中包括代码示例。也许甚至是前几行?
解决方案 8:
对于像我这样一直在摸索着学习比你现在需要知道的多得多的教程和文档,并且只是想看看这个东西对初学者有用的人来说,我发现我唯一需要做的就是添加:
AddHandler cgi 脚本 .pl .cgi
到我的配置文件。
http://httpd.apache.org/docs/2.2/mod/mod_mime.html#addhandler
就我的情况而言,这种方法最有效,因为我可以将我的 perl 脚本放在任何我想要的地方,只需添加 .pl 或 .cgi 扩展名即可。
Dave Sherohman 的回答也提到了 AddHandler 解决方案。
当然,您仍必须确保脚本的权限/所有权设置正确,尤其是脚本是否可执行。请注意从 http 请求运行时的“用户”是谁 - 例如 www 或 www-data。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件