Nginx学习总结
2017年2月23日, 星期四
Nginx学习总结
Nginx是目前比较主流的HTTP反向代理服务器(其企业版提供了基于TCP层的反向代理插件),对于构建大型分布式web应用,具有举足轻重的作用。简单来说,nginx有2个主要的功能:动/静态资源分离、负载均衡。
动/静态资源分离:nginx支持正则表达式以区分静态资源或者动态资源,其中动态资源可以进一步转发给后端的proxy server,而静态资源则可以在nginx层面使用本地缓存策略或者重定向(类CDN)到其他nginx上。
负载均衡:对于动态资源而言,如果有多个proxy server,那么nginx将会根据一定的算法选择合适的server,并转发请求,最终将客户端request相对均衡的分发给多个server。
Nginx作为“单点”,面向客户端请求,并将请求转发给后端的某个server,因为server可以有多个,那么从整体而言,提升了站点的“资源整合”能力,提升了站点的整体吞吐能力;但因为受限于nginx本身的IO模型,并没有“降低”对物理资源的消耗(即性能开支);通常nginx作为整个站点的“避雷针”和导流通道,它应该被架设在物理资源较为优越的机器上,比如8U物理机,32核心,64G内存,对磁盘要求相对较低,对CPU、内存、网卡带宽有较高的要求,因为nginx不仅需要和客户端请求建立链接,而且还需要与后端proxy server建立链接并且负责流量输入、输出(这和LVS、Haproxy有本质区别),这种双倍的链接建立,就要求机器具有较高的内存和CPU,如果你的nginx还有大量的“静态资源”cache,还需要使用高速、高容量的磁盘。因为nginx节点最终为所有proxy server流量的总和,那么它应该具有更高的网卡带宽。
为了避免资源竞争,应该避免nginx和web server部署在同一个节点上,因为web server通常为CPU和内存高耗型,这会大大降低nginx的代理能力。
1) 在中小型应用中(PV在KW级别,单一垂直web应用),通常一个nginx代理多个(组)server即可。
2)对于大中型应用,一个nginx将无法支撑全部的流量,我们将会采用多个nginx代理(复制了1)中的架构模型),并在nginx前端继续构建高性能的分流设备,比如LVS、Haproxy等更低层的软/硬件负载均衡器,这种负载均衡器通常只是“转发”,而不涉及到流量的输出,所以转发效率将会更高,承载能力更强。
3)无论何时,我们也不希望nginx存在单点故障问题,那么通常我们还需要使用keepalived(其他同类型技术,VIP)来提高nginx节点的可用性,即Master-backup模式。
4)当有多个nginx时,为了提升后端server的代理能力,通常还会让多个nginx之间交叉重叠代理后端的server。
一、常用模块
在nginx 中,有几个常用的模块(module):
- ngx_http_core_module:核心模块;内置模块。
- ngx_http_upstream_module:“upstream”模块,内置模块,核心模块;用于请求的“负载均衡”。
- ngx_http_proxy_module:“请求代理”模块,核心模块;将请求转发给代理Server,或者对请求进行额外的cache操作。
- ngx_http_rewrite_module:“URL重写”模块,内置模块;根据规则,rewrite特定的URL并转发给代理Server。
- ngx_http_access_module:“访问控制”模块;“允许”或者“拒绝”特定的IP列表对server的访问,内置模块。
- ngx_http_limit_conn_module:“访问控制”模块;可以限定每个key(可以为客户端IP)允许的最大并发连接数,内置模块。
- ngx_http_limit_req_module:“访问控制”模块;可以限定每个key(可以为客户端IP)在单位之间内允许处理的request个数,“流量控制”,内置模块。
- ngx_http_headers_module:“header”模块;主要是“add_header”和“expired”两个指令,向response中添加header信息,内置模块。
- ngx_http_charset_module:“字符集”模块;在响应头部的“Content-Type”中增加charset信息,内置模块。
- ngx_http_addition_module:“增添”模块;在response内容之前或者之后额外添加文本信息,内置模块。
- ngx_http_sub_module:“后置修改响应”模块;可以过滤并替换response内容中特定的字符串,附加模块,需要在编译时指定“--with-http_sub_module”。
- ngx_http_fastcgi_module:将请求发送给“fastcgi”服务器,内置模块。
- ngx_http_geo_module:“geo”模块;创建一个变量,此变量的值由client ip值决定,对实现小型私有“CDN”方案有参考价值,内置模块。
- ngx_http_geoip_module:“geo”模块;通过配置(数据源)可以得知client ip所属的“城市”、“区域”等信息,对实现小型私有的CDN有一定的参考价值,附加模块,需要在编译时指定“--with-http_geoip_module”。
- ngx_http_gzip_module:“gzip”模块;对response使用gzip压缩,对减少数据传输量有益,内置模块。
- ngx_http_gzip_static_module:“gzip”模块;对response使用gzip压缩,输出为“.gz”文件,附加模块,需要在编译时指定“--with-http_gzip_static_module”。
- ngx_http_image_filter_module:“图片”模块;可以对“JPEG”、“GIF”、“PNG”格式的图片进行裁剪等操作,附加模块,需要在编译时指定“--with-http_image_filter_module”。
- ngx_http_status_module/ngx_http_stub_status_module:“nginx内部状态”模块;用于获取nginx内部的一些状态统计信息,通常用来获取一些简单的统计数据,其中nginx_http_stub_status_module为附加模块,编译时需要指定“--with-http_stub_status_module”。
- nginx-http-concat:第三方附加模块,由taobao开发,主要用于合并“静态资源”请求,提升性能,需要额外下载,并在编译时添加“--add-module=/root/software/nginx-http-concat-master”。
- ngx_cache_purge:第三方附件模块,由frickle提供,当在proxy中使用cache保存静态资源时,那么cache_purge模块提供删除过期数据的功能支持,需要额外下载,并在编译时添加“--add-module=/root/software/ngx_cache_purge”。
二、安装(mac下)
接下来,我们就尝试安装nginx,从官网下载最新版1.8.0压缩包,并按照如下步骤一次安装,本人所使用的平台为mac OS(很遗憾,mac下安装这些软件,还是相当的费劲)。为了方便起见,我们将上述常用的module一次性全部安装或者加载(避免以后重新增加module带来的麻烦)。下文中所下载的软件都先保存到/usr/local/src下。
1、下载ngx_cache_purge模块:http://labs.frickle.com/nginx_ngx_cache_purge/,解压后保存在本地目录。
2、下载ngx-http-concat模块:https://github.com/alibaba/nginx-http-concat,解压后保存在本地目录。
3、下载nginx并解压,保存在/usr/local/src,重命名为“nginx-1.8.0-src”。
4、configure操作,通过--prefix指定nginx最终的可执行文件copy到哪个目录,这个目录不需要提前创建。
- --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --add-module=/usr/local/src/nginx-http-concat-master --add-module=/usr/local/src/ngx_cache_purge/
- ;
- ;
- ;
- ;
- ;
- ;
- /404.html;
- 502 503 504 /50x.html;
- default_server;
- ;
- ;
- ;
- ;
- ;
- default_server;
- ;
- default_server;
- max_fails=3 fail_timeout=10s;
- :2 keys_zone=cache_one:64m inactive=1d max_size=30g;
六、HTTPS配置
https突然风靡起来,就连小论坛也开始用https,显的很技术派,似乎它的低性能的缺点并没有想象的那么可怕。在实际环境中,nginx和后端的web server均可以支持htps,为了架构的简单性,以及不希望web协议干扰程序的实现,我们通常在nginx这一次支持https,而在web server层(比如tomcat)则继续使用http协议。配置样例如下:
- ;
- ;
- ;
- ;
- ;
- TLSv1.1;
- ;
- ;
- ;
- ;
- 32k;
- ;
- ;
- ;
- ;
- 64k;
- ;
- ;
- ;
- 32k;
- 16k;
- ;
- ;
- ;
- ;
- ;
- ;
- ;
- ;
- ;
- ;
- ;
- TLSv1.1;
- ;
- ;
- 天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。
- :2 keys_zone=cache_one:256m inactive=1d max_size=30g;
- ;
- 304 30d;
- 302 404 1m;
- ;
- $is_args$args;
- # }
- #https://github.com/FRiCKLE/ngx_cache_purge/
- access_log /home/wwwlogs/static.example.org.log access;
- }
Nginx学习总结的更多相关文章
- Nginx学习回顾总结 部分:
21:46 2015/11/9Nginx学习回顾总结进程间通信,近似于socket通信的的东西:才发现这种通信并不是很难,并不是我想象的那样很多内容,新领域,入门只是几个函数的使用而已.以前猜过是这样 ...
- Nginx学习笔记4 源码分析
Nginx学习笔记(四) 源码分析 源码分析 在茫茫的源码中,看到了几个好像挺熟悉的名字(socket/UDP/shmem).那就来看看这个文件吧!从简单的开始~~~ src/os/unix/Ngx_ ...
- Nginx学习笔记~目录索引
回到占占推荐博客索引 前几天整理了<Docker的学习笔记索引>,受到了很多朋友的关注,今天把Nginx的文章也整理一下,以后将永久更新,像大叔之前的<EF文章系列>,< ...
- Nginx学习系列二Linux下Nginx实现负载均衡
关于在本地虚拟机(VMware 14)下安装Linux同时安装Nginx,请参考Nginx学习系列之搭建环境 1.启动Nginx 在Nginx安装成功的前提下,启动Nginx 已root模式登陆(权限 ...
- Nginx系列0:Nginx学习历程
Nginx学习历程 一.初识Nginx 1.Nginx适用于哪些场景 (1)静态资源服务 通过本地文件系统提供服务 (2)反向代理服务 Nginx的强大性能 缓存 负载均衡 (3)API服务 Open ...
- nginx 学习资料
nginx 学习资料 table th:first-of-type { width: 90px; } table th:nth-of-type(2) { } table th:nth-of-type( ...
- nginx 学习笔记(2) nginx新手入门
这篇手册简单介绍了nginx,并提供了一些可以操作的简单的工作.前提是nginx已经被安装到你的服务器上.如果没有安装,请阅读上篇:nginx 学习笔记(1) nginx安装.这篇手册主要内容:1. ...
- Nginx学习---Nginx的详解_【all】
1.1. Nginx简介 1.什么是nginx nginx:静态的,开源的www软件,可以解析静态的小文件(低于1M ),支持高并发占用较发少的资源(3W并发,10个进程,内存150M),跨平台 te ...
- Nginx学习之从零搭建静态资源网站
前言 在某学习网站学习了nginx的安装和使用,以此文记录. 环境准备 安装在VMWare下的Centos虚拟机.由于我这是新装的虚拟机.所以很多插件都没有,这里干脆一次性安装上. wget ...
随机推荐
- 杂谈---这些大忌,你在面试的时候发生过吗?(NO.1)
面试是大部分人的人生当中难免会遇到的一件事,那么具体在面试当中有哪些忌讳呢? 说到面试,在这里尤其特指技术岗位的面试,很多时候,结果并不仅仅取决于你的技术广度与深度,亦或是你的笔试 ...
- 机器学习英雄访谈录之 DL 自由职业者:Tuatini Godard
目录 机器学习英雄访谈录之 DL 自由职业者:Tuatini Godard 正文 对我的启发 机器学习英雄访谈录之 DL 自由职业者:Tuatini Godard Sanyam Bhutani 是 M ...
- java中多态的实现机制
多态的概念: 简单来说就是事物在运行过程中存在的不同状态,即父类或接口定义的引用变量指向子类或具体实现类的实例对象.程序调用方法在运行期才进行动态绑定,而不是引用变量的类型中定义的方法. 多态存在的前 ...
- Alpha版本事后诸葛亮
目录 设想和目标 计划 资源 变更管理 设计/实现 测试/发布 团队的角色,管理,合作 总结: 本小组和其他组的评分 分工和贡献分 全组讨论的照片 问题 第一组提问回答:爸爸饿了队 第二组提问回答:拖 ...
- 如何用Qt自动拷贝exe依赖的dll
QT生成的.exe文件不能运行的解决办法 之前的数独项目的GUI,当我的Qt项目生成exe时,由于缺少了相关的依赖dll文件,打开会一直报缺少依赖文件的错: 然后一开始我到安装的Qt文件夹里把这些有Q ...
- 2013长春网赛1010 hdu 4768 Flyer
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4768 题意:有n个社团发传单,每个社团发给编号为A_i, A_i+C_i,A_i+2*C_i,…A_i ...
- MySQL基础(一):基本操作
一.下载安装及连接 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是 ...
- UML时序图学习
定义 时序图主要用于展示对象之间交互的顺序. 时序图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色用一 ...
- 怎样实现在DBGrid中双击选择整行,并且可以多选?谢谢!!
DBGrid1->Options里有个dgMultiSelect,把它设为true就能多选了 先设置DBGrid1->options中dgRowSelect = true, dgMulti ...
- BZOJ2743 HEOI2012采花(离线+树状数组)
如果能够把所有区间内第二次出现某颜色的位置标记出来,树状数组查询一下就可以了. 考虑离线.按左端点从小到大排序,不断移动左端点并更新第二次出现的位置. #include<iostream> ...