与上游连接时连接被拒绝-Docker [英] Connection refused while connection to upstream - Docker

查看:112
本文介绍了与上游连接时连接被拒绝-Docker的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遇到的错误:

nginx_prod_vet | 2019/03/07 20:57:11 [错误] 6#6:* 1 connect()失败 (111:连接被拒绝)在连接到上游时,客户端: 172.23.0.1,服务器:,请求:"GET/backend HTTP/1.1",上游:" http://172.23 .0.2:81/backend ",主机:"localhost:90"

nginx_prod_vet | 2019/03/07 20:57:11 [error] 6#6: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.23.0.1, server: , request: "GET /backend HTTP/1.1", upstream: "http://172.23.0.2:81/backend", host: "localhost:90"

我的目标是使用nginx作为反向代理来传递前端文件并将其他服务代理到前端,因此可以从localhost:90/调用它来访问localhost:90/backend.

My goal is use nginx as reverse-proxy to delivery the frontend files and proxy the other services to the frontend, so it would be accessible localhost:90/backend been call from localhost:90/.

我试图从容器外部访问后端,但这给了我上面的错误.

I tried to access from outside the container the backend but it gives me the error above.

以下是最相关的文件:

# docker-compose.yml

version: '3'

services:

  nginx:
    container_name: nginx_prod_vet
    build:
      context: .
      dockerfile: nginx/prod/Dockerfile
    ports:
      - "90:80"
    volumes:
      - ./nginx/prod/prod.conf:/etc/nginx/nginx.conf:ro
    networks:
      - main
    depends_on:
      - backend

  backend:
    container_name: backend_prod_vet
    build:
        context: .
        dockerfile: apache/Dockerfile
    ports:
      - "81:81"
    networks:
      - main

networks:
  main:
    driver: bridge


# apache/Dockerfile
FROM httpd:2.4.32-alpine

RUN apk update; \
    apk upgrade;

# Copy apache vhost file to proxy php requests to php-fpm container
COPY apache/apache.conf /usr/local/apache2/conf/apache.conf
RUN echo "Include /usr/local/apache2/conf/apache.conf" \
>> /usr/local/apache2/conf/httpd.conf


# apache/apache.conf
ServerName localhost

LoadModule deflate_module /usr/local/apache2/modules/mod_deflate.so
LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so
LoadModule proxy_fcgi_module /usr/local/apache2/modules/mod_proxy_fcgi.so

<VirtualHost *:81>
    # Proxy .php requests to port 9000 of the php-fpm container
    # ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/$1
    DocumentRoot /var/www/html/
    <Directory /var/www/html/>
        # DirectoryIndex index.php
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    # Send apache logs to stdout and stderr
    CustomLog /proc/self/fd/1 common
    ErrorLog /proc/self/fd/2
</VirtualHost>


# nginx/prod/prod.conf
user  nginx;
worker_processes  1;

events {
  worker_connections  1024;
}

http {
  include /etc/nginx/mime.types;
  client_max_body_size 100m;

  upstream backend {
    server backend:81;
  }


  server {
    listen 80;
    charset utf-8;

    root /dist/;
    index index.html;

    location /backend {
      proxy_redirect off;
      proxy_pass http://backend;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
    }


  }
}


# nginx/prod/Dockerfile
# build stage
FROM node:10.14.2-jessie as build-stage
WORKDIR /app/
COPY frontend/package.json /app/
RUN npm cache verify
RUN npm install
COPY frontend /app/
RUN npm run build

# production stage
FROM nginx:1.13.12-alpine as production-stage
COPY nginx/prod/prod.conf /etc/nginx/nginx.conf
COPY --from=build-stage /app/dist /dist/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

docker-compose exec后端netstat -lnpt

docker-compose exec backend netstat -lnpt

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.11:38317        0.0.0.0:*               LISTEN      -
tcp        0      0 :::80                   :::*                    LISTEN      1/httpd

docker-compose exec nginx sh -c"nc后端81&& echo打开|| echo关闭"

docker-compose exec nginx sh -c "nc backend 81 && echo opened || echo closed"

closed.

推荐答案

docker-compose exec backend netstat -lnpt向我们显示服务backend的httpd Web服务器正在侦听端口80而不是81.

docker-compose exec backend netstat -lnpt shows us that the httpd webserver for service backend is listening on port 80 and not 81.

因此,很可能您的Dockerfile apache/Dockerfile在尝试提供自定义httpd配置apache/apache.conf方面是不正确的.

So must probably, your Dockerfile apache/Dockerfile is incorrect regarding how it tries to provide your custom httpd configuration apache/apache.conf.

要进一步调查:

  • 确保主要的apache conf内容符合您的期望:docker-compose exec backend cat /usr/local/apache2/conf/httpd.conf
  • 检查您的后端服务日志:docker-compose logs backend
  • Make sure the main apache conf contents is what you expect with: docker-compose exec backend cat /usr/local/apache2/conf/httpd.conf
  • Inspect your backend service log: docker-compose logs backend

这样做,您将意识到您在主apache配置文件中缺少Listen 81指令.您可以在apache/Dockerfile文件中解决此问题:

Doing so, you will realize your are missing the Listen 81 directive in the main apache config file. You can fix this in your apache/Dockerfile file:

# apache/Dockerfile
FROM httpd:2.4.32-alpine

RUN apk update; \
    apk upgrade;

# Copy apache vhost file to proxy php requests to php-fpm container
COPY apache/apache.conf /usr/local/apache2/conf/apache.conf

RUN echo "Listen 81" >> /usr/local/apache2/conf/httpd.conf
RUN echo "Include /usr/local/apache2/conf/apache.conf" >> /usr/local/apache2/conf/httpd.conf


为什么您的后端容器在端口81上监听?

它不会增加任何值来使您的不同容器打开不同的端口.每个容器都有其自己的IP地址,因此无需避免在docker-compose项目中定义的服务之间的端口冲突.


Why have your backend container listen on port 81?

It does not add any value to make your different containers open different ports. Each container has it's own IP address, thus there is no need for avoiding port collision between the services defined in a docker-compose project.

这篇关于与上游连接时连接被拒绝-Docker的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆