将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

广告
将在 10 秒后关闭
bannerAds