2015-08-04 12 views
7

Sto utilizzando boot2docker poiché eseguo Mac OSX. Non riesco a capire come servire i file statici usando nginx che è in esecuzione all'interno di un container (che contiene anche le risorse statiche, come il mio html e js).Come servire file statici con nginx all'interno di un contenitore di finestra mobile?

Ho quattro contenitori docker essere filate con questa finestra mobile-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" 

Questo è il mio 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; 
    } 

    } 
} 

mio Dockerfile per la mia web build (che contiene il mio nginx.conf e le risorse statiche):

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

Il contenuto della cartella ./dist è un file bundle.js e un file index.html. Il layout del file è:

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

Si sta inviando correttamente le richieste al mio server node (che è anche in un contenitore finestra mobile, è per questo che i miei punti di server a monte per l'ip boot2docker), ma sto solo ottenendo 404s per tentativi di recuperare le mie risorse statiche.

Sono perso per quanto riguarda i prossimi passi. Se posso fornire qualsiasi informazione, per favore fatemelo sapere.

risposta

7

Il problema non è correlato alla finestra mobile ma alla configurazione di nginx.

Nel file di configurazione nginx, si definisce /var/www/ come root del documento (suppongo che serva i file statici). Ma in seguito si istruisce nginx ad agire come proxy inverso all'app di nodo per tutte le richieste.

Per questo motivo, se si chiama l'URL /index.html, nginx non si preoccuperà nemmeno di controllare il contenuto di /var/www e inoltrerà tale query a nodejs.

In genere si desidera distinguere le richieste di contenuto statico dalle richieste di contenuto dinamico utilizzando una convenzione URL. Ad esempio, tutte le richieste che iniziano con /static/ saranno pubblicate da nginx mentre qualsiasi altra cosa verrà inoltrata al nodo. Il file di configurazione di nginx sarebbe quindi:

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

Grazie per la risposta! Adottando la tua configurazione, sto ricevendo un 404 dal mio server di nodi insieme a una certa risposta dal mio server 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, come Gecko) Chrome/44.0.2304.125 Safari/537.36 " –

+2

l'esempio di configurazione nella mia risposta è un esempio che funzionerebbe solo se la tua app è progettata per avere i suoi file statici pubblicati in '/ static /'. Se questo non è il caso della tua app, devi adattare quella conf. In ogni caso questo dovrebbe permetterti di concentrare i tuoi sforzi sulla tua configurazione di nginx e smettere di cercare sulla finestra mobile;) – Thomasleveil

+0

usando "alias" invece di "root" l'ho risolto per me –

Problemi correlati