Nginx SSL 性能调优

简介:

这篇文章的目的是要谈谈我的 Nginx 调优经验,就不涉及数据库调优的内容了。

初始服务器设置

我的服务器运行在亚马逊 EC2 t1 micro 上,选择 Nginx + PHP5-fpm 作为后端,因为一些安全因素还打开了SSL。

性能测试

我使用了Blitz.io 来进行压力测试。下面是我使用的命令参数:


 
 
  1. -1-250:60 https://mydomian.com

这是一个用户线性递增的测试,每个测试用户跑60秒。Blitz.io为每个请求每秒增加4个( = rise / run = 260 / 60)测试用户。

结论

我把结论提前写在这里,如果你不想读完整篇文章也没有问题。

  1. Nginx默认设置的DH算法(译注:Diffie-Hellman key exchange algorithm)是影响SSL性能的最大因素,因此采用如下设置能增加SSL性能:

 
 
  1. ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  2. ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;
  3. ssl_prefer_server_ciphers on;
  4. ssl_session_cache shared:SSL:10m;
  5. ssl_session_timeout 10m;
  1. 升级硬件 Upgrade your EC2 from t1.micro to c1.medium
  2. 正确配置 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的设置:


 
 
  1. worker_processes 2;

尝试3,4,5:调整Nginx和PHP5-fpm

以下尝试得到的结果都和尝试1相同

尝试3:

nginx.conf


 
 
  1. worker_processes 2;
  2. events {
  3. worker_connections 19000;
  4. multi_accept on;
  5. }
  6. ...

尝试4:

nginx.conf


 
 
  1. worker_processes 2;
  2. events {
  3. worker_connections 19000;
  4. multi_accept on;
  5. }
  6. http {
  7. gzip on;
  8. gzip_disable "msie6";
  9. gzip_min_length 1000;
  10. gzip_proxied expired no-cache no-store private auth;
  11. gzip_types text/plain application/xml application/javascript text/css application/x-javascript;
  12. }
  13. ...

尝试5:

在尝试4未变的情况下我更改了php5-fpm的设置:


 
 
  1. pm.max_children = 160
  2. pm.start_servers = 24
  3. pm.min_spare_servers = 20
  4. pm.max_spare_servers = 35
  5. pm.max_requests = 1500

尝试6:在另一个服务器部署

我有一个1.5Gb RAM和8CPU的Linode服务器,采用刚才的设置,这是我的测试结果:

Linode的服务器的结果棒极了!我的第一个直觉是难道Linode比EC2好吗。在我把我的服务迁移到Linode之前我想确保两者仅有的对性能有可能产生影响的不同被排除掉。

尝试7:大惊喜

我Google到Nginx在SSL上有些问题。Nginx默认使用DHE算法来产生密匙,改变这个设置应该能使它快一些。

这里是我参考的一些文章:

所以我更改了nginx.conf,删掉了kEDH算法


 
 
  1. worker_processes 2;
  2. events {
  3. worker_connections 1024;
  4. }
  5. http {
  6. gzip on;
  7. gzip_disable "msie6";
  8. gzip_min_length 1000;
  9. gzip_proxied expired no-cache no-store private auth;
  10. gzip_types text/plain application/xml application/javascript text/css application/x-javascript;
  11. ssl_ciphers ALL:!kEDH!ADH:RC4+RSA:+HIGH:+EXP;
  12. }
  13. ...

下图是测试结果:

效果很显著! 

尝试8: 硬件提升是必要的吗

现在我的EC2和Linode表现差不多了。但是我真的需要升级到c1.medium实例才能实现这个性能的提升吗?或许不是这样……所以我把我改回了t1.micro。因为t1.micro实例只有一个CPU,所以我把worder_processes设置改回1。下面是测试的结果:

所以答案是肯定的,硬件上的提升是必要的。 

尝试9:

有人在 Hacker News 上反馈说我的SSL密匙不能满足Perfect Forward Secrecy,我采用了他们的建议,对我的SSL设置做了如下更改:


 
 
  1. ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  2. ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;
  3. ssl_prefer_server_ciphers on;
  4. ssl_session_cache shared:SSL:10m;
  5. ssl_session_timeout 10m;

现在这个设置应该满足Perfect Forward Secrecy协议了。我重新跑了测试:

太棒了,性能也没有下降。很棒的学习经验!

 原文发布时间为:2013-08-06

本文来自云栖社区合作伙伴“Linux中国”

相关文章
|
3月前
|
应用服务中间件 Linux 网络安全
如何在 CentOS 7 上为 Nginx 创建自签名 SSL 证书
如何在 CentOS 7 上为 Nginx 创建自签名 SSL 证书
194 1
|
1月前
|
安全 应用服务中间件 Shell
nginx配置https的ssl证书和域名
nginx配置https的ssl证书和域名
|
1月前
|
应用服务中间件 网络安全 nginx
nginx如何代理ssl
nginx如何代理ssl
|
3月前
|
存储 缓存 负载均衡
NGINX 性能调优的五大技巧
【8月更文挑战第27天】
77 5
|
3月前
|
jenkins 应用服务中间件 持续交付
如何配置 Nginx 作为 Jenkins 的反向代理并启用 SSL 加密
如何配置 Nginx 作为 Jenkins 的反向代理并启用 SSL 加密
208 8
|
3月前
|
负载均衡 前端开发 应用服务中间件
使用Nginx配置SSL以及部署前端项目
本文介绍了如何使用Nginx配置SSL证书以启用HTTPS,并展示了如何通过Nginx部署前端项目,包括配置SSL证书、设置代理和负载均衡的示例。
114 2
|
3月前
|
应用服务中间件 网络安全 nginx
运维专题.Docker+Nginx服务器的SSL证书安装
运维专题.Docker+Nginx服务器的SSL证书安装
132 3
|
3月前
|
缓存 负载均衡 Java
SpringBoot 与 Nginx 配置优化:性能拉满的关键学习方法
【8月更文挑战第1天】在现代Web开发领域,SpringBoot以其快速启动、简化配置的特性成为众多开发者的首选框架,而Nginx则以其高性能的HTTP和反向代理服务器功能著称。将两者结合,并通过精细的配置优化,可以显著提升Web应用的性能与稳定性。以下是为您学生定制的SpringBoot与Nginx配置优化的学习方法与研究路径。
77 1
|
4月前
|
应用服务中间件 网络安全 nginx
使用Nginx Proxy Manager配置Halo的反向代理和申请 SSL 证书
本文引导如何用Nginx Proxy Manager (NPM)配置Halo的反向代理与SSL证书。NPM简化了Nginx的配置流程,适合无Nginx基础的用户。安装NPM无需额外安装Nginx,避免端口冲突。通过`docker-compose.yaml`启动NPM服务,并映射必要的端口。配置Halo反向代理需登录NPM面板,添加代理主机,设置域名、转发IP等参数。NPM支持自动申请与续期SSL证书,确保网站安全访问。更多Halo安装细节,请参考[如何在Linux云服务器上通过Docker Compose部署安装Halo](https://zhangfeidezhu.com/?p=631).
258 0
使用Nginx Proxy Manager配置Halo的反向代理和申请 SSL 证书
|
3月前
|
Ubuntu 应用服务中间件 网络安全
如何在 Ubuntu 14.04 上为 Nginx 创建 SSL 证书
如何在 Ubuntu 14.04 上为 Nginx 创建 SSL 证书
105 0