Herkese merhaba!

Uzun yıllardır bol miktarda kişisel zaman ve enerji harcayarak bilgimizi hepinizle paylaşıyoruz. Ancak şu andan itibaren bu blogu çalışır durumda tutabilmek için yardımınıza ihtiyacımız var. Yapmanız gereken tek şey, sitedeki reklamlardan birine tıklamak olacaktır, aksi takdirde hosting vb. masraflar nedeniyle maalesef yayından kaldırılacaktır. Teşekkürler.

Nginx'i Go HTTP sunucusunun önüne koymak istiyorsanız, aşağıdaki örneği kullanabilirsiniz. Sonunda API'ye 6000 port (Nginx) veya 8080 port (Go) üzerinden erişebilirsiniz.


Yapı


.
├── cmd
│   └── server.go
├── docker
│   └── dev
│   ├── docker-compose.yaml
│   ├── go
│   │   └── Dockerfile
│   └── nginx
│   ├── Dockerfile
│   └── app.conf
├── go.mod
└── go.sum

Dosyalar


cmd/server.go


package main

import (
"fmt"
"log"
"net/http"

"github.com/google/uuid"
)

func handler(w http.ResponseWriter, _ *http.Request) {
w.Write([]byte(uuid.New().String()))
}

func main() {
http.HandleFunc("/", handler)
fmt.Println("Server is running ...")
log.Fatal(http.ListenAndServe(":8080", nil))
}

docker/dev/docker-compose.yaml


version: "3.4"

services:

football_api_go:
build:
context: "../.."
dockerfile: "docker/dev/go/Dockerfile"
hostname: "football-api-go"

football_api_nginx:
build:
context: "../.."
dockerfile: "docker/dev/nginx/Dockerfile"
hostname: "football-api-nginx"
ports:
- "6000:80"
depends_on:
- "football_api_go"

docker/dev/go/Dockerfile


#
# STAGE 1: prepare
#
FROM golang:1.13.1-alpine3.10 as prepare

WORKDIR /source

COPY go.mod .
COPY go.sum .

RUN go mod download

#
# STAGE 2: build
#
FROM prepare AS build

COPY . .

RUN CGO_ENABLED=0 go build -ldflags "-s -w" -o bin/server -v cmd/server.go

#
# STAGE 3: run
#
FROM scratch as run

COPY --from=build /source/bin/server /server

EXPOSE 8080

ENTRYPOINT ["/server"]

docker/dev/nginx/Dockerfile


FROM nginx:1.15.8-alpine

COPY docker/dev/nginx/app.conf /etc/nginx/conf.d/default.conf

EXPOSE 80

docker/dev/nginx/app.conf


server {
listen 80 default_server;

location / {
proxy_set_header X-Request-Id $request_id;
proxy_set_header Host $host;

proxy_pass http://football_api_go:8080/;
}
}

go.mod


module football-api

go 1.13

require github.com/google/uuid v1.1.1 // indirect

go.sum


github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=

Kurulum


Docker


$ docker-compose -f docker/dev/docker-compose.yaml up --build

Building football_api_go
Successfully built 74e284b2da5c
Successfully tagged dev_football_api_go:latest

Building football_api_nginx
Successfully built 12eabebd6b5f
Successfully tagged dev_football_api_nginx:latest

Recreating dev_football_api_go_1 ... done
Recreating dev_football_api_nginx_1 ... done

Attaching to dev_football_api_go_1, dev_football_api_nginx_1
football_api_go_1 | Server is running ...

$ curl -i http://0.0.0.0:6000
HTTP/1.1 200 OK
Server: nginx/1.15.8
Date: Thu, 26 Dec 2019 15:13:12 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 36
Connection: keep-alive

96d16744-c128-48ce-b9ff-5ae2fc0e3f05

Ana işletim sistemi


$ go build -ldflags "-s -w" -o bin/server -v cmd/server.go
command-line-arguments

$ bin/server
Server is running ...

$ curl -i http://0.0.0.0:8080
HTTP/1.1 200 OK
Date: Thu, 26 Dec 2019 15:16:07 GMT
Content-Length: 36
Content-Type: text/plain; charset=utf-8

cecaabd0-d224-45cc-91c2-5c77f9627611