将Golang与Apache一起作为FastCGI运行
简而言之
我使用了Go语言的net/http/fcgi包将Go作为CGI在Apache中运行。
操控
git clone https://github.com/nozo-moto/golang-fastcgi-try
cd golang-fastcgi-try
make docker-build
dokcer-compose up
确定
$ curl localhost:8888
{"message":"pong"}
网络/ http / fcgi
Go语言中有一个名为net/http/fcgi的包实现了FastCGI协议。
您可以将其包装为http.Handler并使用。这里我们使用了gin。
package main
import (
"net"
"net/http/fcgi"
"github.com/gin-gonic/gin"
)
func main() {
var err error
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
l, err := net.Listen("tcp", ":8080")
if err != nil {
panic(err)
}
if err := fcgi.Serve(l, r); err != nil {
panic(err)
}
}
操纵
我会准备一个类似于下面的docker-compose:
在下面的代码中,我将Go代码的二进制文件放入一个任意的容器中并执行。
version: '3.3'
services:
www:
image: httpd:2.4.41
ports:
- "8888:80"
depends_on:
- fcgi
volumes:
- ./docker/apache/conf/fcgi.conf:/usr/local/apache2/conf/extra/fcgi.conf
command: bash -c "echo 'Include conf/extra/fcgi.conf' >> /usr/local/apache2/conf/httpd.conf && httpd-foreground"
fcgi:
image: nozomi0966/fastcgi-golang-try
fcgi.conf配置文件
使用Apache来执行fastCGI的设置文件。
在上述的docker-compose.yml中,我们读取了./docker/apache/conf/fcgi.conf中的设置。
由于Apache2.4及更高版本内置了一个名为mod_proxy_fcgi的模块,我们将使用它。
我们在docker-compose中以主机名fcgi来运行,所以可以通过fcgi:8080访问。
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
SetHandler "proxy:fcgi://fcgi:8080/"
执行以下步骤来启动Apache和FastCGI。
docker-compose up
只要收到以下的回应,就可以确认程序正在运行。
$ curl localhost:8888
{"message":"pong"}
以上
我在以下的存储库上上传了代码:https://github.com/nozo-moto/golang-fastcgi-try