Nginx SSL 性能调优
这篇文章的目的是要谈谈我的 Nginx 调优经验,就不涉及数据库调优的内容了。
初始服务器设置
我的服务器运行在亚马逊 EC2 t1 micro 上,选择 Nginx + PHP5-fpm 作为后端,因为一些安全因素还打开了SSL。
性能测试
我使用了Blitz.io 来进行压力测试。下面是我使用的命令参数:
-p 1-250:60 https://mydomian.com
这是一个用户线性递增的测试,每个测试用户跑60秒。Blitz.io为每个请求每秒增加4个( = rise / run = 260 / 60)测试用户。
结论
我把结论提前写在这里,如果你不想读完整篇文章也没有问题。
- Nginx默认设置的DH算法(译注:Diffie-Hellman key exchange algorithm)是影响SSL性能的最大因素,因此采用如下设置能增加SSL性能:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
- 升级硬件 Upgrade your EC2 from t1.micro to c1.medium
- 正确配置 Nginx的worker进程数量 Set Nginx to have 2 worker processes as a c1.medium gives you 2 CPUs
细节解释
以下是我进行测试的详细过程。
尝试1:升级硬件
直觉告诉我,想解决性能问题的直接途径就是升级硬件,我把EC2实例从t1.micro升级到了为高流量而优化过的c1.medium
升级后的测试结果:
巅峰时服务器的hits达到50/sec,压力增加时,time-out增加,hits减少。
尝试2:测试CPU性能
我打开top然后重启了测试,注意到2个CPU的使用率不到13%,内存使用了300Mb,很明显硬件没有充分利用。所以我更改了nginx的设置:
worker_processes 2;
尝试3,4,5:调整Nginx和PHP5-fpm
以下尝试得到的结果都和尝试1相同
尝试3:
nginx.conf
worker_processes 2;
events {
worker_connections 19000;
multi_accept on;
}
...
尝试4:
nginx.conf
worker_processes 2;
events {
worker_connections 19000;
multi_accept on;
}
http {
gzip on;
gzip_disable "msie6";
gzip_min_length 1000;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain application/xml application/javascript text/css application/x-javascript;
…
}
...
尝试5:
在尝试4未变的情况下我更改了php5-fpm的设置:
pm.max_children = 160
pm.start_servers = 24
pm.min_spare_servers = 20
pm.max_spare_servers = 35
pm.max_requests = 1500
尝试6:在另一个服务器部署
我有一个1.5Gb RAM和8CPU的Linode服务器,采用刚才的设置,这是我的测试结果:
Linode的服务器的结果棒极了!我的第一个直觉是难道Linode比EC2好吗。在我把我的服务迁移到Linode之前我想确保两者仅有的对性能有可能产生影响的不同被排除掉。
尝试7:大惊喜
我Google到Nginx在SSL上有些问题。Nginx默认使用DHE算法来产生密匙,改变这个设置应该能使它快一些。
这里是我参考的一些文章:
- http://matt.io/entry/ur
- http://auxbuss.com/blog/posts/2011_06_28_ssl_session_caching_on_nginx/
所以我更改了nginx.conf,删掉了kEDH算法
worker_processes 2;
events {
worker_connections 1024;
}
http {
gzip on;
gzip_disable "msie6";
gzip_min_length 1000;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain application/xml application/javascript text/css application/x-javascript;
ssl_ciphers ALL:!kEDH!ADH:RC4+RSA:+HIGH:+EXP;
…
}
...
下图是测试结果:
效果很显著!
尝试8: 硬件提升是必要的吗
现在我的EC2和Linode表现差不多了。但是我真的需要升级到c1.medium实例才能实现这个性能的提升吗?或许不是这样……所以我把我改回了t1.micro。因为t1.micro实例只有一个CPU,所以我把worder_processes设置改回1。下面是测试的结果:
所以答案是肯定的,硬件上的提升是必要的。
尝试9:
有人在 Hacker News 上反馈说我的SSL密匙不能满足Perfect Forward Secrecy,我采用了他们的建议,对我的SSL设置做了如下更改:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
现在这个设置应该满足Perfect Forward Secrecy协议了。我重新跑了测试:
太棒了,性能也没有下降。很棒的学习经验!
原文发布时间为:2013-08-06
本文来自云栖社区合作伙伴“Linux中国”
Nginx SSL 性能调优相关推荐
- 【网站架构】Nginx负载均衡宕机怎么办?Nginx性能调优、集群、高可用方案
大家好,欢迎来到停止重构的频道. 本期,我们讨论Nginx的性能调优. Nginx一般是作为网站系统的反向代理或负载均衡,但这里有一个问题,负载均衡可以绑定多个后端服务器. 一个后端服务器宕机后, ...
- nginx代理转发_学了三年的性能调优,你还不懂Nginx?怎么跳槽涨薪
前言 根据 Netcraft 公布的最新的(2019年10月)Web 服务器调查报告,Nginx 的市场份额达到了 32.69%,毫无争议地成为了最流行的 Web 服务器.这主要得益于 Nginx 在 ...
- 浅谈Nginx性能调优
女主宣言 Web服务性能调优是一项系统工程,涵盖许多方面,其中某一环节做的好并不能够保证整体性能好:但是如果某个环节做的不好,那么整体性能必然不会好. 可以调优的配置有很多,绝大多数情况下我们不需要追 ...
- Nginx性能调优,解决C10K问题
公司的技术总监最近出了一道架构方面的问题让我们同组的开发人员设计,题目是这样的:有个签到功能,需要记录每个⽤户每年每⼀天的签到情况.假设⽤户量在千万,甚⾄亿级,该如何设计. 思考这个问题后,我给出的设 ...
- 肝了 15000 字性能调优系列专题(JVM、MySQL、Nginx and Tomcat),看不完先收藏
前言 性能调优,无疑是个庞大的话题,也是很多项目中非常重要的一环,性能调优难做是众所周知的,毕竟性能调优涵盖的面实在是太多了,在这里我就大概的讲一下企业中最常用的四种调优--JVM 调优.MySQL ...
- apache服务器性能不行,Apache服务器性能调优
文章目录 [隐藏] 工具 Apache mod_status Apache2Buddy 多处理模块 Prefork Worker Event 模块配置 StartServers MinSpareSer ...
- 让你眼前一亮的3. Tomcat 性能调优 (值得收藏)
目录 3. Tomcat 性能调优3.1 Tomcat 性能测试3.2 Tomcat 性能优化3.2.1Tomcat配置调优1.禁用AJP连接2.Connector 连接器的选择3.Executor线 ...
- Ceph分布式存储(架构 配置与使用 原理 性能调优)
Ceph分布式存储 Ceph分布式存储 1. Ceph概述 1.1 背景 1.2 介绍 1.3 特点 1.4 分布式存储系统横纵对比 2. Ceph架构设计 2.1 Ceph整体设计 2.2 逻辑架构 ...
- tomcat 性能调优
tomcat 性能调优 *************** tomcat 调优 ServerProperties:server 配置,直接在配置文件(application.yml)中设置 @Config ...
最新文章
- syslog(),closelog()与openlog()--日志操作函数
- wxWidgets:wxAny类用法
- 为什么按照 Angular 官网教程执行简单的测试代码,会遇到expect is not defined的错误消息
- 如何使用三态工作流 - [MOSS 2007应用日记]
- CMS系统模板引擎设计(5):Label应用初探
- android访问静态内部类,Java 内部类详解
- 【Spring】Spring Boot 支持 Https
- 简述Android 程序执行流程,Android系统启动流程简述
- Codeforces 148D:Bag of mice 概率DP
- vue引入bootstrap、jquery
- [bzoj 1855][SCOI2010]股票交易
- 微服务架构实战(一):微服务架构的优势与不足
- 素数猜想对 c语言,1007 素数对猜想 (20 分)(C语言实现)
- 社招看这里: 高级开发工程师/技术专家 [组内直推]
- 【转载】ubuntu16.04 无线/Wifi 上网速度慢的解决方法
- 关于学期结束的一些题目的记录
- SonarQube扫描的Bug、漏洞以及异味的修复(持续更新)
- Mediator模式(仲裁者设计模式)
- CMMI认证等级应该怎么选
- IBM Semeru Windows 下的安装