2015-08-04 25 views
7

Używam boot2docker, ponieważ używam Mac OSX. Nie wiem, w jaki sposób wyświetlać statyczne pliki za pomocą nginxa, które są uruchomione wewnątrz kontenera dokera (który zawiera także zasoby statyczne, takie jak mój html i js).Jak wyświetlać pliki statyczne za pomocą nginx w kontenerze dokowania?

mam cztery pojemniki dokowane czym obrócił się z tym Döcker-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" 

To jest mój 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; 
    } 

    } 
} 

Moja Dockerfile dla moja kompilacja internetowa (zawierająca mój plik nginx.conf i zasoby statyczne):

# 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"] 

Zawartość folderu ./dist to plik bundle.js i plik index.html. Układ plik jest:

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

To jest właściwie wysyłania żądań do mojego serwera węzła (który jest również w pojemniku Döcker, dlatego moje punkty upstream server do OD boot2docker), ale jestem po prostu coraz błędy 404 dla prób odzyskania moich zasobów statycznych.

Zgubiłem się do następnych kroków. Jeśli mogę podać jakiekolwiek informacje, proszę dać mi znać.

Odpowiedz

7

Twój problem nie dotyczy dokowania, ale konfiguracji nginx.

W pliku konfiguracyjnym nginx definiujemy /var/www/ jako katalog główny (przypuszczam, że obsługujemy twoje pliki statyczne). Ale poniżej instruujesz Nginx, aby działał jako odwrotne proxy dla twojej aplikacji węzła dla wszystkich żądań.

Z tego powodu, jeśli zadzwonisz pod adres /index.html URL, nginx nie będzie nawet kłopotać sprawdzania zawartości /var/www i przekaże to zapytanie do nodejs.

Zazwyczaj można rozróżniać żądania dotyczące zawartości statycznej od żądań dotyczących treści dynamicznych za pomocą konwencji URL. Na przykład wszystkie żądania zaczynające się od /static/ będą obsługiwane przez nginx, podczas gdy wszystko inne będzie przekazywane do węzła. Plik konfiguracyjny nginx będzie wówczas:

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

Dzięki za odpowiedź! Przyjęcie konfiguracji, teraz otrzymuję 404 z mojego serwera węzła wraz z masywną odpowiedzią z mojego serwera 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, jak Gecko) Chrome/44.0.2304.125 Safari/537.36 " –

+2

Przykład konfiguracji w mojej odpowiedzi jest przykładem działa to tylko wtedy, gdy twoja aplikacja jest zaprojektowana tak, aby jej pliki statyczne były wyświetlane w '/ static /'. Jeśli tak nie jest w przypadku Twojej aplikacji, musisz ją dostosować. W każdym razie powinno to pozwolić ci skupić twoje wysiłki na konfiguracji nginx i przestać przeszukiwać docker;) – Thomasleveil

+0

używając "alias" zamiast "root" naprawiłem to dla mnie –

Powiązane problemy