从jwilder / nginx-proxy提供静态文件

时间:2019-02-07 11:00:40

标签: docker docker-compose static-files jwilder-nginx-proxy

我有一个Web应用程序(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 worker提供。

所以基本上我想添加以下内容:

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的问答中,但没有得到答复。

如果有办法实现这一目标,请帮助我。

1 个答案:

答案 0 :(得分:1)

此答案基于comment官方存储库上的#553问题讨论中的nginx-proxy。首先,您必须使用静态位置创建default_location文件:

location /static/ {
    alias /var/www/html/static/;
}

并将其保存到例如项目根目录中的nginx-proxy文件夹中。然后,您必须将此文件添加到/etc/nginx/vhost.d容器的jwilder/nginx-proxy文件夹中。您可以基于jwilder/nginx-proxy构建新映像,并复制此文件,也可以使用volumes部分挂载它。另外,您还必须使用共享卷在webappnginx-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为您提供静态文件。