我有一个Golang网络应用程序,我决定在它前面使用Nginx来提供静态文件,并将其用作我的网络应用程序的反向代理.

用于WebApp的Dockerfile:

FROM golang:1.21.1

WORKDIR /app

COPY go.mod go.sum ./

RUN go mod download && go mod verify

COPY . ./

RUN go build -o ./bin/site ./cmd/site/main.go

CMD ["./bin/site"]

Docker compose 文件:

version: '3'

services:
  nginx:
    image: nginx:1.25.2
    restart: always
    ports:
      - "80:80"
    volumes:
      - "./nginx.conf:/etc/nginx/nginx.conf:ro"
      - "./site/assets/:/app/assets/"

  site:
    build: ./site
    container_name: tmp-site
    restart: always
    volumes:
      - "./site/views:/app/views"

和nginx配置:

events {
    worker_connections 1024;
}

http {

    server {
        listen 80;
        server_name tmp.loc www.tmp.loc;

        location ~* \.(jpg|jpeg|png|gif|ico|css|js|html|svg)$ {
            root /app/assets/;

            expires max;
            access_log off;
        }

        location / {
            proxy_pass          http://tmp-site:5555;
            proxy_set_header    X-Forwarded-For      $proxy_add_x_forwarded_for;
            proxy_set_header    Host                 $host;
            proxy_set_header    X-Real-IP            $remote_addr;
        }
    }
}

在我的网页上我有两个图像,一个PNG和一个SVG,css文件很简单,只包含background-color: lightblue的Body标记,还有js文件,它只是一个控制台日志(log)字符串"已加载!".在使用Docker Compose启动我的容器后,我有以下问题:

  1. 静态文件是随机提供的,例如,显示PNG图像但不显示SVG,不对页面应用CSS样式,但javascrip代码执行得很好.有趣的是,所有的静态文件都是根据浏览器的DevTools网络标签成功获取的,你可以判断它的内容,是的,我已经try 在没有缓存的情况下重新加载页面,但无济于事.这是什么魔力?
  2. 正如你在我的docker compose文件中看到的,我为nginx和webapp都设置了卷,在nginx的情况下,它工作得很好,每当我删除一些assets资源 并重新加载页面而不缓存时,更改都会被应用,但当我改变模板中的文本时,它在页面上不可见,但如果我进入webapp的容器并判断模板的内容-它已经改变了,但在页面上它是不可见的,直到我用docker compose重新启动容器.有什么问题吗?

完整的代码在这里-https://github.com/ivnku/tmp

推荐答案

  1. GoFibre的template通过Engine.Reload(true)提供了这一功能:
// Reload the templates on each render, good for development
engine.Reload(true) // Optional. Default: false
  1. 静态文件确实是由Nginx提供服务的,只是没有正确的MIME类型.在nginx.conf的http部分中包含MIME类型将解决此问题:
http {
    include       /etc/nginx/mime.types;

    server {
        ...
    }
}

Go相关问答推荐

出口上下文值密钥的安全方法?

一次打印用户输入的字符串n次

go grpc:无法导入github.com/golang/protobuf/proto(没有所需的模块提供包github.com/gorang/protobuf-proto)

有没有办法让sqlc生成可以使用pgxpool的代码

创建新对象后如何返回嵌套实体?

在 Go 中公开公共 JWK

读取非UTF8编码的文件内容并正确打印出来

如何将文件上传到 Google Drive,并与使用服务帐户和 Golang 的任何人共享

如何编写一个以字符串或错误为参数的通用函数?

如何使用 Status 字段创建 Kubernetes 对象?

使用 `didip/tollbooth` 限制每小时最大请求数

Go 并发、goroutine 同步和关闭通道

Gorm 在保存/创建时序列化 struct

将 Golang Gin 与 AWS Lambda 和无服务器与代理路径一起使用

如何在 Windows 上使用 cgo 为 386 arch 构建 lib?

使用 image/jpeg 编码导致图像饱和/错误像素

如何从字符串中删除多个换行符`\n`但只保留一个?

不理解切片和指针

如何发送带有登录数据的 GET 请求并将 cookie 数据保存到 txt 文件?

如果在调用 http.Get(url) 时发生错误,我们是否需要关闭响应对象?