“本地主机没有发送数据。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)来自服务器的空回复”的主要内容,如果未能解决你的问题,请参考以下文章