Docker: Nginx - хост [Emerg] не найден в восходящем потоке - PullRequest
0 голосов
/ 06 мая 2020

Я создаю приложение Rails и настраиваю приложение для развертывания на docker с Nginx в качестве веб-сервера. Однако у меня возникают проблемы с настройкой Nginx с Docker для приложения.

Я продолжаю получать эту ошибку при запуске docker-compose up:

nginx : [Emerg] хост не найден в восходящем "app: 3000" в /etc/nginx/conf.d/mailing_list.conf

Вот мой docker-compose.yml файл:

version: '3'
 
services:
  app:
    build:
      context: .
      dockerfile: ./docker/${RAILS_ENV}/Dockerfile
    depends_on:
      - database
    ports:
      - "3000:3000"
    restart: always
    volumes:
      - .:/app
      - gem-cache:/usr/local/bundle/gems
      - node-modules:/app/node_modules
    env_file:
      - .env
    environment:
      RAILS_ENV: ${RAILS_ENV}
      RACK_ENV: ${RACK_ENV}
 
  database:
    image: postgres:12.1
    expose:
      - "5432"
    restart: always
    env_file:
      - .env
    environment:
      POSTGRES_USER: ${DATABASE_USER}
      POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
      POSTGRES_DB: ${DATABASE_NAME}
      POSTGRES_HOST_AUTH_METHOD: ${DATABASE_HOST}
    volumes:
      - postgres-data:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
  nginx:
    build:
      context: .
      dockerfile: ./docker/nginx/Dockerfile
    depends_on:
      - app
    ports:
      - "8080:8080"
    restart: always
    volumes:
      - .:/app
      - nginx-config:/etc/nginx
      - nginx-log:/var/log/nginx
 
volumes:
  gem-cache:
  nginx-config:
  nginx-log:
  node-modules:
  postgres-data:

А вот мой nginx.conf файл:

upstream app {
  server app:3000;
}
 
server {
    listen 8080;
    listen [::]:8080;
 
    root app/public;
    index index.html index.htm;
 
    server_name localhost;
 
    location /app {
      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-Forwarded-Proto $scheme;
      proxy_pass http://app;
    }
}

Я пробовал много решений, но ни одно из них не работает.

Я продолжаю получать эту ошибку при запуске docker-compose up :

nginx: [Emerg] хост не найден в восходящем "app: 3000" в /etc/nginx/conf.d/mailing_list.conf

Любой форма помощи будет оценена. Спасибо.

1 Ответ

0 голосов
/ 08 мая 2020

После нескольких часов исследований и испытаний я наконец понял это.

Проблемы были связаны с неправильными конфигурациями в моих файлах docker-compose.yml и my_app.conf (Nginx конфигурации).

Вот правильная конфигурация :

Dockerfile для Nginx:

FROM nginx:1.18.0
LABEL maintainer="promisepreston@gmail.com"

# Set working directory
WORKDIR /app

# Copy over static assets
COPY public public/

# Copy over entrypoint
COPY docker/entrypoints/nginx-entrypoint.sh /usr/local/bin/nginx-entrypoint.sh

# Copy Nginx config template
RUN rm /etc/nginx/conf.d/default.conf
COPY docker/nginx/my_app.conf /etc/nginx/conf.d/my_app.conf

# Nginx init
RUN ["chmod", "+x", "/usr/local/bin/nginx-entrypoint.sh"]
ENTRYPOINT ["/usr/local/bin/nginx-entrypoint.sh"]

Файл docker-compose.yml (он содержит мой app , database и Nginx конфигурация):

version: '3'

services:
  app:
    build:
      context: .
      dockerfile: ./docker/${RAILS_ENV}/Dockerfile
    depends_on:
      - database
    expose:
      - "3000"
    restart: always
    volumes:
      - .:/app
      - gem-cache:/usr/local/bundle/gems
      - node-modules:/app/node_modules
    env_file:
      - .env
    environment:
      RAILS_ENV: ${RAILS_ENV}
      RACK_ENV: ${RACK_ENV}

  database:
    image: postgres:12.1
    expose:
      - "5432"
    restart: always
    env_file:
      - .env
    environment:
      POSTGRES_USER: ${DATABASE_USER}
      POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
      POSTGRES_DB: ${DATABASE_NAME}
      POSTGRES_HOST_AUTH_METHOD: ${DATABASE_HOST}
    volumes:
      - postgres-data:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
  nginx:
    build:
      context: .
      dockerfile: ./docker/nginx/Dockerfile
    depends_on:
      - app
    ports:
      - "8084:80"
      # - "443:443"
    restart: always
    volumes:
      - .:/app

  volumes:
    gem-cache:
    node-modules:
    postgres-data:

Файл my_app.conf для Nginx:

upstream rails_app {
  server app:3000;

}

server {
  listen       80;

  # define your domain
  server_name localhost;

  # define the public application root
  root   /app/public;
  index  index.html index.htm;

  # define where Nginx should write its logs
  access_log /app/log/nginx.access.log;
  error_log /app/log/nginx.error.log;

  # deny requests for files that should never be accessed
  location ~ /\. {
    deny all;
  }

  location ~* ^.+\.(rb|log)$ {
    deny all;
  }

  # serve static (compiled) assets directly if they exist (for rails production)
  location ~ ^/(assets|images|javascripts|stylesheets|swfs|system)/ {
    try_files $uri @rails;

    access_log off;
    gzip_static on; # to serve pre-gzipped version

    expires max;
    add_header Cache-Control public;

    # Some browsers still send conditional-GET requests if there's a
    # Last-Modified header or an ETag header even if they haven't
    # reached the expiry date sent in the Expires header.
    add_header Last-Modified "";
    add_header ETag "";
    break;
  }

  # send non-static file requests to the app server
  location / {
    try_files $uri @rails;
  }

  location @rails {
    proxy_pass        http://rails_app;
    proxy_redirect    off;
    proxy_set_header  Host $http_host;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  X-Real-IP  $remote_addr;

  }

  # redirect server error pages to the static page /50x.html
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
      root   /app/public;
  }
}

Файл nginx-entrypoint.sh для Nginx:

#!/bin/sh

set -e

# Allow nginx to stay in the foreground
# so that Docker can track the process properly
nginx -g 'daemon off;'

Примечание :

  1. Я использовал такие переменные, как RAILS_ENV, RACK_ENV и многие другие, которые могут вам не понадобиться.
  2. Кроме того, мой WORKDIR для Nginx равен /app, поэтому важно указать его как том в конфигурации Nginx в файле docker-compose.yml, как и я.
  3. Я сопоставил Nginx с портом 8084 на хост-машине, вы можете сопоставить его с любым доступным портом на хост-машине.

Вот и все.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...