将Web服务器迁移到较新的操作系统和Python版本无法使Pylons Web应用程序运行

时间:2016-01-29 07:26:25

标签: python-2.7 virtualenv python-2.6 pylons

我们将托管的Web服务器从旧的centos 5.5,apache 2.2,python 2.5或2.6迁移到最新版本的centos,apache 2.4,python 2.7。我们的主要Web应用程序是使用python 2.6编写的pylons。并位于/ home /下。托管公司没有移动目录,所以我们tar并将它们移动过来。击败tar并运行.sh以启动贴纸和Web应用程序。现在得到这些错误,我不知道从哪里开始。

Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
'import site' failed; use -v for traceback
Traceback (most recent call last):
  File "/home/webapp/pylons-env/bin/paster", line 5, in <module>
    from pkg_resources import load_entry_point
ImportError: No module named pkg_resources

一些研究建议重新安装python但是服务器上已经有2.7.x了,应用程序编写的已安装版本来自tar的子目录。

shell脚本如下所示,并且还会更新出现的错误的全文:

#!/bin/bash
source /home/webapp/pylons-env/bin/activate
cd /home/webapp/app
kill `cat paster.pid`
paster serve --daemon --log-file=prod-mt.log --pid-file=paster.pid prod-mt.ini

#sender="company@www.domain.com"
#receiver="dev@gmail.com"
#body="Thanks"
#echo $body | mail $receiver -s "App Restarted" 

由于Audrius&#39;我已经取得了一些进展。帖子。有些事情需要注意:没有requirements.txt,所以我安装了Pylons并安装在setup.py上。当我尝试启动应用程序时,我必须指定/ home / webapp / pylons-env / bin / paster,因为如果我只是做贴纸服务,系统/ bin /中现在有一个paster。我确实删除了/ home / webapp /中的pylons-env并重新安装。如果我在上面运行.sh脚本,我就会得到一个&#34;进入守护进程模式&#34;消息,但贴纸过程永远不会启动(我已更新它以在/ home / webapp中指定贴纸)。我以为我会尝试在文档中做标准:

/home/webapp/pylons-env/bin/paster serve /home/webapp/app/prod-mt.ini

我明白了:

[root@58ck-6gpy me]# /home/webapp/pylons-env/bin/paster serve /home/webapp/app/prod-mt.ini
Traceback (most recent call last):
  File "/home/webapp/pylons-env/bin/paster", line 9, in <module>
load_entry_point('PasteScript==2.0.2', 'console_scripts', 'paster')()
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/script/command.py", line 102, in run
invoke(command, command_name, options, args[1:])
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/script/command.py", line 141, in invoke
exit_code = runner.run(args)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/script/command.py", line 236, in run
result = self.command()
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/script/serve.py", line 284, in command
relative_to=base, global_conf=vars)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/script/serve.py", line 329, in loadapp
**kw)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 247, in loadapp
return loadobj(APP, uri, name=name, **kw)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 271, in loadobj
global_conf=global_conf)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 296, in loadcontext
global_conf=global_conf)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 320, in _loadconfig
return loader.get_context(object_type, name, global_conf)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 454, in get_context
section)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 476, in _context_from_use
object_type, name=use, global_conf=global_conf)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 406, in get_context
global_conf=global_conf)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 296, in loadcontext
global_conf=global_conf)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 320, in _loadconfig
return loader.get_context(object_type, name, global_conf)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 454, in get_context
section)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 476, in _context_from_use
object_type, name=use, global_conf=global_conf)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 406, in get_context
global_conf=global_conf)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 296, in loadcontext
global_conf=global_conf)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 328, in _loadegg
return loader.get_context(object_type, name, global_conf)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 620, in get_context
object_type, name=name)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 646, in find_egg_entry_point
possible.append((entry.load(), protocol, entry.name))
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/pkg_resources.py", line 2260, in load
entry = __import__(self.module_name, globals(),globals(), ['__name__'])
  File "/home/webapp/app/client/config/middleware.py", line 8, in <module>
from pylons.error import error_template
ImportError: cannot import name error_template

Haven没有改变任何东西,但我得到了这个。与上面相同的代码,最后几行文件行替换为:

  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 640, in find_egg_entry_point
pkg_resources.require(self.spec)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/pkg_resources.py", line 728, in require
needed = self.resolve(parse_requirements(requirements))
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/pkg_resources.py", line 626, in resolve
raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: appClient

取得进展,但paster进程无法在新服务器上启动。这是运行上面的.sh时的输出:

cat: paster.pid: No such file or directory
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
Entering daemon mode

然后我top并且没有看到正在运行的进程。

2 个答案:

答案 0 :(得分:1)

问题似乎是与webapp一起提取了一个旧的Python 虚拟环境/home/webapp/pylons-env),它需要旧版服务器的Python版本。为了解决这个问题,您需要重新创建虚拟环境并安装您的webapp所需的软件包。

首先,您需要在服务器中安装virtualenv(如果您还没有安装)。我不太了解CentOS,所以包名可能有所不同:

sudo yum install python-virtualenv

然后删除旧的虚拟环境并创建新的虚拟环境:

rm -rf /home/webapp/pylons-env
virtualenv /home/webapp/pylons-env

我不知道你的webapp的所有依赖关系是如何安装在旧的virtualenv中的,但是现在常见的方法是使用pip工具,它包含在新创建的virtualenv中。如果您在webapp旁边看到requirements.txt文件(保留所有依赖项列表的常用位置),请尝试运行:

/home/webapp/pylons-env/bin/pip install -r requirements.txt

否则,您可以自己在命令行中输入依赖项的名称(至少这将是Pylons,可能是其他一些):

/home/webapp/pylons-env/bin/pip install Pylons

如果您的网络应用程序在setup.py文件中包含依赖项,则可以执行此操作(请注意末尾的点):

# Assuming, that setup.py is located at /home/webapp/app:
cd /home/webapp/app
/home/webapp/pylons-env/bin/pip install .

这会将webapp及其依赖项安装到virtualenv。

这些是将软件包安装到virtualenv中的常用方法,你需要弄清楚哪一个最适合你的项目。

并且不要担心这些方法中的任何一个会破坏某些东西,因为虚拟环境在设计上与系统范围的Python安装隔离,并且重新创建起来也很便宜。

答案 1 :(得分:0)

非常感谢Audrius,得到了一切。必须重新创建virtualenv,运行应用程序的setup.py,最后必须手动完成并安装每个依赖项。在bash脚本中,它创建了一个日志文件,因此我只运行脚本并读取日志文件以查看生成的错误。当我一次解决这些问题时 - 在谷歌和Stack Overflow的帮助下 - 它最终达到了贴纸加载应用程序的程度。到目前为止运行良好。