2017-01-23 7 views
8

У меня есть существующий Elastic Beanstalk опоки приложение на AWS, что иногда не инициализацию и выдает следующую ошибку:AWS Elastic Beanstalk - Скрипт приуроченная перед возвращающимся заголовками: application.py

[Mon Jan 23 10:06:51.550205 2017] [core:error] [pid 7331] [client 127.0.0.1:43790] script timed out before returning headers: application.py 
[Mon Jan 23 10:10:43.910014 2017] [core:error] [pid 7329] [client 127.0.0.1:43782] End of script output before headers: application.py 

Любые идеи, почему это может быть? Совсем недавно я изменил проект requirements.txt, включив в него pandas==0.19.2. До этого изменения программа будет работать в течение нескольких дней, прежде чем возвращать ту же ошибку. Другие журналы/информация о программе:

[Mon Jan 23 10:05:36.877664 2017] [suexec:notice] [pid 7323] AH: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec) 
[Mon Jan 23 10:05:36.886151 2017] [so:warn] [pid 7323] AH01574: module wsgi_module is already loaded, skipping 
AH00557: httpd: apr_sockaddr_info_get() failed for ip-10-55-254-33 
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message 
[Mon Jan 23 10:05:36.887302 2017] [auth_digest:notice] [pid 7323] AH01757: generating secret for digest authentication ... 
[Mon Jan 23 10:05:36.887797 2017] [lbmethod_heartbeat:notice] [pid 7323] AH02282: No slotmem from mod_heartmonitor 
[Mon Jan 23 10:05:36.887828 2017] [:warn] [pid 7323] mod_wsgi: Compiled for Python/2.7.10. 
[Mon Jan 23 10:05:36.887832 2017] [:warn] [pid 7323] mod_wsgi: Runtime using Python/2.7.12. 
[Mon Jan 23 10:05:36.889729 2017] [mpm_prefork:notice] [pid 7323] AH00163: Apache/2.4.23 (Amazon) mod_wsgi/3.5 Python/2.7.12 configured -- resuming normal operations 
[Mon Jan 23 10:05:36.889744 2017] [core:notice] [pid 7323] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND' 
[Mon Jan 23 10:06:43.542607 2017] [core:error] [pid 7328] [client 127.0.0.1:43786] Script timed out before returning headers: application.py 
[Mon Jan 23 10:06:47.548360 2017] [core:error] [pid 7330] [client 127.0.0.1:43788] Script timed out before returning headers: application.py 
[Mon Jan 23 10:06:51.550205 2017] [core:error] [pid 7331] [client 127.0.0.1:43790] Script timed out before returning headers: application.py 
[Mon Jan 23 10:10:43.910014 2017] [core:error] [pid 7329] [client 127.0.0.1:43782] End of script output before headers: application.py 

application.py

import flask 
from flask import request, Response 
import logging 
import json 
import JobType1 
import JobType2 
import sys 


application = flask.Flask(__name__) 
application.config.from_object('default_config') 
application.debug = application.config['FLASK_DEBUG'] in ['true', 'True']` 

logging.basicConfig(level=logging.INFO) 
logger = logging.getLogger(__name__) 


@application.route('/', methods=['GET']) 
def index(): 
    logger.info("The message received was '/', no action taken") 
    response = Response("Success", status=200) 
    return response 


@application.route('/StartJob', methods=['POST']) 
def StartJob(): 
    logger.info("!!start_job message received! This is the start job logger") 
    print("!!start_job message received! This is the start job printer") 
    response = None 

if request.json is None: 
    response = Response("Error, no job specified.", status=400) 
else: 
    message = dict() 

    try: 
     if request.json.has_key('TopicArn') and request.json.has_key('Message'): 
      message = json.loads(request.json['Message']) 
      job = message['job'] 
     else: 
      message = request.json 
      job = message['job'] 
     date_key = None 
     try: 
      date_key = message['runkey'] 
     except Exception as e: 
      print "printing Exception:" 
      print e 
      pass 
     start_job(job, date_key) 
     response = Response("Called Job", status=200) 
    except Exception as ex: 
     logging.exception("There was an error processing this message: %s" % request.json) 
     response = Response("Error processing message", status=400) 
return response 


@application.route('/CronMessage', methods=['POST']) 
def cron_message(): 
    logger.info("!!Cron message received! This is the Cron Start Logger") 
    response = None 
    logger.info("About to print headers of CRON***") 
    job = request.headers.get('X-Aws-Sqsd-Taskname') 
    start_job(job, None) 
    response = Response("Called Job", status=200) 
    return response 


def start_job(job_name, date_key): 
    logger.info("JOB NAME SUBMITTED IS:") 
    logger.info(job_name) 
    if job_name == 'JobType1': 
     start_job_if_not_running(job_name, JobType1.main, True, date_key) 
    if job_name == 'JobType2': 
    start_job_if_not_running(job_name, JobType2.main, True, date_key) 
    else: 
    print "Submitted job nome is invalid, no job started. The invalid submitted job name was %s" % job_name 


def start_job_if_not_running(job_name, program_to_execute, uses_date_key_flag, date_key): 
    global running_jobs 
    logger.info("running_jobs are:") 
    logger.info(running_jobs) 

    if job_name in running_jobs: 
    logger.info("Currently running job " + job_name + ", will not start again.") 
    return False 
else: 
    try: 
     running_jobs.append(job_name) 
     if uses_date_key_flag: 
      logger.info("") 
      program_to_execute(date_key) 
     else: 
      program_to_execute() 
    except Exception as e: 
     handle_job_end(job_name) 
     print "Error in " + job_name 
     error_message = str(e) + "-" + str(sys.exc_info()[0]) 
     print error_message 
     EmailUsers.main(subject="Error in " + job_name, 
         message=error_message, 
         message_type='error', 
         date_key=date_key, 
         job_name=job_name, 
         process_name='application.py', 
         notification_group='bp_only') 
    handle_job_end(job_name) 


def handle_job_end(job_name): 
    while job_name in running_jobs: 
    running_jobs.remove(job_name) 

logger.info("Process Complete") 

if __name__ == '__main__': 
    application.run(host='0.0.0.0', threaded=True) 

любая помощь, я могу поделиться больше кода из других файлов по мере необходимости.

Кроме того, если я перейти к /etc/httpd/conf.d/wsgi.conf, я вижу:

LoadModule wsgi_module modules/mod_wsgi.so 
WSGIPythonHome /opt/python/run/baselinenv 
WSGISocketPrefix run/wsgi 
WSGIRestrictEmbedded On 

<VirtualHost *:80> 

Alias /static/ /opt/python/current/app/static/ 
<Directory /opt/python/current/app/static/> 
Order allow,deny 
Allow from all 
</Directory> 


WSGIScriptAlias//opt/python/current/app/application.py 


<Directory /opt/python/current/app/> 
    Require all granted 
</Directory> 

WSGIDaemonProcess wsgi processes=1 threads=15 display-name=%{GROUP} \ 
    python-path=/opt/python/current/app:/opt/python/run/venv/lib64/python2.7/site-packages:/opt/python/run/venv/lib/python2.7/site-packages user=wsgi group=wsgi \ 
    home=/opt/python/current/app 
WSGIProcessGroup wsgi 
</VirtualHost> 

LogFormat "%h (%{X-Forwarded-For}i) %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 
+2

Какова конфигурация mod_wsgi от Apache? При использовании '' numpy'', '' pandas'' и т. Д. Вы должны принудительно использовать основной интерпретатор Python, иначе вы можете увидеть эту проблему. См. Http://modwsgi.readthedocs.io/en/develop/user-guides/application-issues.html#python-simplified-gil-state-api –

+0

@GrahamDumpleton Я добавил содержимое '/ etc/httpd/conf.d/wsgi.conf' к исходному вопросу. Это полезно? Извините за мою неопытность. – user2752159

+1

В соответствии с ссылкой вам нужно добавить '' WSGIApplicationGroup% {GLOBAL}% ''. –

ответ

11

Ответ @ user2752159 подчеркивает проблему, однако я собираюсь добавить это, чтобы показать, как преодолеть эту проблему в контексте AWS Beanstalk (то есть, если новый экземпляр или вы развернете больше кода, тогда проблема останется фиксированной, вместо того, чтобы иметь ssh в поле каждый раз, чтобы изменить wsgi.conf).

nano .ebextensions/<some_name>.config 

#add the following to <some_name>.config 
files: 
    "/etc/httpd/conf.d/wsgi_custom.conf": 
    mode: "000644" 
    owner: root 
    group: root 
    content: | 
     WSGIApplicationGroup %{GLOBAL} 


#add to git 
git add .ebextensions/<some_name>.config 
git commit -m 'message here' 

#deploy to beanstalk 
eb deploy 

Теперь каждый раз при развертывании, WSGIApplicationGroup %{GLOBAL} будут добавлены к wsgi_custom.conf, фиксируя проблему.

+0

Поиск этого вопроса/ответа занял у меня время, но решил мою проблему - большое спасибо! –

1

Огромное спасибо @GrahamDumpleton за его помощь. Используемый мной раствор был:

-Отменить файл wsgi.conf, найденный по адресу /etc/httpd/conf.d/wsgi.conf на экземпляре EC2 с эластичным бобовым стеком.

Для этого я использовал команду sudo -e /etc/httpd/conf.d/wsgi.conf, чтобы открыть редактор, нажать INSERT, чтобы начать редактирование, и добавил WSGIApplicationGroup %{GLOBAL} в любом месте файла. Я тогда его ESCAPE и использовал команду :wq, чтобы сохранить изменения.

После этого я выбрал «Перезапустить серверы приложений» из раскрывающегося списка «Действие» консоли Elastic Beanstalk. После этого программа загрузится и сообщит сообщение AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND', но не сообщение об ошибке после этого. Кроме того, приложение будет получать сообщения SQS и работать как ожидалось.

Следует отметить, что файл wsgi.conf будет отображаться, если какие-либо изменения конфигурации будут внесены в конфигурацию Elastic Beanstalk. Я не уверен в этом, но если я найду что-то, я отправлю его здесь.

Еще раз спасибо @GrahamDumpleton за его быстрый ответ и помощь в решении этой проблемы!