テックブログ

Curlコマンドを使ったWebサーバートラブル調査

こんにちは、T・Kです。新年度最初のブログを投稿しようと思います。

サーバーの管理を行う中で、Webサイトが閲覧できなくなってしまう事があります。
今回は、そういった時の確認等にも使用できるcurlコマンドについて執筆しようと思います。

Curlコマンドとは

Linuxサーバー上で、man curlを実行してマニュアルを確認します。

マニュアルのDESCRIPTION、いわゆるコマンドの説明には以下のように記載されています。

DESCRIPTION
curl is a tool to transfer data from or to a server, using one of the supported protocols (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS TFTP). The command is designed to work without user interaction.

curlコマンドのマニュアルから引用

ざっくりと説明すると、HTTP、HTTPS、FTPなどのプロトコルを使用して、サーバとデータのやり取りを行う事の出来るコマンドです。

まずは引数にはURLを指定し、何もオプションを指定せずに実行するとどのような挙動をするかを確認します。

[root@test ~]# curl https://google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="https://www.google.com/">here</A>.
</BODY></HTML>

このように、HTMLの内容が返ってきます。

この解説の前に、HTTPレスポンスについて扱っていきます。

このページを閲覧したい等の要求(リクエスト)、HTTPリクエストに対して、サーバから返ってくる返答がHTTPレスポンスです。

HTTPレスポンスは次の3つの要素から構成されます

  • ステータスコード
  • HTTPレスポンスヘッダ
  • レスポンスの本体

オプションなしで実行した場合は、HTTPレスポンスのうちの本体の部分が表示されるようになっています。

オプションについて

ここからは、オプションについて紹介します。

ただし、curlコマンドのオプションは多岐にわたりますので、よく扱うものを紹介していきます。

-I

マニュアルでは、以下の説明となっております。

-I, --head
(HTTP/FTP/FILE) Fetch the HTTP-header only! HTTP-servers feature the command HEAD which this uses to get nothing but the header of a  docu‐ment. When used on an FTP or FILE file, curl displays the file size and last modification time only.
curlコマンドのマニュアルから引用

こちらのオプションを指定すると、HTTPレスポンスのヘッダーのみを取得、表示することが出来ます。

実際に-Iをつけて実行してみます。

[root@test ~]# curl -I https://google.com
HTTP/1.1 301 Moved Permanently
Location: https://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Fri, 17 Mar 2023 07:32:38 GMT
Expires: Sun, 16 Apr 2023 07:32:38 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 220
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000

出力内容が、先ほどとは変わりました。こちらが、HTTPレスポンスのヘッダーです。

-L

-Lはリダイレクト先の内容を取得するときにつけるオプションです。

リダイレクトとは、アクセスのあったサイトとは別のサイトに誘導するためのものです。

よくある設定ですと、wwwなしのURLでアクセスがあった際はwwwありのURLに誘導するといったものがございます。リダイレクトについては、弊社のこのブログがイメージがしやすいかと思います。

まずは、-Lなしで実行します。

-Lなし

[root@test ~]# curl https://google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="https://www.google.com/">here</A>.
</BODY></HTML>

ブラウザ上でhttps://google.comにアクセスすると、https://www.google.comにリダイレクトしますが、

curlコマンドでは通常はリダイレクト元の情報を取得するのでこのような結果になります。

それでは、-Lをつけて実行します。

-Lあり

[root@test ~]# curl -L https://google.com
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head><meta content="&#19990;&#30028;&#20013;&#12398;&#12354;&#12425;&#12422;&#12427;&#24773;&#22577;&#12434;&#26908;&#32034;&#12377;&#12427;&#12383;&#12417;&#12398;&#12484;&#12540;&#12523;&#12434;&#25552;&#20379;&#12375;&#12390;&#12356;&#12414;&#12377;&#12290;&#12373;&#12414;&#12374;&#12414;&#12394;&#26908;&#32034;&#27231;&#33021;&#12434;&#27963;&#29992;&#12375;&#12390;&#12289;&#12362;&#25506;&#12375;&#12398;&#24773;&#22577;&#12434;&#35211;&#12388;&#12369;&#12390;&#12367;&#12384;&#12373;&#12356;&#12290;" name="description"><meta content="noodp" name="robots"><meta content="text/html; charset=UTF-8" http-equiv="Content-Type"><meta content="/images/branding/googleg/1x/googleg_standard_color_128dp.png" itemprop="image"><title>Google</title><script nonce="FJxHcKprVKNA18pY5dJKUA">

膨大な量が出てくるので、一部のみ記載しますが、HTMLが表示されます。

こちらが、リダイレクト先のhttps://www.google.comの本体の部分です。

-Lをつけて実行することでリダイレクト元ではなく、遷移先の情報を取得することが出来ます。

-v

[root@test ~]$ curl -v https://google.com
* About to connect() to google.com port 443 (#0)
*   Trying 2404:6800:4004:801::200e...
* Connected to google.com (2404:6800:4004:801::200e) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* SSL connection using TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
* Server certificate:
*       subject: CN=*.google.com
*       start date:  2月 20 09:13:15 2023 GMT
*       expire date:  5月 15 09:13:14 2023 GMT
*       common name: *.google.com
*       issuer: CN=GTS CA 1C3,O=Google Trust Services LLC,C=US
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: google.com
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Location: https://www.google.com/
< Content-Type: text/html; charset=UTF-8
< Date: Fri, 17 Mar 2023 08:38:25 GMT
< Expires: Sun, 16 Apr 2023 08:38:25 GMT
< Cache-Control: public, max-age=2592000
< Server: gws
< Content-Length: 220
< X-XSS-Protection: 0
< X-Frame-Options: SAMEORIGIN
< Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
<
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="https://www.google.com/">here</A>.
</BODY></HTML>
* Connection #0 to host google.com left intact

ここまでで紹介したオプションでは、HTTPレスポンスの内容が出力されていました。

-vオプションをつけると、HTTPレスポンスだけでなくHTTPリクエストの内容も出力することができます。

まとめ

ここまでで、いくつかのcurlコマンドのオプションについて紹介しました。

Webサイトが閲覧できるかの確認自体は、ブラウザを使用することでも確認が出来ます。

締めくくりとして、curlコマンドを活用することでどのような調査ができるかを紹介します。

レスポンスの内容から、どういった状態になっているかを確認できる

対象のサーバーからどのようなレスポンスが返ってくるかを確認することによって、

例えばステータスコードですと

  • 「リダイレクトが起きているから、サーバー内の設定を確認する必要がある」
  • 「404エラーが返ってきているから、サーバー上にWebサイトのファイルがあるかを確認する」

などといった、どのあたりを調査したらいいかを絞り込むことが出来ます。

接続の状態確認

対象のサーバーへ、弊社の踏み台サーバーや対象のお客様の別のサーバー等からcurlコマンドを実行することで、全ての環境からWebサイトへ接続できないのか、特定の環境だけ接続ができないのかを絞り込むことにも役立ちます。

最後に

curlコマンドでできる事は幅広いので、他にもどんなことができるか、HTTPヘッダーの値と意味について深堀していくと面白いかもしれません。

弊社では、サーバーの構築や管理、Webサイトが正常に閲覧できるかの監視とトラブルシュートもおこなっております。

もし詳しく相談したいという方がいらっしゃいましたら、ぜひお待ちしております。

この記事をシェアする

  • facebook
  • twitter
  • hatena
  • line
URLとタイトルをコピーする

実績数30,000件!
サーバーやネットワークなど
ITインフラのことならネットアシストへ、
お気軽にご相談ください