我尝试使用Node.js(在主机上,外部)配置Nginx(在Docker容器内)。 Nginx配置使用upstream
和proxy-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应用程序。
非常感谢任何帮助。
答案 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