如何配置Docker文件以运行像Perl这样的CGI脚本

7

我有以下文件:

  • index.php
  • Dockerfile
  • /conf/myawesomesite.conf
  • cgi-bin/helloworld.pl

/conf/myawesomesite.conf中包含:

<VirtualHost *:80>

    ServerAdmin webmaster@myawesomesite.com
    ServerName myawesomesite.com
    ServerAlias www.myawesomesite.com
    DocumentRoot /var/www/html/myawesomesite.com/httpdocs
    ErrorLog /var/www/myawesomesite.com/logs/error.log 
    CustomLog /var/www/myawesomesite.com/logs/access.log combined
    Options ExecCGI
    AddHandler cgi-script .pl

</VirtualHost>

在 Dockerfile 中:

FROM ubuntu:16.04

## Install Base Packages
RUN apt-get update && apt-get -y install \
    apache2 \
    make \
    curl \
    git \
    gcc

RUN a2enmod rewrite

## Install Perl
RUN apt-get update && apt-get -y install \
    libapache2-mod-perl2 \
    perl

RUN a2enmod perl

## Install PHP
RUN apt-get update && apt-get -y install \
    php7.0 php7.0-cli php7.0-common php7.0-fpm php7.0-json \
    php7.0-mbstring php7.0-mcrypt php7.0-mysql php7.0-opcache php7.0-readline \
    libapache2-mod-php7.0

RUN a2enmod rewrite


EXPOSE 80

RUN mkdir -p /var/www/html/myawesomesite.com/httpdocs

RUN mkdir -p /var/www/myawesomesite.com/logs/

COPY ./conf/myawesomesite.conf /etc/apache2/sites-available/
RUN a2ensite myawesomesite
RUN a2dissite 000-default.conf

CMD /usr/sbin/apache2ctl -D FOREGROUND

构建和运行容器后,index.php 能够正确执行。但当访问页面 myawesomesite.com/cgi-bin/helloworld.pl 时,脚本仅仅是被打印出来而没有被执行。如下所示:

#!/usr/bin/perl

print "Content-Type:text/html\n\n";
print "Hello World!";

我期望的结果是Hello World!,因为我在myawesomesite.conf文件中添加了以下指令。但是为什么呢? Options ExecCGI AddHandler cgi-script .pl
2个回答

4

我不得不在Dockerfile中添加RUN a2enmod cgid,并针对以下配置文件添加代码块(假设perl脚本已经复制到了/var/www/myawesomesite.com/www/cgi-bin/):

<Directory "/var/www/myawesomesite.com/www/cgi-bin/">
    Options +ExecCGI
    AddHandler cgi-script .pl
</Directory>

2
尝试在Dockerfile中添加以下内容:
RUN chmod +x cgi-bin/helloworld.pl

CGI脚本必须设置可执行位。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接