“本地主机没有发送数据。ERR_EMPTY_RESPONSE”和“curl:(52)来自服务器的空回复”
Posted
技术标签:
【中文标题】“本地主机没有发送数据。ERR_EMPTY_RESPONSE”和“curl:(52)来自服务器的空回复”【英文标题】:"localhost didn't send data. ERR_EMPTY_RESPONSE" and "curl: (52) Empty reply from server" 【发布时间】:2018-04-13 09:15:01 【问题描述】:当我尝试在 Docker 容器之外访问时,我得到了以下错误的空数据。我对 Docker 容器内的 curl 和 wget 命令都没有任何问题。该容器基于 Angular JS 图像。
“localhost 没有发送数据。ERR_EMPTY_RESPONSE”和“curl: (52) Empty reply from server”
请帮忙。
对不起!忘记发布实际代码。这是我的 Dockerfile 和 package.json 文件。
package.json
"name": "angularjs-project”,
"version": "0.0.0",
"license": "MIT",
"scripts":
"ng": "ng",
"start": "ng serve -H 0.0.0.0",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
,
"private": true,
"dependencies":
"@angular/animations": "^4.3.6",
"@angular/common": "^4.2.4",
"@angular/compiler": "^4.2.4",
"@angular/core": "^4.2.4",
"@angular/forms": "^4.2.4",
"@angular/http": "^4.2.4",
"@angular/platform-browser": "^4.2.4",
"@angular/platform-browser-dynamic": "^4.2.4",
"@angular/router": "^4.2.4",
"core-js": "^2.4.1",
"font-awesome": "^4.7.0",
"primeng": "^4.1.3",
"rxjs": "^5.4.2",
"zone.js": "^0.8.14"
,
"devDependencies":
"@angular/cli": "1.3.2",
"@angular/compiler-cli": "^4.2.4",
"@angular/language-service": "^4.2.4",
"@types/jasmine": "~2.5.53",
"@types/jasminewd2": "~2.0.2",
"@types/node": "~6.0.60",
"codelyzer": "~3.1.1",
"jasmine-core": "~2.6.2",
"jasmine-spec-reporter": "~4.1.0",
"karma": "~1.7.0",
"karma-chrome-launcher": "~2.1.1",
"karma-cli": "~1.0.1",
"karma-coverage-istanbul-reporter": "^1.2.1",
"karma-jasmine": "~1.1.0",
"karma-jasmine-html-reporter": "^0.2.2",
"protractor": "~5.1.2",
"ts-node": "~3.2.0",
"tslint": "~5.3.2",
"typescript": "~2.3.3"
Dockerfile
FROM node:6
RUN mkdir -p /angularjs-sample
ADD . /angularjs-sample
WORKDIR /angularjs-sample
RUN cd /angularjs-sample
RUN npm cache clean
RUN npm install -g @angular/cli
RUN npm install
RUN npm update
EXPOSE 4200
CMD ["ng", "serve"]
【问题讨论】:
github.com/moby/moby/issues/2522 @VijayKrishna,我希望您提供的链接能够解决问题。我今天已经通过链接很多次来理解这个问题。你能告诉我为了解决这个问题我需要用 0.0.0.0 更新 Angular JS 的哪个文件或位置吗?顺便说一句,如果这个问题很愚蠢,请原谅我,因为我是 Angular JS 和 Docker 的新手。 请也发布您的 dockerfile 和 package.json 请详细粘贴您使用 dockerfile 执行的步骤。 如果容器内的进程只监听“localhost”,则只能从容器内访问。确保进程正在侦听“任何”地址(即侦听0.0.0.0
),以便它接受来自容器外部的连接。 github.com/moby/moby/issues/2522#issuecomment-94878176
【参考方案1】:
CMD ["ng", "serve", "--host=0.0.0.0"]
当像 Web 浏览器这样的 HTTP 客户端(或者在本例中为 curl)发送 HTTP 请求时,服务器需要客户端的 IP 地址,因此它知道将响应发送到哪里。当您运行本地开发服务器时,它会检查该 IP 地址,甚至不会响应不是来自 127.0.0.1 (localhost) 的请求。这可以防止您网络上的其他人(例如,坐在同一家星巴克)使用开发服务器来破解您的盒子。
当您在来宾容器或 VM 中运行开发服务器并在主机上运行客户端 (curl) 时,服务器会看到不同的 IP 地址并拒绝响应。大多数服务器允许您指定哪些 IP 地址是有效客户端的掩码。 0.0.0.0 表示 fugetaboutit,接受所有客户端 IP。它让保镖过夜。
【讨论】:
@Rob 我错过了什么?对我来说,我应该做些什么不同的事情并不明显。 不要只是脱口而出代码。解释你在做什么。它如何回答这个问题?解决问题的方法是什么?【参考方案2】:我建议的理想方法是在创建时将主机 IP 地址绑定到您的容器。您不应该从 docker 文件开始运行您的应用程序。创建容器,与您的主机绑定并编写脚本来启动您的应用程序
你可以这样做,
docker run -d -p 4545:8553--name my-container my-image my-command
其中“8553”可以是您的应用程序默认内部端口与“4545”外部端口合并
【讨论】:
我可以得到拒绝投票的理由吗?以上是关于“本地主机没有发送数据。ERR_EMPTY_RESPONSE”和“curl:(52)来自服务器的空回复”的主要内容,如果未能解决你的问题,请参考以下文章