当尝试连接到节点应用程序作为反向代理时,Nginx连接被拒绝

时间:2017-03-08 11:59:54

标签: node.js nginx docker reverse-proxy

我尝试使用docker容器构建一个webapp,并且在尝试将Nginx作为我的节点应用程序的反向代理运行时,我得到连接被拒绝。我不确定它是否是nginx服务器配置问题或docker-compose配置问题。

[error] 5#5: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.20.0.1, server: foo.com, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:7770/", host: "foo.com"

我在点击foo.com时遇到此错误,奇怪的是我的应用程序在引用端口号时有效,因此foo.com:7770运行应用程序。

我的nginx服务器配置:

server {
    listen       80;
    server_name  foo.com;

    port_in_redirect off;
    autoindex on;

    location / {
        proxy_pass http://127.0.0.1:7770;
        proxy_redirect off;
        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;
    }
}

我的Docker撰写文件:(这里可能有一些多余的东西)

version: "2"
services:
  nginx:
    build: ./nginx
    ports:
      - "80:80"
    depends_on:
      - app
    links:
      - app
  app:
    build:
      context: .
      dockerfile: DockerFile
    ports:
      - "7770:7770"
    links:
      - mongo
    depends_on:
      - mongo
  mongo:
    image: mongo
    ports:
      - "27017:27017"
    volumes_from:
      - mongodata
    depends_on:
      - mongodata
  mongodata:
    image: tianon/true
    volumes:
      - /data/db

My Node Dockerfile:

FROM node:latest

ADD package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app/

WORKDIR /opt/app
ADD . /opt/app

EXPOSE 7770

CMD ["npm", "start"]

我的ngnix Dockerfile

FROM nginx:1.10

COPY default.conf /etc/nginx/conf.d/default.conf

在npm开始时,这将运行:

app.get('*', function(req, res) {
  res.sendFile(path.join(__dirname, 'index.html'));
});

app.listen(7770, function(err) {
  if (err) {
    console.log(err);
    return;
  }

  console.log('Listening at http://localhost:7770');
});

这是我第一次在码头工作,所以我可能会搞砸几件事。另外,我将foo.com指向/ private / etc / hosts中的127.0.0.1。

2 个答案:

答案 0 :(得分:3)

C-浏览量,

首先,您需要记住每个容器都有自己的网络堆栈,因此您无法在容器内使用localhost来访问在docker主机中运行的服务。

对于此特定项目,您需要将Nginx服务器配置中的proxy_pass指令指向到达app容器的值。类似的东西:

proxy_pass http://app:7770;

您需要做正确的事,因为在docker-compose上下文中,您的容器名称将映射到内部DNS条目。这样,您就不需要将7770的应用程序容器发布到外部世界,如果您的MongoBD只能通过您的应用程序容器访问,您也不需要发布27017端口。

答案 1 :(得分:0)

如果您要将流量从nginx路由到app,则必须使用appproxy_pass容器的IP地址或dns。使用Docker Compose服务可以使用服务名称发现彼此,因此在nginx conf中进行更改

proxy_pass http://app:7770;

您不需要将端口7770发布到外部世界。同样对于mongo,您不需要发布27017端口。