"man curl"より抜粋
curl --http1.1 -I https://www.example.com/ HTTP/1.1 200 OK ...
dig +short example-com-1234567890.ap-northeast-1.elb.amazonaws.com 203.0.113.1 203.0.113.3 curl -I "https://www.example.com/" --resolve 'www.example.com:443:203.0.113.1'
curl -H "Host: www.example.com" -I "https://example-com-1234567890.ap-northeast-1.elb.amazonaws.com" curl: (60) SSL: no alternative certificate subject name matches target host name 'example-com-1234567890.ap-northeast-1.elb.amazonaws.com' ...
「-w "%{http_code}"」が「000」を返す場合、http codeに未定義のエラーが発生している。
「curl ...;echo $?」で原因が分かる場合がある。
curl(libcurl)で定期的にhttps://リクエストを発行するようなサーバでメモリ不足になる。 topでみても怪しげなプロセスは無い。 「slabtop」で見るとdentryが異常にメモリを使っている。
rpm -q nss-softokn nss-softokn-3.14.3-23.el6_7.x86_64
sync; echo 2 > /proc/sys/vm/drop_caches
sudo yum update curl nss-softokn
export NSS_SDB_USE_CACHE=yes # または export TMPDIR=/dev/shm
# curl実行後 dentunusd が大きく増えている事を確認 sar -v 1 10時50分21秒 dentunusd file-nr inode-nr pty-nr 10時50分22秒 42860 768 27417 10 10時50分23秒 42860 768 27417 10 ... strace -fc -e trace=access curl -s 'https://www.google.com' > /dev/null % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 100.00 0.000056 0 4505 4503 access ------ ----------- ----------- --------- --------- ---------------- 100.00 0.000056 4505 4503 total
export NSS_SDB_USE_CACHE=yes strace -fc -e trace=access curl -s 'https://www.google.com' > /dev/null % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 0.00 0.000000 0 23 21 access ------ ----------- ----------- --------- --------- ---------------- 100.00 0.000000 23 21 total
curlが参照している中間証明書(CA)が古い場合にも起きる。 php等でlibcurlを使っている場合も同様。 golangも同様に発生。
sudo yum update ca-certificates libcurl curl nss # 解決しない場合 mv /etc/pki/tls/certs/ca-bundle.crt /etc/pki/tls/certs/ca-bundle.crt.$(date +%Y%m%d) wget http://curl.haxx.se/ca/cacert.pem -O /etc/pki/tls/certs/ca-bundle.crt
curl -x proxy.example.com:8080 -L https://www.google.com
# http status curl -LI -s -w "%{http_code}" "http://www.google.co.jp" -o /dev/null 2>&1 200 #結果 # download spees (byte) curl -s -w "%{speed_download}" "http://www.google.co.jp" -o /dev/null 2>&1 242079.000
# jsonを標準入力から送信 curl -X POST http://localhost:3000 \ -H "Content-Type: application/json" \ -d @- <<EOS { "key1": 1, "key2": "val2" } EOS # key=valueで送信 curl ... -X POST -d "key1=value1" -d "key2=value2"