SlideShare a Scribd company logo
Nginx深度開發與客制化
——來⾃自阿⾥里巴巴的經驗
阿⾥里巴巴集團-核⼼心系統部
朱照遠(叔度)
2013-08-04
提綱
• 背景介紹
• 應⽤用案例
• 開發與客制化
• 進⾏行中的⼯工作
• 開源總結
1. 背景介紹
關於阿⾥里巴巴集團
⾯面對的技術挑戰
• 2012年淘寶、天貓的交易額為11600億元⼈人民幣
• 超過Amazon與eBay之和
• 四家網站的網路流量在全球排名前100(Alexa統計)
• taobao.com(#10) tmall.com(#42)
• alibaba.com(#72) alipay.com(#77)
• 2012年雙11⼤大促活動的⼀一些數據
• 雙11購物當天總銷售額191億⼈人民幣
• 第⼀一分鐘超過1000萬⼈人湧⼊入,1分鐘成交19.2萬筆交易
• 全天有2.13億獨⽴立訪客,佔中國⼤大陸網民總數40%
• CDN最⾼高峰值流量到達2100Gbps
使⽤用Nginx的過程
• 2009年開始使⽤用和探索
• 2010年開始開發⼤大量模組以滿⾜足業務
• 2011年開始修改Nginx的核⼼心
• 2011年12月將修改過的Nginx項⺫⽬目開源
• 項⺫⽬目名稱為Tengine
產⽣生的收益
• Nginx使得業務更加穩定
• 對⼤大連接數⺫⽬目⽀支援⾮非常好
• 佔⽤用記憶體⾮非常節省,更不會⽤用swap
• Nginx使得應⽤用的性能更⾼高
• QPS⽐比Apache⾼高
• 節省伺服器數⺫⽬目
• 基於Nginx的模組性能往往是之前業務的數倍
2. 應⽤用案例
Web接⼊入層
• 負載均衡
• SSL卸載
• 管理界⾯面
• 安全防禦
• 灰度發佈
• 靜態化與cache
⽤用⼾戶群消息服務
• 提供comet服務
• 60萬連接每臺伺服器
灰度發佈與A/B Testing
• 灰度發佈
• 逐漸放量測試
• ⽅方便的管理界⾯面
• 規則
• IP地址
• cookie值
• K/V存儲
⽇日誌收集與統計系統
• 阿⾥里的類似於Google Analytics系統
• JavaScript植⼊入
• 收集⽇日誌
• 分析統計資訊
• 內部實做
• Nginx模組
• 分佈式傳輸系統
• 在Hadoop上運⾏行MapReduce統計
• 性能
• 幾⼗十臺伺服器每天處理數百億query
• 單機處理能⼒力4萬QPS(短連接)
RESTful界⾯面層
• RESTful界⾯面⽀支援
• TFS(阿⾥里分佈式檔案系統,類似GFS)
• Tair(可以看作⼀一個分佈式的memcached
+ Redis)
• 簡化應⽤用開發
• 可返回JSON格式直接讓瀏覽器處理
• 從⽽而不必在伺服器做組裝
分佈式防攻擊系統
• 應對的問題
• HTTP層⾯面的DDoS攻擊
• 惡意的爬蟲
• 解決單機防護不知道全局資訊的問題
• TMD(Taobao Missle Defense)系統
• Nginx作為防攻擊系統的客⼾戶端
• TMD Server做策略分析
• TMD Console執⾏行彙總和控制檯
TMD系統架構圖
• consistent_hash模組
• 同⼀一對象到同⼀一台cache服務器
• 不會cache抖動
CDN系統
Tengine
Swift
Tengine
Swift
3. 開發與客制化
動態模組加載
• DSO (Dynamic Shared Object) ⽀支援
• 避免每次新加模組都要重新編譯binary
• 配置例⼦子
./configure --with-http_sub_module=shared
./dso_tool --add-module=/home/dso/lua-nginx-module
dso {
load ngx_http_lua_module.so;
load ngx_http_memcached_module.so;
}
流式上傳
• Nginx的問題
• 寫硬碟與記憶體佔⽤用之間的權衡,避免IO
• client_body_buffer_size的限制
• Tengine的實做
• proxy_request_buffering
• client_body_buffers
• client_body_postpone_size
組合JavaScript和CSS
• 根據Yahoo!前端優化第⼀一條原則
• Minimize HTTP Requests
• 減少三⽅方握⼿手和HTTP請求的發送次數
• 阿⾥里CDN combo
• concat模組,組合JavaScript和CSS
CDN combo的使⽤用
• 以兩個問號(??)激活combo特性
• 多個檔案之間⽤用逗號(,)分開
• ⽤用⼀一個?來表⽰示timestamp
• ⽤用來突破瀏覽器cache
• 例⼦子
• http://example.com??1.js,2.js,3.js?t=20130805
為⾴頁⾯面瘦⾝身
• trim模組
• 刪除HTML和內嵌JavaScript、CSS的註
釋和空⽩白符號
location / {
trim on;
trim_jscss on;
}
系統過載保護
• 監控系統條⺫⽬目
• 伺服器的load
• 記憶體的使⽤用(如swap的⽐比例)
• sysguard模組
• 可客制化保護返回的⾴頁⾯面
sysguard on;
sysguard_load load=4 action=/high_load.html;
sysguard_mem swapratio=10% action=/mem_high.html
多種⽇日誌⽀支援的⽅方式
• 本地和遠程syslog⽀支援
• 管道⽀支援
• 抽樣⽀支援(減少⽇日誌的條⺫⽬目數⺫⽬目)
access_log syslog:user:info:127.0.0.1:514 combined;
access_log pipe:/path/to/cronolog combined;
access_log /path/to/file combined ratio=0.01;
伺服器資訊調試
• footer模組
• 例⼦子(在⾴頁⾯面最後添加)
<!-- joshua Fri, 03 Aug 2013 08:24:43 GMT -->
footer $host_comment;
對於⾏行程設置的簡化
• 可以通過auto選項來⾃自動設置⾏行程數⺫⽬目
和CPU親和性
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100
00001000 00010000 00100000 01000000 10000000;
worker_processes auto;
worker_cpu_affinity auto;
user_agent模組
• 將瀏覽器、爬蟲輸出成變量
• 具體實做
• 使⽤用trie樹,O(n)的複雜度
• 對⽐比Nginx的browser模組是O(n^3)
增強了limit_req模組
• 多變量⽀支援
• ⽩白名單⽀支援
• 指定跳轉⾴頁⾯面⽀支援
• 同location下多limit_req⽀支援
• ⽀支援off選項
location / {
limit_req zone=one burst=5;
limit_req zone=two forbid_action=@test1;
limit_req zone=three burst=3 forbid_action=@test2;
}
主動健康檢查
• 發現後端伺服器失效的響應快
• L7的檢查使上線下線很⽅方便
• 後端伺服器的狀態監控⾴頁⾯面
• 可以檢查多種後端伺服器
• TCP/HTTP/HTTPS/AJP/MySQL/FastCGI
輸⼊入體過濾器
• 流式地做安全過濾
• 標準Nginx的問題
• POST體與記憶體之間的關係
• 性能與硬碟
• 已應⽤用場景
• 防hashdos/SQL注⼊入/XSS
動態腳本⽀支援
• Lua語⾔言的⽀支援
• ⽀支持各種phase
• ⽀支持header、body filter
• 性能和彈性的完美結合
• LuaJIT,和Java、C⼀一個量級
• ⽅方便修改,不需編譯
• 不必開發C的模組
Lua⽀支援的例⼦子
location /http_client {
proxy_pass $arg_url;
}
location /web_iconv {
content_by_lua '
local from, to, url = ngx.var.arg_f, ngx.var.arg_t, ngx.var.arg_u
local iconv = require "iconv"
local cd = iconv.new(to or "utf8", from or "gbk")
local res = ngx.location.capture("/http_client?url=" .. url)
if res.status == 200 then
local ostr, err = cd:iconv(res.body)
ngx.print(ostr)
else
ngx.say("error occured: rc=" .. res.status)
end
';
}
會話保持
• session_sticky模組
• 通過cookie實現客⼾戶端與伺服器做負載
均衡,後續訪問同⼀一台伺服器
upstream foo {
server 192.168.0.1;
server 192.168.0.2;
session_sticky;
}
server {
location / {
proxy_pass http://foo;
}
}
⼀一致性hash
• consistent_hash模組
• 防⽌止抖動
• 可以根據變量來hash
命令⾏行參數的完善
• 列出已經編譯的模組
• -m選項
• 列出已⽀支援的指令
• -l選項
• 列出配置檔案的全部內容
• -d選項
監控增強
4. 進⾏行中的⼯工作
計時器的優化
• 數據結構對⽐比
• rbtree
• minheap
• timer wheel
SO_REUSEPORT⽀支援
• epoll的驚群問題(Thundering Hurd)
• Google的patch
• 性能提升
後端keep_alive優化
• 超時時間限制
• 針對後端伺服器的pool
對10GE網路的良好⽀支援
• 10GE網卡跑滿做Load Balancer
• CPU要求還有⾜足夠的空閒
5. 開源總結
開源社區
• 發佈15個版本
• 核⼼心開發者7⼈人
• 貢獻者25⼈人
⾮非阿⾥里的外部⽤用⼾戶
• Internet Archive
• 騰訊
• ⼟土⾖豆
• 京東
• 酷六
• PPLive
• 鳳凰網
• 開源中國
• ...
參考資源
• 前⾯面講過的內容絕⼤大部分已經開源!
• Tengine的主⾴頁
• http://tengine.taobao.org
• Tengine的GitHub
• https://github.com/alibaba/tengine
• 歡迎參與Tengine開源項⺫⽬目!
阿⾥里開源情況
• 中國⼤大陸開源⼒力度投⼊入最⼤大的企業!
• https://github.com/alibaba
• 60個開源項⺫⽬目左右
• Linux kernel
• Hadoop
• LVS
• TFS/Tair
• ...
Q&A
• Thank you!

More Related Content

PDF
阿里开源经验分享
PDF
阿里CDN技术揭秘
PDF
阿里云CDN技术演进之路
PDF
Hacking Nginx at Taobao
PDF
Q con shanghai2013-赵永明-ats与cdn实践
PDF
阿里云技术实践
PDF
淘宝图片存储与Cdn系统
PDF
MySQL技术分享:一步到位实现mysql优化
阿里开源经验分享
阿里CDN技术揭秘
阿里云CDN技术演进之路
Hacking Nginx at Taobao
Q con shanghai2013-赵永明-ats与cdn实践
阿里云技术实践
淘宝图片存储与Cdn系统
MySQL技术分享:一步到位实现mysql优化

What's hot (20)

PDF
美团点评技术沙龙14:美团云对象存储系统
PDF
美团技术沙龙04 美团下一代分布式存储系统
PDF
美团点评技术沙龙14美团云-Docker平台
PPTX
阿里自研数据库 Ocean base实践
PPTX
如何针对业务做DB优化
PDF
从开发到上线-实战持续交付
PPT
新浪微博redis技术演化
PPT
新浪微博分布式缓存与队列-2013版
PDF
MySQL设计、优化、运维
PPTX
大规模数据库存储方案
PPTX
分布式缓存与队列
PDF
美团点评技术沙龙010-点评RDS系统介绍
PDF
高效Linux SA
PDF
新浪微博Feed服务架构
PDF
MySQL数据库设计、优化
PDF
Traffic server 管理员指南v1.0
PDF
Ceph intro
PDF
Kubernetes use-ceph
PDF
頑皮工坊 GCP 大冒險
PPTX
浅谈电商网站数据访问层(DAL)与 ORM 之适用性
美团点评技术沙龙14:美团云对象存储系统
美团技术沙龙04 美团下一代分布式存储系统
美团点评技术沙龙14美团云-Docker平台
阿里自研数据库 Ocean base实践
如何针对业务做DB优化
从开发到上线-实战持续交付
新浪微博redis技术演化
新浪微博分布式缓存与队列-2013版
MySQL设计、优化、运维
大规模数据库存储方案
分布式缓存与队列
美团点评技术沙龙010-点评RDS系统介绍
高效Linux SA
新浪微博Feed服务架构
MySQL数据库设计、优化
Traffic server 管理员指南v1.0
Ceph intro
Kubernetes use-ceph
頑皮工坊 GCP 大冒險
浅谈电商网站数据访问层(DAL)与 ORM 之适用性
Ad

Viewers also liked (18)

PDF
Nginx Internals
PDF
Tips on High Performance Server Programming
PPT
Montreal On Rails 5 : Rails deployment using : Nginx, Mongrel, Mongrel_cluste...
PDF
Nginx: Accelerate Rails, HTTP Tricks
PPT
Nginx internals
PPT
高性能Web服务器Nginx及相关新技术的应用实践
PDF
Lcu14 Lightning Talk- NGINX
PDF
Nginx conference 2015
PPTX
Delivering High-Availability Web Services with NGINX Plus on AWS
PPTX
Learn nginx in 90mins
PDF
Tuning TCP and NGINX on EC2
PPTX
NGINX Installation and Tuning
PDF
How to secure your web applications with NGINX
PPT
使用Nginx轻松实现开源负载均衡
PPTX
NGINX High-performance Caching
PPTX
The 3 Models in the NGINX Microservices Reference Architecture
PPTX
5 things you didn't know nginx could do
PDF
Extending functionality in nginx, with modules!
Nginx Internals
Tips on High Performance Server Programming
Montreal On Rails 5 : Rails deployment using : Nginx, Mongrel, Mongrel_cluste...
Nginx: Accelerate Rails, HTTP Tricks
Nginx internals
高性能Web服务器Nginx及相关新技术的应用实践
Lcu14 Lightning Talk- NGINX
Nginx conference 2015
Delivering High-Availability Web Services with NGINX Plus on AWS
Learn nginx in 90mins
Tuning TCP and NGINX on EC2
NGINX Installation and Tuning
How to secure your web applications with NGINX
使用Nginx轻松实现开源负载均衡
NGINX High-performance Caching
The 3 Models in the NGINX Microservices Reference Architecture
5 things you didn't know nginx could do
Extending functionality in nginx, with modules!
Ad

Similar to Nginx深度開發與客制化 (8)

PPTX
tengine(nginx with lua ) develop at 2013
PDF
Nginx+lua在阿里巴巴的使用
DOC
Nginx+常见应用技术指南
PPT
使用Nginx轻松实现开源负载均衡
PDF
Nginx+lua+py构建高性能处理服务
PDF
以Code igniter為基礎的網頁前端程式設計
PPT
高性能Web服务器Nginx及相关新技术的应用实践
PPT
高性能Web服务器Nginx及相关新技术的应用实践
tengine(nginx with lua ) develop at 2013
Nginx+lua在阿里巴巴的使用
Nginx+常见应用技术指南
使用Nginx轻松实现开源负载均衡
Nginx+lua+py构建高性能处理服务
以Code igniter為基礎的網頁前端程式設計
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践

Nginx深度開發與客制化