我已经安装了Apache服务器,它正在通过mod_wsgi处理Flask响应.我通过别名注册了WSGI脚本:
[httpd.conf中]
WSGIScriptAlias /service "/mnt/www/wsgi-scripts/service.wsgi"
Run Code Online (Sandbox Code Playgroud)
我在上面的路径中添加了相应的WSGI文件:
[/mnt/www/wsgi-scripts/service.wsgi]
import sys
sys.path.insert(0, "/mnt/www/wsgi-scripts")
from service import application
Run Code Online (Sandbox Code Playgroud)
我有一个简单的测试Flask Python脚本,它提供了服务模块:
[/mnt/www/wsgi-scripts/service.py]
from flask import Flask
app = Flask(__name__)
@app.route('/')
def application(environ, start_response):
status = '200 OK'
output = "Hello World!"
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
@app.route('/upload')
def upload(environ, start_response):
output = "Uploading"
status = '200 OK'
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
if __name__ == '__main__':
app.run()
Run Code Online (Sandbox Code Playgroud)
当我访问我的网站URL [hostname]/service时,它按预期工作,我得到"Hello World!" 背部.问题是我不知道如何使其他路由工作,如上例中的"上传".这在独立的Flask中工作正常但在mod_wsgi下我很难过.我唯一可以想象的是在httpd.conf中为我想要的每个端点注册一个单独的WSGI脚本别名,但这会消除Flask的奇特路由支持.有没有办法让这项工作?
在我尝试让我的烧瓶应用程序在Apache上运行后反复失败后,我mod_wsgi决定尝试运行hello world示例.这是我的 -
目录结构(我将apache默认更改/var/www为~/public_html)
- public_html
- wsgi-scripts
- test_wsgi.wsgi
- test_wsgi
- test_wsgi.wsgi
Run Code Online (Sandbox Code Playgroud)
test_wsgi.wsgi文件
def application(environ, start_response):
status = '200 OK'
output = 'Hello World!'
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
Run Code Online (Sandbox Code Playgroud)
VirtualHost配置文件(称为testwsgi) - 驻留在 /etc/apache2/sites-enabled/
<VirtualHost *:80>
DocumentRoot ~/public_html/test_wsgi
<Directory ~/public_html/test_wsgi>
Order allow,deny
Allow from all
</Directory>
WSGIScriptAlias /wsgi ~/public_html/wsgi-scripts/test_wsgi.wsgi
<Directory ~/public_html/wsgi-scripts>
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
当我尝试localhost/wsgi使用浏览器时,我收到404 Not Found错误.我究竟做错了什么?这是我第一次尝试在生产服务器上部署应用程序.到目前为止,我采用了简单的方法来使用Google App Engine.我无法继续部署我的烧瓶应用程序,直到它启动并运行.非常感谢!
我在CentOS 6.5上使用Apache 2.2.15.我正在尝试使用mod_wsgi设置Django应用程序.我正在使用虚拟环境,并且配置了mod_wsgi --with-python=/path/to/virtualenv/bin/python3.4.
我已将此添加到我的httpd.conf:
WSGIPythonPath /srv/myproject:/path/to/virtualenv/lib/python3.4/site-packages
WSGIPythonHome /path/to/virtualenv
<VirtualHost *:80>
WSGIScriptAlias / /srv/myproject/myproject/wsgi.py
...
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
在wsgi.py,我补充说
sys.path.insert(1, "/path/to/virtualenv/lib/python3.4/site-packages")
Run Code Online (Sandbox Code Playgroud)
问题是,当我尝试在浏览器中打开应用程序时,它会无限期地加载.这是Apache错误日志:
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'
[Mon Jun 30 17:37:28 2014] [notice] child pid 19370 exit signal Aborted (6)
[Mon Jun 30 17:37:28 2014] [notice] child pid 19371 exit signal Aborted (6)
...
[Mon Jun 30 17:37:28 2014] [notice] child pid 19377 exit signal Aborted (6) …Run Code Online (Sandbox Code Playgroud) 这一定是一个非常简单的问题,但我似乎无法弄明白.
我正在使用apache + mod_wsgi来托管我的python应用程序,并且我希望以其中一个表单提交帖子内容 - 但是,环境值和sys.stdin都不包含任何此类数据.介意给我一个快速的手?
编辑:已经尝试过:
我正在使用Ubuntu 10.04.
我在/home/wong2/Code/python/django2/named 下创建了一个django项目,atest
并setting.wsgi在同一目录下创建了一个wsgi文件.
这里的内容是setting.wsgi:
import os
import sys
path = '/home/wong2/Code/python/django2'
if path not in sys.path:
sys.path.append(path)
os.environ["DJANGO_SETTINGS_MODULE"] = "atest.settings"
from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()
Run Code Online (Sandbox Code Playgroud)
这是我添加到我的httpd.conf中的内容:
<VirtualHost *:80>
ServerName localhost
WSGIScriptAlias / /home/wong2/Code/python/django2/setting.wsgi
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Allow from all
</Directory>
<Directory "/home/wong2/Code/python/django2/atest">
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
问题是,当我访问http:// localhost时,它说
被禁止
您无权访问此服务器上的/.
非常感谢.
我的第一篇文章,我是Python和Apache的新手,所以请放轻松我.我在conda环境中有一个Python Web应用程序,使用Flask可以很好地提供内容.现在我需要用Apache而不是Flask来提供所有服务.我可以让Apache使用mod_wsgi来运行Python,但只能使用virtualenv.我尝试使用Anaconda安装virtualenv,但我收到警告说这样的设置不受支持且不推荐.所以我的问题是:
如何设置Apache以在conda环境中运行我的应用程序?
这里有一个关于使用虚拟环境的部分,它说我需要在我的wsgi文件中输入一行,显示在哪里可以找到activate_this.py.virtualenv虚拟环境有activate_this.py,但conda环境没有.似乎没有激活虚拟环境的正确指令,我只是在浏览器中收到错误500并在我的httpd error_log中导入"导入错误:没有名为flask的模块".
这是在我的httpd.conf文件中:
<VirtualHost *:80>
DocumentRoot /var/www
WSGIScriptAlias / var/www/tsm.wsgi
<Directory /var/www/tsm>
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
这是tsm.wsgi:
import sys
import site
site.addsitedir('~/.conda/envs/tsm/lib/python2.7/site-packages')
sys.path.insert(0, '/var/www/tsm/server/time_series_machine')
sys.stdout = sys.stderr
from app import app as application
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?感谢您的任何帮助,您可以提供.
我在Webfaction上托管的生产服务器上的Django应用程序工作正常,直到我在将更改推送到settings.py文件后尝试重新启动它.我跑了
apache2/bin/restart
Run Code Online (Sandbox Code Playgroud)
照常.然后我尝试在浏览器上访问我的应用程序,然后我得到了504网关超时.我查看了mod_wsgi日志并看到了这个:
[Thu Nov 03 23:46:53.605625 2016] [wsgi:error] [pid 8027:tid 139641332168448]
[client 127.0.0.1:34570] Timeout when reading response headers from daemon
process 'myapp' : /home/<me>/webapps/<myapp>/<ProjectName>/<myapp>/wsgi.py
Run Code Online (Sandbox Code Playgroud)
这是什么意思,我该如何解决?我在settings.py文件中唯一更改的是移动一些变量名称.我仍然可以成功地与应用程序进行交互
python2.7 manage.py shell
Run Code Online (Sandbox Code Playgroud)
但我不能在网上找到它,也不能使用API.
编辑:这是我的wsgi.py文件:
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "<myapp>.settings")
application = get_wsgi_application()
Run Code Online (Sandbox Code Playgroud) 在发布之前,我已经在线阅读了很多资源,包括mod_wsgi wiki,但我对Apache进程/线程与mod_wsgi的交互方式感到困惑.
这是我目前的理解:可以将Apache配置为运行,使得一个或多个子进程可以处理传入请求,并且可以将这些子进程中的每一个配置为依次使用一个或多个线程来为请求提供服务.在那之后,事情开始变得模糊.我的怀疑是:
我正在尝试使用mod_wsgi查看Django中的Authorization标头.我读到Apache默认保留了Authorization标头,我在我的Apache VirtualHost块中放了<< WSGIPassAuthorization On >>...缥缈.
我怎么知道把它放在哪里?
有没有办法让mod_wsgi在每次加载时重新加载所有模块(可能在特定目录中)?
在处理代码时,每次更改某些内容时重启apache都会非常烦人.到目前为止,我发现的唯一选择是放在modname = reload(modname)每个导入下面..但这也很烦人,因为这意味着我将不得不在以后删除它们.