Python 亚马逊&x2B;Django每12小时出现一次[Errno 5]输入/输出错误

Python 亚马逊&x2B;Django每12小时出现一次[Errno 5]输入/输出错误,python,django,input,amazon-ec2,output,Python,Django,Input,Amazon Ec2,Output,我最近为deploymydjango项目设置并部署了一个amazonec2实例 当我在浏览器中遇到此错误时,我正在通过浏览器与应用程序交互: errno 5 input/output error django 此错误未引用我的应用程序的某些功能 Environment: Request Method: GET Request URL: http://localhost:8000/accounts/profile/ Django Version: 1.9 Python Version: 3

我最近为deploymydjango项目设置并部署了一个amazonec2实例

当我在浏览器中遇到此错误时,我正在通过浏览器与应用程序交互:

errno 5 input/output error django

此错误未引用我的应用程序的某些功能

Environment:

Request Method: GET
Request URL: http://localhost:8000/accounts/profile/

Django Version: 1.9
Python Version: 3.4.3
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'crispy_forms',
 'django_extensions',
 'storages',
 'userprofile']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "/home/ubuntu/.virtualenvs/nrb_dev/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response
  149.                     response = self.process_exception_by_middleware(e, request)

File "/home/ubuntu/.virtualenvs/nrb_dev/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response
  147.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/home/ubuntu/.virtualenvs/nrb_dev/lib/python3.4/site-packages/django/views/generic/base.py" in view
  68.             return self.dispatch(request, *args, **kwargs)

File "/home/ubuntu/.virtualenvs/nrb_dev/lib/python3.4/site-packages/django/utils/decorators.py" in _wrapper
  67.             return bound_func(*args, **kwargs)

File "/home/ubuntu/.virtualenvs/nrb_dev/lib/python3.4/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
  23.                 return view_func(request, *args, **kwargs)

File "/home/ubuntu/.virtualenvs/nrb_dev/lib/python3.4/site-packages/django/utils/decorators.py" in bound_func
  63.                 return func.__get__(self, type(self))(*args2, **kwargs2)

File "/home/ubuntu/workspace/neurorehabilitation-system/userprofile/mixins.py" in dispatch
  7.         return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs)

File "/home/ubuntu/.virtualenvs/nrb_dev/lib/python3.4/site-packages/django/views/generic/base.py" in dispatch
  88.         return handler(request, *args, **kwargs)

File "/home/ubuntu/.virtualenvs/nrb_dev/lib/python3.4/site-packages/django/views/generic/base.py" in get
  157.         context = self.get_context_data(**kwargs)

File "/home/ubuntu/workspace/neurorehabilitation-system/userprofile/views.py" in get_context_data
  50.             print (user.is_physiotherapist)

Exception Type: OSError at /accounts/profile/
Exception Value: [Errno 5] Input/output error
第50行末尾引用了一个
get\u context\u data()
函数,该函数位于继承
TemplateView
CBV的基于类的视图中

但在我的控制台中,服务器需要重新启动,当我这样做时,错误以一种神奇的方式得到了解决

我已搜索此错误,并发现此票证已报告

这个报告和我的错误很相似

此外,我昨天还出现了这个错误,我重新启动了服务器,今天又出现了这个错误

Django的EC2基础架构存在一些问题(我不这么认为),或者问题更多的是我的应用程序方面

我认为我的应用程序的函数
get\u context\u data()
不是问题所在

文件“/my\u api/to/Credit.py”,第17行,在get\u Credit\u from\u响应中

打印xml\u响应


堆栈跟踪足够清晰。您有一个名为
get\u credit\u from\u response
的函数,其中发生了I/O错误。可能每6/12小时安排一次,并导致问题。请仔细检查您的代码。

我一直在探索,应该说这个错误的根源在我的代码中

我有两个新手错误:

  • 打印
    制作中的句子
  • 在我上面的问题中显示的回溯中,我在我的
    get\u context\u data()
    函数中有一个
    print
    句子,其方式如下:

    File "/home/ubuntu/workspace/neurorehabilitation-system/userprofile/views.py" in get_context_data
      50.             print (user.is_physiotherapist)
    
    export DJANGO_SETTINGS_MODULE="neurorehabilitation.settings.production"
    
    有可能每次执行这个打印语句时,进程都会尝试写入AmazonEC2机器实例中的标准输出文件

    我删除了这一行中的打印语句,并通过git将更改检索到我的生产服务器中,然后重新启动gunicorn服务器,所有的工作都很完美

  • 我在生产中有
    DEBUG=True
  • 我有以下设置文件:

    settings/
        base.py # --- without DEBUG
        development.py # --- DEBUG=True
        testing.py # --- DEBUG=True
        production.py # --- DEBUG=False
        staging.py # --- DEBUG=False  
    
    所有文件(
    development.py、testing.py、production.py、staging.py
    )都继承自
    base.py

    但我不知道如何在我的ec2实例中执行production.py,这将继承base.py中的所有内容,并将DEBUG重写为False

    我一直在探索,一种可能性是根据运行我的应用程序的主机的名称更改它们的值(真或假)

    在我的例子中,这是我的主机名的值

    (nrb_dev)ubuntu@ip-172-31-27-249:~$ python
    Python 3.4.3 (default, Oct 14 2015, 20:28:29) 
    [GCC 4.8.4] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import socket
    >>> a=socket.gethostname()
    >>> a
    'ip-172-31-27-249'
    >>> 
    >>> if a != 'ip-172-31-27-249':
    ...     DEBUG = print ('Caleno juiciocito')
    ... 
    >>> DEBUG
    True
    >>> 
    
    这意味着,在my base.py中输入以下内容:

    import socket
    
    if socket.gethostname() == 'ip-172-31-27-249':
        DEBUG = False
    else:
        DEBUG = True
    
    尽管我正在代码中硬编码生产服务器的主机名。 这意味着我要添加一个点,当我们想用其他主机名在其他机器上部署我的项目时,该点将被手动修改

    这是一种最佳实践吗

    另一个我认为最合适的选择是修复我的
    DJANGO\u设置\u模块
    环境变量的值

    在我的特殊情况下,我使用的是
    virtualenvwrapper
    ,我有两个虚拟环境,因此:

    nrb\u dev
    用于我的开发环境

    nrb_测试
    用于我的测试环境。 我有一些钩子,当虚拟环境被激活时会被激活

    nrb_dev
    中的
    $VIRTUAL_ENV/bin/postactive
    中,我有以下内容:

    export DJANGO_SETTINGS_MODULE="neurorehabilitation.settings.development"
    
    export DJANGO_SETTINGS_MODULE="neurorehabilitation.settings.testing"
    
    同样,在
    nrb_测试
    In
    $VIRTUAL_ENV/bin/postactivate
    中,我有:

    export DJANGO_SETTINGS_MODULE="neurorehabilitation.settings.development"
    
    export DJANGO_SETTINGS_MODULE="neurorehabilitation.settings.testing"
    
    这意味着在我的amazon EC2生产机器中,我应该更改
    $VIRTUAL_ENV/bin/postactive
    中的钩子,以选择以下方式的
    设置/production.py

    File "/home/ubuntu/workspace/neurorehabilitation-system/userprofile/views.py" in get_context_data
      50.             print (user.is_physiotherapist)
    
    export DJANGO_SETTINGS_MODULE="neurorehabilitation.settings.production"
    
    为了测试效果和时间方式,我在我的
    settings/production.py中打印
    DEBUG

    from .base import *
    
    # SECURITY WARNING: don't run with debug turned on in production!
    DEBUG = False
    print (DEBUG) # just for now.
    
    当我启动gunicorn守护进程服务器时,我可以看到DEBUG值设置为
    False

    (nrb_dev)ubuntu@ip-172-31-27-249:~/workspace/neurorehabilitation-system$ gunicorn -c neurorehabilitation/gunicorn_config.py neurorehabilitation.wsgi 
    [2016-01-08 00:26:15 +0000] [6691] [INFO] Starting gunicorn 19.4.5
    [2016-01-08 00:26:15 +0000] [6691] [INFO] Listening at: http://127.0.0.1:8000 (6691)
    [2016-01-08 00:26:15 +0000] [6691] [INFO] Using worker: sync
    [2016-01-08 00:26:15 +0000] [6694] [INFO] Booting worker with pid: 6694
    False
    ^C[2016-01-08 00:26:19 +0000] [6691] [INFO] Handling signal: int
    
    附加注释

    我可以在Django中查找注册事件和我的应用程序的其他内容

    我应该探索更好的生产方式来管理gunicorn过程

    主管的其他资源:


    此问题的一些可能原因和建议

    原因:

  • 循环引用
  • 硬盘坏扇区错误
  • 复杂的流程、用户、网络、权限等会产生混合错误
  • 建议:

  • 使用日志取代打印,这是最好的方法
  • 将IO重定向到文件或null:
    python test.py>test.log 2>&1&
    python test.py>/dev/null 2>&1&

  • 感谢您阅读并检查该票证,但这不是我的问题,我已经编辑了我的问题以添加更多关于我的疑问的详细信息,但当我在这里阅读您的回复时,我了解到报告的票证是用户应用程序的一个错误案例,而不是与Django相关的Amazon EC2。我是对的真的吗?我不能采取我的具体错误相关的屏幕,但这确实引用了我的应用程序的一个功能。。。虽然如下所述,我重新启动了我的服务器,所有问题都解决了。。。我会在EC2中查看我的应用程序deployen,了解其行为的详细信息:由于今天再次出现错误,我已编辑了我的问题。我一直在探索并在这篇文章中描述了一个相关的情况(没有相同的错误或回溯),但此人也说他重新启动了您的服务器,并且在这篇文章中解决了所有问题。在一个回答中,谈到了回顾自动搜索部分和健康检查计划(可能对他们的情况很有用),尽管我认为我部署的项目对于这个替代方案来说太小了。