Python Flask 两个站点和虚拟环境使用 Paramiko 库错误
Python Flask two sites and Virtual Environment using Paramiko Library Error
我开发了一个 Python Flask 应用程序,我想 运行 在服务器 (RHEL 6) 中另一个 Flask 应用程序 运行ning。我正在使用 httpd (apache) 和 mod_wsgi 来实现这一点。第一个应用程序运行良好,没有任何问题。
我在 /var/www/app2 上安装了我的应用程序,我的目录结构是:
app2
|_ app2
| |_ config.ini
| |_ __init__.py
| |_ static
| |_ templates
| |_ venv
|_ app2.wsgi
/var/www/app2所有文件和目录的权限都是755,我用的是虚拟环境,用pip paramiko和flask安装,拥有这些文件和目录的用户叫"user1"
app2.wsgi的内容是:
import sys
import logging
activate_this = '/var/www/app2/app2/venv/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0,"/var/www/app2/")
from app2 import app as application
apache服务器上的虚拟主机配置为:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName server1
ServerAdmin webmaster@example.org
WSGIDaemonProcess app1 user=user1 group=user1 threads=5
WSGIScriptAlias /app1 /var/www/app1/app1.wsgi
<Directory /var/www/app1/app1/>
Order allow,deny
Allow from all
</Directory>
Alias /app1/static /var/www/app1/app1/static
<Directory /var/www/app1/app1/static/>
Order allow,deny
Allow from all
</Directory>
WSGIDaemonProcess app2 user=sat_user group=sat_user threads=5
WSGIScriptAlias /app2 /var/www/app2/app2.wsgi
<Directory /var/www/app2/app2/>
Order allow,deny
Allow from all
</Directory>
Alias /app2/static /var/www/app2/app2/static
<Directory /var/www/app2/app2/static/>
Order allow,deny
Allow from all
</Directory>
ErrorLog /var/log/httpd/error.log
LogLevel warn
CustomLog /var/log/httpd/access.log combined
</VirtualHost>
我在服务器上重新启动了 httpd 服务,当我尝试使用 http://server1/app2 连接到新应用程序时,我收到一个内部服务器错误,通过查看 apache 的 error.log 我看到了以下:
mod_wsgi (pid=8205): Target WSGI script '/var/www/app2/app2.wsgi' cannot be loaded as Python module.
mod_wsgi (pid=8205): Exception occurred processing WSGI script '/var/www/app2/app2.wsgi'.
Traceback (most recent call last):
File "/var/www/app2/app2.wsgi", line 10, in <module>
from app2 import app as application
File "/var/www/app2/app2/__init__.py", line 2, in <module>
import paramiko
File "/var/www/app2/app2/venv/lib/python2.6/site-packages/paramiko/__init__.py", line 30, in <module>
from paramiko.transport import SecurityOptions, Transport
File "/var/www/app2/app2/venv/lib/python2.6/site-packages/paramiko/transport.py", line 33, in <module>
from cryptography.hazmat.backends import default_backend
File "/var/www/app2/app2/venv/lib/python2.6/site-packages/cryptography/hazmat/backends/__init__.py", line 7, in <module>
import pkg_resources
File "/var/www/app2/app2/venv/lib/python2.6/site-packages/pkg_resources/__init__.py", line 3019, in <module>
@_call_aside
File "/var/www/app2/app2/venv/lib/python2.6/site-packages/pkg_resources/__init__.py", line 3003, in _call_aside
f(*args, **kwargs)
File "/var/www/app2/app2/venv/lib/python2.6/site-packages/pkg_resources/__init__.py", line 3032, in _initialize_master_working_set
working_set = WorkingSet._build_master()
File "/var/www/app2/app2/venv/lib/python2.6/site-packages/pkg_resources/__init__.py", line 646, in _build_master
ws = cls()
File "/var/www/app2/app2/venv/lib/python2.6/site-packages/pkg_resources/__init__.py", line 639, in __init__
self.add_entry(entry)
File "/var/www/app2/app2/venv/lib/python2.6/site-packages/pkg_resources/__init__.py", line 695, in add_entry
for dist in find_distributions(entry, True):
File "/var/www/app2/app2/venv/lib/python2.6/site-packages/pkg_resources/__init__.py", line 2012, in find_on_path
if len(os.listdir(fullpath)) == 0:
OSError: [Errno 13] Permission denied: '/usr/lib64/python2.6/site-packages/tornado-4.4.1.dist-info'
同样,第一个应用程序没有任何问题,如果我使用用户 "user1" 登录并连接到虚拟环境,并且 运行 使用 python __init__.py
的应用程序,我可以在端口 5000 上连接没有问题。
好像paramiko试图访问虚拟环境外的一些库导致错误,我不知道为什么,我尝试禁用SELinux,结果还是一样。
任何帮助将不胜感激!
谢谢
当您使用 WSGIDaemonProcess
指令以在守护进程模式下拥有 WSGI 应用程序 运行 时,您仍然需要在该守护进程中标记 运行 的 WSGI 应用程序团体。您不这样做,因此 WSGI 应用程序仍然 运行 以 Apache 用户的身份以嵌入式模式(Apache 工作进程)运行。
您需要在适当的上下文中使用 WSGIProcessGroup
,或 WSGIScriptAlias
的 process-group
选项将 WSGI 应用程序委托给守护进程组。
在以下位置查看这些指令的文档:
另请查看有关使用 mod_wsgi 设置 Python 虚拟环境的最佳方法的文档。你没有使用推荐的方式。
我开发了一个 Python Flask 应用程序,我想 运行 在服务器 (RHEL 6) 中另一个 Flask 应用程序 运行ning。我正在使用 httpd (apache) 和 mod_wsgi 来实现这一点。第一个应用程序运行良好,没有任何问题。
我在 /var/www/app2 上安装了我的应用程序,我的目录结构是:
app2
|_ app2
| |_ config.ini
| |_ __init__.py
| |_ static
| |_ templates
| |_ venv
|_ app2.wsgi
/var/www/app2所有文件和目录的权限都是755,我用的是虚拟环境,用pip paramiko和flask安装,拥有这些文件和目录的用户叫"user1"
app2.wsgi的内容是:
import sys
import logging
activate_this = '/var/www/app2/app2/venv/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0,"/var/www/app2/")
from app2 import app as application
apache服务器上的虚拟主机配置为:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName server1
ServerAdmin webmaster@example.org
WSGIDaemonProcess app1 user=user1 group=user1 threads=5
WSGIScriptAlias /app1 /var/www/app1/app1.wsgi
<Directory /var/www/app1/app1/>
Order allow,deny
Allow from all
</Directory>
Alias /app1/static /var/www/app1/app1/static
<Directory /var/www/app1/app1/static/>
Order allow,deny
Allow from all
</Directory>
WSGIDaemonProcess app2 user=sat_user group=sat_user threads=5
WSGIScriptAlias /app2 /var/www/app2/app2.wsgi
<Directory /var/www/app2/app2/>
Order allow,deny
Allow from all
</Directory>
Alias /app2/static /var/www/app2/app2/static
<Directory /var/www/app2/app2/static/>
Order allow,deny
Allow from all
</Directory>
ErrorLog /var/log/httpd/error.log
LogLevel warn
CustomLog /var/log/httpd/access.log combined
</VirtualHost>
我在服务器上重新启动了 httpd 服务,当我尝试使用 http://server1/app2 连接到新应用程序时,我收到一个内部服务器错误,通过查看 apache 的 error.log 我看到了以下:
mod_wsgi (pid=8205): Target WSGI script '/var/www/app2/app2.wsgi' cannot be loaded as Python module.
mod_wsgi (pid=8205): Exception occurred processing WSGI script '/var/www/app2/app2.wsgi'.
Traceback (most recent call last):
File "/var/www/app2/app2.wsgi", line 10, in <module>
from app2 import app as application
File "/var/www/app2/app2/__init__.py", line 2, in <module>
import paramiko
File "/var/www/app2/app2/venv/lib/python2.6/site-packages/paramiko/__init__.py", line 30, in <module>
from paramiko.transport import SecurityOptions, Transport
File "/var/www/app2/app2/venv/lib/python2.6/site-packages/paramiko/transport.py", line 33, in <module>
from cryptography.hazmat.backends import default_backend
File "/var/www/app2/app2/venv/lib/python2.6/site-packages/cryptography/hazmat/backends/__init__.py", line 7, in <module>
import pkg_resources
File "/var/www/app2/app2/venv/lib/python2.6/site-packages/pkg_resources/__init__.py", line 3019, in <module>
@_call_aside
File "/var/www/app2/app2/venv/lib/python2.6/site-packages/pkg_resources/__init__.py", line 3003, in _call_aside
f(*args, **kwargs)
File "/var/www/app2/app2/venv/lib/python2.6/site-packages/pkg_resources/__init__.py", line 3032, in _initialize_master_working_set
working_set = WorkingSet._build_master()
File "/var/www/app2/app2/venv/lib/python2.6/site-packages/pkg_resources/__init__.py", line 646, in _build_master
ws = cls()
File "/var/www/app2/app2/venv/lib/python2.6/site-packages/pkg_resources/__init__.py", line 639, in __init__
self.add_entry(entry)
File "/var/www/app2/app2/venv/lib/python2.6/site-packages/pkg_resources/__init__.py", line 695, in add_entry
for dist in find_distributions(entry, True):
File "/var/www/app2/app2/venv/lib/python2.6/site-packages/pkg_resources/__init__.py", line 2012, in find_on_path
if len(os.listdir(fullpath)) == 0:
OSError: [Errno 13] Permission denied: '/usr/lib64/python2.6/site-packages/tornado-4.4.1.dist-info'
同样,第一个应用程序没有任何问题,如果我使用用户 "user1" 登录并连接到虚拟环境,并且 运行 使用 python __init__.py
的应用程序,我可以在端口 5000 上连接没有问题。
好像paramiko试图访问虚拟环境外的一些库导致错误,我不知道为什么,我尝试禁用SELinux,结果还是一样。
任何帮助将不胜感激!
谢谢
当您使用 WSGIDaemonProcess
指令以在守护进程模式下拥有 WSGI 应用程序 运行 时,您仍然需要在该守护进程中标记 运行 的 WSGI 应用程序团体。您不这样做,因此 WSGI 应用程序仍然 运行 以 Apache 用户的身份以嵌入式模式(Apache 工作进程)运行。
您需要在适当的上下文中使用 WSGIProcessGroup
,或 WSGIScriptAlias
的 process-group
选项将 WSGI 应用程序委托给守护进程组。
在以下位置查看这些指令的文档:
另请查看有关使用 mod_wsgi 设置 Python 虚拟环境的最佳方法的文档。你没有使用推荐的方式。