透過Docker架設Apache啟用CGI

本文將採用docker建立一個apache http伺服器, 並且透過此伺服器運行CGI程式。

配置apache

找到對應的image並且pull

sudo docker search apache 
sudo docker pull httpd

httpd.conf

取得預設的httpd.conf

sudo docker create --name temp httpd
sudo docker cp temp:/usr/local/apache2/conf/httpd.conf httpd.conf
sudo docker rm temp

修改cgi的部份

<Directory "/usr/local/apache2/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>

修改成

<Directory "/usr/local/apache2/cgi-bin">
    AllowOverride None
    Options ExecCGI
    SetHandler cgi-script
    Require all granted
</Directory>

取消mod_cgid.so註解

LoadModule cgid_module modules/mod_cgid.so

Build Dockerfile

建立Dockerfile

FROM httpd
COPY ./httpd.conf /usr/local/apache2/conf/httpd.conf

build image

sudo docker build -t my-httpd . 

使用當前目錄作為cgi-bin

sudo docker run -p 8080:80 -v "$PWD":/usr/local/apache2/cgi-bin/ my-httpd

測試配置結果

編寫測試CGI,假設名稱為cgi

#!/bin/sh
echo Content-Type: text; charset=utf-8
echo
echo cgi working

連上http://localhost:8080/cgi-bin/cgi 可以看到CGI正常運作。

GET method

將下列程式取名為cgi-get

#!/bin/sh
echo Content-Type: text; charset=utf-8
echo
echo $QUERY_STRING

連上 http://localhost:8080/cgi-bin/cgi-get?foo=a&bar=123

POST method

將下列程式取名為cgi-post

#!/bin/sh
echo Content-Type: text; charset=utf-8
echo

a=$(cat)
echo $a

透過firefox連上http://localhost:8080/cgi-bin/cgi-post 此時應該可以看到一個空白頁

透過內建的開發人員工具,在HTTP Header的地方補上

Content-Length: 15

並且在Request Body填上

foo=aaa&bar=bbb

透過POST發送應該可以看見Request Body顯示在頁面上


HTTP Web Docker Apache