使用位于另一个Docker容器中的Nginx提供静态文件

And*_*oll 6 static nginx docker

刚开始时,我已经看到了这一点。但是他/她使用build,而我使用image

我有一个docker-compose文件,该文件将我之前制作的图像拖到服务器上。

app:
  restart: always
  image: some-app-image:latest
Run Code Online (Sandbox Code Playgroud)

Nginx配置

location /static/ {
    root /data/app/web_interface;  <--- this exists in some-app-image container
}
Run Code Online (Sandbox Code Playgroud)

通常,我会将一个挂载到包含静态文件的应用程序映像上。

但是,由于应用程序容器本身具有静态文件,因此这变得多余。

Nginx容器所需要做的就是将“对等”到应用容器中并提供这些静态文件。喜欢:

location /static/ {
    root http://app:8000/web_interface;
}
Run Code Online (Sandbox Code Playgroud)

要么

location /static/ {
    root app/web_interface;
}
Run Code Online (Sandbox Code Playgroud)

有机会从Nginx容器提供位于另一个容器中的静态文件的机会吗?

Gri*_*mmy 5

我过去的所有想法:

从应用程序到 nginx 共享 docker 卷

您可以在应用程序中创建一个卷Dockefile,并在容器运行时复制静态文件。然后使用 与 nginx 容器共享卷volumes_from。这有点丑陋,如果你的应用程序是 nginx,则根本不起作用depends_on。我想说这绝对是不行的,因为在扩展应用程序容器时它的效果非常糟糕。

将静态文件从主机映射到 nginx 容器的想法也不是最佳的。你将有一个额外奇怪的步骤来处理它们。

独立的静态容器

构建另一个 nginx 容器,仅在不同的虚拟主机上提供静态文件。static.foo.bar

使用 CDN

有大量的 CDN 可供您放置静态文件,并且大多数框架都有用于处理该问题的插件。我有一些项目就是这样做的。效果很好。

使用uWSGI

您可以使用 uWSGI 提供静态文件--static-map。请参阅文档。这就是我最终所做的,因为它在扩展方面既便宜又简单......而且友好。那么你可能还需要使用http-socketuWSGI 来代替 http。


Ste*_*ado 5

这是一个很晚的答案,但添加它以防其他人发现它。

也许您可以利用服务器缓存,以便 NGINX 在对被代理的应用程序发出第一个请求后,可以有效地从其文件系统提供静态文件。

这是使用 NGINX 进行缓存的良好指南

您可以将非活动标志设置为很长一段时间,因为资产是静态的。


基于上述指南的基本示例:

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=30d use_temp_path=off;

server {
  ...

  location /static {
    proxy_cache my_cache;
    proxy_pass http://app:8000/static; # <--- wherever static files are on app server
  }

  ...
}
Run Code Online (Sandbox Code Playgroud)