Python AWS EC2实例在移动NLTK数据位置后似乎自毁

Python AWS EC2实例在移动NLTK数据位置后似乎自毁,python,apache,amazon-ec2,nltk,mod-wsgi,Python,Apache,Amazon Ec2,Nltk,Mod Wsgi,因此,我用flask前端构建了一个数据和NLP应用程序,它在本地运行得非常好,但当我尝试在Apache服务器后面的AWS(Ubuntu linux)上设置它时,出现了大量问题,正如我们建议的那样(flask不是为部署而设计的)。在这种设置下,python模块的导入突然变得相当困难,在Stackoverflow上有很多问题。已经解决了其中的5个问题,在整个代码中每次都使用大量Python日志语句来查看各种脚本在什么时候崩溃或挂起(没有错误消息),然后它比以往任何时候都更进一步,出现了关于NLTK语

因此,我用flask前端构建了一个数据和NLP应用程序,它在本地运行得非常好,但当我尝试在Apache服务器后面的AWS(Ubuntu linux)上设置它时,出现了大量问题,正如我们建议的那样(flask不是为部署而设计的)。在这种设置下,python模块的导入突然变得相当困难,在Stackoverflow上有很多问题。已经解决了其中的5个问题,在整个代码中每次都使用大量Python日志语句来查看各种脚本在什么时候崩溃或挂起(没有错误消息),然后它比以往任何时候都更进一步,出现了关于NLTK语料库位置的问题。不是NLTK模块,导入的很好,只是语料库文件夹

因此,要做到这一点,通常只需要以下代码:

import nltk
nltk.download()
它打开了一种用户界面,您可以在其中选择要下载的语料库或NLP项目,以及是否更改目录以将其存储在其他地方。默认情况下,它将目录
nltk\u data/
置于您的主目录中并将其放入其中

因此,我起初认为问题在于,该文件夹需要Apache用户
www-data
的权限,但这不起作用。然后在Apache错误日志中注意到,它在4个文件夹中进行了查找,但没有找到任何内容—其中一个文件夹是
/var/www/nltk_data
,没有一个文件夹是它实际所在的主目录。我记不起另外3个了

我看了几个关于Stackoverflow(,,,)的类似问题,但决定用更简单的方法。以下方面也是如此:

sudo mkdir /var/www/nltk_data
sudo cp -r nltk_data/   /var/www/
然后我再次刷新Apache日志,重新启动服务器并开始检查日志。它以通常的速度运行,花了几分钟完成脚本,重新检查日志,新的日志消息不断出现,然后一些关于内存的消息在ssh屏幕上不断重复,日志不再可见。我什么都打不出来。它让我退出,不让我重新登录。进入AWS控制台,重新启动两次。停止,重新启动,仍然无法登录。所以在愤怒中,终止了它。后悔这么做了,但是如果你不能登录的话,你觉得把它保留在那里没有任何意义

问题:

  • 将nltk_数据目录复制到Apache正在查找的/var/www上可以吗?我应该再这样做吗
  • 如果一个EC2实例的内存不足,它是否会严重杀死它,甚至在停止和启动它之后,您也无法再登录
  • 如果这种情况再次发生,从我的本地终端,是否有办法在“安全”模式下重新启动,这样我就可以进入那里,并尝试撤销我所做的任何杀死它的事情?(而不仅仅是有效地删除整个内容)

  • 现在可能会有另一次尝试,重新创建实例,可能4MB的ram不足以让我的应用程序和Apache一起使用,我想知道这些问题的答案或任何其他相关提示,以便我下一步必须执行nltk步骤。

    因此,在设置新实例后,我谢天谢地解决了这个问题,下面是如何:

    sudo ln -sT /home/ubuntu/nltk_data  /usr/share/nltk_data
    
    我很高兴现在一切正常。我们一直在观察新实例上
    top
    系统监视器的输出,该实例比自毁实例稍大,注意到它从未使用超过40%的内存,但在主脚本运行时,CPU长时间处于最大状态。也许这就是杀死较小实例的原因

    当我最初安装stopwords时,它显示在这里: LookupError:

    **********************************************************************
      Resource 'corpora/stopwords' not found.  Please use the NLTK
      Downloader to obtain the resource:  >>> nltk.download()
      Searched in:
        - '/home/ubuntu/nltk_data'
        - '/usr/share/nltk_data'
        - '/usr/local/share/nltk_data'
        - '/usr/lib/nltk_data'
        - '/usr/local/lib/nltk_data'
    **********************************************************************
    
    然而,apache日志显示,除了

    ] [pid 19:tid 13] [client 77..]   Resource 'corpora/stopwords' not found.  Please use the NLTK
    [Sat Jul 08 16:35:19.694759 2017] [wsgi:error] [pid 19437:tid 1..] [client 77..]   Downloader to obtain the resource:  >>> nltk.download()
    [Sat Jul 08 16:35:19.694762 2017] [wsgi:error] [pid 19437:tid 1..] [client 77..]   Searched in:
    [Sat Jul 08 16:35:19.694764 2017] [wsgi:error] [pid 19437:tid 1..] [client 77..]     - '/var/www/nltk_data'
    [Sat Jul 08 16:35:19.694766 2017] [wsgi:error] [pid 19437:tid 1..] [client 77..]     - '/usr/share/nltk_data'
    [Sat Jul 08 16:35:19.694768 2017] [wsgi:error] [pid 19437:tid 1..] [client 77..]     - '/usr/local/share/nltk_data'
    [Sat Jul 08 16:35:19.694770 2017] [wsgi:error] [pid 19437:tid 1..] [client 77..]     - '/usr/lib/nltk_data'
    [Sat Jul 08 16:35:19.694772 2017] [wsgi:error] [pid 19437:tid 1..] [client 77..]     - '/usr/local/lib/nltk_data'
    

    因此,我认为链接而不是复制会更安全,而且使用Apache正在查看的
    /usr/share/
    目录也会更安全,而不是弄乱自己的目录。

    我无法与AWS对话,但没有理由将
    nltk_数据
    置于
    /var/www
    之下。只要通过设置环境变量
    nltk_DATA
    (或者在应用程序中调整
    nltk.DATA.path
    ,请参见)确保您的
    nltk
    可以找到它,如果“import nltk”工作正常(并且您也拥有所有依赖项),那么您链接到的四个问题中只有
    1
    是相关的,并且没有答案。问题3在任何情况下都是不相关的。感谢您的回答并查看张贴的问题。。同时找到了一个解决我的一个问题的方法-没有,不幸的是EC2实例不能在安全模式下启动,恢复过程听起来不太愉快。这次我有一个内存更大的,以减少它再次发生的机会,我会看看什么时候我到了那一点,如何以及如果我解决nltk目录问题。Apache服务于
    /usr/share
    ?你把我弄丢了。但很高兴听到你把它修好了。(您引用的消息来自
    nltk.data
    库,而不是Apache)。是吗?谢谢,我看过了。正如您在Apache日志中所看到的,Apache在5个位置查找,不包括nltk_数据实际所在的1个位置。我不认为Apache想要查看我的主目录更容易,只需将某些东西放在它已经在查看的地方。