使用mod_wsgi

时间:2016-05-17 00:43:40

标签: python apache flask mod-wsgi

我正在尝试使用apache2服务器和mod_wsgi在ec2实例上设置一个简单的烧瓶应用程序。似乎有不成比例的diffculty配置正确的python路径供mod_wsgi使用。

我已在下面放置了代码段。

我得到apache2日志的错误是:

追踪(最近一次通话):   文件" /var/www/html/flaskapp_tut/flaskapp_tut.wsgi" ;,第7行,在     来自flaskapp_tut导入应用程序作为应用程序 ]文件" /var/www/html/flaskapp_tut/flaskapp_tut.py" ;,第1行,在 来自flask进口烧瓶  ImportError:没有名为flask的模块

flask肯定是通过anaconda安装安装的,但显然mod_wsgi正在使用错误的python版本。

日志文件说它使用: apache / 2.4.7(Ubuntu)mod_wsgi / 3.4配置Python / 2.7.6 - 恢复正常操作

但是我使用的是python 3.x,当我使用命令&#34时,anaconda安装显示;#py;"即/ home / ubuntu / anaconda3 / bin / python

mod_wsgi文档说你可以配置python路径: WSGIPythonHome / home / ubuntu / anaconda3 / bin / python,但是我不知道在哪里放置这个配置。

非常感谢任何帮助。根据我作为指南使用的步骤,这看起来好像应该比它更直接。 http://www.datasciencebytes.com/bytes/2015/02/24/running-a-flask-app-on-aws-ec2/

flaskapp_tut.wsgi

#!/home/ubuntu/anaconda3/bin/python

import sys
sys.path.insert(0, '/var/www/html/flaskapp_tut')
sys.path.append('/home/ubuntu/anaconda3/bin/python')

from flaskapp_tut import app as application

flaskapp_tut.py

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
   return 'Hello from Flask!'

if __name__ == '__main__':
  app.run()

000-default.conf文件中的设置

    DocumentRoot /var/www/html

    WSGIDaemonProcess flaskapp_tut threads=5
    WSGIScriptAlias / /var/www/html/flaskapp_tut/flaskapp_tut.wsgi

    <Directory flaskapp_tut>
        WSGIProcessGroup flaskapp_tut
        WSGIApplicationGroup %{GLOBAL}
        Order deny,allow
        Allow from all
    </Directory>

4 个答案:

答案 0 :(得分:2)

mod_wsgi/3.4 Python/2.7.6

这是一个相当古老的mod_wsgi,这告诉你的是你安装的mod_wsgi是针对Python / 2.7.6编译的。

我建议你获得一个当前的mod_wsgi,并确保它是针对python-3.x编译的。

另外,(我不认为这会解决你的问题,但值得一提)你可以指定一个python-path作为WSGIDaemonProcess的参数。这可能有助于您至少看到正确的东西(在某些情况下可能比在代码中放置sys.path.append()更干净)。见这里:http://modwsgi.readthedocs.io/en/develop/configuration-directives/WSGIDaemonProcess.html

答案 1 :(得分:0)

我最近通过从源代码构建来安装mod_wsgi

mod_wsgi Quick Configuration Guide
mod_wsgi Configuring The Source Code

我想使用Python 3.7,所以(从源代码)安装了它,而我的Python3.7可执行文件(在Ubuntu 18.04上)的位置是:

/usr/local/bin/python3.7

可以通过以下方式找到此位置:

which python3.7

在配置mod_wsgi的过程中,这正是我的确切操作,以确保我的mod_wsgi是针对已安装的Python3.7进行编译的。当我最初仅运行./configure时,mod_wsgi将默认使用Python2.7可执行文件。

./configure --with-python=/usr/local/bin/python3.7

答案 2 :(得分:0)

它以这种方式对我有效(Debian 9):

首先,安装为python3编译的mod-wsgi

sudo apt-get install libapache2-mod-wsgi-py3 

第二,添加python虚拟环境。库wsgi脚本中的路径:(start-jobs-backend.wsgi)。还添加function application

 #!/usr/bin/python3
 import sys
 import os

 sys.path.insert(0, '/path/to/backend')
 sys.path.insert(0, '/path/to/venv/lib/python3.7/site-packages')

 def application(environ, start_response):
     status = '200 OK'
     output = b'Hello World! \n'
     response_headers = [('Content-type', 'text/plain'),
                ('Content-Length', str(len(output)))]


     start_response(status, response_headers)
     return [output]

 from yourproject import app as application

第三,apache conf

<VirtualHost>
    WSGIDaemonProcess backend user=www-data group=www-data threads=5 
    WSGIScriptAlias / /path/to/backend/start-jobs-backend.wsgi

    DocumentRoot  /path/to/backend
    <Files start-jobs-backend.wsgi>
        Require all granted
    </Files>
    <Directory /path/to/backend>
        AddHandler wsgi-script .wsgi
        WSGIProcessGroup backend
        WSGIApplicationGroup %{GLOBAL}
        WSGIScriptReloading On
        Options Indexes FollowSymLinks MultiViews ExecCGI
        Require all granted
    </Directory>
</VirtualHost>

我花了一个星期的时间为我的第一个带有wsgi部署选项的烧瓶应用程序进行了开发,希望它可以为您提供帮助。

答案 3 :(得分:0)

如果您使用虚拟环境,强烈建议使用以下格式:

$openssl req -newkey rsa:2048  -keyout privkey.pem -x509 -days 36500 -out certificate.pem