nginx+uwsgi优化
这篇只要讲解 从系统层面进行优化、nginx层面进行优化和uwsgi层面进行相优化。加速网站,加速站点。
系统层面配置
1、调整同时打开文件数量
ulimit -n 20480
ulimit -a # 查看是否生效
2、TCP最大连接数(somaxconn)定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数。默认是128.优化可以根据系统配置做优化
echo 10000 > /proc/sys/net/core/somaxconn
3、TCP连接立即回收、回用(recycle、reuse)
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
4、不做TCP洪水抵御
echo 0 > /proc/sys/net/ipv4/tcp_syncookies
完整的配置:
net.core.somaxconn = 20480
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 4096 16777216
net.ipv4.tcp_wmem = 4096 4096 16777216
net.ipv4.tcp_mem = 786432 2097152 3145728
net.ipv4.tcp_max_syn_backlog = 16384
net.core.netdev_max_backlog = 20000
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_max_orphans = 131072
net.ipv4.tcp_syncookies = 0
sysctl -p 生效。
nginx配置
nginx 是一个高效的服务器,但是如果只是安装,没有做什么配置的话,那么它最多也就只能承受1024个左右的并发,如何可以让nginx能轻松应对5000甚至10000的高并发呢,修改nginx配置文件( 使用epoll的I/O模型 worker_connections )
worker_processes 2; #nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数
worker_rlimit_nofile 30000; #一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx 进程数相除,但是nginx 分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致
events {
use epoll;#使用epoll的I/O模型
worker_connections 30000;#每个进程允许的最多连接数, 理论上每台nginx 服务器的最大连接数为worker_processes*worker_connections
multi_accept on;
}
http {
keepalive_timeout 60;
}
uwsgi配置
[uwsgi]
wsgi-file=app.py # 应用的主文件
callable=app # 应用中的 flask 实例
chdir=/opt/app # chdir 到给定目录
env= XXX=XXX # 额外的环境变量
# 以下三者任选其一
http=0.0.0.0:5000 # 如果直接暴露 uwsgi 的话用这个
http-socekt=0.0.0.0:5001 # 如果用nginx反向代理的话,用这个
socket=:3031 # 在 3031 使用 uwsgi 协议,nginx 中使用 uwsgi_pass 更高效
chmod-socket = 664
pidfile=xxx # pid 文件路径
venv=xxx # 虚拟环境路径
logto = /var/log/www.log
# 并发设置
workers = 2 # 一般为 CPU 核数 * 2
threads = 2 # 线程比进程开销更小一点。如果没有使用 threads 那么 thread 直接不工作的,必须使用 enable_threads。
max-requests = 100000 # 处理过多少个请求后重启进程,目的是防止内存泄露
master = true # 使用 max-requests 必须采用这个选项
listen = 65536 # 每个进程排队的请求数量,默认为 100 太小了。并发数 = procsses * threads * listen
buffer-size = 65536 # header 的 buffer 大小,默认是 4 k
thunder-lock = true # 避免惊群效应
uid=www-data
gid=www-data
harakiri=30 # 所有进程在 30s 没有响应后傻屌
log-slow=3000 # 记录满于 3000 毫秒的请求
# lazy-apps # 不使用 prefork,而是在需要时才启动进程
# 监控设置
stats = 127.0.0.1:9191 # 可以使用 uwsgi top 监控
python-autoreload=1 # 自动重载,开发时非常方便
# 静态文件
check-static = /var/static # 尝试从该目录下加载静态文件
static-map = /static=/var/static # 把对应目录映射
route = /static/(.*)\.png static:/var/www/images/pngs/$1/highres.png # 使用高级路由模式
offload-threads = 10 # 让 uwsgi 启动额外的进程处理
测试
ab -r -n 100000 -c 10000 -H “User-Agent: python-keystoneclient”
-H “Accept: application/json” -H “X-Auth-Token: 63e194”
http://fffmo.com:1688/v2.0/
压测报告:
Server Software: nginx/1.8.1
Server Hostname: fffmo.com
Server Port: 1688
Document Path: /v2/
Document Length: 450 bytes
Concurrency Level: 15000
Time taken for tests: 30.136 seconds
Complete requests: 100000
Failed requests: 0
Write errors: 0
Total transferred: 72900000 bytes
HTML transferred: 45000000 bytes
Time per request: 520.137 ms