由于缺乏运维的实战经验,在服务器部署后,遇到了各种问题,暂时也只能“头痛医头脚痛医脚”,有时候一个小小参数搞得自己狼狈不已,记录一下,以备后用(当前nginx版本1.4.6)。
- Linux默认参数的一些优化
- sysctl net.core.somaxconn=1024 #此参数默认为128,不更改uwsgi的监听队列不能大于这个值
-
swap空间使用
阿里云镜像默认是没有开swap分区的,偶尔峰值的时候就会出现out of memory的错误,增加swap分区能有效的避免这个情况,并设置swap分区的使用前提
sysctl vm.swappiness=10 #物理内存还剩10%的时候开始使用虚拟内存
网上普遍开辟虚拟空间的做法
dd if=/dev/zero of=swapfile bs=1024 count=400000
在一篇网管日志中看到还可以这样,速度比上面的方式要快很多很多哦
fallocate -l 4G /swapfile
-
uwsgi协程支持
在有频繁IO的情况下,uwsgi的性能会打折扣,threads参数可以增加并发,但是性能开销很大,使用gevent可以在不修改代码的情况下大大增强并发,(道听途说:stackoverflow上说threads开到1000,基本吃空内存,gevent则表现很好)
使用协程示例,在高并发下推荐使用
uwsgi --http :8001 --module ugtest.wsgi --gevent 40 --gevent-monkey-patch
使用线程示例,并发不高可以使用,高并发不适用
uwsgi --http :8001 --module ugtest.wsgi --enable-threads --threads 40
-
nginx访问控制
由于服务器并不强大,在高峰期间遭到恶意访问时会造成listen队列被填满,正常用户无法访问,在nginx.conf中添加
limit_req_status 599; #定义被限制的返回码,便于和正常的区分
limit_req_zone $binary_remote_addr zone=allips:2m rate=100r/s; #nginx每秒仅接受100个请求
geo $limited { #设定不受限制的IP
default 1;
182.92.117.23 0;
}
在应用的config中的location / 段添加,个人感觉这段和uwsgi的listen做的事差不多,只是在nginx层做效率应该比uwsgi层效率要高。
location / {
...
limit_req zone=allips burst=60 nodelay; #达到限速后,允许等待的请求数
}