我对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)
在多处理环境中表现不可预测?
谢谢!
我如何获得为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) 当我更新我的网站上的代码时,我(自然地)重启我的apache实例,以便更改生效.
不幸的是,每个apache实例所服务的第一个页面非常慢,而它首次将所有内容加载到RAM中(此特定站点为5-7秒).
后续请求只需0.5到1.5秒,所以我想为我的用户消除这种影响.
是否有更好的方法将所有内容加载到RAM而不是执行wget x次(其中x是我的http.conf中ServerLimit定义的apache实例的数量)
编写一个重新启动apache并运行wget 5次的重启脚本对我来说似乎有些不好意思.
谢谢!
我正在使用ubuntu 12.041并通过apt-get安装了apache.
我不知道我正在使用什么版本的mod_wsgi,虽然我谷歌关于它.我发现你可以使用apachctl重新启动你的apache,你会得到类似"Apache/2.2.2(Unix)mod_wsgi/1.0 Python/2.3配置"的东西.但这并没有发生在我身上.
有什么方法可以知道我使用的是什么版本?谢谢.
我想在同一主机中部署两个不同的django应用程序:第一个将对应于url/site1,第二个对应于url/site2.这是我的配置:
LoadModule wsgi_module modules/mod_wsgi.so WSGIScriptAlias /site1 /var/www/py/site1/site1/wsgi.py WSGIScriptAlias /site2 /var/www/py/site2/site2/wsgi.py WSGIPythonPath /var/www/py/site1:/var/www/py/site2 <Directory "/var/www/py/site1/site1"> <Files wsgi.py> Order deny,allow Allow from all </Files> </Directory> <Directory "/var/www/py/site2/site2"> <Files wsgi.py> Order deny,allow Allow from all </Files> </Directory>
这里也是两个应用程序的wsgi.py文件
import os
import sys
path = '/var/www/py/site1'
if path not in sys.path:
sys.path.append(path)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "site1.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
现在,这是我的问题.当我去我的服务器时,让我们说http://app1.sites.gr/site1它有时加载site1,有时它加载site2 !!!! 当我访问http://app1.sites.gr/site2时也是如此 ... Sometiems我得到了site1的欢迎页面,有时我得到了site2的欢迎页面!我正在点击F5并获得不同的欢迎页面.我检查了前几个小时的所有内容,没有发现任何奇怪的事情......
拜托,在我发疯之前告诉我可能出现什么问题......
谢谢 !
我是Python的新手,我仍然无法理解为什么我们需要一个__init__.py文件来导入模块.我已经完成了其他问题和答案,比如这个.
令我困惑的是我可以在没有 导入模块的情况下使用__init__py,所以为什么我需要它呢?
我的例子,
index.py
modules/
hello/
hello.py
HelloWorld.py
Run Code Online (Sandbox Code Playgroud)
index.py,
import os
import sys
root = os.path.dirname(__file__)
sys.path.append(root + "/modules/hello")
# IMPORTS MODULES
from hello import hello
from HelloWorld import HelloWorld
def application(environ, start_response):
results = []
results.append(hello())
helloWorld = HelloWorld()
results.append(helloWorld.sayHello())
output = "<br/>".join(results)
response_body = output
status = '200 OK'
response_headers = [('Content-Type', 'text/html'),
('Content-Length', str(len(response_body)))]
start_response(status, response_headers)
return [response_body]
Run Code Online (Sandbox Code Playgroud)
模块/你好/ hello.py,
def hello():
return 'Hello World from …Run Code Online (Sandbox Code Playgroud) 我在守护进程模式下运行apache mod_wsgi上的wsgi应用程序.我在配置中有这些行
WSGIDaemonProcess app processes=2 threads=3 display-name=%{GROUP}
WSGIProcessGroup app
Run Code Online (Sandbox Code Playgroud)
如何找到进程和线程的最佳组合/调优?
编辑:此链接[在下面的回答中给出]是非常有用的:https: //serverfault.com/questions/145617/apache-2-2-mpm-worker-more-threads-or-more-processes/146382#146382
现在,我的问题是:如果我的服务器为我的需求提供了相当好的性能,我应该减少线程数以提高稳定性/可靠性吗?我可以把它设置为1吗?
我正在使用Python 3.4,并创建了pyvenv,我希望在python进程中激活它.使用virtualenv,我曾经使用过activate_this.py,但这似乎在pyvenv中消失了.
现在有一种简单的方法可以有效地将当前的解释器更改为virtualenv解释器吗?我可能会搞乱PATH(这就是做了什么activate_this.py),但我想要一种更简单,更稳定的方式.
这适用于wsgi.py.
我正在尝试将Django应用程序部署到Elastic Beanstalk.当我访问页面时,它永远不会加载.日志说:
Script timed out before returning headers: wsgi.py
Run Code Online (Sandbox Code Playgroud)
我可以进入服务器并运行manage.py runserver,然后curl 127.0.0.1:8000从另一个终端运行,这将成功返回页面.所以我认为它必须是Apache配置的一个问题,它被设置为Elastic Beanstalk的一部分.
这里有更多的日志:
[pid 15880] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[so:warn] [pid 15880] AH01574: module wsgi_module is already loaded, skipping
[auth_digest:notice] [pid 15880] AH01757: generating secret for digest authentication ...
[lbmethod_heartbeat:notice] [pid 15880] AH02282: No slotmem from mod_heartmonitor
[mpm_prefork:notice] [pid 15880] AH00163: Apache/2.4.9 (Amazon) mod_wsgi/3.4 Python/2.7.5 configured -- resuming normal operations
[core:notice] [pid 15880] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'
[:error] [pid 15881] /opt/python/run/venv/lib/python2.7/site-packages/numpy/oldnumeric/__init__.py:11: …Run Code Online (Sandbox Code Playgroud) mod-wsgi ×10
apache ×6
django ×5
python ×5
wsgi ×4
python-3.x ×2
http ×1
pageload ×1
performance ×1
python-2.7 ×1