代码之家  ›  专栏  ›  技术社区  ›  Andrew Graham-Yooll

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

  •  16
  • Andrew Graham-Yooll  · 技术社区  · 8 年前

    首先,我看到 this .但他/她使用 build ,我使用 image

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

    app:
      restart: always
      image: some-app-image:latest
    

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

    通常,我会在包含静态文件的应用程序映像上安装一个卷。

    nginx容器需要做的就是“对等”到应用程序容器中,并为这些静态文件提供服务。例如:

    location /static/ {
        root http://app:8000/web_interface;
    }
    

    location /static/ {
        root app/web_interface;
    }
    

    4 回复  |  直到 8 年前
        1
  •  5
  •   Grimmy    8 年前

    我过去的所有想法:

    从应用程序到nginx共享docker卷

    你可以在应用程序的 Dockefile volumes_from .这有点难看,如果你的应用程序 depends_on nginx。我认为这是

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

    static.foo.bar

    使用CDN

    使用uWSGI

    您可以使用uWSGI提供静态文件 --static-map 看见 docs http-socket

        2
  •  4
  •   Steve Holgado    7 年前

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

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

    Here is a good guide to caching with 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
      }
    
      ...
    }
    
        3
  •  2
  •   x-yuri    6 年前

    解决方案之一是将资产复制到上的共享卷 app 服务开始:

    docker-stack.yml

    volumes:
      docroot:
    services:
      site:
        volumes:
          - docroot:/docroot
      nginx:
        volumes:
          - docroot:/docroot
    

    应用程序 服务的 entrypoint.sh :

    #!/usr/bin/env sh
    rsync -a --delete --exclude /uploads public/ /docroot
    # start the site
    

    WORKDIR 位于 /app /app/public uploads 目录。

    here .

        4
  •  1
  •   grantr    5 年前

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

    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;
    }
    }
    

    和我的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/
    

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

    推荐文章