SlideShare a Scribd company logo
Roll Your Own API Management
Platform with nginx and Lua
Jon Moore
Senior Fellow, Comcast Cable
@jon_moore
access control
capacity management
(“rate limiting”)
capacity management
(“rate limiting”)
HTTP
Proxy
custom logic!
Lua
Roll Your Own API Management Platform with nginx and Lua
Roll Your Own API Management Platform with nginx and Lua
--- Validates the OAuth signature!
-- @return Const.HTTP_UNAUTHORIZED if either the key or signature is invalid!
-- this method is internal and should not be called directly!
function _M.validate_signature(self)!
local headers = self.req.get_oauth_params()!
local key = headers[Const.OAUTH_CONSUMER_KEY]!
local keyconf = self.conf.keys[key]!
if keyconf == nil then!
return {!
code = Const.HTTP_UNAUTHORIZED!
error = Const.ERROR_INVALID_CONSUMER_KEY!
}!
end!
!
local sig = get_hmac_signature(self.req, keyconf.secret)!
if sig ~= headers[Const.OAUTH_SIGNATURE] then!
return {!
code = Const.HTTP_UNAUTHORIZED,!
error = Const.ERROR_INVALID_SIGNATURE!
}!
end!
end!
Lua < 3k LOC
testing
function TestOAuth1:test_reject_request_when_signature_invalid()!
local header = Header:new()!
header[Const.OAUTH_SIGNATURE] = “invalid”!
local req = Req:new({oauth_params = header })!
local conf = Conf:new()!
local oauth = OAuth1:new(conf, req)!
!
local res = oauth:authorize()!
assertEquals(res.code, Const.HTTP_UNAUTHORIZED)!
assertEquals(res.error, Const.ERROR_INVALID_SIGNATURE)!
end!
!
lu = LuaUnit.new()!
Lu:setOutputType(“tap”)!
os.exit(lu:runSuite())!
ngx.log(ngx.ERR, “oops”)!
ngx.log(ngx.ERR, “oops”)!
function get_oauth_params_from_auth_header()!
function get_oauth_params_from_auth_header(env)!
env = env or ngx!
local auth_hdrs = env.req.get_headers()[“Authorization”]!
...!
function get_oauth_params_from_auth_header(env)!
env = env or ngx!
local auth_hdrs = env.req.get_headers()[“Authorization”]!
...!
function get_oauth_params_from_auth_header(env)!
env = env or ngx!
local auth_hdrs = env.req.get_headers()[“Authorization”]!
...!
function TestRequest:test_retrieve_oauth_params_from_header()!
local header = [[Oauth realm=“example.com”, ]]!
.. [[oauth_consumer_key=“mykey”,]]!
.. [[oauth_version=“1.0”]]!
local ngx = StubNgx:new({ Authorization = header })!
local res = get_oauth_params_from_auth_header(ngx)!
assertEquals(“1.0”, res.oauth_version)!
...!
function TestRequest:test_retrieve_oauth_params_from_header()!
local header = [[Oauth realm=“example.com”, ]]!
.. [[oauth_consumer_key=“mykey”,]]!
.. [[oauth_version=“1.0”]]!
local ngx = StubNgx:new({ Authorization = header })!
local res = get_oauth_params_from_auth_header(ngx)!
assertEquals(“1.0”, res.oauth_version)!
...!
function TestRequest:test_retrieve_oauth_params_from_header()!
local header = [[Oauth realm=“example.com”, ]]!
.. [[oauth_consumer_key=“mykey”,]]!
.. [[oauth_version=“1.0”]]!
local ngx = StubNgx:new({ Authorization = header })!
local res = get_oauth_params_from_auth_header(ngx)!
assertEquals(“1.0”, res.oauth_version)!
...!
function TestRequest:test_retrieve_oauth_params_from_header()!
local header = [[Oauth realm=“example.com”, ]]!
.. [[oauth_consumer_key=“mykey”,]]!
.. [[oauth_version=“1.0”]]!
local ngx = StubNgx:new({ Authorization = header })!
local res = get_oauth_params_from_auth_header(ngx)!
assertEquals(“1.0”, res.oauth_version)!
...!
function TestRequest:test_retrieve_oauth_params_from_header()!
local header = [[Oauth realm=“example.com”, ]]!
.. [[oauth_consumer_key=“mykey”,]]!
.. [[oauth_version=“1.0”]]!
local ngx = StubNgx:new({ Authorization = header })!
local res = get_oauth_params_from_auth_header(ngx)!
assertEquals(“1.0”, res.oauth_version)!
...!
Roll Your Own API Management Platform with nginx and Lua
Roll Your Own API Management Platform with nginx and Lua
test
harness
nginx-oauth1.conf!
test
harness
nginx-oauth1.conf!
test
harness
nginx-oauth1.conf!
test
harness
nginx-oauth1.conf!
test
harness
def spec_using_valid_oauth_credentials(self, harness)!
auth = OAuth1(“mykey”, “mysecret”)!
body_data = “{‘function’: ‘tick’}”!
harness.reset_data()!
response = requests.post(root_url, data=body_data, auth=auth,!
headers={‘Content-Type’:!
‘application/json’})!
assert response.status_code == 200!
assert “Authorization” in harness.forwarded_headers!
assert “Oauth” in harness.forwarded_headers[“Authorization”]!
assert harness.forwarded_body == body_data!
def spec_using_valid_oauth_credentials(self, harness)!
auth = OAuth1(“mykey”, “mysecret”)!
body_data = “{‘function’: ‘tick’}”!
harness.reset_data()!
response = requests.post(root_url, data=body_data, auth=auth,!
headers={‘Content-Type’:!
‘application/json’})!
assert response.status_code == 200!
assert “Authorization” in harness.forwarded_headers!
assert “Oauth” in harness.forwarded_headers[“Authorization”]!
assert harness.forwarded_body == body_data!
def spec_using_valid_oauth_credentials(self, harness)!
auth = OAuth1(“mykey”, “mysecret”)!
body_data = “{‘function’: ‘tick’}”!
harness.reset_data()!
response = requests.post(root_url, data=body_data, auth=auth,!
headers={‘Content-Type’:!
‘application/json’})!
assert response.status_code == 200!
assert “Authorization” in harness.forwarded_headers!
assert “Oauth” in harness.forwarded_headers[“Authorization”]!
assert harness.forwarded_body == body_data!
def spec_using_valid_oauth_credentials(self, harness)!
auth = OAuth1(“mykey”, “mysecret”)!
body_data = “{‘function’: ‘tick’}”!
harness.reset_data()!
response = requests.post(root_url, data=body_data, auth=auth,!
headers={‘Content-Type’:!
‘application/json’})!
assert response.status_code == 200!
assert “Authorization” in harness.forwarded_headers!
assert “Oauth” in harness.forwarded_headers[“Authorization”]!
assert harness.forwarded_body == body_data!
def spec_using_valid_oauth_credentials(self, harness)!
auth = OAuth1(“mykey”, “mysecret”)!
body_data = “{‘function’: ‘tick’}”!
harness.reset_data()!
response = requests.post(root_url, data=body_data, auth=auth,!
headers={‘Content-Type’:!
‘application/json’})!
assert response.status_code == 200!
assert “Authorization” in harness.forwarded_headers!
assert “Oauth” in harness.forwarded_headers[“Authorization”]!
assert harness.forwarded_body == body_data!
def spec_using_valid_oauth_credentials(self, harness)!
auth = OAuth1(“mykey”, “mysecret”)!
body_data = “{‘function’: ‘tick’}”!
harness.reset_data()!
response = requests.post(root_url, data=body_data, auth=auth,!
headers={‘Content-Type’:!
‘application/json’})!
assert response.status_code == 200!
assert “Authorization” in harness.forwarded_headers!
assert “Oauth” in harness.forwarded_headers[“Authorization”]!
assert harness.forwarded_body == body_data!
def spec_using_valid_oauth_credentials(self, harness)!
auth = OAuth1(“mykey”, “mysecret”)!
body_data = “{‘function’: ‘tick’}”!
harness.reset_data()!
response = requests.post(root_url, data=body_data, auth=auth,!
headers={‘Content-Type’:!
‘application/json’})!
assert response.status_code == 200!
assert “Authorization” in harness.forwarded_headers!
assert “Oauth” in harness.forwarded_headers[“Authorization”]!
assert harness.forwarded_body == body_data!
capacity management
N = XR
# concurrent
requests
transaction
rate
response
time
API
Mgmt
client origin
1s2 req/s
API
Mgmt
client origin
1s2 req/s
N = XR = 2 req/s × 1s = 2 req
API
Mgmt
client origin
1s2 req/s
N = XR = 2 req/s × 1s = 2 req
API
Mgmt
client origin
1s2 req/s
N = XR = 2 req/s × 1s = 2 req
API
Mgmt
client origin
1s2 req/s
N = XR = 2 req/s × 1s = 2 req
API
Mgmt
client origin
1s2 req/s
N = XR = 2 req/s × 1s = 2 req
API
Mgmt
client origin
1s2 req/s
API
Mgmt
client origin
10s2 req/s
N = XR = 2 req/s × 10s = 20 req
API
Mgmt
client origin
10s2 req/s
N = XR = 2 req/s × 10s = 20 req
API
Mgmt
client origin
10s2 req/s
N = XR = 2 req/s × 10s = 20 req
API
Mgmt
client origin
10s2 req/s
N = XR = 2 req/s × 10s = 20 req
API
Mgmt
client origin
10s2 req/s
N = XR = 2 req/s × 10s = 20 req
API
Mgmt
client origin
10s2 req/s
N = XR = 2 req/s × 10s = 20 req
API
Mgmt
client origin
10s2 req/s
✗
N = XR = 2 req/s × 10s = 20 req
API
Mgmt
client origin
10s2 req/s
✗ ✗
N = XR = 2 req/s × 10s = 20 req
access_by_lua ...!
log_by_lua ...!
+1
-1
deployment
Roll Your Own API Management Platform with nginx and Lua
Version
Control
templates vault
(keys)
nginx.conf!ssh!
architecture
HAProxy HAProxy
VIP
. . .
<API>
DC1 DC2 DC3
VIP VIP VIP
entry-vip-dc1. A 10.1.0.1!
<foo> <foo>
<bar>
<bar>
foo-dc1. CNAME entry-vip-dc1.!
foo. CNAME foo-dc1.! (GSLB)
entry-vip-dc2. A 10.2.0.1!
entry-vip-dc3. A 10.3.0.1!
DC1 DC2 DC3
VIP VIP VIP
entry-vip-dc1. A 10.1.0.1!
<foo> <foo>
<bar>
<bar>
foo-dc1. CNAME entry-vip-dc1.!
foo. CNAME foo-dc1.! (GSLB)
entry-vip-dc2. A 10.2.0.1!
entry-vip-dc3. A 10.3.0.1!
DC1 DC2 DC3
VIP VIP VIP
entry-vip-dc1. A 10.1.0.1!
<foo> <foo>
<bar>
<bar>
foo-dc1. CNAME entry-vip-dc1.!
foo. CNAME foo-dc1.! (GSLB)
entry-vip-dc2. A 10.2.0.1!
entry-vip-dc3. A 10.3.0.1!
DC1 DC2 DC3
VIP VIP VIP
entry-vip-dc1. A 10.1.0.1!
<foo> <foo>
<bar>
<bar>
foo-dc1. CNAME entry-vip-dc1.!
foo. CNAME foo-dc1.! (GSLB)
entry-vip-dc2. A 10.2.0.1!
entry-vip-dc3. A 10.3.0.1!
DC1 DC2 DC3
VIP VIP VIP
entry-vip-dc1. A 10.1.0.1!
<foo> <foo>
<bar>
<bar>
foo-dc1. CNAME entry-vip-dc1.!
foo. CNAME foo-dc1.! (GSLB)
entry-vip-dc2. A 10.2.0.1!
entry-vip-dc3. A 10.3.0.1!
DC1 DC2 DC3
VIP VIP VIP
entry-vip-dc1. A 10.1.0.1!
<foo> <foo>
<bar>
<bar>
foo-dc1. CNAME entry-vip-dc1.!
foo. CNAME foo-dc1.! (GSLB)
entry-vip-dc2. A 10.2.0.1!
entry-vip-dc3. A 10.3.0.1!
Roll Your Own API Management with nginx and Lua
• nginx + Lua => great for HTTP middleware with a small
amount of custom logic
• Automated test and deployment pipeline with Vagrant,
Python, and Ansible
• Concurrent request limiting, not rate limiting
• Network architecture with operational flexibility
Presentation title (optional)67
Ad

Recommended

PDF
Lua tech talk
Locaweb
 
PDF
Using ngx_lua in UPYUN
Cong Zhang
 
PDF
Devinsampa nginx-scripting
Tony Fabeen
 
PDF
Bootstrapping multidc observability stack
Bram Vogelaar
 
PDF
Nginx-lua
Дэв Тим Афс
 
PDF
Static Typing in Vault
GlynnForrest
 
PDF
Using ngx_lua in UPYUN 2
Cong Zhang
 
ODP
Integrating icinga2 and the HashiCorp suite
Bram Vogelaar
 
PDF
RestMQ - HTTP/Redis based Message Queue
Gleicon Moraes
 
PDF
Puppet and the HashiStack
Bram Vogelaar
 
PDF
Observability with Consul Connect
Bram Vogelaar
 
PDF
Securing Prometheus exporters using HashiCorp Vault
Bram Vogelaar
 
PDF
Bootstrapping multidc observability stack
Bram Vogelaar
 
PDF
Testing your infrastructure with litmus
Bram Vogelaar
 
PDF
Redis & ZeroMQ: How to scale your application
rjsmelo
 
PDF
Node.js streaming csv downloads proxy
Ismael Celis
 
PDF
Using Node.js to Build Great Streaming Services - HTML5 Dev Conf
Tom Croucher
 
PDF
Using ngx_lua in upyun 2
OpenRestyCon
 
PDF
Top Node.js Metrics to Watch
Sematext Group, Inc.
 
PDF
Facebook的缓存系统
yiditushe
 
PDF
Redis as a message queue
Brandon Lamb
 
PPT
On UnQLite
charsbar
 
PDF
Codified PostgreSQL Schema
Sean Chittenden
 
PDF
Application Logging in the 21st century - 2014.key
Tim Bunce
 
PDF
Autoscaling with hashi_corp_nomad
Bram Vogelaar
 
PDF
Nko workshop - node js crud & deploy
Simon Su
 
PDF
4069180 Caching Performance Lessons From Facebook
guoqing75
 
PDF
Nodejs - A quick tour (v6)
Felix Geisendörfer
 
PPT
API Management architect presentation
sflynn073
 
PDF
Oracle api gateway overview
Oracle Corporation
 

More Related Content

What's hot (20)

PDF
RestMQ - HTTP/Redis based Message Queue
Gleicon Moraes
 
PDF
Puppet and the HashiStack
Bram Vogelaar
 
PDF
Observability with Consul Connect
Bram Vogelaar
 
PDF
Securing Prometheus exporters using HashiCorp Vault
Bram Vogelaar
 
PDF
Bootstrapping multidc observability stack
Bram Vogelaar
 
PDF
Testing your infrastructure with litmus
Bram Vogelaar
 
PDF
Redis & ZeroMQ: How to scale your application
rjsmelo
 
PDF
Node.js streaming csv downloads proxy
Ismael Celis
 
PDF
Using Node.js to Build Great Streaming Services - HTML5 Dev Conf
Tom Croucher
 
PDF
Using ngx_lua in upyun 2
OpenRestyCon
 
PDF
Top Node.js Metrics to Watch
Sematext Group, Inc.
 
PDF
Facebook的缓存系统
yiditushe
 
PDF
Redis as a message queue
Brandon Lamb
 
PPT
On UnQLite
charsbar
 
PDF
Codified PostgreSQL Schema
Sean Chittenden
 
PDF
Application Logging in the 21st century - 2014.key
Tim Bunce
 
PDF
Autoscaling with hashi_corp_nomad
Bram Vogelaar
 
PDF
Nko workshop - node js crud & deploy
Simon Su
 
PDF
4069180 Caching Performance Lessons From Facebook
guoqing75
 
PDF
Nodejs - A quick tour (v6)
Felix Geisendörfer
 
RestMQ - HTTP/Redis based Message Queue
Gleicon Moraes
 
Puppet and the HashiStack
Bram Vogelaar
 
Observability with Consul Connect
Bram Vogelaar
 
Securing Prometheus exporters using HashiCorp Vault
Bram Vogelaar
 
Bootstrapping multidc observability stack
Bram Vogelaar
 
Testing your infrastructure with litmus
Bram Vogelaar
 
Redis & ZeroMQ: How to scale your application
rjsmelo
 
Node.js streaming csv downloads proxy
Ismael Celis
 
Using Node.js to Build Great Streaming Services - HTML5 Dev Conf
Tom Croucher
 
Using ngx_lua in upyun 2
OpenRestyCon
 
Top Node.js Metrics to Watch
Sematext Group, Inc.
 
Facebook的缓存系统
yiditushe
 
Redis as a message queue
Brandon Lamb
 
On UnQLite
charsbar
 
Codified PostgreSQL Schema
Sean Chittenden
 
Application Logging in the 21st century - 2014.key
Tim Bunce
 
Autoscaling with hashi_corp_nomad
Bram Vogelaar
 
Nko workshop - node js crud & deploy
Simon Su
 
4069180 Caching Performance Lessons From Facebook
guoqing75
 
Nodejs - A quick tour (v6)
Felix Geisendörfer
 

Viewers also liked (13)

PPT
API Management architect presentation
sflynn073
 
PDF
Oracle api gateway overview
Oracle Corporation
 
PDF
WSO2Con EU 2016: Understanding the WSO2 API Management Platform
WSO2
 
PDF
Implementing API Facade using WSO2 API Management Platform
WSO2
 
PDF
Best Practices for API Management
WSO2
 
PPTX
API Management Platform Technical Evaluation Framework
WSO2
 
PPTX
Craft Conference 2015 - Evolution of the PayPal API: Platform & Culture
Deepak Nadig
 
PDF
WSO2Con ASIA 2016: Understanding the WSO2 API Management Platform
WSO2
 
PPTX
Gartner AADI Summit Sydney 2014 Implementing the Layer 7 API Management Pla...
CA API Management
 
PPTX
OAuth 101 & Secure APIs 2012 Cloud Identity Summit
Brian Campbell
 
PDF
Oracle API Gateway
Rakesh Gujjarlapudi
 
PDF
Open API and API Management - Introduction and Comparison of Products: TIBCO ...
Kai Wähner
 
PPTX
Securing RESTful APIs using OAuth 2 and OpenID Connect
Jonathan LeBlanc
 
API Management architect presentation
sflynn073
 
Oracle api gateway overview
Oracle Corporation
 
WSO2Con EU 2016: Understanding the WSO2 API Management Platform
WSO2
 
Implementing API Facade using WSO2 API Management Platform
WSO2
 
Best Practices for API Management
WSO2
 
API Management Platform Technical Evaluation Framework
WSO2
 
Craft Conference 2015 - Evolution of the PayPal API: Platform & Culture
Deepak Nadig
 
WSO2Con ASIA 2016: Understanding the WSO2 API Management Platform
WSO2
 
Gartner AADI Summit Sydney 2014 Implementing the Layer 7 API Management Pla...
CA API Management
 
OAuth 101 & Secure APIs 2012 Cloud Identity Summit
Brian Campbell
 
Oracle API Gateway
Rakesh Gujjarlapudi
 
Open API and API Management - Introduction and Comparison of Products: TIBCO ...
Kai Wähner
 
Securing RESTful APIs using OAuth 2 and OpenID Connect
Jonathan LeBlanc
 
Ad

Similar to Roll Your Own API Management Platform with nginx and Lua (20)

PDF
Securing APIs
WSO2
 
PPTX
OAuth1.0
G Jayendra Kartheek
 
PPTX
How to build Simple yet powerful API.pptx
Channa Ly
 
PPTX
Demystifying REST
Kirsten Hunter
 
PPTX
Enterprise Access Control Patterns for Rest and Web APIs
CA API Management
 
PDF
Rest api titouan benoit
Titouan BENOIT
 
PPTX
Best Practices in Building an API Security Ecosystem
Prabath Siriwardena
 
PDF
Draft Hammer Oauth 10
Vishal Shah
 
PDF
Bufferauthentication
Vishal Shah
 
PDF
How LinkedIn changed its security model in order to offer an API
LinkedIn
 
PPTX
REST API Security: OAuth 2.0, JWTs, and More!
Stormpath
 
PDF
Tips and tricks for building api heavy ruby on rails applications
Tim Cull
 
PPTX
API Management and Mobile App Enablement
CA API Management
 
PPTX
Enterprise Access Control Patterns for REST and Web APIs Gluecon 2011, Franco...
CA API Management
 
PDF
Authorization with oAuth
Vivastream
 
PDF
O auth how_to
vivaqa
 
PDF
How to build a scalable SNS via Polling & Push
Mu Chun Wang
 
PDF
Draft Ietf Oauth V2 12
Vishal Shah
 
PDF
OAuth and OEmbed
leahculver
 
PDF
RefCard RESTful API Design
OCTO Technology
 
Securing APIs
WSO2
 
How to build Simple yet powerful API.pptx
Channa Ly
 
Demystifying REST
Kirsten Hunter
 
Enterprise Access Control Patterns for Rest and Web APIs
CA API Management
 
Rest api titouan benoit
Titouan BENOIT
 
Best Practices in Building an API Security Ecosystem
Prabath Siriwardena
 
Draft Hammer Oauth 10
Vishal Shah
 
Bufferauthentication
Vishal Shah
 
How LinkedIn changed its security model in order to offer an API
LinkedIn
 
REST API Security: OAuth 2.0, JWTs, and More!
Stormpath
 
Tips and tricks for building api heavy ruby on rails applications
Tim Cull
 
API Management and Mobile App Enablement
CA API Management
 
Enterprise Access Control Patterns for REST and Web APIs Gluecon 2011, Franco...
CA API Management
 
Authorization with oAuth
Vivastream
 
O auth how_to
vivaqa
 
How to build a scalable SNS via Polling & Push
Mu Chun Wang
 
Draft Ietf Oauth V2 12
Vishal Shah
 
OAuth and OEmbed
leahculver
 
RefCard RESTful API Design
OCTO Technology
 
Ad

Recently uploaded (20)

PPTX
HYBRIDIZATION OF ALKANES AND ALKENES ...
karishmaduhijod1
 
PDF
Simplify Task, Team, and Project Management with Orangescrum Work
Orangescrum
 
PPTX
Threat Modeling a Batch Job Framework - Teri Radichel - AWS re:Inforce 2025
2nd Sight Lab
 
PPTX
Key Challenges in Troubleshooting Customer On-Premise Applications
Tier1 app
 
PDF
Digital Transformation: Automating the Placement of Medical Interns
Safe Software
 
PDF
CodeCleaner: Mitigating Data Contamination for LLM Benchmarking
arabelatso
 
PDF
Why Edge Computing Matters in Mobile Application Tech.pdf
IMG Global Infotech
 
PDF
A Guide to Telemedicine Software Development.pdf
Olivero Bozzelli
 
PPTX
AI for PV: Development and Governance for a Regulated Industry
Biologit
 
PPTX
From Code to Commerce, a Backend Java Developer's Galactic Journey into Ecomm...
Jamie Coleman
 
PDF
University Campus Navigation for All - Peak of Data & AI
Safe Software
 
PDF
Humans vs AI Call Agents - Qcall.ai's Special Report
Udit Goenka
 
PDF
Why Every Growing Business Needs a Staff Augmentation Company IN USA.pdf
mary rojas
 
PDF
How Automation in Claims Handling Streamlined Operations
Insurance Tech Services
 
DOCX
Enable Your Cloud Journey With Microsoft Trusted Partner | IFI Tech
IFI Techsolutions
 
PDF
CodeCleaner: Mitigating Data Contamination for LLM Benchmarking
arabelatso
 
PDF
OpenChain Webinar - AboutCode - Practical Compliance in One Stack – Licensing...
Shane Coughlan
 
PDF
Best Practice for LLM Serving in the Cloud
Alluxio, Inc.
 
PPTX
Simplify Insurance Regulations with Compliance Management Software
Insurance Tech Services
 
PDF
From Data Preparation to Inference: How Alluxio Speeds Up AI
Alluxio, Inc.
 
HYBRIDIZATION OF ALKANES AND ALKENES ...
karishmaduhijod1
 
Simplify Task, Team, and Project Management with Orangescrum Work
Orangescrum
 
Threat Modeling a Batch Job Framework - Teri Radichel - AWS re:Inforce 2025
2nd Sight Lab
 
Key Challenges in Troubleshooting Customer On-Premise Applications
Tier1 app
 
Digital Transformation: Automating the Placement of Medical Interns
Safe Software
 
CodeCleaner: Mitigating Data Contamination for LLM Benchmarking
arabelatso
 
Why Edge Computing Matters in Mobile Application Tech.pdf
IMG Global Infotech
 
A Guide to Telemedicine Software Development.pdf
Olivero Bozzelli
 
AI for PV: Development and Governance for a Regulated Industry
Biologit
 
From Code to Commerce, a Backend Java Developer's Galactic Journey into Ecomm...
Jamie Coleman
 
University Campus Navigation for All - Peak of Data & AI
Safe Software
 
Humans vs AI Call Agents - Qcall.ai's Special Report
Udit Goenka
 
Why Every Growing Business Needs a Staff Augmentation Company IN USA.pdf
mary rojas
 
How Automation in Claims Handling Streamlined Operations
Insurance Tech Services
 
Enable Your Cloud Journey With Microsoft Trusted Partner | IFI Tech
IFI Techsolutions
 
CodeCleaner: Mitigating Data Contamination for LLM Benchmarking
arabelatso
 
OpenChain Webinar - AboutCode - Practical Compliance in One Stack – Licensing...
Shane Coughlan
 
Best Practice for LLM Serving in the Cloud
Alluxio, Inc.
 
Simplify Insurance Regulations with Compliance Management Software
Insurance Tech Services
 
From Data Preparation to Inference: How Alluxio Speeds Up AI
Alluxio, Inc.
 

Roll Your Own API Management Platform with nginx and Lua