与上游连接时连接被拒绝-Docker [英] Connection refused while connection to upstream - 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屋!