-
우분투에 Curl 최신 버전 설치하기 (http 400, 500에러 실패 처리하기 (--fail 옵션), curl: option --retry-all-errors: is unknown 에러 해결)Tips 2023. 1. 30. 16:24728x90반응형
http 400/500 응답시 cUrl 요청 실패처리하기
cUrl은 http, https, ftp 등의 프로토콜을 통해 url로 데이터를 전송하는 명령줄 도구이다. 서버가 응답을 하면 성공으로 인식을 하는데, http/https서버의 경우 400번대, 500번대 응답 코드를 받아도 응답한 것으로 간주하여 CICD 파이프라인에서 cUrl로 서버 응답 확인을 할 때 서버는 띄워졌으나 특정 엔드포인트가 응답하지 않을 경우에도 exitcode를 0으로 리턴하는(성공)으로 인식하는 문제가 있었다.
이 때, 두 가지 방법으로 처리할 수 있는데, 첫번째 방법은
-w
옵션을 사용하여 http상태코드를 출력값으로 받는 것이다. 해당 출력값을 변수로 받아 if문으로 200이 아닌 경우 파이프라인을 실패하도록 처리할 수 있다.response=$(curl -w "%{http_code}" [url])
다른 방법으로, cUrl의
--fail
(-f)옵션을 사용하는 것이다. 해당 방법을 사용하면 http서버가 문서 전달을 실패할 경우 상태 문서를 리턴하며 curl 종료코드는 22로 에러로 처리된다.HTTP page not retrieved. The requested URL was not found or returned another error with the HTTP error code being 400 or above. This return code only appears if -f, --fail is used.
출처 - cUrl 공식문서(HTTP) Fail silently (no output at all) on server errors. This is mostly done to better enable scripts etc to better deal with failed attempts. In normal cases when a HTTP server fails to deliver a document, it returns an HTML document stating so (which often also describes why and more). This flag will prevent curl from outputting that and return error 22. This method is not fail-safe and there are occasions where non-successful response codes will slip through, especially when authentication is involved (response codes 401 and 407).
출처 - https://explainshell.com/explain?cmd=curl+-fsSLI--retry family
cUrl의 retry 옵션은 지정한 횟수만큼 데이터 전송을 재시도하며, 해당 횟수 내에 전송이 성공할 시 시도를 종료한다. Argument로 시도할 횟수인 정수를 입력한다.
서버가 이미 띄워져 있는 상태가 아니라 파이프라인에서 띄운 후 cUrl요청을 시도할 경우, 아직 서버가 띄워지고 있는 상태에서는 전송 요청이 실패할 수 있다. 이럴 경우를 대비해 retry 옵션을 활용할 수 있다.
--retry
옵션은--retry-delay
,--retry-max-time
,--retry-all-errors
옵션으로 확장된다.- --retry-delay [int]: 다음 재시도 전 sleep할 초
- --retry-max-time [int]: 총 요청에 할당할 초. 해당 시간이 초과되면 retry횟수가 남아도 요청을 종료한다. 예를 들어, 해당 옵션의 인자로 2초를 주고 retry횟수를 3으로 지정했는데 처음 요청에 걸린 시간이 2초인 경우 한 번만 요청을 보내고 종료한다.
- --retry-all-errors: 모든 에러를 fail로 간주하고 재시도한다.
Ubuntu에 수동으로 특정 버전 cUrl 설치하기
※ 혹시 nginx 설치가 필요하다면 nginx 설치시 cUrl도 같이 설치되므로 nginx를 먼저 설치하고 다음 과정을 설치해야한다.
--retry-all-errors
옵션의 경우 7.71 버전에 추가된 기능이다. 따라서 7.71버전 이상으로 업데이트해주어야하는데, 내가 사용하는 VM의 apt 소스에서 cUrl 7.68 이상 버전을 찾지 못해 수동으로 설치가 필요했다 (Ubuntu 20.04라 7.68에서 멈춰있는 듯 하다).1. 현재 설치되어 있는 cUrl 패키지 및 환경설정을 삭제하고 apt를 업데이트한다. 파이프라인 script라 interactive reponse가 불가능해서
-y
옵션을 추가했다.sudo apt purge nginx -y && sudo apt update
2. cUrl 종속 패키지들을 설치한다.
apt-get install -y libssl-dev autoconf libtool make
3. cUrl 관련 디렉토리들을 삭제한다.
cd /usr/local/src && sudo rm -rf curl*
4. cUrl 다운로드 사이트에서 원하는 버전의 패키지 파일명을 확인 후
wget
명령어로 다운로드,unzip
한다. 다음 명령어는 7.74 버전을 예시로 작성했다.sudo wget https://curl.haxx.se/download/curl-7.74.0.zip && sudo unzip curl-7.74.0.zip && cd curl-7.74.0
5. 실행파일들을 컴파일한다.
sudo ./buildconf && sudo ./configure --with-ssl && sudo make && sudo make install
6. 시스템 바이너리 파일을 bin폴더로 옮겨준다.
sudo cp /usr/local/bin/curl /usr/bin/curl
7. 다음 명령어로 버전을 확인했을 때 설치한 버전이 나오면 성공한 것이다.
curl --version
혹시 설치한 버전이 나오지 않는다면 다음 명령어를 수행한 후 다시 버전을 확인해본다.
mv /usr/bin/curl /usr/bin/curl.bak
728x90반응형'Tips' 카테고리의 다른 글