Nginx学习总结

时间:2023-11-12 12:16:20

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学习总结

一、常用模块

在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到哪个目录,这个目录不需要提前创建。

  1. --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/
  2. ;
  3. ;
  4. ;
  5. ;
  6. ;
  7. ;
  8. /404.html;
  9. 502 503 504  /50x.html;
  10. default_server;
  11. ;
  12. ;
  13. ;
  14. ;
  15. ;
  16. default_server;
  17. ;
  18. default_server;
  19. max_fails=3 fail_timeout=10s;
  20. :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协议。配置样例如下:

  1. ;
  2. ;
  3. ;
  4. ;
  5. ;
  6. TLSv1.1;
  7. ;
  8. ;
  9. ;
  10. ;
  11. 32k;
  12. ;
  13. ;
  14. ;
  15. ;
  16. 64k;
  17. ;
  18. ;
  19. ;
  20. 32k;
  21. 16k;
  22. ;
  23. ;
  24. ;
  25. ;
  26. ;
  27. ;
  28. ;
  29. ;
  30. ;
  31. ;
  32. ;
  33. TLSv1.1;
  34. ;
  35. ;
  36. 天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。
  37. :2 keys_zone=cache_one:256m inactive=1d max_size=30g;
  38. ;
  39. 304 30d;
  40. 302 404 1m;
  41. ;
  42. $is_args$args;
  43. # }
  44. #https://github.com/FRiCKLE/ngx_cache_purge/
  45. access_log  /home/wwwlogs/static.example.org.log  access;
  46. }