我有一个项目,它由Go应用程序+Nginx+Db(Postgres)组成。所有这些都在docker个容器中构建。这是我的docker-compose.yml文件:

version: "3"
services:
  db:
    image: postgres:10
    environment:
      - POSTGRES_PASSWORD=DatabasePassword
      - POSTGRES_USER=egor
      - POSTGRES_DB=postgres
    expose:
      - 5432
    
  backend:
    build: .
    environment:
      - POSTGRES_URL=postgres://egor:DatabasePassword@db:5432/postgres?sslmode=disable
      - LISTEN_ADDRESS=:5432
    depends_on:
      - db
  
  proxy:
    image: nginx
    volumes:
      - type: bind
        source: ./nginx.conf
        target: /etc/nginx/nginx.conf
    ports:
      - 80:80
    depends_on: 
      - backend
      - db

这是我的go应用程序:

package main

import (
    "database/sql"
    "fmt"
    "time"
    _ "github.com/lib/pq"
    "log"
    "net/http"

    "github.com/caarlos0/env"
    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promhttp"
)

type config struct {
    PostgresUri   string `env:"POSTGRES_URL" envDefault:"postgres://root:pass@localhost:5432/postgres?sslmode=disable"`
    ListenAddress string `env:"LISTEN_ADDRESS" envDefault:":7000"`
    //PostgresHost  string `env:"POSTGRES_HOST" envDefault:":l"`
    //PostgresUser  string `env:"POSTGRES_USER" envDefault:":root"`
    //PostgresPassword string `env:"POSTGRES_PASSWD" envDefault:":qwerty"`
    //PostgresName  string `env:"POSTGRES_NAME" envDefault:":postgres"`

}

var (
    db          *sql.DB
    errorsCount = prometheus.NewCounterVec(
        prometheus.CounterOpts{
            Name: "gocalc_errors_count",
            Help: "Gocalc Errors Count Per Type",
        },
        []string{"type"},
    )

    requestsCount = prometheus.NewCounter(
        prometheus.CounterOpts{
            Name: "gocalc_requests_count",
            Help: "Gocalc Requests Count",
        })
)

func main() {
    var err error

    // Initing prometheus
    prometheus.MustRegister(errorsCount)
    prometheus.MustRegister(requestsCount)

    // Getting env
    cfg := config{}
    if err = env.Parse(&cfg); err != nil {
        fmt.Printf("%+v\n", err)
    }
    
    time.Sleep(time.Second)
    fmt.Println("Sleep over!")
    
    // Connecting to database
    //psqlInfo := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=5432 sslmode=disable",
    //                        cfg.PostgresHost,cfg.ListenAddress,cfg.PostgresUser,cfg.PostgresPassword,cfg.PostgresName)
    
    //db, err := sql.Open("postgres", "host=db user=egor password=DatabasePassword dbname=postgres port=5432 sslmode=disable")
    db, err = sql.Open("postgres",cfg.PostgresUri)
    if err != nil {
        log.Fatalf("Can't connect to postgresql: %v", err)
    }
    defer db.Close()

    err = db.Ping()
    if err != nil {
        log.Fatalf("Can't ping database: %v", err)
    }

    http.HandleFunc("/", handler)
    http.Handle("/metrics", promhttp.Handler())
    log.Fatal(http.ListenAndServe(cfg.ListenAddress, nil))
}

func handler(w http.ResponseWriter, r *http.Request) {
    requestsCount.Inc()

    keys, ok := r.URL.Query()["q"]
    if !ok || len(keys[0]) < 1 {
        errorsCount.WithLabelValues("missing").Inc()
        log.Println("Url Param 'q' is missing")
        http.Error(w, "Bad Request", 400)
        return
    }
    q := keys[0]
    log.Println("Got query: ", q)

    var result string
    sqlStatement := fmt.Sprintf("SELECT (%s)::numeric", q)
    row := db.QueryRow(sqlStatement)
    err := row.Scan(&result)

    if err != nil {
        log.Println("Error from db: %s", err)
        errorsCount.WithLabelValues("db").Inc()
        http.Error(w, "Internal Server Error", 500)
        return
    }

    fmt.Fprintf(w, "query %s; result %s", q, result)
}

以及我的nginx配置:

events{
    worker_connections 1024;
}
http{
   server {
      listen 80;
      server_name  localhost;
      location / {
        proxy_pass  http://backend:7000;
      }
  }
}

但当我要在浏览器中尝试页面时,我看到错误页面-502坏网关nginx。这是我的日志:

2022/11/08 23:41:24 [error] 29#29: *1 connect() failed (111: Connection refused) while connecting to upstream, client: xxx.xx.x.x, server: localhost, request: "GET / HTTP/1.1", upstream: "http://xxx.xx.x.x:7000/", host: "0.0.0.0"

问题是什么?所有服务都正常工作,只有nginx反向代理有错误