将 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 的帮助下——它最终达到了粘贴者加载应用程序的地步。 运行 目前还不错。
我们将我们的托管网络服务器从旧的 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 的帮助下——它最终达到了粘贴者加载应用程序的地步。 运行 目前还不错。