2015-08-15 6 views
3

Прежде чем я войду в него, я просмотрел все похожие проблемы, которые мог найти, и ничего не нашел, решил мою проблему.nginx & nodejs: connect() не удалось (111: соединение отказано) при подключении к восходящему потоку

Я запускаю 2 докер-контейнера, 1 для nginx и 1 для nodejs api. Я использую nginx в качестве обратного прокси.

Когда я прошу локальный/апи/х, я получаю 502 недопустимый шлюз и журналы Nginx

nginx_1 | 2015/08/15 15:30:30 [error] 9#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: X.X.X.X, server: _, request: "GET /api/x HTTP/1.1", upstream: "http://127.0.0.1:8543/x", host: "localhost" 

Я могу получить порт 8543 сопоставлен на моем компьютере с Docker пс, и может получить доступ к приложению там просто отлично. Это приводит меня к выводу, что приложение узла запущено и прослушивает правильный порт (8543). Я также могу сообщить из сообщения об ошибке и из журнала перезаписи, что запрос uri правильно переписывается.

Я некоторое время стуча головой об этом, и не могу понять, что не так, любая помощь будет оценена!

Мой nginx.conf:

user nginx nginx; 

worker_processes auto; 
worker_rlimit_nofile 8192; 

events { 
    worker_connections 8000; 
} 

error_log /dev/stderr notice; 
pid  /var/run/nginx.pid; 

http { 

    # Hide nginx version 
    server_tokens off; 

    rewrite_log on; 

    # mime types 
    include mime.types; 
    default_type application/octet-stream; 

    # Update charset_types due to updated mime.types 
    charset_types text/xml text/plain text/vnd.wap.wml application/x-javascript application/rss+xml text/css application/javascript application/json; 

    # Format to use in log files 
    log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 
        '$status $body_bytes_sent "$http_referer" ' 
        '"$http_user_agent" "$http_x_forwarded_for"'; 

    access_log /dev/stdout main; 

    keepalive_timeout 20; 
    sendfile   on; 
    tcp_nopush  on; 

    # Nodejs API 
    upstream api { 
    server 127.0.0.1:8543; 
    } 

    # Reverse-proxy for the Riot API, S3, and our API 
    server { 
    listen [::]:80; 
    listen 80; 

    server_name _; 

    charset utf-8; 

    # Resolver 
    resolver   8.8.8.8 valid=300s; 
    resolver_timeout 10s; 

    # API, reverse proxy our API 
    location /api/ { 
     limit_except GET { 
     deny all; 
     } 
     rewrite ^/api(/.*)$ $1 break; 
     proxy_pass http://api; 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection 'upgrade'; 
     proxy_set_header Host $host; 
     proxy_cache_bypass $http_upgrade; 
    } 
    } 
} 

Мой Nginx Dockerfile

# Set the base image to centos 
FROM centos:7 

# File Author 
MAINTAINER Andrew Shapro 

# Install nginx 
RUN yum update -y && \ 
    yum -y install \ 
    curl \ 
    tar \ 
    openssl-devel \ 
    gcc \ 
    gcc-c++ \ 
    make \ 
    zlib-devel \ 
    pcre-devel \ 
    gd-devel \ 
    krb5-devel 

# download and compile nginx 
RUN curl -sLo nginx-1.9.2.tar.gz http://nginx.org/download/nginx-1.9.2.tar.gz \ 
    && mkdir /root/nginx_source \ 
    && tar -xzvf nginx-1.9.2.tar.gz -C /root/nginx_source --strip-components=1 
COPY nginx_modules /root/nginx_modules 
RUN cd /root/nginx_source \ 
    && ./configure \ 
    --user=nginx \ 
    --with-debug \ 
    --group=nginx \ 
    # --prefix=/user/share/nginx \ 
    # --sbin-path=/user/sbin/nginx \ 
    --conf-path=/etc/nginx/nginx.conf \ 
    --pid-path=/run/nginx.pid \ 
    --http-client-body-temp-path=/var/lib/nginx/body \ 
    --http-proxy-temp-path=/var/lib/nginx/proxy \ 
    --lock-path=/run/lock/subsys/nginx \ 
    --error-log-path=/var/log/nginx/error.log \ 
    --http-log-path=/var/log/nginx/access.log \ 
    --with-http_ssl_module \ 
    --with-http_stub_status_module \ 
    --with-http_realip_module \ 
    --with-http_auth_request_module \ 
    --with-http_addition_module \ 
    --with-http_gzip_static_module \ 
    --with-http_image_filter_module \ 
    --with-http_spdy_module \ 
    --with-http_sub_module \ 
    --with-ipv6 \ 
    --add-module=/root/nginx_modules/ngx_devel_kit \ 
    --add-module=/root/nginx_modules/ngx_aws_auth \ 
    && make \ 
    && make install \ 
    && rm -rf /root/nginx_modules /root/nginx_source \ 
    && mkdir --parents /var/lib/nginx 

# Add nginx configs 
RUN curl -sLo /usr/local/bin/ep https://github.com/kreuzwerker/envplate/releases/download/v0.0.8/ep-linux && chmod +x /usr/local/bin/ep 
ADD nginx.conf /etc/nginx/nginx.conf 
ADD mime.types /etc/nginx/mime.types 

# Cleanup after build 
RUN yum clean all \ 
    && yum autoremove -y 

# Add nginx user 
RUN adduser -c "Nginx user" nginx 

EXPOSE 80 

# Run nginx 
# CMD ["stat", "/usr/local/nginx/sbin/nginx"] 
CMD [ "/usr/local/bin/ep", "-v", "/etc/nginx/nginx.conf", "--", "/usr/local/nginx/sbin/nginx", "-c", "/etc/nginx/nginx.conf", "-g", "daemon off;" ] 

Мой узел приложения

var express = require('express'); 

var app = express(); 

function allTheRoutes (req, res) { 
    res.send('Hello World!'); 
} 

app.get('/', allTheRoutes); 
app.get('/*', allTheRoutes); 
var app = require('./src/app'); 
var server = app.listen(process.env.PORT || 8543, process.env.HOST || '127.0.0.1', function() { 
    var host = server.address().address; 
    var port = server.address().port; 

    console.log('Listening at http://%s:%s', host, port); 
}); 

Мой узел Dockerfile

# Set the base image to centos 
FROM centos:7 

# File Author 
MAINTAINER Andrew Shapro 

# Install nginx 
RUN yum update -y && \ 
    yum -y install curl 

# Add nvm to $PATH 
ENV PATH $PATH:$HOME/.nvm/bin 

# Install nvm 
RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.26.0/install.sh | bash 

# Clean up 
RUN yum clean all \ 
    && yum autoremove -y 

# Add iojs to $PATH 
ENV PATH $PATH:/root/.nvm/versions/io.js/v3.0.0/bin 

# Intall iojs 
RUN bash -lic 'nvm install iojs-v3.0' 

# Install PM2 
RUN npm install -g pm2 

# NPM install 
WORKDIR /app 
ADD package.json /app/ 
RUN npm install 

# Add app 
ADD . /app 

# Add run.sh 
ADD run.sh run.sh 
RUN chmod 755 run.sh 

# Expose port 
EXPOSE 8543 

# run node 
CMD ["./run.sh"] 

./run.sh выполняет данную команду pm2 start -x app.js --no-daemon

Докер-compose.yml

nginx: 
    build: nginx 
    ports: 
     - "80:80" 
    link: node 
    node: 
    build: node 
    ports: 
     - "8543" 
    environment: 
     - HOST=127.0.0.1 
     - PORT=8543 
+0

Каковы ваши докер команды для запуска контейнеров? – Michael

+0

Я использую docker-compose, добавленный ко дну моего сообщения –

ответ

6

Ваш докер-compose.yml вы обнажая порт 80 из контейнера Nginx к порту 80 снаружи контейнера, но вы показываете порт 8543 на random port. Когда вы скажете nginx искать 127.0.0.1:8543, он не найдет этот порт в хосте.

Вы уже связываете оба контейнера вместе, вам не нужно выставлять порт 8543 на хост, чтобы получить доступ, если от nginx. Все, что вам нужно сделать, это сказать ему, чтобы получить доступ к правому хосту:

# Nodejs API 
upstream api { 
    server node:8543; 
} 

Это происходит потому, что при связывании контейнеров Docker установить хост в/и т.д./хостах. Вы можете проверить это:

docker exec -ti nginx bash 
cat /etc/hosts 

Конечно, он должен работать, если вы подвергаете 8543:

nginx: 
build: nginx 
ports: 
    - "80:80" 
link: node 
node: 
build: node 
ports: 
    - "8543:8543" 
environment: 
    - HOST=127.0.0.1 
    - PORT=8543 

Подробнее о Докер сети: https://docs.docker.com/articles/networking/

+0

Спасибо, я дам вам попробовать. –

+1

Я считаю, что синтаксис 'link' неверен или был изменен. 'links:' то с портами '' ' – jackncoke

Смежные вопросы

 Смежные вопросы