Linux で cURL を使ってサーバーの接続性をテストする方法

LinuxBeginner
オンラインで実践に進む

はじめに

Linux システム管理において、サーバーの接続性を確認することは基本的なスキルです。このチュートリアルでは、cURL ツールを使用してサーバーの接続性をテストするプロセスを説明します。cURL (Client URL) は、さまざまなネットワークプロトコルを介してデータ転送を可能にするコマンドラインユーティリティであり、ネットワーク診断とトラブルシューティングに不可欠なツールです。

このチュートリアルを終える頃には、cURL を使用してサーバーの可用性を検証し、応答時間をチェックし、HTTP ステータスコードを分析し、接続の問題をトラブルシューティングする方法を理解できるようになります。これらのスキルは、Web サーバー、API、または Linux 環境内のあらゆるネットワークサービスを管理する場合に役立ちます。

cURL の基本を理解する

cURL は、HTTP、HTTPS、FTP など、さまざまなプロトコルを使用してデータを転送できる強力なコマンドラインツールです。接続性のテストに入る前に、cURL とは何か、基本的な操作にどのように使用するかを理解しましょう。

cURL のインストール

cURL ユーティリティは、Ubuntu 22.04 環境を含むほとんどの Linux ディストリビューションにプリインストールされています。cURL がインストールされていることを確認するには、ターミナルを開いて以下を実行します。

curl --version

次のような出力が表示されるはずです。

curl 7.81.0 (x86_64-pc-linux-gnu) libcurl/7.81.0 OpenSSL/3.0.2 zlib/1.2.11 brotli/1.0.9 zstd/1.4.8 libidn2/2.3.2 libpsl/0.21.0 (+libidn2/2.3.2) libssh/0.9.6/openssl/zlib nghttp2/1.43.0 librtmp/2.3 OpenLDAP/2.5.13
Release-Date: 2022-01-05
Protocols: dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP UnixSockets zstd

これにより、cURL がインストールされており、バージョンとサポートされているプロトコルと機能が表示されることが確認されます。

cURL の基本的な構文

cURL を使用するための基本的な構文は次のとおりです。

curl [options] [URL]

Web サイトのコンテンツを取得する簡単な cURL コマンドを試してみましょう。

curl https://example.com

このコマンドは、example.com に GET リクエストを送信し、HTML レスポンスをターミナルに表示します。次のような HTML コードが表示されるはずです。

<!doctype html>
<html>
  <head>
    <title>Example Domain</title>
    <!-- More HTML content -->
  </head>
  <body>
    <div>
      <h1>Example Domain</h1>
      <p>This domain is for use in illustrative examples in documents...</p>
      <!-- More content -->
    </div>
  </body>
</html>

出力をファイルに保存する

出力をターミナルに表示する代わりに、-oまたは--outputオプションを使用してファイルに保存できます。

curl -o example.html https://example.com

このコマンドは、example.com からのレスポンスをexample.htmlという名前のファイルに保存します。ファイルが作成されたことを確認するには、以下を実行します。

ls -l example.html

ファイルが存在することを確認する出力が表示されるはずです。

-rw-rw-r-- 1 labex labex 1256 Mar 28 12:34 example.html

ファイルの内容を表示するには、以下を実行します。

cat example.html

以前にターミナルに表示されたのと同じ HTML コンテンツが表示されるはずです。

cURL を使用した HTTP メソッドの理解

cURL はデフォルトで HTTP GET メソッドを使用しますが、-Xオプションを使用して他のメソッドを指定できます。一般的な HTTP メソッドには以下が含まれます。

  • GET: サーバーからデータを取得する
  • POST: サーバーにデータを送信する
  • PUT: サーバー上の既存のデータを更新する
  • DELETE: サーバーからデータを削除する
  • HEAD: GET と同様ですが、ヘッダーのみを取得します

後のステップでは、これらのさまざまなメソッドを使用して、サーバーの接続性と機能をテストする方法を説明します。

基本的なサーバー接続性のテスト

cURL の基本を理解したところで、サーバーの接続性をテストするために使用してみましょう。サーバーが正常に起動し、正しく応答しているかどうかを確認する能力は、システム管理者や開発者にとって重要なスキルです。

簡単な接続テスト

最も基本的な接続テストは、サーバーにリクエストを送信し、応答があるかどうかを確認することです。Google のサーバーへの接続性をテストしてみましょう。

curl -I https://www.google.com

-Iオプション(または--head)は、cURL に HEAD リクエストを送信するように指示します。これは、本文コンテンツなしでヘッダーのみを取得します。これは、迅速な接続チェックに役立ちます。次のような出力が表示されるはずです。

HTTP/2 200
content-type: text/html; charset=ISO-8859-1
date: Tue, 28 Mar 2023 12:34:56 GMT
server: gws
content-length: 219
x-xss-protection: 0
x-frame-options: SAMEORIGIN

HTTP/2 200は、接続が成功したことを示しています。つまり、サーバーは起動しており、応答しています。

HTTP ステータスコードの確認

HTTP ステータスコードは、クライアントリクエストの結果を示すためにサーバーが送信する標準化された応答です。一般的なステータスコードには以下が含まれます。

  • 200: OK - リクエストは成功しました
  • 301/302: リダイレクト - リソースが移動しました
  • 404: Not Found - リソースが存在しません
  • 500: Internal Server Error - サーバーでエラーが発生しました

存在しない URL をテストして、404 応答を確認してみましょう。

curl -I https://www.google.com/nonexistent-page

出力には、404 ステータスコードが含まれるはずです。

HTTP/2 404
content-type: text/html; charset=UTF-8
date: Tue, 28 Mar 2023 12:35:01 GMT
server: gws
content-length: 1565
...

応答時間の測定

サーバーが応答するのにかかる時間を測定するには、-wオプションとフォーマット文字列を使用します。

curl -s -o /dev/null -w "Connect: %{time_connect}s\nTotal: %{time_total}s\n" https://www.google.com

このコマンドは次のとおりです。

  • -s: サイレントモードで動作します(進行状況またはエラーメッセージなし)
  • -o /dev/null: 出力を/dev/null にリダイレクトします(破棄します)
  • -w "...": タイミング情報を含むフォーマットされた出力を表示します

次のような出力が表示されるはずです。

Connect: 0.052s
Total: 0.157s

これは、接続を確立するのにかかった時間と、リクエストが完了するまでの合計時間を示しています。

ドメイン名解決のテスト

場合によっては、接続性の問題は DNS の問題に起因します。ドメイン名が IP アドレスに解決できるかどうかをテストするには、以下を実行します。

curl -v https://www.example.com 2>&1 | grep "Trying"

これは、-v(verbose)オプションを使用し、「Trying」行をフィルタリングします。これにより、接続先の IP アドレスが表示されます。次のような出力が表示されるはずです。

* Trying 93.184.216.34:443...

これにより、ドメイン名が IP アドレスに正常に解決されたことが確認されます。

簡単な接続テストスクリプトの作成

複数のサイトへの接続性をテストする簡単なシェルスクリプトを作成しましょう。テキストエディタを開きます。

nano connection_test.sh

次の内容をファイルに追加します。

#!/bin/bash

echo "Testing server connectivity..."

for site in google.com example.com github.com nonexistent-site.xyz; do
  echo -n "Testing $site: "

  ## Use curl with a 5-second timeout
  status_code=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 5 "https://$site" 2> /dev/null)

  if [ $? -eq 0 ] && [ "$status_code" -lt 400 ]; then
    echo "OK (Status: $status_code)"
  else
    echo "Failed (Status: $status_code)"
  fi
done

echo "Testing complete!"

Ctrl+OEnterの順に押してファイルを保存し、Ctrl+Xで終了します。

スクリプトを実行可能にします。

chmod +x connection_test.sh

スクリプトを実行します。

./connection_test.sh

各サイトの接続ステータスを示す出力が表示されるはずです。

Testing server connectivity...
Testing google.com: OK (Status: 200)
Testing example.com: OK (Status: 200)
Testing github.com: OK (Status: 200)
Testing nonexistent-site.xyz: Failed (Status: 000)
Testing complete!

このスクリプトは、複数のサーバーへの接続性を一度に確認するための簡単な方法を提供します。

cURL による高度な接続性テスト

基本的な接続性テストを理解したところで、詳細なトラブルシューティングとテストに役立つ cURL のより高度な機能を調べてみましょう。

詳細なデバッグのための詳細モードの使用

詳細モード(-vオプション)は、リクエストとレスポンスのプロセス全体を表示するため、接続性の問題をトラブルシューティングする上で非常に役立ちます。

curl -v https://example.com

出力は包括的で、DNS 解決、TLS ハンドシェイク、リクエストヘッダー、レスポンスヘッダーなどを表示します。

*   Trying 93.184.216.34:443...
* Connected to example.com (93.184.216.34) port 443 (#0)
* ALPN: offers h2
* ALPN: offers http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN: server accepted h2
* Server certificate:
*  subject: C=US; ST=California; L=Los Angeles; O=Internet Corporation for Assigned Names and Numbers; CN=www.example.org
*  start date: Nov 24 00:00:00 2022 GMT
*  expire date: Nov 24 23:59:59 2023 GMT
*  subjectAltName: host "example.com" matched cert's "example.com"
*  issuer: C=US; O=DigiCert Inc; CN=DigiCert TLS RSA SHA256 2020 CA1
*  SSL certificate verify ok.
* using HTTP/2
* h2 [:method: GET]
* h2 [:path: /]
* h2 [:scheme: https]
* h2 [:authority: example.com]
* h2 [user-agent: curl/7.81.0]
* h2 [accept: */*]
* Using Stream ID: 1
> GET / HTTP/2
> Host: example.com
> user-agent: curl/7.81.0
> accept: */*
>
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* Connection state changed (MAX_CONCURRENT_STREAMS == 100)!
< HTTP/2 200
< age: 587269
< cache-control: max-age=604800
< content-type: text/html; charset=UTF-8
< date: Tue, 28 Mar 2023 12:40:01 GMT
< etag: "3147526947+ident"
< expires: Tue, 04 Apr 2023 12:40:01 GMT
< last-modified: Thu, 17 Oct 2019 07:18:26 GMT
< server: ECS (nyb/1D2B)
< vary: Accept-Encoding
< x-cache: HIT
< content-length: 1256
<
<!doctype html>
<html>
<head>
    <title>Example Domain</title>
    <!-- More HTML content -->
</head>
<body>
    <div>
        <h1>Example Domain</h1>
        <p>This domain is for use in illustrative examples in documents...</p>
        <!-- More content -->
    </div>
</body>
</html>
* Connection #0 to host example.com left intact

この詳細な出力は、接続が正確にどこで失敗しているかを特定するのに役立ちます。

さまざまな HTTP メソッドのテスト

テスト API エンドポイントへの POST リクエストをテストしてみましょう。

curl -X POST -d "name=test&email=test@example.com" https://httpbin.org/post

このコマンドは次のとおりです。

  • -X POST: POST リクエストを指定します
  • -d "name=test&email=test@example.com": リクエストでフォームデータを送信します

送信したデータを示す JSON レスポンスを受け取るはずです。

{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "email": "test@example.com",
    "name": "test"
  },
  "headers": {
    "Accept": "*/*",
    "Content-Length": "32",
    "Content-Type": "application/x-www-form-urlencoded",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.81.0",
    "X-Amzn-Trace-Id": "Root=1-642295b1-0d2340ef34f2e8ea6270241a"
  },
  "json": null,
  "origin": "198.51.100.42",
  "url": "https://httpbin.org/post"
}

カスタムヘッダーを使用したテスト

多くの API では、認証またはコンテンツタイプを指定するために特定のヘッダーが必要です。これをテストしてみましょう。

curl -H "User-Agent: MyCustomAgent" -H "Authorization: Bearer test-token" https://httpbin.org/headers

このコマンドは次のとおりです。

  • -H "User-Agent: MyCustomAgent": カスタム User-Agent ヘッダーを設定します
  • -H "Authorization: Bearer test-token": Authorization ヘッダーを設定します

レスポンスには、リクエストで送信されたヘッダーが表示されます。

{
  "headers": {
    "Accept": "*/*",
    "Authorization": "Bearer test-token",
    "Host": "httpbin.org",
    "User-Agent": "MyCustomAgent",
    "X-Amzn-Trace-Id": "Root=1-642295c3-73cac0a73b34b1c93a8ce520"
  }
}

さまざまなエンドポイントの応答時間のテスト

さまざまなサーバーの応答時間を比較するスクリプトを作成しましょう。

nano response_time.sh

次の内容を追加します。

#!/bin/bash

echo "Testing response times..."

for site in google.com bing.com baidu.com duckduckgo.com yahoo.com; do
  echo -n "$site: "
  curl -s -o /dev/null -w "%{time_total}s" "https://$site"
  echo ""
done

echo "Testing complete!"

ファイルを保存し、実行可能にします。

chmod +x response_time.sh

スクリプトを実行します。

./response_time.sh

出力には、各サイトの応答時間が表示されます。

Testing response times...
google.com: 0.187s
bing.com: 0.232s
baidu.com: 0.412s
duckduckgo.com: 0.298s
yahoo.com: 0.342s
Testing complete!

これは、さまざまなサーバーのパフォーマンスを比較したり、時間の経過に伴うサーバーのパフォーマンスを監視したりするのに役立ちます。

特定のポートへの TCP 接続性のテスト

特定のポートがサーバーで開いているかどうかをテストする必要がある場合があります。cURL もこれに使用できます。

curl -v telnet://example.com:80

ポートが開いている場合は、接続が成功したというメッセージが表示されます。

* Trying 93.184.216.34:80...
* Connected to example.com (93.184.216.34) port 80 (#0)

Ctrl+Cを押して接続を終了します。

同様に、安全な接続をテストできます。

curl -v https://example.com:443

詳細出力は、接続が成功したかどうか、または問題があったかどうかを示します。

包括的なサーバー監視ツールの作成

接続性テストのためのさまざまな cURL テクニックを学習したので、これらのテクニックを組み合わせた、より包括的なサーバー監視ツールを構築しましょう。

包括的なサーバー監視スクリプト

新しいスクリプトファイルを作成します。

nano server_monitor.sh

次の内容を追加します。

#!/bin/bash

## Server Monitoring Script
## This script checks the availability and performance of specified servers

## Define colors for output
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[0;33m'
NC='\033[0m' ## No Color

## Function to check server status
check_server() {
  local url=$1
  local timeout=5

  echo -e "\n${YELLOW}Testing $url:${NC}"

  ## Test connection and get status code
  status_code=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout $timeout "$url" 2> /dev/null)

  if [ "$status_code" -eq 200 ]; then
    echo -e "${GREEN}✓ Status: $status_code (OK)${NC}"
  elif [ "$status_code" -ge 100 ] && [ "$status_code" -lt 400 ]; then
    echo -e "${GREEN}✓ Status: $status_code (Success/Redirect)${NC}"
  elif [ "$status_code" -ge 400 ] && [ "$status_code" -lt 500 ]; then
    echo -e "${RED}✗ Status: $status_code (Client Error)${NC}"
  elif [ "$status_code" -ge 500 ]; then
    echo -e "${RED}✗ Status: $status_code (Server Error)${NC}"
  else
    echo -e "${RED}✗ Status: Connection failed${NC}"
  fi

  ## Measure response time if connection successful
  if [ "$status_code" -gt 0 ]; then
    response_time=$(curl -s -o /dev/null -w "%{time_total}" --connect-timeout $timeout "$url" 2> /dev/null)
    echo -e "• Response time: ${response_time}s"

    ## Get server headers
    echo "• Server headers:"
    curl -s -I --connect-timeout $timeout "$url" | grep -E 'Server:|Content-Type:|Date:' | sed 's/^/  /'
  fi
}

## Main function
main() {
  echo -e "${YELLOW}===== Server Connectivity Monitor =====${NC}"
  echo "Started at: $(date)"

  ## List of servers to monitor
  servers=(
    "https://www.google.com"
    "https://www.github.com"
    "https://www.example.com"
    "https://httpbin.org/status/404" ## This will return a 404 status
    "https://httpbin.org/status/500" ## This will return a 500 status
  )

  ## Check each server
  for server in "${servers[@]}"; do
    check_server "$server"
  done

  echo -e "\n${YELLOW}===== Monitoring Complete =====${NC}"
  echo "Finished at: $(date)"
}

## Run the main function
main

ファイルを保存し、実行可能にします。

chmod +x server_monitor.sh

スクリプトを実行します。

./server_monitor.sh

出力は、各サーバーの包括的なステータス概要を提供します。

===== Server Connectivity Monitor =====
Started at: Tue Mar 28 13:15:01 UTC 2023

Testing https://www.google.com:
✓ Status: 200 (OK)
• Response time: 0.186s
• Server headers:
  Date: Tue, 28 Mar 2023 13:15:02 GMT
  Content-Type: text/html; charset=ISO-8859-1
  Server: gws

Testing https://www.github.com:
✓ Status: 200 (OK)
• Response time: 0.247s
• Server headers:
  Server: GitHub.com
  Date: Tue, 28 Mar 2023 13:15:02 GMT
  Content-Type: text/html; charset=utf-8

Testing https://www.example.com:
✓ Status: 200 (OK)
• Response time: 0.132s
• Server headers:
  Content-Type: text/html; charset=UTF-8
  Date: Tue, 28 Mar 2023 13:15:03 GMT
  Server: ECS (nyb/1D2B)

Testing https://httpbin.org/status/404:
✗ Status: 404 (Client Error)
• Response time: 0.189s
• Server headers:
  Date: Tue, 28 Mar 2023 13:15:03 GMT
  Content-Type: text/html; charset=utf-8
  Server: gunicorn/19.9.0

Testing https://httpbin.org/status/500:
✗ Status: 500 (Server Error)
• Response time: 0.192s
• Server headers:
  Date: Tue, 28 Mar 2023 13:15:03 GMT
  Content-Type: text/html; charset=utf-8
  Server: gunicorn/19.9.0

===== Monitoring Complete =====
Finished at: Tue Mar 28 13:15:04 UTC 2023

定期的な接続チェックのスケジュール

サーバーを定期的に監視するには、cron ジョブを設定できます。実際の運用環境では、このスクリプトを crontab に追加して、定期的に実行することができます。デモンストレーションのために、指定された期間、1 分ごとに監視を実行する簡単なラッパースクリプトを作成しましょう。

nano scheduled_monitor.sh

次の内容を追加します。

#!/bin/bash

## Scheduled monitoring script
## This script runs the server_monitor.sh at regular intervals

## Check if duration parameter is provided
if [ $## -ne 1 ]; then
  echo "Usage: $0 <duration_in_minutes>"
  exit 1
fi

duration=$1
interval=60 ## seconds
iterations=$((duration * 60 / interval))

echo "Starting scheduled monitoring for $duration minutes..."
echo "Press Ctrl+C to stop monitoring"

for ((i = 1; i <= iterations; i++)); do
  echo -e "\n===== Run $i of $iterations ====="
  ./server_monitor.sh

  ## Don't sleep after the last iteration
  if [ $i -lt $iterations ]; then
    echo "Next check in $interval seconds..."
    sleep $interval
  fi
done

echo "Scheduled monitoring completed."

ファイルを保存し、実行可能にします。

chmod +x scheduled_monitor.sh

2 分間スクリプトを実行します(必要に応じて増減できます)。

./scheduled_monitor.sh 2

これにより、2 分間、1 分ごとにサーバー監視スクリプトが実行されます。

Starting scheduled monitoring for 2 minutes...
Press Ctrl+C to stop monitoring

===== Run 1 of 2 =====
===== Server Connectivity Monitor =====
...
(monitoring output)
...
Next check in 60 seconds...
(waits for 60 seconds)

===== Run 2 of 2 =====
===== Server Connectivity Monitor =====
...
(monitoring output)
...
Scheduled monitoring completed.

運用環境では、通常は cron ジョブを設定しますが、このスクリプトは、この実験演習中にスケジュールされた監視を実行するための簡単な方法を提供します。

まとめ

この実験では、Linux 環境でサーバーの接続性をテストするために cURL を使用する方法を学習しました。基本から始めて、シンプルな HTTP リクエストを送信し、レスポンスをファイルに保存する方法を学びました。その後、HTTP ステータスコードの確認、応答時間の測定、詳細なデバッグのための詳細モードの使用など、より複雑な操作に進みました。

サーバー監視と接続性テストのための cURL の力を示す、いくつかの実用的なスクリプトを作成しました。

  1. 複数のサーバーへの接続性を確認する基本的な接続テストスクリプト
  2. サーバーのパフォーマンスを測定および比較するための応答時間比較スクリプト
  3. サーバーのステータス、応答時間、ヘッダー情報に関する詳細を提供する包括的なサーバー監視ツール
  4. 定期的な接続チェックを自動化するスケジュールされた監視スクリプト

これらのツールとテクニックは、システム管理者、開発者、およびネットワークシステムを扱うすべての人にとって非常に貴重です。cURL を習得することにより、Linux 環境での接続性の問題を診断および解決するための強力なツールを手にしました。

Linux システムを引き続き使用する際には、cURL は接続性のテストだけでなく、API との対話、ファイルのダウンロード、さまざまなネットワーク関連タスクの自動化にも役立つことを忘れないでください。この実験で得たスキルは、将来のより高度なネットワーク操作とトラブルシューティングの基盤となります。