2013-10-10 2 views
0
  • Созданный балансировщик нагрузки Amazon с двумя экземплярами EC2 micro.
  • 2 экземпляра EC2 micro имеют службы python.
  • Службы работают нормально и отвечают при прямом их вызове
  • Услуги НЕ запускаются, когда мы вызываем их через общедоступный 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, то есть сопоставление протокола балансировки нагрузки = HTTP с портом 80 до протокола экземпляра = HTTP с портом 80

+0

Это решение было разрешено. Был еще один файл settings.py, который переопределял предыдущий файл настроек django. Как только мы обновим ALLOWED_HOSTS до ['*'] в правильном файле, тогда это сработало. – user2653294

ответ

1

Я признаю, что это очень старый вопрос, но я использовал решение, которое, я считаю, лучше и не ставит под угрозу безопасности системы, установив ALLOWED_HOSTS = ['*'].

Вот часть класса промежуточного уровня, которую я написал, что я чувствую, что его можно повторно использовать по своему усмотрению.

Он наследует от CommonMiddleware, и это тот, который должен использоваться вместо CommonMiddleware в MIDDLEWARE_CLASSES в 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 в целом, но он делает это только тогда, когда запрашивается путь сердцебиение, поэтому я считаю, что это немного цена.

Надеюсь, что кто-то еще посчитает это полезным.

Смежные вопросы