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

使用位于另一个docker容器中的nginx提供静态文件,nginx,docker,static,Nginx,Docker,Static,刚开始,我看到了。但是他/她使用构建,而我使用图像 我有一个docker compose文件,它将我以前制作的图像拉到我的服务器上 app: restart: always image: some-app-image:latest nginx配置 location /static/ { root /data/app/web_interface; <--- this exists in some-app-image container } 或 有没有可能从nginx容器

刚开始,我看到了。但是他/她使用
构建
,而我使用
图像

我有一个docker compose文件,它将我以前制作的图像拉到我的服务器上

app:
  restart: always
  image: some-app-image:latest
nginx配置

location /static/ {
    root /data/app/web_interface;  <--- this exists in some-app-image container
}


有没有可能从nginx容器中提供位于另一个容器中的静态文件?

我过去的所有想法:

从应用程序到nginx共享docker卷

您可以在应用程序的
dockfile
中创建一个卷,并在容器运行时复制到静态文件中。然后使用中的
volumes\u与nginx容器共享该卷。这有点难看,如果你的应用程序依赖于nginx,那么它根本不起作用。我想说,这绝对是不可能的,因为它在放大应用程序容器时效果非常糟糕

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

单独的静态容器

构建另一个仅为不同virtualhost上的静态文件提供服务的nginx容器<代码>静态.foo.bar

使用CDN

有很多CDN,你可以把你的静态文件放在那里,大多数框架都有处理这些文件的插件。我有一些这样的项目。效果很好

使用uWSGI


您可以使用
--static map
为uWSGI提供静态文件。看见这就是我最后做的,因为这是一个便宜又容易的。。。而且在缩放方面也很友好。然后您可能还需要使用
httpsocket
,这样uWSGI就可以使用http了。

这是一个非常晚的答案,但如果其他人发现了,请添加它

也许您可以利用服务器缓存,以便NGINX在第一次请求代理应用程序后,能够有效地为其文件系统中的静态文件提供服务

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


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

proxy\u cache\u path/path/to/cache levels=1:2键\u区域=我的\u缓存:10m最大\u大小=10g非活动=30d使用\u临时\u路径=关闭;
服务器{
...
位置/静态{
代理缓存我的缓存;

代理通行证http://app:8000/static解决方案之一是在
app
服务开始时将资产复制到共享卷:

docker stack.yml

volumes:
  docroot:
services:
  site:
    volumes:
      - docroot:/docroot
  nginx:
    volumes:
      - docroot:/docroot
app
服务的
entrypoint.sh

#!/usr/bin/env sh
rsync -a --delete --exclude /uploads public/ /docroot
# start the site
WORKDIR
位于
/app
。docroot位于
/app/public
。在此,我还使其不复制
上传
目录


更多信息。

我做了一些类似但不同的事情:

我让docker compose运行两个容器:nginx和flaskapp。我让nginx容器服务静态请求,并将其余的转发到flask应用程序。这是我的nginx配置(flaskapp.conf):

以及my nginx容器的dockerfile:

FROM nginx

RUN rm /etc/nginx/conf.d/default.conf
RUN mkdir static
COPY /static/ /static/
COPY flaskapp.conf /etc/nginx/conf.d/

我复制了一个静态文件夹,其中包含我需要的资产,现在我可以将它们加载到前端。

您的容器设置有点不清楚。您有一个nginx容器作为反向代理,已经在为您的
应用程序
容器(虚拟主机)中的数据提供服务?为什么
应用程序
容器不能提供自己的静态文件?我让nginx提供静态文件,因为我不想让gunicorn服务器处理它们。只是要明确一点:应用程序容器运行gunicorn,而你的nginx容器通过uwsgi通行证提供服务?或多或少,具体来说,是
代理通行证
。嘿,谢谢你的回答。我知道但是,我们需要非常快地移动CDN选项,我觉得这比uWSGI解决方案需要更长的时间来设置。我一直认为从应用服务器提供静态文件是不可能的。我想这种方法已经发展了。我会说从应用服务器提供静态文件不是最佳选择,但不一定是b如果你需要快速移动,这是一种安全而简单的方法。它可以正常工作。php已经这样做了很长时间了。这不是很清楚,但有一个选项(你不推荐的)你提到的似乎是描述。你能详细说明一下吗?在什么情况下我会面临问题?具体是什么类型的问题?我同意——为什么应用程序和nginx之间的docker卷在这里不好?在我的opinon中,在集群环境中运行时会变得太混乱,但对于docker,我可能是一个纯粹主义者。
volumes:
  docroot:
services:
  site:
    volumes:
      - docroot:/docroot
  nginx:
    volumes:
      - docroot:/docroot
#!/usr/bin/env sh
rsync -a --delete --exclude /uploads public/ /docroot
# start the site
server {
listen 80;
server_name $SERVER_NAME;

location ^~ /static/  {
    include  /etc/nginx/mime.types;
    root /;
}

location / {
    proxy_set_header Host $host;
    proxy_pass http://frontend:8000;
}
}
FROM nginx

RUN rm /etc/nginx/conf.d/default.conf
RUN mkdir static
COPY /static/ /static/
COPY flaskapp.conf /etc/nginx/conf.d/