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