Slide 1

Slide 1 text

nginx and Node.js Kim Schlesinger Denver Node.js Meetup - May 2020 @kimschles

Slide 2

Slide 2 text

nginx can make your production Node.js apps faster. @kimschles

Slide 3

Slide 3 text

Kim Schlesinger @kimschles

Slide 4

Slide 4 text

Agenda 1. About nginx 2. Demo setup 3. nginx as a Reverse Proxy, Web Cache and Load Balancer 4. Recap @kimschles

Slide 5

Slide 5 text

Agenda 1. About nginx @kimschles

Slide 6

Slide 6 text

Server Something that sends files to a web browser @kimschles

Slide 7

Slide 7 text

@kimschles

Slide 8

Slide 8 text

About nginx • pronounced "engine-x" • A web server, reverse proxy and load balancer • First developed in 2004 by Igor Sysoev • Designed to solve the C10K Problem1 • Written in C 1 Concurrently handling ten thousand connections @kimschles

Slide 9

Slide 9 text

Moar about nginx • Open Source nginx and nginx Plus • Serves 28.5% active sites on the web2 • Apache is 2nd with 27.8% websites 2 Netcraft April 2020 Web Server Survey @kimschles

Slide 10

Slide 10 text

How do I know which webserver is serving my content? @kimschles

Slide 11

Slide 11 text

Look at the http response headers using your browser's dev tools. • Open dev tools • Go to the network tab • Refresh the page • Look at response headers @kimschles

Slide 12

Slide 12 text

@kimschles

Slide 13

Slide 13 text

Agenda 1. About nginx @kimschles

Slide 14

Slide 14 text

Agenda 1. About nginx 2. Demo setup @kimschles

Slide 15

Slide 15 text

Demo Setup • Digital Ocean Droplet • Ubuntu 18.04.3 • iTerm2 Profiles • Dockerized Node.js apps • Code at github.com/kimschles/nginx-nodejs @kimschles

Slide 16

Slide 16 text

Prerequisite Skills • Setting up a remote server • Using SSH to connect to the server • Building an app with Node.js and Express • Containerizing Node.js apps with Docker • Deploying apps using Docker @kimschles

Slide 17

Slide 17 text

Thoughts on programming vs. configuration management @kimschles

Slide 18

Slide 18 text

Agenda 1. About nginx 2. Demo setup 3. nginx as a Reverse Proxy @kimschles

Slide 19

Slide 19 text

Reverse Proxy A reverse proxy takes requests from the Internet and forwards them to servers in an internal network.3 3 MDN: Proxy Server @kimschles

Slide 20

Slide 20 text

Reverse Proxy Demo! @kimschles

Slide 21

Slide 21 text

The simplest possible configuration server { location / { proxy_pass http://:8080/; } } @kimschles

Slide 22

Slide 22 text

One with a little more info server { location / { proxy_pass http://:8080/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } @kimschles

Slide 23

Slide 23 text

How to setup a Reverse Proxy • Download nginx • Find and edit the configuration file • /etc/nginx/sites-available/default • Reload nginx with service nginx reload • Check to see if nginx is the server @kimschles

Slide 24

Slide 24 text

Agenda 1. About nginx 2. Demo setup 3. nginx as a Reverse Proxy @kimschles

Slide 25

Slide 25 text

Agenda 1. About nginx 2. Demo setup 3. nginx as a Web Cache @kimschles

Slide 26

Slide 26 text

Serve static content @kimschles

Slide 27

Slide 27 text

index.html Hey!

Hello Denver Node.js Meetup!

A husky puppy in the woods running toward the camera

Isn't this a cute puppy?

@kimschles

Slide 28

Slide 28 text

Serve Static HTML files server { location ~ \.(html)$ { root /var/www/staticfiles; expires 30d; } location / { proxy_pass http://:3000; } } @kimschles

Slide 29

Slide 29 text

Agenda 1. About nginx 2. Demo setup 3. nginx as a Web Cache @kimschles

Slide 30

Slide 30 text

Agenda 1. About nginx 2. Demo setup 3. nginx as a Load Balancer @kimschles

Slide 31

Slide 31 text

Load Balancer @kimschles

Slide 32

Slide 32 text

High Availability (lots of replicas) @kimschles

Slide 33

Slide 33 text

Round Robin Load Balancer upstream nodeapps { server :3000; server :8080; } server { location / { proxy_pass http://nodeapps; } } @kimschles

Slide 34

Slide 34 text

Least Connections Load Balancer upstream nodeapps { least_conn; server :3000; server :8080; } server { location / { proxy_pass http://nodeapps; } } @kimschles

Slide 35

Slide 35 text

IP Hash Load Balancer upstream nodeapps { ip_hash; server :3000; server :8080; } server { location / { proxy_pass http://nodeapps; } } @kimschles

Slide 36

Slide 36 text

Recap @kimschles

Slide 37

Slide 37 text

nginx can make your production Node.js apps faster. @kimschles

Slide 38

Slide 38 text

nginx.conf @kimschles

Slide 39

Slide 39 text

Reverse Proxy @kimschles

Slide 40

Slide 40 text

Web Cache @kimschles

Slide 41

Slide 41 text

Load Balancer @kimschles

Slide 42

Slide 42 text

There's more! @kimschles

Slide 43

Slide 43 text

Resources • Full Example Configuration • 5 Performance Tips for Node.js Applications @kimschles

Slide 44

Slide 44 text

kimschlesinger.com @kimschles @kimschles