gpt4 book ai didi

ruby-on-rails - docker容器之间的代理

转载 作者:行者123 更新时间:2023-12-02 19:08:50 25 4
gpt4 key购买 nike

我有一个带有以下内容的 docker 设置

  • rails api 后端
  • mysql数据库
  • redis 数据库
  • 节点/ react 前端 (webpack)
  • nginx 服务于前端

  • (rails 后端目前正在通过内置 puma 服务器提供服务 - 我想我会将它移动到运行节点应用程序的同一 nginx 服务器)

    我的问题是前端会在后端请求东西,但这不起作用。

    我在 nginx 上设置了一个代理,如下所示:
    #nginx.conf

    server {
    listen 8080;

    # Always serve index.html for any request
    location / {
    # Set path
    root /wwwroot/;
    try_files $uri /index.html;
    }

    location /api/ {
    proxy_pass http://127.0.0.1:3000;
    }
    }

    但是当我发起 api 调用时,我在 nginx 日志中得到以下信息:
    nginx-server | 2017/05/13 20:56:08 [error] 5#5: *19 connect() failed (111: Connection refused) while connecting to upstream, client: 172.21.0.1, server: , request: "POST /api/authenticate HTTP/1.1", upstream: "http://127.0.0.1:3000/api/authenticate", host: "localhost:8080", referrer: "http://localhost:8080/"
    nginx-server | 172.21.0.1 - - [13/May/2017:20:56:08 +0000] "POST /api/authenticate HTTP/1.1" 502 575 "http://localhost:8080/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36" "-"

    而且我没有看到任何东西击中 puma 服务器。

    我不确定我应该在哪里寻找。这是我的 docker-compose 文件的问题还是 nginx 问题(或两者兼而有之)。
    我在下面包含了我的 docker-compose.yml:
    version: '2'

    services:
    nginx:
    build:
    context: .
    dockerfile: docker.nginx
    image: pt-nginx
    container_name: nginx-server
    ports:
    - "8080:8080"
    volumes:
    - wwwroot:/wwwroot

    webpack:
    build:
    context: ./frontend
    dockerfile: docker.webpack
    image: pt-webpack
    container_name: react-frontend
    ports:
    - "35729:35729"
    volumes:
    - ./frontend:/app
    - /app/node_modules
    - wwwroot:/wwwroot
    db:
    build:
    context: ./backend
    dockerfile: docker.mysql
    image: pt-mysql
    container_name: mysql-server

    env_file: ./backend/.env
    ports:
    - "3306:3306"
    volumes:
    - ./sql/data/:/var/lib/mysql

    redis:
    build:
    context: ./backend
    dockerfile: docker.redis
    image: pt-redis
    container_name: redis-server

    app:
    build:
    context: ./backend
    dockerfile: docker.rails
    image: pt-rails
    container_name: rails-server

    command: >
    sh -c '
    rake resque:start_workers;
    bundle exec rails s -p 3000 -b 0.0.0.0;
    '
    env_file: ./backend/.env
    volumes:
    - ./backend:/usr/src/app
    - /Users/mh/Pictures/ROR_PT/phototank:/Users/martinhinge/Pictures/ROR_PT/phototank
    ports:
    - "3000:3000"
    expose:
    - "3000"
    depends_on:
    - db
    - redis

    volumes:
    wwwroot:
    driver: local

    最佳答案

    问题是您的 nginx 服务正在请求 localhost (127.0.0.1) 的上游。但是应用程序在另一个容器中(使用另一个 IP)。您可以在 app 上通过 DNS 引用 rails 应用程序。因为它们都在默认网络中。 nginx 配置中的上游类似于 proxy_pass http://app:3000;反而。

    https://docs.docker.com/compose/networking/ 上阅读有关网络的更多信息, 具体来说:

    Within the web container, your connection string to db would look like postgres://db:5432, and from the host machine, the connection string would look like postgres://{DOCKER_IP}:8001.

    关于ruby-on-rails - docker容器之间的代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43958006/

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