我在主目录中创建了Django项目,因此它位于主目录中.
建立
Django Verison : 1.5.1
Python Version : 2.7.5
mod_wsgi Version: 3.4
Home Directory : /home/aettool
Run Code Online (Sandbox Code Playgroud)
的内容 /home/aettool/aet/apache/django.wsgi
import os
import sys
os.environ['DJANGO_SETTINGS_MODULE'] = 'aet.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
Run Code Online (Sandbox Code Playgroud)
的意见 httpd.conf
WSGIScriptAlias / /home/aettool/aet/apache/django.wsgi
<Directory /home/aettool/aet/apache>
Order deny,allow
Allow from all
</Directory>
Run Code Online (Sandbox Code Playgroud)
错误 error_log
[Sun Jul 21 02:01:30.923364 2013] [authz_core:error] [pid 21540:tid 1193011520] [client 10.20.17.184:51340] AH01630: client denied by server configuration: /home/aettool/aet/apache/django.wsgi
Run Code Online (Sandbox Code Playgroud)
的内容 urls.py
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('', …Run Code Online (Sandbox Code Playgroud) 免责声明:我知道SO上有几个类似的问题.我想我读的大多数,如果不是全部,但没有找到我真实问题的答案(见后文).我也知道使用celery或其他异步队列系统是实现长时间运行任务的最佳方法 - 或者至少使用cron管理的脚本.还有关于进程和线程的mod_wsgi文档,但我不确定我是否正确.
问题是:
使用其中列出的解决方案涉及哪些确切的风险/问题?它们中的任何一个都适用于长时间运行的任务(好吧,即使芹菜更适合)?我的问题更多是关于理解wsgi和python/django的内部结构,而不是找到最好的整体解决方案.阻塞线程,不安全访问变量,僵尸处理等问题.
让我们说:
mod_wsgi conf:
WSGIDaemonProcess NAME user=www-data group=www-data threads=25
WSGIScriptAlias / /path/to/wsgi.py
WSGIProcessGroup %{ENV:VHOST}
Run Code Online (Sandbox Code Playgroud)
我认为这些是可用于启动单独进程(在广义上意味着)的选项,以便在快速返回对用户的响应的同时执行长时间运行的任务:
import os
if os.fork()==0:
long_process()
else:
return HttpResponse()
Run Code Online (Sandbox Code Playgroud)
import subprocess
p = subprocess.Popen([sys.executable, '/path/to/script.py'],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
Run Code Online (Sandbox Code Playgroud)
(脚本可能是manage.py命令)
import threading
t = threading.Thread(target=long_process,
args=args,
kwargs=kwargs)
t.setDaemon(True)
t.start()
return HttpResponse()
Run Code Online (Sandbox Code Playgroud)
NB.
由于Global Interpreter Lock,在CPython中只有一个线程可以同时执行Python代码(即使某些面向性能的库可能会克服此限制).如果您希望应用程序更好地使用多核计算机的计算资源,建议您使用多处理.但是,如果要同时运行多个I/O绑定任务,则线程仍然是一个合适的模型.
主线程将快速返回(httpresponse).产生的长线程是否会阻止wsgi为其他请求做其他事情?!
from multiprocessing import Process
p = Process(target=_bulk_action,args=(action,objs))
p.start()
return HttpResponse()
Run Code Online (Sandbox Code Playgroud)
这应该解决线程并发问题,不应该吗?
所以这些是我能想到的选择.什么会起作用,什么不起作用,为什么?
我将我的第一个Django项目从DjangoEurope转移到Webfaction,这开始出现一个看起来像内存泄漏的问题.随着每个请求服务器进程的内存使用量增加约500kb.它永远不会失败.这种情况一直持续到Webfaction因使用太多内存而导致死亡.
当我在浏览器中刷新Django的管理界面时,我可以清楚地看到这一点(虽然每个页面都会发生这种情况,不仅仅是管理界面 - 我虽然管理界面会是一个不错的测试用例,因为那里没有我的代码) .随着每个浏览器重新加载,内存使用量增加几百千字节.
我使用Webfaction建议的命令测试内存:
ps -u publica -o rss,etime,pid,command
Run Code Online (Sandbox Code Playgroud)
更多关于我的设置:
DEBUG 调成 False编辑:我创建了一个空的Django项目 - 默认的Django配置django.contrib.admin和新的空数据库(同时使用mysql和postgresql).我开始在浏览器中重新加载Django管理员并观察内存使用情况.起初我看到了问题 - 每次重新加载后内存使用量都会增加.但随后它稳定下来并停止增长.这与我的原始项目在Django Europe上的表现一致.不幸的是,在Webfaction上它似乎永远不会稳定(或者至少不在我帐户可用的内存限制内).有什么建议?
我这样配置了我的开发服务器:
Ubuntu,Apache,mod_wsgi,Python 2.6
我从连接到它的另一台计算机上工作.
除非我重新启动Apache,否则大多数情况下更改不会影响应用程序.在某些情况下,更改会在不重新启动Web服务器的情况下生效,但在让我们说3或4页加载后,应用程序的行为可能与更改之前的行为相似.
到现在为止我只是重新加载每次apache,因为我在这里有我的开发服务器,但是HELL过了一段时间后非常讨厌.我怎么能避免这个?
我无法使用开发服务器,因为我需要一个尽可能接近生产环境的环境.
谢谢
在我写的烧瓶应用程序中,我使用了可以使用环境变量配置的外部库.注意:我自己写了这个外部库.所以我可以在必要时进行更改.从命令行运行时,运行flask服务器:
# env = python virtual environment
ENV_VAR=foo ./env/bin/python myapp/webui.py
Run Code Online (Sandbox Code Playgroud)
这一切都如预期的那样.但是在将它部署到apache后,使用SetEnv它不再起作用了.事实上,打印出os.environ到stderr(所以它显示了在Apache日志显示,该wsgi过程似乎是在一个非常不同的环境(一个,os.environ['PWD']好像是这样了.其实,它指向我的发展的文件夹.
为了帮助确定问题,以下是作为独立的hello-world应用程序的应用程序的相关部分.错误输出和观察结果都在帖子的最后.
Python应用程序:
.
??? myapp.ini
??? setup.py
??? testenv
??? __init__.py
??? model
? ??? __init__.py
??? webui.py
Run Code Online (Sandbox Code Playgroud)
Apache文件夹(/var/www/michel/testenv):
.
??? env
? ??? [...]
??? logs
? ??? access.log
? ??? error.log
??? wsgi
??? app.wsgi
Run Code Online (Sandbox Code Playgroud)
[app]
somevar=somevalue
Run Code Online (Sandbox Code Playgroud)
from setuptools import setup, find_packages
setup(
name="testenv",
version='1.0dev1',
description="A …Run Code Online (Sandbox Code Playgroud) 我想限制登录用户只有一个活动会话,即如果用户使用新的sessionid登录,则应终止旧会话.我已经在SO上找到了很多帮助: 这里和这里
我实现了中间件解决方案,还有一些额外的检查......
class OnlyOneUserMiddleware(object):
"""
Middleware to ensure that a logged-in user only has one session active.
Will kick out any previous session.
"""
def process_request(self, request):
if request.user.is_authenticated():
try:
cur_session_key = request.user.get_profile().session_key
if cur_session_key and cur_session_key != request.session.session_key:
# Default handling... kick the old session...
Session.objects.get(session_key=cur_session_key).delete()
if not cur_session_key or cur_session_key != request.session.session_key:
p = request.user.get_profile()
p.session_key = request.session.session_key
p.save()
except ObjectDoesNotExist:
pass
Run Code Online (Sandbox Code Playgroud)
到目前为止,这么好......在Django开发服务器(manage.py runserver)上一切正常,它踢旧会话......
...但是当使用Apache(使用mod_wsgi)时,它不起作用!
我试图找到关于此的任何信息,但到目前为止没有运气......
我发现的最接近的是这个,但它是一种"相反"的问题......
任何帮助将非常感激.
编辑:我在删除Session之前添加了一个调试打印...这是Apache的error.log的一个片段:
[Fri Jan 20 09:56:50 …Run Code Online (Sandbox Code Playgroud) 我对mod_wsgi的多重管理功能以及将在具有多处理能力的WSGI服务器上执行的WSGI应用程序的一般设计感到困惑.
请考虑以下指令:
WSGIDaemonProcess example processes=5 threads=1
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,mod_wsgi将生成5个Python(例如CPython)进程,并且这些进程中的任何一个都可以接收来自用户的请求.
文件说:
共享数据需要对所有应用程序实例可见,无论它们执行哪个子进程,并且一个应用程序对数据所做的更改都可以立即供另一个应用程序使用,包括在另一个子进程中执行的任何子进程,外部数据存储,如必须使用数据库或共享内存.普通Python模块中的全局变量不能用于此目的.
但是在这种情况下,当想要确定应用程序在任何WSGI条件(包括多处理条件)中运行时,它会变得非常沉重.
例如,一个包含当前连接用户数量的简单变量 - 它应该是从/向memcached进行过程安全读/写,还是DB或(如果有这样的标准库机制可用)共享记忆?
并且代码会像
counter = 0
@app.route('/login')
def login():
...
counter += 1
...
@app.route('/logout')
def logout():
...
counter -= 1
...
@app.route('/show_users_count')
def show_users_count():
return counter
Run Code Online (Sandbox Code Playgroud)
在多处理环境中表现不可预测?
谢谢!
我正在尝试重建mod_wsgi并遇到这个问题?有谁知道这里发生了什么?
/tmp/mod_wsgi-3.4# ls
config.log LICENCE posix-ap2X.mk.in win32-ap22py31.mk
config.status Makefile.in README
configure mod_wsgi.c win32-ap22py26.mk
configure.ac posix-ap1X.mk.in win32-ap22py27.mk
root@vps-547073:/tmp/mod_wsgi-3.4# ./configure
checking for apxs2... no
checking for apxs... no
checking Apache version... ./configure: line 1704: apxs: command not found
./configure: line 1704: apxs: command not found
./configure: line 1705: apxs: command not found
./configure: line 1708: /: Is a directory
checking for python... /usr/bin/python
./configure: line 1877: apxs: command not found
configure: creating ./config.status
config.status: error: cannot find input file: Makefile.in
Run Code Online (Sandbox Code Playgroud) 我想部署一个django站点(它是github上的开源edx代码).
我面临着使用之间的选择
我使用了mod_wsgi的Apache,它很酷,但我对第二个选项没有经验.
在速度和某种程度上易用性方面,哪一种更好?
注意:我需要在端口80和81上运行两个不同的django站点,并从两个不同的子域访问它们.
我如何获得为Python 3.6.1编译的Apache2的mod_wsgi?
(或任何未来的Python版本)
我正在使用带有Django 1.11的Python 3.6.1虚拟环境,并且Everything正在根据Apache错误日志工作,除了Apache 2.4的mod_wsgi是为Python/3.5.1 +编译的并使用Python/3.5.2所以我的Python 3.6 .1代码失败,因为我使用的是3.5.2中没有的新功能
设置我的系统所涉及的所有其他配置和安装似乎都很好(在守护进程模式下运行)虽然mod_wsgi似乎没有使用我的Python 3.6.1虚拟环境(尽管它试图将它用于Django根据到错误日志)...
我用过: sudo apt-get install libapache2-mod-wsgi-py3为Apache 2.4安装mod_wsgi
我用: ./configure --with-python=/usr/local/bin/python3.6和make同make install为Python的3.6安装mod_wsgi的
我一定做错了 - 请纠正我!
这是我的Apache错误日志(清理了一下) - 是的我知道它在f""字符串行上失败了(python 3.6功能不在3.5中)
[wsgi:warn] mod_wsgi: Compiled for Python/3.5.1+.
[wsgi:warn] mod_wsgi: Runtime using Python/3.5.2.
[wsgi:warn] AH00489: Apache/2.4.18 (Ubuntu) mod_wsgi/4.3.0 Python/3.5.2 configured -- resuming normal operations
[wsgi:warn] AH00094: Command line: '/usr/sbin/apache2'
[wsgi:error] mod_wsgi (pid=12963): Target WSGI script '/home/jamin/www/dev.tir.com/tir/tir/wsgi.py' cannot be loaded as Python module.
[wsgi:error] mod_wsgi (pid=12963): Exception occurred processing …Run Code Online (Sandbox Code Playgroud) mod-wsgi ×10
django ×7
python ×7
apache ×4
apache2 ×2
asynchronous ×1
django-wsgi ×1
flask ×1
gunicorn ×1
memory-leaks ×1
nginx ×1
python-3.x ×1
wsgi ×1