docker - 从 jwilder/nginx-proxy 提供静态文件
问题描述
我有一个网络应用程序(由 uwsgi 提供的 django),我正在使用 nginx 代理对特定容器的请求。这是我的 default.conf 中的相关片段。
upstream web.ubuntu.com {
server 172.18.0.9:8080;
}
server {
server_name web.ubuntu.com;
listen 80 ;
access_log /var/log/nginx/access.log vhost;
location / {
include uwsgi_params;
uwsgi_pass uwsgi://web.ubuntu.com;
}
}
现在我希望从 nginx 而不是 uwsgi 工作人员提供静态文件。
所以基本上我想添加类似的东西:
location /static/ {
autoindex on;
alias /staticfiles/;
}
到容器的自动生成的服务器块。
我相信这应该让 nginx 为 /staticfiles 文件夹中对 web.ubuntu.com/static/* 的所有请求提供服务。
但是由于配置(default.conf)是自动生成的,所以我不知道如何将上述位置动态添加到服务器块中:(
我认为位置块不能在服务器块之外,每台服务器只能有一个服务器块?
所以我不知道如何在那里添加位置块,除非我在 nginx 出现后动态添加到 default.conf 然后重新加载它我猜。
我确实通过了https://github.com/jwilder/nginx-proxy并且我只看到了一个实际更改每个主机和默认位置设置的示例。但是完全没有添加一个新位置。
我已经在 jwilder/nginx-proxy 的问答中发布了这个,但没有得到回复。
如果有办法实现这一点,请帮助我。
解决方案
此答案基于官方nginx-proxy存储库上 #553 问题讨论中的此评论。首先,您必须使用静态位置创建文件:default_location
location /static/ {
alias /var/www/html/static/;
}
例如,将其保存到nginx-proxy
项目根目录的文件夹中。然后,您必须将此文件添加到容器的文件/etc/nginx/vhost.d
夹中jwilder/nginx-proxy
。您可以基于jwilder/nginx-proxy
复制的此文件构建新映像,也可以使用volumes
部分挂载它。此外,您必须使用共享卷在您的容器webapp
和容器之间共享静态文件。nginx-proxy
结果,您的docker-compose.yml
文件将如下所示:
version: "3"
services:
nginx-proxy:
image: jwilder/nginx-proxy
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./nginx-proxy/default_location:/etc/nginx/vhost.d/default_location
- static:/var/www/html/static
webapp:
build: ./webapp
expose:
- 8080
volumes:
- static:/path/to/webapp/static
environment:
- VIRTUAL_HOST=webapp.docker.localhost
- VIRTUAL_PORT=8080
- VIRTUAL_PROTO=uwsgi
volumes:
static:
现在,server
块/etc/nginx/conf.d/default.conf
中将始终包含静态位置:
server {
server_name webapp.docker.localhost;
listen 80 ;
access_log /var/log/nginx/access.log vhost;
location / {
include uwsgi_params;
uwsgi_pass uwsgi://webapp.docker.localhost;
include /etc/nginx/vhost.d/default_location;
}
}
这将使 Nginx 为您提供静态文件。
推荐阅读
- c# - 如何在 C# 中使用 DataGridView 值作为保存和加载控件?
- flutter - Flutter - Firebase 电子邮件格式错误,为空
- bluetooth-lowenergy - iBeacon 名称未显示在 ESP32 BLE 扫描仪中
- swift - 将 ARFaceGeometry 保存到 OBJ 文件
- vue.js - 找不到Vue js路由404和资产
- laravel - Laravel 说在表单中给出动作时缺少必需的参数
- r - 如何以一定次数重复堆叠同一行
- google-apps-script - 如何在谷歌电子表格中 B 列的每个填充单元格中获取文本
- nginx - Apache Zeppelin websockets 是否经过身份验证?
- python - Tensorflow 的 name_scope 在 Tensorboard 中不起作用