如何使用httpd将测试perl脚本作为cgi脚本运行?

时间:2019-03-20 13:58:08

标签: apache docker cgi httpd.conf

我正在尝试遵循this tutorial并在cgi下运行示例脚本。

以下是我执行的步骤:

1)制作示例脚本

$ cat > test.pl <<EOF
> #!/usr/bin/perl
> print "Content-type: text/html\n\n";
> print "Hello, World.";
EOF

2)运行httpd docker容器,并将创建的脚本作为卷挂载在cgi-bin目录中:

$ docker run --name cgi_test --rm -p 3000:80 -v $(pwd)/test.pl:/usr/local/apache2/cgi-bin/test.pl httpd

3)检查是否启用了CGI模块:

$ docker exec -it cgi_test cat /usr/local/apache2/conf/httpd.conf | grep modules/mod_cgid.so
    #LoadModule cgi_module modules/mod_cgid.so

原来是CGI模块,所以我启用了它:

$ docker exec -it cgi_test sed -i 's,#\(LoadModule cgid_module modules/mod_cgid.so\),\1,g' /usr/local/apache2/conf/httpd.conf

4)检查了ScriptAlias指令并启用了alias_module

$ docker exec -it cgi_test cat /usr/local/apache2/conf/httpd.conf | grep "ScriptAlias /cgi-bin/"
    ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
$ docker exec -it cgi_test httpd -M | grep -e cgid -e alias
 cgid_module (shared)
 alias_module (shared)

还可以

5)检查执行权限:

$ docker exec -it cgi_test ls -la /usr/local/apache2/cgi-bin/test.pl
-rwxr-xr-x 1 1000 1000 76 Mar 20 12:41 /usr/local/apache2/cgi-bin/test.pl

还可以

6)在docker容器中重新启动httpd:

$ docker kill --signal="USR1" cgi_test

但是当我转到http://localhost:3000/cgi-bin/test.pl时,我看到503 Service Unavailable并在日志中显示此错误:

[Wed Mar 20 19:03:02.323430 2019] [cgid:error] [pid 1446:tid 139952364902144] (22)Invalid argument: [client 172.17.0.1:34328] AH01257: unable to connect to cgi daemon after multiple tries: /usr/local/apache2/cgi-bin/test.pl

我还需要做什么来运行脚本?

2 个答案:

答案 0 :(得分:0)

要使所有工作正常进行,我需要重新启动httpd两次,而不是一次:

docker kill --signal="USR1" cgi_test  # (x2)

我以为可能是USR1信号(正常重启)问题,但我也有HUP信号(立即重启)问题。要应用更改,我需要发送两次信号。因此看起来像httpd容器问题。

答案 1 :(得分:0)

要在CGI下运行脚本,您无需更改官方httpd Docker映像中的任何文件。

请确保您的脚本可以用chmod +x test.pl执行,并使用配置指令将-c选项传递给服务器程序以加载CGI模块,如以下命令所述:

docker run \
  -it \
  --rm \
  -p 127.0.0.1:8080:80 \
  -v $(pwd)/test.pl:/usr/local/apache2/cgi-bin/test.pl \
  httpd:alpine \
  httpd-foreground -c "LoadModule cgid_module modules/mod_cgid.so"

一些解释:

  • 使用高山变形图片是因为它比默认的基于Debian的图片小,并且足以满足我们的需求

  • httpd-foreground脚本在所有官方httpd映像中均可用,并且允许以前台模式执行Apache HTTP Server(等效于httpd -D FOREGROUND

  • 发布选项-p还包含回送IP地址,以防止从外部访问该测试服务器