2015-08-04 4 views
7

Ich benutze boot2docker, seit ich Mac OSX benutze. Ich kann nicht herausfinden, wie statische Dateien mit nginx, die in einem Docker-Container (der auch die statischen Assets wie meine HTML und Js enthält) ausgeführt wird.Wie stehe ich statische Dateien mit Nginx in einem Andock-Container?

ich vier Docker-Container wird mit diesem Docker-compose.yml haben gesponnen up:

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" 

Das ist mein nginx.conf:

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

    } 
} 

Mein Dockerfile für Mein Webbuild (enthält meine nginx.conf und statische Assets):

# Pull nginx base image 
FROM nginx:latest 

# Expost port 80 
EXPOSE 80 

# Copy custom configuration file from the current directory 
COPY nginx.conf /etc/nginx/nginx.conf 

# Copy static assets into var/www 
COPY ./dist /var/www 
COPY ./node_modules /var/www/node_modules 

# Start up nginx server 
CMD ["nginx"] 

Der Inhalt des Ordners ./dist ist eine Datei "bundle.js" und eine Datei "index.html". Das Datei-Layout ist:

public 
    -- Dockerfile 
    -- nginx.conf 
    -- dist (directory) 
    -- bundle.js 
    -- index.html 
    -- node_modules 
    ...various node modules 

Es ist richtig Anfragen an meine Knoten Server zu senden (die auch in einem Docker Behälter ist, weshalb mein Upstream-Server verweist auf die boot2docker ip ist), aber ich bin gerade erst 404s für Versuche, meine statischen Assets abzurufen.

Ich bin bezüglich der nächsten Schritte verloren. Wenn ich irgendwelche Informationen zur Verfügung stellen kann, lass es mich wissen.

Antwort

7

Ihr Problem bezieht sich nicht auf docker, sondern auf Ihre nginx-Konfiguration.

In Ihrer Nginx-Konfigurationsdatei definieren Sie /var/www/ als das Dokumentenstammverzeichnis (ich denke, dass Sie Ihre statischen Dateien bereitstellen). Aber unterhalb davon weisen Sie nginx an, als Reverse-Proxy für Ihre Knoten-App für alle Anfragen zu fungieren.

Aus diesem Grund, wenn Sie die /index.html URL aufrufen, wird nginx nicht einmal den Inhalt von /var/www überprüfen und wird diese Abfrage an nodejs weiterleiten.

Normalerweise möchten Sie Anforderungen für statischen Inhalt von Anforderungen für dynamischen Inhalt unter Verwendung einer URL-Konvention unterscheiden. Zum Beispiel werden alle Anfragen, die mit /static/ beginnen, von nginx bedient, während alles andere zum Knoten weitergeleitet wird. Die Nginx-Konfigurationsdatei wäre dann:

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

    } 
} 
+0

Danke für die Antwort! Nachdem ich Ihre Konfiguration übernommen habe, erhalte ich nun einen 404 von meinem Node-Server und einige klobige Antworten von meinem Nginx-Server: 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, wie Gecko) Chrome/44.0.2304.125 Safari/537.36 " –

+2

Das Konfigurationsbeispiel in meiner Antwort ist ein Beispiel Das funktioniert nur, wenn Ihre App so konzipiert ist, dass ihre statischen Dateien unter '/ static /' bereitgestellt werden. Wenn dies für Ihre App nicht der Fall ist, müssen Sie dieses Conf anpassen. Wie auch immer, dies sollte es Ihnen erlauben, sich auf Ihre nginx-Konfiguration zu konzentrieren und die Suche nach docker zu stoppen;) – Thomasleveil

+0

mit "alias" anstelle von "root" hat es für mich behoben –

Verwandte Themen