前言 关于Nginx,你了解多少一、Nginx简介 Nginx(enginex)是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。 1。1WEB服务器 Nginx可以作为静态页面的web服务器,同时还支持CGI协议的动态语言,比如perl、php 等。但是不支持java。Java程序只能通过与tomcat配合完成。Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表明能支持高达50000个并发连接数。 1。2反向代理 1。正向代理,代理客户端,客户端需要配置代理 2。反向代理,代理服务端,客户端无感知 1。3负载均衡 Nginx的异步框架可以处理很大的并发请求,把这些并发请求hold住之后就可以分发给后台服务端(backendservers,也叫做服务池,后面简称backend)来做复杂的计算、处理和响应,这种模式的好处是相当多的:隐藏业务主机更安全,节约了公网IP地址,并且在业务量增加的时候可以方便地扩容后台服务器。 这时候集群的概念产生了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服器,也就是我们所说的负载均衡。 1。4动静分离 为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。 Nginx部署静态资源,tomcat部署动态资源二、安装启动 Nginx官网 2。1相关安装包 pcre8。37。tar。gzopenssl1。0。1t。tar。gzzlib1。2。8。tar。gznginx1。11。1。tar。gz 2。2安装流程 2。1。1。安装pcre解压缩pcrexx。tar。gz包 进入解压缩目录,执行。configure 如果提示,需要提前安装gcc,进入安装光盘目录的软件包(mediaCentOSXXPackage)执行 rpmivhlibstdcdevel4。4。717。el6。x8664。rpm rpmivhgccc4。4。717。el6。x8664。rpm 。configure完成后,回到pcre目录下执行make,再执行makeinstall 2。2。2。安装openssl 解压缩opensslxx。tar。gz包。 进入解压缩目录,执行。config makemakeinstall 2。2。3。安装zlib解压缩zlibxx。tar。gz包。 进入解压缩目录,执行。configure。 makemakeinstall 2。2。4。安装nginx 解压缩nginxxx。tar。gz包。 进入解压缩目录,执行。configure。 makemakeinstall 查看开放的端口号 firewallcmdlistall 设置开放的端口号 firewallcmdaddservicehttppermanent sudofirewallcmdaddport80tcppermanent 重启防火墙 firewallcmdreload 2。3Nginx启动 命令 启动命令:在usrlocalnginxsbin目录下执行。nginx 关闭命令:在usrlocalnginxsbin目录下执行。nginxsstop 重新加载命令:在usrlocalnginxsbin目录下执行。nginxsreload 设置nginx为自启动服务 修改linux启动脚本etcrc。drc 加入:usrlocalnginxsbinnginx三、Nginx核心配置文件 nginx安装目录下,其默认的配置文件都放在conf目录下,而主配置文件nginx。conf也在其中,后续对nginx的使用基本上都是对此配置文件进行相应的修改。workerprocesses1;events{workerconnections1024;}http{includemime。keepalivetimeout65;server{listen80;location{indexindex。htmlindex。}}} 根据上述文件,我们可以很明显的将nginx。conf配置文件分为三部分 第一部分:全局块 从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行Nginx服务器的用户(组)、允许生成的workerprocess数,进程PID存放路径、日志存放路径和类型以及配置文件的引入等。 比如上面第一行配置的:workerprocesses1; 这是Nginx服务器并发处理服务的关键配置,workerprocesses值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。 第二部分:events块events{workerconnections1024;} events块涉及的指令主要影响Nginx服务器与用户的网络连接,常用的设置包括是否开启对多workprocess下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个wordprocess可以同时支持的最大连接数等。 上述例子就表示每个workprocess支持的最大连接数为1024。 这部分的配置对Nginx的性能影响较大,在实际中应该灵活配置。 第三部分:http块http{includemime。keepalivetimeout65;server{listen80;location{indexindex。htmlindex。}}} 这算是Nginx服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。 需要注意的是:http块也可以包括http全局块、server块。 http全局块 http全局块配置的指令包括文件引入、MIMETYPE定义、日志自定义、连接超时时间、单链接请求数上限等。 server块 这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。 每个http块可以包括多个server块,而每个server块就相当于一个虚拟主机。 而每个server块也分为全局server块,以及可以同时包含多个locaton块。 全局server块 最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。 location块 一个server块可以配置多个location块。 这块的主要作用是基于Nginx服务器接收到的请求字符串(例如servernameuristring),对虚拟主机名称(也可以是IP别名)之外的字符串(例如前面的uristring)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。四、Nginx配置实战反向代理 案例配置如下:server{listen80;location{proxypasshttp:localhost:8001;}locationdemo1{proxypasshttp:localhost:8001;}locationdemo2{proxypasshttp:localhost:8002;}} location指令说明 该指令用于匹配URL,语法如下:location〔〕url{} :用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配 成功,就停止继续向下搜索并立即处理该请求。 :用于表示uri包含正则表达式,并且区分大小写。 :用于表示uri包含正则表达式,并且不区分大小写。 :用于不含正则表达式的uri前,要求Nginx服务器找到标识uri和请求字 符串匹配度最高的location后,立即使用此location处理请求,而不再使用location 块中的正则uri和请求字符串做匹配。 注意:如果uri包含正则表达式,则必须要有或者标识。五、Nginx配置实战负载均衡 案例配置如下:http{upstreammyserver{serverlocalhost:8080weight1;serverlocalhost:8081weight1;}server{listen80;location{proxypasshttp:myserverproxyconnecttimeout10;}} 在linux下有Nginx、LVS、Haproxy等等服务可以提供负载均衡服务,而且Nginx提供了几种分配方式(策略): 轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 weight weight代表权重,默认为1,权重越高被分配的客户端越多指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 iphash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。六、Nginx配置实战动静分离 动静分离从目前实现角度来讲大致分为两种: 1。一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案; 2。另外一种方法就是动态跟静态文件混合在一起发布,通过nginx来分开。 通过location指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体Expires定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用Expires来缓存),我这里设置3d,表示在这3天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200。七、Nginx原理与优化参数配置 masterworkers的机制的好处 首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销, 同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会 影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的 worker进程。当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当 前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。 需要设置多少个worker Nginx同redis类似都采用了io多路复用机制,每个worker都是一个独立的进程,但每个进 程里只有一个主线程,通过异步非阻塞的方式来处理请求,即使是千上万个请求也不在话 下。每个worker的线程可以把一个cpu的性能发挥到极致。所以worker数和服务器的cpu 数相等是最为适宜的。设少了会浪费cpu,设多了会造成cpu频繁切换上下文带来的损耗。设置worker数量。workerprocesses4work绑定cpu(4work绑定4cpu)。workercpuaffinity0001001001001000work绑定cpu(4work绑定8cpu中的4个)。workercpuaffinity0000001000000100000010000001000 连接数workerconnection 这个值是表示每个worker进程所能建立连接的最大值,所以,一个nginx能建立的最大连接数,应该是workerconnectionsworkerprocesses。当然,这里说的是最大连接数,对于HTTP请求本地资源来说,能够支持的最大并发数量是workerconnectionsworkerprocesses,如果是支持http1。1的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是:workerconnectionsworkerprocesses2,而如果是HTTP作为反向代理来说,最大并发数量应该是workerconnections workerprocesses4。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。 八、nginx搭建高可用集群 注意:此部分属于高级技术,近几日会将下面的知识点补充完毕。 8。1KeepalivedNginx高可用集群(主从模式) 8。2KeepalivedNginx高可用集群(双主模式)