38
चԭngx_luaா๐ۓ᪠ኧොໜ ݨ(yejingx) @ ԯ 2016.8.13 UPYUN OpenTalk Guangzhou

- ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

  • Upload
    dophuc

  • View
    241

  • Download
    0

Embed Size (px)

Citation preview

Page 1: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

ngx_lua

(yejingx) @ 2016.8.13 UPYUN OpenTalk Guangzhou

Page 2: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

zero down-time

Page 3: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

Registrator /

ZooKeeper / etc / consul

LVS / HAProxy / Nginx

Page 4: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

DNS

Page 5: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

TCP HTTP

HTTP

Page 6: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

Nginx + Consul + Registrator

Page 7: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

Consul Nginx?

Page 8: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

- consul-template

consul

nginx reload

Page 9: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

- Nginx reload

2. kill -s HUP nginx.pid nginx -s reload

1. upstream.conf

upstream imgprocess { server 192.168.1.1:8080 max_fails=3 fail_timeout=30s; server 192.168.1.2:8080 max_fails=3 fail_timeout=30s; server 192.168.1.3:8080 max_fails=3 fail_timeout=30s; }

upstream imgprocess { {{range service "app.imgprocess"}} server {{.address}} max_fails={{.max_fails}} fail_timeout={{.fail_timeout}};{{end}} }

Page 10: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

- Reload

shutting down

Page 11: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

- DNS

upstream imgprocess { server imgprocess.upyun.com:8080 max_fails=3 fail_timeout=10s; }

imgprocess.upyun.com

192.168.1.1192.168.1.2192.168.1.3192.168.1.4

consul resolve

Page 12: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

- DNS

DNS

DNS

Docker IP

Page 13: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

HTTP Nginx

Page 14: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

- ngx_http_dyups_module

GET /detail upstream servers GET /list upstream GET /upstream/name name upstream

POST /upstream/name upstream body servers

DELETE /upstream/name upstream

Page 15: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

- ngx_http_dyups_module

$ curl -H "host: dyhost" 127.0.0.1:8080 <html> <head><title>502 Bad Gateway</title></head> <body bgcolor="white"> <center><h1>502 Bad Gateway</h1></center> <hr><center>nginx/1.3.13</center> </body> </html>

$ curl -d "server 127.0.0.1:8089;server 127.0.0.1:8088;" 127.0.0.1:8081/upstream/dyhost success

$ curl -H "host: dyhost" 127.0.0.1:8080 8089

Page 16: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

- C

Nginx

lua

nginx C

C lua

C proxy lua peer

Page 17: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080
Page 18: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

- Slardar

luasocket

lua-resty-checkupslua-nginx-module

Nginx

Slardar

02

03

04

01

proxy_* upstream proxy_next_upstream_retry proxy_next_upstream_timeout

Nginx lua balance_by_lua_* upstream hook

lua upstream upstream

lua consul

upstream

Page 19: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

- lua-resty-checkups

upstreamupdate_upstream / delete_upstream

worker

max_fails / fail_timeout fail_timeout max_fails

fail_timeout

heartbeat

wrr / / /

Page 20: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

-

$ curl -T cat.jpg 192.168.1.155:3130 -H "Host: imageinfo”

$ curl -T cat.jpg 192.168.1.155:3130 -H "Host: imgprocess”

Host :

Page 21: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

-

Host

upstream

lua

Page 22: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

- upstream

curl -d \ ’{“servers”:[ \ {"host":"10.0.5.108", "port": 4001}, \ ——> node docker 1 {“host":"10.0.5.109", "port": 4001}], \ ——> node docker 2 ”keepalive": 20}’\ 127.0.0.1:1995/upstream/node-dev.upyun.com

HTTP upstream :

Page 23: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

- upstream

http://127.0.0.1:1995/status

Page 24: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

- lua

Page 25: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

- lua

if ngx.get_method() == “DELETE” and ngx.var.host == “admin.upyun.com” then return ngx.exit(403) end

E.X.

Page 26: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

- lua

http://127.0.0.1:1995/lua

Page 27: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

-

upstream

lua

1

2

3

Page 28: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

- upstream

luasocket consul

upstream

worker

Page 29: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

master

upstream consul

upstream

- upstream

upstream

init master

init worker

luasocket

Page 30: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

-

upstream common { server 0.0.0.1; balancer_by_lua_file app/src/slardar_balance.lua; }

balance_by_lua_*

upstream.conf:

Page 31: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

local status, code = balancer.get_last_failure() if status == "failed" then local last_peer = ngx.ctx.last_peer -- mark last_peer failed checkups.feedback_status(skey, last_peer.host, last_peer.port, true) end

local peer = checkups.select_peer(ngx.var.host) ngx.ctx.last_peer = peer

balancer.set_current_peer(peer.host, peer.port) balancer.set_more_tries(1)

app/src/slardar_balance.lua:

-

Page 32: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

- lua

loadfile loadstring setfenv

lua consul HTTP body

Page 33: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

-

lua C

Nginx proxy_*

proxy_next_upstream_tries / proxy_next_upstream_timeout

proxy_xxx

ngx_lua

lua c

lua-resty-checkups balance_by_lua_*+

Page 34: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

Slardar

Page 35: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

http://martinfowler.com/articles/microservices.html

Page 36: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

Slardar

Consul

1 2 3Host: beautifyargs: /beautify/90 Host: zoom

args: /width/100

Host: watermarkargs: text/hello

Slardar GW

Host: imgprocessargs: /beautify/90/width/100/wmtext/hello

imgprocess

Host: imgprocessargs: /beautify/90/width/100/wmtext/hello

Page 37: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

!

Talk is cheap. Show me the code.

Page 38: - ngx lua 1 Ö ¾ P Ó § Ü ÜŸº于ngx_lua... · Ü Ü Þ - Nginx reload & U 2. kill -s HUP nginx.pid r nginx -s reload 1. § \ n upstream.conf upstream imgprocess { server 192.168.1.1:8080

Q & A