首页 > 代码库 > 【uWSGI】实战之Django配置经验

【uWSGI】实战之Django配置经验

  • uWSGI 是应用服务器,实现了uwsgi, wsgi等协议。能够执行wsgi 应用
  • uwsgi 是协议名

Django配置

以下是自己常常常使用的一个配置模板。基于1.9以上的版本号使用的。 主要基于django应用

[uwsgi]
djangoproject=/home/www/portal

chdir=%(djangoproject)
#virtualenv = /home/robc/.virtualenvs/workrave-cloud-server/
#pythonpath = %(django_dir)

wsgi-file=wsgi.py
module = wsgi
env=DJANGO_SETTINGS_MODULE=settings
daemonize=%(djangoproject)/logs/uwsgi.log
pidfile=%(djangoproject)/uwsgi.pid
print=%(daemonize)

#you can use http mode test
#socket=0.0.0.0:9001
http=0.0.0.0:8000
#user unix sock
#socket = %(deploy_dir)/run/uwsgi-%(project).sock
#chmod-socket = 777

stats=/tmp/myapp.status
memory-report=true
log-format = %(addr) - %(user) [%(ltime)] "%(method) %(uri) %(proto)" %(status) %(size) "%(referer)" "%(uagent)"
master=True
processes=8
vacuum=True
max-requests=8000
eable-threads=True
buffer-size=65535
harakiri=30

#listen queue number,you can see /proc/sys/net/core/somaxconn in linux
listen=1024

#user and group
#uid = 
#gid = 
  • 设置权限须要加入

uid =
gid =

来进行权限控制

  • uWSGI能够使用socket 。http。或者unix socket,主要取决于应用场景
  • 不想打印请求的log 能够配置 disable-logging = true, 这样仅仅会打印启动log了
  • 在某些情况下python C拓展在多个解释器协作中并不好使 single-interpreter = true 来解决
  • harakiri=30 django文档中也推荐了这个选项,30代表30秒。主要是保护进程。防止某些危急的request拖死整个进程,详细原理參考[doc](

http://uwsgi-docs.readthedocs.org/en/latest/FAQ.html#what-is-harakiri-mode) 假设应用有对外交互的接口。并且响应很慢的话,最好把值调大点,否则会常常重新启动。请求正常响应概率减少。

  • max-requests 当达到设定值之后会优雅的重载一个process
  • 配置文件里有些是属于uwsgi的魔法变量
    • %d 配置文件所在文件夹的绝对路径,能够依据这个省去许多路径的硬编码
    • %(params) 取出自己定义的变量的值

配置选项能够參考官方文档或者这个ppt

其它

  • 许多得採用 Emperor 模式(主要是用来监控配置文件,能够做到热插拔),也能够在uWSGI做python 应用的负载均衡
  • 配置文件的热插拔比較好的做法是。配置文件夹+软连接
  • gevent 或者 async 配置 对于纯django应用来说并没啥作用

配置静态文件

相似于nginx中的 alias

static-map = /static=/usr/lib/python2.6/site-packages/django/contrib/admin/static
<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

【uWSGI】实战之Django配置经验