Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonでプロキシWebサーバーを作成する方法【初心者向けサンプルコード付き】

プロキシサーバーとは

プロキシサーバーは、クライアントと実際のサーバー(オリジンサーバー)の間に位置する中継役となるサーバーです。クライアントから送られたリクエストを受け取り、それを実際のサーバーへ転送します。そして、サーバーからレスポンスが返ってくると、その内容をクライアントへ届けます。

プロキシサーバーを利用するメリットは多岐にわたり、代表的なものとしては以下が挙げられます。

  • サーバーのIPアドレスの隠蔽:実際のサーバーを外部に露出させず、攻撃や不正アクセスのリスクを低減できます。
  • パフォーマンスの向上:キャッシュ機能により、同じコンテンツへのアクセスを高速化できます。
  • セキュリティの強化:フィルタリングやアクセス制御によって、通信を監視・制限できます。

本記事では、Pythonの標準ライブラリだけを使って、こうしたプロキシサーバーの最小構成を実装する方法を解説します。

実装の考え方と使うモジュール

シンプルなプロキシサーバーは、次の標準モジュールを組み合わせることで実現できます。

  • SimpleHTTPServer:HTTPリクエストを処理するハンドラクラス(SimpleHTTPRequestHandler)を提供します。
  • SocketServer:TCPサーバーの土台を作り、受信したリクエストをハンドラに振り分けます。
  • urllib:指定したURLへアクセスし、コンテンツを取得します。

処理の流れは次のとおりです。まずSimpleHTTPRequestHandlerを継承した独自クラスを定義し、GETリクエストを処理するdo_GETメソッドをオーバーライドします。このメソッド内で、リクエストされたパスからURLを取り出し、urllibでそのURLにアクセスして得たレスポンスを、そのままクライアントへ書き戻します。最後に、このハンドラクラスをサーバークラスに渡してインスタンス化し、serve_forever()メソッドを呼び出せば、サーバーが起動してリクエストの待ち受けが始まります。

実装例

import SimpleHTTPServer
import SocketServer
import urllib

PORT = 9012

class JustAProxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        # パス先頭の「/」を除いた部分をURLとして扱う
        url = self.path[1:]
        self.send_response(200)
        self.end_headers()
        # 取得したコンテンツをそのままクライアントへ転送する
        self.copyfile(urllib.urlopen(url), self.wfile)

httpd = SocketServer.TCPServer(('localhost', PORT), JustAProxy)
print('Proxy Server at', str(PORT))
httpd.serve_forever()

コードのポイント

  • do_GETメソッド:GETリクエストが来たときに自動的に呼び出されるハンドラです。
  • self.path[1:]:リクエストパスの先頭のスラッシュを取り除き、転送先のURLとして利用します。例えば「https://localhost:9012/example.com」へのアクセスは、example.comの内容を取得するリクエストとして処理されます。
  • copyfile():urllibで取得したレスポンスの中身を、クライアントへの出力ストリーム(self.wfile)へそのまま流し込みます。
  • serve_forever():サーバーを明示的に停止させるまで、リクエストを繰り返し受け付け続けます。

実行結果

上記のコードを実行すると、次のような出力が表示され、ポート9012でプロキシサーバーが起動します。

Proxy Server at 9012

この状態でブラウザから「https://localhost:9012/取得したいURL」にアクセスすると、プロキシ経由で対象サイトのコンテンツを取得できます。

補足:Python 3での実装について

上記のコードはPython 2系の標準ライブラリに基づいています。Python 3ではモジュール名が変更されているため、以下のように読み替えてください。

  • SimpleHTTPServer → http.server
  • SocketServer → socketserver
  • urllib.urlopen → urllib.request.urlopen

また、実運用を想定する場合は、HTTPSへの対応、HTTPヘッダーの適切な転送、エラーハンドリング、同時接続への対応(ThreadingMixInの利用など)も併せて検討することをおすすめします。

  1. LAN環境でプロキシサーバーの制限を回避する5つの方法と便利な裏ワザ

    コンテンツフィルタリングやプロキシサーバーは、学校・大学・オフィスではもはや日常的な存在となっています。システム管理者は、Webトラフィックを監視し、不要なサイトへのアクセスをブロックするために、端末とインターネットの間にプロキシを設置することがよくあります。しかし、場合によっては業務や作業の妨げになることもあります。そこで本記事では、LAN環境で使えるプロキシ回避の方法をいくつか紹介します。 方法1:ブラウザ設定からプロキシを無効化する 他の設定に問題がない場合は、ブラウザ側のプロキシ設定を無効にするだけで解決することがあります。Firefoxの場合は「設定 → 詳細 → 接続設定」と進み、

  2. Macでプロキシサーバーの設定を変更する方法を徹底解説

    Mac、Linux、Windowsなど、どのデバイスでもプロキシ設定の調整が必要になることがあります。MacBookでもプロキシ設定を変更する必要が生じたことはありませんか?この記事では、Macでプロキシを最短かつ簡単に設定するための手順を、ステップバイステップでわかりやすく解説します。 Macでプロキシサーバー設定を調整する方法 それでは早速始めましょう。 プロキシはなぜ必要なのか? プロキシサーバーは、ユーザーとインターネットの間に立つファイアウォールのような役割を果たし、プライバシーを保護します。一般的に、プロキシサーバーはネットワークトラフィックの中継のために使用されます。プロキシサー