1
  • 2 つの EC2 マイクロ インスタンスを背後に持つ Amazon ロード バランサーを作成しました。
  • 2 つの EC2 マイクロ インスタンスに Python サービスがあります。
  • サービスは正常に実行されており、直接呼び出し中に応答しています
  • Load Balancer のパブリック DNS 経由でサービスを呼び出すと、サービスは実行されません。ELB は 500 エラーをスローします。

EC2 インスタンス サービスを直接呼び出す例: ec2-54-200-1-2.us-west-2.compute.amazonaws.com/myservice ==> データを返す

Load Balancer の呼び出し例: test-12345678.us-west-2.elb.amazonaws.com/myservice ==> 500 エラーを返す

その他のポイント: DJANGO プロパティ ALLOWED_HOSTS は ['*'] に設定されていますが、機能しませんでした。HTTP プロトコルを使用します。つまり、ロード バランサ プロトコル = ポート 80 の HTTP をインスタンス プロトコル = ポート 80 の HTTP にマッピングします。

4

1 に答える 1

1

これは非常に古い質問であることを認めますが、ALLOWED_HOSTS = ['*'].

これは、自由に再利用できると感じた、私が書いたミドルウェア クラスの一部です。

から継承し、 の設定でCommonMiddleware代わりに使用する必要があるものです。CommonMiddlewareMIDDLEWARE_CLASSESsettings.py

from django.middleware.common import CommonMiddleware
from django.conf import settings
from django.http.response import HttpResponse
from django.utils import importlib

class CommonWithAllowedHeartbeatMiddleWare(CommonMiddleware):
    """ 
    A middleware class to take care of LoadBalancers whose HOST headers might change dynamically
    but are supposed to only access a specific path that returns a 200-OK status.
    This middleware allows these requests to the "heartbeat" path to bypass the ALLOWED_HOSTS mechanism check
    without jeopardizing the rest of the framework.
    (for more details on ALLOWED_HOSTS setting, see: https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts )

    settings.HEARTBEAT_PATH (default: "/heartbeat/"):
        This will be the path that is cleared and bypasses the common middleware's ALLOWED_HOSTS check. 

    settings.HEARTBEAT_METHOD (default: None):
        The full path to the method that should be called that checks the status. 
        This setting allows you to hook a method that will be called that can perform any kind of health checks and return the result.
        If no method is specified a simple HttpResponse("OK", status_code=200) will be returned.
        The method should expect the HttpRequest object of this request and return either True, False or a HttpResponse object.
        - True: middleware will return HttpResponse("OK")
        - False: middleware will return HttpResponse("Unhealthy", status_code=503) [status 503 - "Service Unavailable"]
        - HttpResponse: middleware will just return the HttpResponse object it got back.

    IMPORTANT NOTE:
    The method being called and any method it calls, cannot call HttpRequest.get_host().
    If they do, the ALLOWED_HOSTS mechanism will be called and SuspeciousOperation exception will be thrown.
    """

    def process_request(self, request):
        # Checking if the request is for the heartbeat path
        if request.path == getattr(settings, "HEARTBEAT_PATH", "/heartbeat/"):
            method_path = getattr(settings, "HEARTBEAT_METHOD", None)

            # Checking if there is a method that should be called instead of the default HttpResponse 
            if method_path:
                # Getting the module to import and method to call
                last_sep = method_path.rfind(".") 
                module_name = method_path[:last_sep]
                method = method_path[(last_sep+1):]
                module = importlib.import_module(module_name)

                # Calling the desired method
                result = getattr(module, method)(request)

                # If the result is alreay a HttpResponse object just return it
                if isinstance(result, HttpResponse):
                    return result
                # Otherwise, if the result is False, return a 503-response
                elif not result:
                    return HttpResponse("Unhealthy", status_code=503)

            # Just return OK
            return HttpResponse("OK")

        # If this is not a request to the specific heartbeat path, just let the common middleware do its magic
        return CommonMiddleware.process_request(self, request)

もちろん、このメカニズムが CommonMiddleware を完全にバイパスすることは理解していますが、それはハートビート パスが要求された場合にのみ行われるため、これは少し代償が大きいと感じています。

他の誰かがそれが役に立つことを願っています。

于 2014-08-21T11:28:28.777 に答える