nginx : SSLのセッション確立パフォーマンス測定


nginxでSSLを終端する際に、クライアントの新規SSLセッションの確立スループットを知りたかった。

参考資料
======
[NGINX SSL Performance](https://www.nginx.com/blog/nginx-ssl-performance/)に、[pdfの資料](https://cdn-1.wp.nginx.com/wp-content/files/nginx-pdfs/Sizing-Guide-for-Deploying-NGINX-on-Bare-Metal-Servers.pdf?_ga=2.219546330.2144902351.1499222824-921313232.1485940655)がありますが、
これを参照すると

Intel Xeon E5-2699 v3 CPUs @ 2.3 GHz の2コアマシンで、

```
1,500/4,700 RSA/ECC SSL TPS (OpenSSL 1.0.2)
850/2,400 RSA/ECC SSL TPS (OpenSSL 1.0.1)
```

のパフォーマンスが出るようです。
今回はRSAなcipher suiteでテストをしてみます。
RSAだと 1coreあたり、 OpenSSL1.0.2で750req/sec程度出るようですね。
ホントかな？


測定結果
======
先に測定結果を記載します。


| nginx | OpenSSL | gcc | req/sec | 備考|
|:----------:|:-----------:|:------------:|:---:|:---:|
| 1.10.2       | 1.0.1e        | 4.4.7          | 232.22 |yumでいれたもの|
| 1.10.3       | 1.0.2l         | 4.4.7          | 466.47 |  |
| 1.10.3       | 1.1.0f         | 4.4.7          | 467.06 |  |
| 1.12.0       | 1.1.0f         | 4.4.7          | 476.18 |  |
| 1.10.3       |  1.1.0f        |  6.2.1         |  485.24  | gccが新しい場合を試したかった |

大体誤差程度に見えますが、

- OpenSSL  
    - 1.0.1e < 1.0.2l = 1.1.0f
- nginx
    - 1.10.3 < 1.12.0
- gcc
    - 4.4.7 < 6.2.1

となりました。

新しいもののほうが早くなっている・・・といえるのかな？

とりあえず nginx の資料の750req/sec は達成できませんでした。
・・・CPUが違うのと、VPSだからかな。

試験環境
======
- Server
    - CPU : Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz
- Client
    - ab -n 10000 -c 100 -Z  ECDHE-RSA-AES256-GCM-SHA384  -f TLS1.2 https://domain/
    - を、クライントのほうがサーバより弱かったために、サーバのCPUを100%使いきれなかったので、2プロセス実行


- config

```nginx
user nginx;
#worker_processes auto;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
    worker_connections  1024;
    multi_accept on;
}
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    server {
      ssl_certificate 証明書;
      ssl_certificate_key 鍵ファイル;

      ssl_session_timeout 1d;
      ssl_session_cache shared:SSL:50m;
      ssl_session_tickets off;
      ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

      ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
      ssl_prefer_server_ciphers on;

      server_name _;
      listen 443 ssl http2 backlog=100000;

      root /var/www;

    }
}
```

結果一覧
======

■1

```
nginx version: nginx/1.10.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013

115.91 + 116.31 = 232.22 req/sec
```


■2

```
nginx version: nginx/1.10.3
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC)
built with OpenSSL 1.0.2l  25 May 2017

234.06 + 232.41 = 466.47 req/sec
```

■3

```
nginx version: nginx/1.10.3
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC)
built with OpenSSL 1.1.0f  25 May 2017

233.44 + 233.62 = 467.06 req/sec
```

■４

```
nginx version: nginx/1.12.0
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC)
built with OpenSSL 1.1.0f  25 May 2017

238.66 + 237.52 = 476.18 req/sec
```

■5

```
nginx version: nginx/1.10.3
built by gcc 6.2.1 20160916 (Red Hat 6.2.1-3) (GCC)
built with OpenSSL 1.1.0f  25 May 2017

243.64 + 241.60 = 485.24 req/sec
```