Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

33
Advanced nginx in Mercari nginx実践入門」出版記念!執筆者らが語る nginx Tech Talks Masahiro Nagano How to handle over 1,200,000 HTTPS Reqs/Min

Transcript of Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

Page 1: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

Advanced nginx in Mercari

「nginx実践入門」出版記念!執筆者らが語る nginx Tech Talks

Masahiro Nagano

How to handle over 1,200,000 HTTPS Reqs/Min

Page 2: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

Me

• Masahiro Nagano @kazeburo

• Mercari, inc.

• Principal Engineer, Site Reliability Engineering Team

• BASE, inc. Technical Advisor

Page 3: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

MercariYour Friendly Mobile MarketPlaceJP US

Page 4: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

Mercari KPI

DOWNLOAD

GMV

ITEMS

3100万DL(JP+US)

月間数十億円

1日数十万品以上

Page 5: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

API Traffic

1,200,000 reqs/min (HTTPS only)

Page 6: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

nginx in mercari

©2011 Amazon Web Services LLC or its affiliates. All rights reserved.

User Users Client Multimedia Corporate data center

Traditional server

Mobile Client

Internet AWS Management Console

IAM Add-on Example:IAM Add-on

Amazon Mechanical Turk

On-Demand Workforce

Human Intelligence Tasks (HIT)

Assignment/Task

RequesterWorkersAmazon Mechanical Turk

Non-Service Specific

©2011 Amazon Web Services LLC or its affiliates. All rights reserved.

User

Users

Client

Multimedia

Corporate data centerTraditional server

Mobile Client

Internet

AWS Management Console

IAM Add-on

Example:IAM Add-on

Amazon Mechanical Turk

On-Demand Workforce

Human Intelligence Tasks (HIT)

Assignment/Task

Requester

Workers

Amazon Mechanical Turk

Non-Service Specific

©2011 Am

azon W

eb Servi

ces L

LC or its

affiliate

s. All r

ights re

serve

d.

User

Users

Client

Multimedia

Corpora

te

data ce

nter

Traditio

nal

serve

r

Mobile C

lient

Inte

rnet

AWS M

anagement

Console

IAM A

dd-on

Exam

ple:

IAM A

dd-on

Amazo

n Mechanical T

urk

On-Dem

and Work

forc

e

Human In

tellig

ence

Tasks (

HIT)

Assignm

ent/

Task

Requester

Work

ers

Amazo

n

Mechanica

l Turk

Non-Serv

ice Specifi

c L7 load balancerReverse Proxy TLS Terminator

Contents Distribution©2011 Amazon W

eb Services LLC or its affiliates. All rights reserved.

User

Users

Client

Multim

edia

Corporate

data center

Traditional

server

Mobile Client

Internet

AWS M

anagement

Console

IAM Add-on

Example:

IAM Add-on

Amazon M

echanical Turk

On-Demand W

orkforce

Human Intelligence

Tasks (HIT)

Assignment/

Task

Requester

Workers

Amazon

Mechanical TurkNon-Service Specific

Page 7: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

nginx Extension in mercari

• ngx_dynamic_upstream

• Operate upsteam servers Up/Down dynamically

• OpenResty (ngx_lua)

• More powerful L7 load balancer

• Application log collector

Page 8: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

Agenda

• Continuous updating nginx

• TLS Optimization

• Automated TLS session ticket key updating

• SPDY to HTTP/2

Page 9: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

Continuous updating nginx

Page 10: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

Keep nginx the latest• Use nginx mainline version

• stableは安定しているという意味ではなく新機能が追加されず、バグ修正も緊急な修正を除いて行われないということ。すべての新機能やバグ修正はmainlineにて行われるので結果的にmainlineが安定しているhttps://www.nginx.com/blog/nginx-1-6-1-7-released/

• nginxは無停止でのアップデートが可能

• Periodic OpenSSL vulnerability report 😓

Page 11: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

nginx-build

• nginx builder command written in Gohttps://github.com/cubicdaiya/nginx-build

• Automate download, configure and make

• Download OpenSSL, zlib and PCRE. build them statically ( independent from OS’s library version)

• Support Tengine and OpenResty

Page 12: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

nginx-build$ EXPORT $VERSION=1.9.10$ nginx-build \ -clear \ -d work \ -v $VERSION \ -c nginx-build-conf/configure \ -m nginx-build-conf/modules3rd.ini \ -zlib \ -zlibversion=1.2.8 \ -verbose \ -pcre \ -pcreversion=8.38 \ -openssl \ -opensslversion=1.0.2f \$ cd work/$VERSION/nginx-$VERSION$ sudo make install

Page 13: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

TLS Optimization

Page 14: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

TLS Optimization

• PFS - Perfect Forward Secrecy

• TTFB - Time To First Byte

Page 15: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

Perfect Forward Secrecy

• Mozilla Wikihttps://wiki.mozilla.org/Security/Server_Side_TLS

• Mozilla SSL Configuration Generatorhttps://mozilla.github.io/server-side-tls/ssl-config-generator/

• *最新の情報を参照し、プロダクション環境に投入する前にテストを行ってください

Page 16: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

TTFB

• TLS Session Cache

• TLS Session Tickets

• OCSP Stapling

• SSL buffer size

Page 17: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

TLS Session Cache

• Server side session cache

• Client software does not matter

• nginx could’t share session cache between servers.

ssl_session_cache shared:SSL:120m;ssl_session_timeout 5m;

CONS

PROS

Page 18: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

TLS Session Cache

• OpenResty will support it?https://twitter.com/agentzh/status/686655229828403201

Page 19: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

TLS Session Tickets

• Client Side Session Cache(like a CookieStore)

• No need to share cache between servers

• It’s required share ssl_session_ticket_key file

• Client support required

ssl_session_tickets on;ssl_session_ticket_key /path/to/ssl_session_ticket;

PROS

CONS

Page 20: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

TLS Session TicketsUser Agent Session Tickets

Android 2.3.7 NoAndroid 4.0.4 YES

Android 5 YESChrome 47 YESFirefox 42 YESIE11/Win7 No

IE11/Win10 YESEdge/Win10 YESSafari 9/iOS9 No

Safari 9/MacOSX10.11 No!!!!!!!!

https://www.ssllabs.com/ssltest/clients.html

Page 21: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

OCSP Stapling

https://wiki.mozilla.org/Security/Server_Side_TLS

Client required to checking the revocation status. If OCSP Responder is down, page load is failed.

Server retrieves OCSP record, caches it and servers it to client directly. Fast!

Page 22: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

OSCP Stapling

• All Android version don’t support yet

• iOS < 9 doesn’t support it

CONS

CONS

ssl_stapling on;ssl_stapling_verify on;ssl_trusted_certificate /path/to/server.crt;resolver 8.8.8.8 valid=30s;resolver_timeout 5s;

Page 23: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

TLS buffer size

• TLS record size. Default 16KB, it’s too large. That’s effect to latencyhttps://www.igvita.com/2013/12/16/optimizing-nginx-tls-time-to-first-byte/

ssl_buffer_size 1k;

Page 24: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

Automated TLS session tickets key

updating

Page 25: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

TLS Session Tickets

• Should share ssl_session_ticket_key file between servers

• Mozilla recommends replace it every day for forward secrecy

• Previously we changed the key file almost every month in manual operation😓

Page 26: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

Update Tickets with Consul

• Inspired by Stretcher (fujiwara👍)

• Key_file is very small (48byte), It can store into a payload of consul event

• We’re updating key_file twice a day by using Consul

Page 27: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

Update Tickets with Consul

JOB

Consul Servers

nginx

Consul Agent

$ consul event \ -name=“ssl-session-ticket-refresh" \ $(openssl rand 48 | base64)

nginx

Consul Agent

nginx

Consul Agent

cat | jq -r '.Payload' | \ base64 -d | base64 -d \ > /path/to/ticket.keyservice nginx reload

❷ ❷ ❷

Page 28: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

SPDY to HTTP/2

Page 29: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

SPDY is alive

Request to a webview728

1,009,268

270,527

HTTP/1.1 SPDY HTTP2

Page 30: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

SPDY to HTTP/2

• In Mobile App, transition to HTTP/2 from SPDY is not so quickly

• Android 4.x, iOS 8...

• nginx dropped SPDY in 1.9.4, but we need to transition gracefully in a few and more years

• We need a server that speak both HTTP/2 and SPDY

Page 31: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

Tengine

Now we’re trying Tengine (at a previous slide)

Page 32: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

cloudflare patch?

https://blog.cloudflare.com/introducing-http2/

Page 33: Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min

End