gpt4 book ai didi

ruby-on-rails - Docker:Nginx - [emerg] 在上游找不到主机

转载 作者:行者123 更新时间:2023-12-05 07:09:20 24 4
gpt4 key购买 nike

我正在构建一个 Rails 应用程序,我正在设置应用程序以在 docker 上部署,并使用 Nginx 作为网络服务器。但是,我在为应用程序设置 Nginx 和 Docker 时遇到问题。

我在运行 docker-compose up 时不断收到此错误:

nginx: [emerg] host not found in upstream "app:3000" in /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] host not found in upstream "app:3000" in /etc/nginx/conf.d/mailing_list.conf

任何形式的帮助将不胜感激。谢谢。

最佳答案

经过几个小时的研究和试验,我终于明白了这一点。

问题与我的 docker-compose.ymlmy_app.conf(Nginx 配置)文件中的错误配置有关。

这是正确的配置:

NginxDockerfile:

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 文件(这包含我的appdatabaseNginx 配置) :

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:

Nginxmy_app.conf 文件:

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

Nginxnginx-entrypoint.sh 文件:

#!/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_ENVRACK_ENV 等变量,您可能不需要这些变量。
  2. 此外,我的 NginxWORKDIR/app,因此将它指定为 Nginx 下的卷很重要 像我一样在 docker-compose.yml 文件中配置。
  3. 我将 Nginx 映射到主机上的端口 8084,您可以随意将其映射到主机上的任何可用端口。

就这些。

希望对您有所帮助

关于ruby-on-rails - Docker:Nginx - [emerg] 在上游找不到主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61639764/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com