2013-10-10 1 views
0
  • 생성 된 EC2 마이크로 인스턴스가있는 Amazon Load Balancer가 뒤에 있습니다.
  • 2 EC2 마이크로 인스턴스에 파이썬 서비스가 있습니다.
  • 서비스가 정상적으로 실행 중이고 응답하는 중입니다.
  • Load Balancer의 공용 DNS를 통해 서비스를 호출 할 때 서비스가 실행되지 않습니다. ELB는 500 오류를 발생시킵니다.

직접 호출 EC2 인스턴스 서비스의 예 : ec2-54-200-1-2.us-west-2.compute.amazonaws.com/myservice ==> 데이터를 반환Amazon ELB가 작동하지 않고 500 서버 오류가 발생했습니다.

호출

예 로드 밸런서 : test-12345678.us-west-2.elb.amazonaws.com/myservice가 ==> 500 오류

또한 포인트 반환로 설정되어 장고 속성 ALLOWED_HOSTS를 [ '*']하지만 작동하지 않았다 . 로드 밸런서 프로토콜을 사용하는 HTTP 프로토콜을 사용합니다. 즉, 포트 80을 사용하는 포트 80과 인스턴스 프로토콜 = 포트 80을 사용하는 HTTP

+0

이 문제가 해결되었습니다. 이전의 장고 설정 파일을 덮어 쓰는 또 다른 settings.py 파일이있었습니다. 일단 올바른 파일에서 ALLOWED_HOSTS를 [ '*'] (으)로 업데이트하면 제대로 작동합니다. – user2653294

답변

1

나는 이것이 매우 오래된 질문이라는 것을 인정하지만 나는 더 좋다고 생각하는 솔루션을 사용했습니다. ALLOWED_HOSTS = ['*']을 설정하여 시스템의 보안을 설정하십시오.

다음은 내가 재사용 할 수 있다고 생각되는 미들웨어 클래스입니다.

에서 상속되며 MIDDLEWARE_CLASSES 설정에 CommonMiddleware 대신 settings.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를 무시 실현,하지만 하트 비트 경로가 요청 될 때만 것을 않는, 그래서 나는이 지불하는 작은 가격입니다 생각합니다.

다른 누군가가 유용하다고 생각합니다.