Docker Nginx + Node:已在使用的地址

时间:2016-09-06 08:37:33

标签: node.js nginx docker proxy reverse-proxy

我尝试使用Node.js(在主机上,外部)配置Nginx(在Docker容器内)。 Nginx配置使用upstreamproxy-pass指令:

upstream helloworld {
    server localhost:8080;
}

server {
    listen 443;
    ssl on;
    ssl_certificate /some/cert.crt;
    ssl_certificate_key /some/cert.key;
    location / {
        proxy_pass http://helloworld;
        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;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
    }
}

节点应用程序侦听主机的端口8080。现在,我启动Nginx容器

docker run \
        -d \
        -p 80:80 \
        -p 443:443 \
        -p 8080:8080 \
        -v /some/mounts:/to/some/mounts \
        --name nginx \
        nginx:alpine

我期望Nginx接收到端口80和443的连接,并将它们转发到其容器内的端口8080,然后将其转发到主机的端口8080到节点应用程序(-p 8080:8080) ,但它会出错:Error starting userland proxy: listen tcp 0.0.0.0:8080: bind: address already in use.

我已尝试将localhost更改为127.0.0.1,甚至更改为主机的IP地址(172.17.0.1从Nginx内部生成$ /sbin/ip route容器),但似乎都没有。如果我在启动容器时没有使用-p 8080:8080,那么它也无法正常工作。

即使172.17.0.1是主机的ip-address,我也无法从Nginx容器中连接到它:

$ wget 172.17.0.1:8080
Connecting to 172.17.0.1:8080... failed: Connection refused.

现在,我知道我可以在启动Nginx容器时使用Dockerize我的Node应用程序并使用--link参数,但目前它不是解决方案,因为它需要重新编写Node应用程序。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

我首先建议您将nodejs应用程序移动到与nginx相同的网络(桥接网络)上的容器中。它使得它更容易/更安全(在nginx公共代理后面隔离节点)。

否则,在主机网络上运行您的nginx,使其docker run \ -d \ -p 80:80 \ -p 443:443 \ -p 8080:8080 \ -v /some/mounts:/to/some/mounts \ --name nginx \ --network host \ nginx:alpine 与主机相同。

bind: address already in use

如果您仍然获得public class SOAPRequest extends HttpServlet { private static final long serialVersionUID = 1L; public SOAPRequest() { super(); // TODO Auto-generated constructor stub } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { SOAPConnectionFactory myFct = SOAPConnectionFactory.newInstance(); SOAPConnection myCon = myFct.createConnection(); MessageFactory msgFct = MessageFactory.newInstance(); SOAPMessage msg = msgFct.createMessage(); SOAPPart mySPart = msg.getSOAPPart(); SOAPEnvelope myEnvp = mySPart.getEnvelope(); SOAPBody body = myEnvp.getBody(); Name bodyName = envelope.createName("GetLastTradePrice", "m", "http://eztrade.com"); SOAPBodyElement gltp = body.addBodyElement(bodyName); Name myContent = envelope.createName("symbol"); SOAPElement mySymbol = gltp.addChildElement(myContent); mySymbol.addTextNode("SUNW"); message.saveChanges(); URLEndpoint endPt = new URLEndpoint("http://eztrade.com//quotes"); SOAPMessage reply = myCon.call(message, endPt); myCon.close(); } ,那是因为有多个服务正在侦听该地址。使用netstat或lsof(linux | osx)来确定正在侦听8080的进程。

有关网络设置的一些额外信息。 LINK