wget --spider는 404에서는 실패하지만 --spider 없이는 작동합니다.

wget --spider는 404에서는 실패하지만 --spider 없이는 작동합니다.

도커 컨테이너에서 상태 확인을 수행하려고 합니다. 다음 명령을 찾았습니다.

wget --quiet --tries=1 --spider http://localhost:6077 || exit 1

문제는 컨테이너가 실행 중일 때 --spider 없이 wget을 실행하면 HTTP 200 코드를 얻지만 --spider를 사용하면 404를 반환한다는 것입니다.

왜 이런 일이 발생합니까?

$ wget --tries=1  http://localhost:6077
--2019-04-22 04:20:12--  http://localhost:6077/
Resolving localhost (localhost)... 127.0.0.1, ::1
Connecting to localhost (localhost)|127.0.0.1|:6077... connected.
HTTP request sent, awaiting response... 200 OK
Length: 436 [application/xml]
Saving to: ‘index.html.1’


$ wget --tries=1 --spider  http://localhost:6077
Spider mode enabled. Check if remote file exists.
--2019-04-22 04:21:46--  http://localhost:6077/
Resolving localhost (localhost)... 127.0.0.1, ::1
Connecting to localhost (localhost)|127.0.0.1|:6077... connected.
HTTP request sent, awaiting response... 404 Not Found
Remote file does not exist -- broken link!!!

이 이상한 동작으로 인해 상태 확인이 중단됩니다. --spider를 사용하지 않으면 wget이 어딘가에서 index.html을 다운로드하려고 한다고 가정합니다. 그렇죠?

답변1

허용된 답변은 잘못된 것으로 보이며 실제로 Docker 컨테이너의 오류를 숨기는 데 도움이 될 수 있습니다. 해당 옵션을 Wget에 추가하면 Wget이 대신 요청을 --spider보내게 됩니다 . 특히 이 특별한 경우에는 더욱 그렇습니다.HEADGET아니요Wget 호출을 사용하세요 --recursive.

RFC 7231 섹션 4.3.2에 따르면 요청은 메시지 본문을 포함하지 않는다는 점을 제외하면 HEAD요청과 동일합니다 . GET그러나 귀하의 경우에는 서버가 a HEAD및 a 요청에 대해 GET서로 다른 응답을 반환하는 것 같습니다. 나는 그것을 서버의 버그라고 부르고 싶습니다. 스파이더 없이 단순히 Wget을 호출하여 문제를 숨기지 마십시오. 이 동작은 HTTP 사양을 위반하며 이에 연결하는 클라이언트가 잘못된 응답을 보게 되므로 향후에 다른 문제가 발생할 수 있습니다.

답변2

wget 호출이 --spider제대로 작동하지 않는 것 같습니다. 또한 요청과 함께 HTTP 200을 반환해야 합니다 HEAD. 바라보다다르니어의 답변.

--spider를 사용하지 않으면 wget이 index.html을 어딘가에서 다운로드하려고 시도할 것이라고 가정합니다. 그렇죠?

-O특정 파일 이름이 필요한 경우 이 옵션을 사용하여 출력 문서를 설정할 수 있습니다.

wget --quiet --tries=1 -O/tmp/docker.html http://localhost:6077

또는 출력이 필요하지 않은 경우 -O -결과를 stdout으로 인쇄한 다음 stdout/stderr을 /dev/null.

wget -O - http://localhost:6077 &>/dev/null

관련 정보