【问题标题】:Amazon + Django each 12 hours appears that [Errno 5] Input/output errorAmazon + Django 每 12 小时出现一次 [Errno 5] 输入/输出错误
【发布时间】:2016-04-11 03:16:15
【问题描述】:

我最近设置并部署了一个 Amazon EC2 实例来部署我的 django 项目。

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

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_context_data() 函数,该函数位于基于类的视图内部,该视图继承了 TemplateView CBV

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

我搜索了这个错误,发现这个票报告了https://code.djangoproject.com/ticket/23284

此报告与我的错误非常相似...

另外我昨天有这个错误,我重新启动了我的服务器,今天我又出现了这个错误。

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

我不认为我的应用程序的函数get_context_data() 是问题...

【问题讨论】:

    标签: python django input amazon-ec2 output


    【解决方案1】:

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

    原因:

    1. 循环引用
    2. 硬盘坏道错误
    3. 复杂进程、用户、网络、权限等引发混合错误

    建议:

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

    【讨论】:

      【解决方案2】:

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

      我有两个新手错误:

      1. print 生产中的句子

      在我上面在我的问题中显示的回溯中,我的get_context_data() 函数中有一个print 语句,这种方式是:

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

      可能每次执行此打印语句时,该进程都会尝试写入我的亚马逊 ec2 机器实例中的标准输出文件。

      我删除了该行中的这个打印语句,并通过 git 将更改检索到我的生产服务器中,然后重新启动 gunicorn 服务器,一切正常。

      1. 我有 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。

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

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

      (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
      >>> 
      

      这意味着,将以下内容放入我的 base.py 中:

      import socket
      
      if socket.gethostname() == 'ip-172-31-27-249':
          DEBUG = False
      else:
          DEBUG = True
      

      虽然我在我的代码中硬编码了生产服务器的主机名。 这意味着当我们想将我的项目部署到其他主机名的其他机器上时,我将手动修改后添加一个点

      尽管它有效,但这是一个最佳实践吗?

      我认为最合适的另一个选项是修复我的 DJANGO_SETTINGS_MODULE 环境变量的值

      在我的特殊情况下,我使用的是virtualenvwrapper,并且我有两个虚拟环境,所以:

      nrb_dev 我的开发环境

      nrb_test 用于我的测试环境。 我有一些在激活虚拟环境时会激活的钩子

      nrb_dev$VIRTUAL_ENV/bin/postactivate 我有这个:

      export DJANGO_SETTINGS_MODULE="neurorehabilitation.settings.development"
      

      以同样的方式,在nrb_test$VIRTUAL_ENV/bin/postactivate 我有这个:

      export DJANGO_SETTINGS_MODULE="neurorehabilitation.settings.testing"
      

      这意味着在我的亚马逊 EC2 生产机器上我应该更改 $VIRTUAL_ENV/bin/postactivate 中的钩子以选择这种方式的 settings/production.py

      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 Logging functionality 以获取我的应用程序的注册事件和其他内容。

      我应该探索supervisor service 以更好地管理生产中的gunicorn 进程。

      主管的其他资源:

      How to install and manage supervisor in Ubuntu

      Setting up Django with Nginx, Gunicorn, virtualenv, supervisor and PostgreSQL

      【讨论】:

      • 我把这条评论留给面对:error no 5 input/output error 在 Django 中的人。我正在从 django 向 FCM 发出发布请求,并在获得响应时打印响应。这在本地运行良好,因此部署在开发服务器上。但它仅在我的 SSH 终端打开时才在 dev 上工作,并在 SSH 终端关闭时给我这个错误。所以我在删除打印语句后修复了这个问题,它神奇地起作用了。
      【解决方案3】:

      文件“./my_api/to/Credit.py”,第 17 行,在 get_credit_from_response 中

      打印 xml_response

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

      【讨论】:

      • 感谢您阅读并检查票,但这不是我的,我已经编辑了我的问题以添加有关我的疑问的更多详细信息,但是当我在这里阅读您的回复时,我明白票报告的是与 Django 相关的用户应用程序错误,而不是 Amazon EC2 错误。我真的是对的吗?我无法查看与我的特定错误相关的屏幕,但这确实引用了我的应用程序的一个功能......尽管如下所述,我重新启动服务器并解决了所有问题......我按照检查我在 EC2 中部署的应用程序详细了解它们行为。 :D
      • 我已经编辑了我的问题,因为错误今天再次出现。任何方向将不胜感激。
      • 我一直在探索并在这篇文章中描述了一个相关的情况(没有相同的错误或回溯),但是这个人也说他重新启动了你的服务器并且所有它都解决了 stackoverflow.com/questions/31083103/… 在这个线程,在一个答案中,谈到了审查 autosacaling 部分和健康检查计划(可能对他们的情况有用),尽管我认为我部署的项目对于这个替代方案来说太小了。
      猜你喜欢
      • 2021-09-11
      • 2023-03-15
      • 2020-08-10
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多