1.业内专家刘凯、冯浩、屈耀华、杨明翰、彭赫联袂力荐。 2.本书深入浅出地讲解了Nginx+Lua在实战场景中的各种使用技巧和方法,涉及配置、模块、缓存、日志分析、静态容灾、反向代理、爬虫、性能分析与优化等众多方面,帮助提升服务性能。 3.所有实战案例都有配套源码,方便读者学习和使用。
《Nginx实战:基于Lua语言的配置、开发与架构详解》主要讲解了Nginx在反向代理和应用开发中的作用,阅读本书可以了解Nginx在互联网开发中扮演的多个角色,充分利用这些角色的各项功能有助于提升服务的整体性能。《Nginx实战:基于Lua语言的配置、开发与架构详解》所介绍的大部分功能是通过Nginx+Lua进行开发和配置的,但并不要求读者精通Lua,在必要的位置本书会对Lua进行选择性讲解。涉及实战的内容会有配套源码,方便读者学习和使用。 《Nginx实战:基于Lua语言的配置、开发与架构详解》适合广大运维人员和开发人员学习,对使用Nginx完成各种服务架构感兴趣的架构师也可以阅读《Nginx实战:基于Lua语言的配置、开发与架构详解》。阅读本书需要有Nginx初级或中级配置经验。
王力 折800运维架构师,Nginx开发工程师,具有多年互联网相关项目的开发经验。喜欢使用小众技术完成运维、开发和测试任务,擅长通过架构设计降低开发难度,擅长搭建Nginx高性能服务。 汤永全 折800运维主管,具有多年互联网相关项目的运维工作经验。历经传统运维和互联网运维,一步一个脚印,积累了不少运维相关的经验和感悟。活跃于成都运维管理人员的线下组织“运维罗汉堂”。
合抱之木,生于毫末,学习技术也是一个循序渐进的过程。本书有基础知识,也有作者自我沉淀后的独创和感悟,完整地体现了一名开发人员从入门新技术到自成一家的成长历程。通过学习本书,读者可以快速上手Nginx开发,并跟随着作者成长的脚步,逐步成长为一名Nginx高手。 ——美团到家交易系统平台高级技术专家刘凯 本书深入浅出地讲解了Nginx+Lua在实战场景中的各种使用技巧,对于想入门Nginx和想提升Nginx开发技术的读者来说,阅读本书都将大有裨益。 ——聚美优品基础架构总监冯浩 微服务、CI/CD及Scrum一直以来都是大中型互联网公司的专属,其根本原因在于这些技术都需要较强大的硬件设备的支持,而其中尤为重要的是API网关、CI工具及容器编排调度系统,初创型公司很难同时具备所有满足需求的硬件设备。而本书在API网关方面给出了一个投入较少、实现快速的可行性解决方案,相信从事基础架构运维的读者能够从中获得启发。 ——货车帮运维中心负责人屈耀华 本书是作者多年来在Nginx方面技术积累及实践的结晶,读完本书后,相信大家也会和我一样惊讶于Nginx和Lua结合所产生的“化学反应”。本书详细阐述了对Nginx的佳实践,并深入剖析了日志分析和静态容灾系统的实现原理,细致地讲解了性能分析和优化的各种方法。相信本书定能给运维工程师、普通开发人员和架构师带来帮助和启发。 ——折800运维总监杨明翰 近几年来,使用Nginx来完成应用服务开发变得越来越热门,其低成本、高效率的开发模式受到业界喜爱,阿里巴巴、京东、又拍云、携程、微博、折800等众多互联网平台对其都有广泛应用。本书作者结合多年的Nginx实战经验,从反向代理、网关系统、Web应用开发等角度对Nginx+Lua进行了详细的介绍,并详细讲解了Nginx在整个业务体系中可以扮演的角色,为充分发挥Nginx的性能进行了有益的探索。 ——折800联合创始人彭赫
第1章Nginx学前必知11.1HTTP请求报文11.2HTTP响应报文21.3安装Nginx21.4支持HTTPS41.5添加模块41.6小结4第2章基础配置52.1Nginx指令和指令块52.2Nginx基本配置说明62.2.1Main配置62.2.2与客户端有关的配置72.2.3server块72.2.4location块82.3include的使用92.4常见配置92.4.1常见配置注解102.4.2常见配置实战技巧112.5内置变量132.5.1常见内置变量132.5.2常见内置变量实战技巧152.6小结16第3章强化基础配置173.1牢记Context标识173.2获取请求的IP地址183.2.1获取用户的真实IP地址183.2.2防止IP地址伪造193.2.3后端服务器对IP地址的需求193.3管理请求的行为203.3.1限制IP地址的访问203.3.2auth身份验证213.3.3利用LDAP服务加强安全223.3.4satisfy二选一的访问限制功能233.4proxy代理233.4.1proxy_pass请求代理规则243.4.2减少后端服务器的网络开销243.4.3控制请求头和请求体253.4.4控制请求和后端服务器的交互时间263.5upstream使用手册263.5.1代理多台服务器273.5.2故障转移283.5.3负载均衡293.5.4通过hash分片提升缓存命中率293.5.5利用长连接提升性能303.5.6利用resolver加速内部域名访问313.6rewrite使用手册323.6.1内部重定向323.6.2域名跳转333.6.3跳转POST请求343.6.4设置变量的值343.7限速白名单353.8日志363.8.1记录自定义变量363.8.2日志格式规范363.8.3日志存储373.9HTTP执行阶段383.10小结39第4章常用模块精解404.1定制HTTP头信息404.1.1使用ngx_http_headers_module设置响应头404.1.2使用headers-more-nginx控制请求头和响应头434.2第三方模块set-misc-nginx454.2.1设置变量464.2.2防止SQL注入464.2.3字符串非转义和转义474.2.4基于键值的集群分片484.2.5base编码484.2.6md5编码504.2.7生成随机数504.2.8本地时间的输出524.2.9实战经验524.3图片的处理534.3.1image_filter图片处理534.3.2采用渐进式方式打开JPEG图片554.3.3WebP格式564.3.4优化图片564.3.5实战经验:动态切图584.4TCP和UDP代理584.4.1代理配置说明584.4.2DNS服务的反向代理624.4.3MySQL集群代理配置624.4.4实战经验634.5常用模块介绍634.5.1基于访问IP地址跳转到对应城市634.5.2修改响应内容654.5.3零像素文件的生成及其作用664.5.4图片的防盗链674.6小结68第5章缓存系统695.1缓存配置说明695.2控制缓存有效期715.3性能优化725.3.1缓存未命中的最佳实践725.3.2横向扩展最佳实践755.3.3避免硬盘I/O阻塞765.3.4集群模式775.4高可用方案775.5proxy_cache配置模板785.6小结81第6章引入Lua826.1为什么要引入Lua826.2Lua和LuaJIT836.3环境搭建836.4Lua的数据类型846.5表达式896.6变量936.7流程控制956.8函数986.9模块1006.10Lua常见操作1026.11引入Lua的插曲1046.12小结105第7章Lua-Nginx-Module常用指令1067.1Nginx和OpenResty1067.2安装Ngx_Lua1077.3牢记Context标识1087.4Helloworld1087.5避免I/O阻塞1097.6定义模块搜索路径1097.7读/写Nginx的内置变量1107.8控制请求头1117.9控制响应头1137.10读取请求体1167.11输出响应体1217.12正则表达式1247.13子请求1307.14获取Nginx的环境变量1357.15定时任务1387.16常用指令1427.17提升开发和测试效率1497.18小结156第8章Ngx_Lua的执行阶段1578.1init_by_lua_block1578.2init_worker_by_lua_block1608.3set_by_lua_block1658.4rewrite_by_lua_block1688.5access_by_lua_block1698.6content_by_lua_block1708.8header_filter_by_lua_block1728.9body_filter_by_lua_block1738.10log_by_lua_block1768.11Lua和ngx.ssl1778.12Ngx_Lua执行阶段1778.13小结180第9章Nginx与数据库的交互1819.1安装cjson1819.2与MySQL交互1839.3与Redis交互1899.4与数据库交互的常见问题1949.5小结198第10章缓存利器19910.1worker进程的共享内存20010.2Lua模块下的共享内存20910.3当前请求在各执行阶段间的数据共享21310.4利用共享内存配置动态IP地址认证21510.5缓存和数据库的交互21810.6小结228第11章动态管理upstream22911.1实战需求分析23011.2ngx_http_dyups_module23011.3nginx-upsync-module23311.4基于balancer_by_lua_block的灵活控制23811.5小结239第12章Nginx日志分析系统24012.1实战需求分析24012.2ngxtop实时分析24112.3Flume方案的日志分析24312.4智能化nginx_log_analysis24412.5lua-resty-logger-socket传输方案24612.6时序数据库InfluxDB24912.7利用lua-resty-http实现API交互25412.8提升InfluxDB性能25512.9小结255第13章静态容灾系统25613.1荆棘之路25713.2设计之路25913.3架构流程图26113.4核心代码解说26413.5静态容灾的智能关闭方案26713.6小结269第14章深入挖掘反向代理27014.1验证码防御中心27014.2鉴权管理中心27214.3并行访问27414.4小结281第15章爬虫28215.1区分搜索引擎爬虫和恶意爬虫28215.2应对搜索引擎爬虫28415.3应对恶意爬虫28815.4小插曲——使用假数据迷惑恶意爬虫29015.5小结291第16章性能分析和优化29216.1性能分析场景搭建29216.2流量复制29516.3各项指标分析和优化建议29516.4检查全局变量30516.5小结305第17章值得拥有的OpenResty30617.1OPM30717.2使用DNS提升访问效率30917.3TCP和UDP服务31017.4多层级缓存31217.5lua-resty-core扩展31317.6字符串分割31317.7Nginx进程管理31317.8全局唯一标识符UUID31517.9“全家福”awesome-resty31617.10OpenResty,未来!316第18章开发环境下的常见问题31718.1被截断的响应体31718.2“邪恶”的if31718.3“贪婪”的正则匹配31818.4规范HTTP状态码31918.5规范URL31918.6proxy_set_header的误操作32018.7开发环境下的证书问题32018.8深层次的错误重定向32318.9压测环境下的限速和短连接32318.10小结323
Nginx自2004年发布第一个公开版本以来,就因其稳定性强、配置灵活、占用内存少、反向代理功能强大,而被越来越多的人喜爱和使用。随着人们对Nginx关注度的不断上升,Nginx有了更多的使用场景,但在大多数公司中仍然只是扮演着反向代理的角色。 笔者在折800电商平台(以下简称折800)工作多年,深感对一个电商平台来说,在成本控制和服务性能之间取得平衡是能够可持续发展的前提之一。与同类型且流量级别相近的公司相比,折800的计算机硬件成本要低很多,这主要得益于公司对软件技术的极致追求。在这样的背景下,我们热衷于研究Nginx反向代理等小众技术,并使用Nginx实现了大量功能,极大地提升了服务的性能和灵活度。 目前,Nginx在国内的影响力还比较有限,因此很多开发人员并不了解Nginx的魅力,笔者写这本书的目的就是和大家分享Nginx的使用技巧,并一起来推广Nginx。 市面上已经有一些介绍Nginx技术的书籍,但大多偏向于对Nginx配置和原理的讲解,还有一些书籍是基于C或C++来介绍Nginx模块的。这样的书籍要求读者对Nginx的原理和源码有所了解,甚至还要有深厚的C语言或C++语言的开发功底,这对大多数初学者来说要求太高了。 怎样才能做到既发挥出Nginx的威力,又尽量降低学习成本呢?笔者选择使用OpenResty的核心组件,因为OpenResty是Nginx+Lua的完美结合,它既能够实现Nginx的异步功能,又兼有Lua的易学优势,这样,在使用Nginx进行开发的过程中就不需要深入了解Nginx的原理了(如果已经掌握了Nginx原理当然更好)。所以,与市面上的大多数同类书籍不同,本书不会过多介绍Nginx配置和原理方面的内容,学习难度较低。 近几年来,OpenResty的热度不断上升,各大互联网公司纷纷尝试使用Nginx+Lua的开发模式,在反向代理、网关系统、API调度服务中都能看到这种开发模式的“身影”。希望本书可以让更多的开发人员了解Nginx+Lua的魅力,也让更多技术团队能够合理地使用Nginx,降低硬件的投入成本,同时提升服务的性能。 本书由王力、汤永全编写。全书内容共分18章,其中第1~5章介绍Nginx常见的配置方式,属于Nginx的入门知识;第6~10章对Nginx+Lua核心功能进行解读,是熟悉Nginx+Lua开发模式的必备知识;第11~18章是Nginx+Lua开发模式在实际业务中的实践应用,是灵活运用该模式的具体体现。 感谢杨明翰、冯浩、刘凯、屈耀华对本书的支持;也感谢折800技术平台,在这里我得到了持续的历练和成长。同时,感谢电子工业出版社博文视点的编辑付睿和崔志伟,他们在本书的语言表述方面给了很多建议。 本书包含了作者的技术实践,如果你对本书内容有任何建议和疑惑,可以发电子邮件至leehomewl@gmail.com。谢谢! 王力 2018年12月