如何在docker容器中使用nginx提供静态文件?

如何在docker容器中使用nginx提供静态文件?,nginx,static,docker,Nginx,Static,Docker,自从我运行MacOSX以来,我一直在使用boot2docker。我不知道如何使用运行在docker容器(也包含静态资产,如html和js)中的nginx提供静态文件 我有四个docker容器正在与这个docker compose.yml一起旋转: web: build: ./public links: - nodeapi1:nodeapi1 ports: - "80:80" nodeapi1: build: ./api links:

自从我运行MacOSX以来,我一直在使用boot2docker。我不知道如何使用运行在docker容器(也包含静态资产,如html和js)中的nginx提供静态文件

我有四个docker容器正在与这个docker compose.yml一起旋转:

web:
   build: ./public
   links: 
     - nodeapi1:nodeapi1
   ports:
     - "80:80"

nodeapi1:
   build: ./api
   links:
     - redis
     - db
   ports:
     - "5000:5000"
   volumes:
     - ./api:/data

redis:
   image: redis:latest
   ports:
     - "6379:6379"

db:
   image: postgres:latest
   environment:
     POSTGRES_USER: root
   ports:
     - "5432:5432"
worker_processes auto;

daemon off;

events {
  worker_connections 1024;
}

http {
  server_tokens off;
  upstream node-app {
    ip_hash;
    server 192.168.59.103:5000;
  }
  server {
    listen 80;
    index index.html;
    root /var/www;

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
      expires 1d;
    }

    location / {
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-NginX-Proxy true;

      proxy_http_version 1.1;
      proxy_pass http://node-app;
      proxy_cache_bypass $http_upgrade;
    }

  }
}
这是我的nginx.conf

web:
   build: ./public
   links: 
     - nodeapi1:nodeapi1
   ports:
     - "80:80"

nodeapi1:
   build: ./api
   links:
     - redis
     - db
   ports:
     - "5000:5000"
   volumes:
     - ./api:/data

redis:
   image: redis:latest
   ports:
     - "6379:6379"

db:
   image: postgres:latest
   environment:
     POSTGRES_USER: root
   ports:
     - "5432:5432"
worker_processes auto;

daemon off;

events {
  worker_connections 1024;
}

http {
  server_tokens off;
  upstream node-app {
    ip_hash;
    server 192.168.59.103:5000;
  }
  server {
    listen 80;
    index index.html;
    root /var/www;

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
      expires 1d;
    }

    location / {
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-NginX-Proxy true;

      proxy_http_version 1.1;
      proxy_pass http://node-app;
      proxy_cache_bypass $http_upgrade;
    }

  }
}
我的web版本(包含我的nginx.conf和静态资产)的我的Dockerfile

./dist文件夹的内容是bundle.js文件和index.html文件。文件布局为:

public
  -- Dockerfile
  -- nginx.conf
  -- dist (directory)
    -- bundle.js
    -- index.html
  -- node_modules
    ...various node modules
它正确地向我的节点服务器(也在docker容器中,这就是为什么我的上游服务器指向boot2docker ip)发送请求,但我只是得到了404,用于尝试检索我的静态资产


我不知道下一步该怎么办。如果我能提供任何信息,请告诉我。

您的问题与docker无关,而是与您的nginx配置有关

在nginx配置文件中,您将
/var/www/
定义为文档根目录(我想是为静态文件提供服务)。但在下面,您指示nginx充当所有请求的节点应用程序的反向代理

因此,如果调用
/index.html
URL,nginx甚至不会检查
/var/www
的内容,而是将该查询转发给nodejs

通常,您希望通过使用URL约定来区分静态内容请求和动态内容请求。例如,所有以
/static/
开头的请求都将由nginx提供服务,而其他任何请求都将转发到node。然后,nginx配置文件将是:

worker_processes auto;

daemon off;

events {
  worker_connections 1024;
}

http {
  server_tokens off;
  upstream node-app {
    ip_hash;
    server 192.168.59.103:5000;
  }
  server {
    listen 80;

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
      expires 1d;
    }

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

    location / {
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-NginX-Proxy true;

      proxy_http_version 1.1;
      proxy_pass http://node-app;
      proxy_cache_bypass $http_upgrade;
    }

  }
}

谢谢你的回复!采用您的配置,我现在从我的节点服务器得到一个404,同时从我的nginx服务器得到一些粗块的响应:192.168.59.3---[04/Aug/2015:10:43:23+0000]“GET/HTTP/1.1”404 13“-”Mozilla/5.0(Macintosh;Intel Mac OS X 10_10_2)AppleWebKit/537.36(KHTML,如Gecko)Chrome/44.0.2304.125 Safari/537.36”我的回答中的配置示例是一个仅当您的应用程序设计为在
/static/
下提供其静态文件时才有效的示例。如果你的应用程序不是这样,你需要调整该配置。无论如何,这应该允许你将精力集中在nginx配置上,并停止在docker周围搜索;)使用“别名”而不是“根”为我修复了它