将 Web 服务器迁移到较新的 OS 和 Python 版本无法将 Pylons Web 应用程序升级到 运行

Migrated web server to newer OS and Python version cant get Pylons web app to run

我们将我们的托管网络服务器从旧的 centos 5.5、apache 2.2、python 2.5 或 2.6 迁移到最新版本的 centos、apache 2.4、python 2.7。我们的主要 Web 应用程序是用 python 2.6 编写的。位于 /home/ 下。托管公司没有移动目录,所以我们 tar 将它们移动了。将 tar 和 运行 .sh 解压缩为 start 贴纸和网络应用程序。现在得到这些错误,我不确定在哪里 start.

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 的 post,我取得了一些进步。需要注意的一些事项:没有 requirements.txt,所以我安装了 Pylons 并安装在 setup.py 上。当我尝试 start 应用程序时,我必须指定 /home/webapp/pylons-env/bin/paster,因为现在系统 /bin/ 中有一个贴纸,如果我只是做一个贴纸服务,它会使用它。我确实删除了 /home/webapp/ 中的 pylons-env 并重新安装。如果我 运行 上面的 .sh 脚本我只收到一条 "Entering Daemon Mode" 消息,但是粘贴过程永远不会 starts (我已经更新它以在 /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

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

  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 进程不会在新服务器上运行 tart。这是 运行 上面的 .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,没看到进程运行ning.

问题似乎是连同 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 中.如果您看到 requirements.txt 文件(通常用于保存所有依赖项列表的位置)位于您的 Web 应用程序旁边,请尝试 运行:

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

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

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

如果你的 webapp 在 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 安装隔离,并且重新创建也很便宜。

在很大程度上要感谢 Audrius,让一切都搞清楚了。不得不为应用程序重新创建 virtualenv,运行 setup.py,最后不得不手动安装每个依赖项。在 bash 脚本中,它创建了一个日志文件,所以我只是 运行 脚本并读取日志文件以查看生成了哪些错误。当我一次解决这些问题时——在 Google 和 Stack Overflow 的帮助下——它最终达到了粘贴者加载应用程序的地步。 运行 目前还不错。