Nginx笔记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx笔记相关的知识,希望对你有一定的参考价值。
- alias和root区别,root指定了根目录,在定位资源的时候,是root+匹配部分+资源(没有指定使用index指令指定);alias则是重写location请求uri,定位资源就是alias+资源;注意alias一定是要全路径的,之前配置了相对路径导致了无法获得;
- nginx作为一个代理服务器,有几个点需要配置:
首先,代理的基本设置,服务器组,设定权重,以及在location中声明跳转的组;
其次,改写请求信息,包括对header,body,location的改写;其中有一个改写比较特殊,就是跳转机器的改写:proxy_next_stream,通过设定这个配置,如果发生了诸如被代理服务器宕机,将自动跳转到下一个服务器上面;
第三,设定Buffer,Buffer的作用在于积累一定的相应再一次性返给客户端;
第四,设定Cache,Cache的Buffer的区别在于前者数据会被多次使用,后者一次性推送到客户端之后就无法再次使用;Cache有一个配置比较有用,就是store,不占用内存,没有过期,对于静态数据的获得很有好处; - 负载均衡有几种模式:
第一种是一般轮训,大家机会均等;
第二种,加权轮训,通过在upstream块中指定weight,其实第一种方式只不过使用了weight=1的默认权值而已;
第三种,分组均衡,就是定义n组upstream,在对不同的资源进行请求的时候(通过在location中配置),跳转到不同的upstream组; - Nginx的Server-location块正常情况下,匹配到了一个location之后,就不会再走别的location了,但是rewrite指令有一个参数,last的意思就是里跳出当前location(后面的逻辑也不走了),重新匹配location;break,则是继续走当前的location,不过呢,URI就是改写之后那个URI了;后面的逻辑处理都是基于这个新的URL进行的;
- Nginx最根本的职责是定位资源,基于这个职责有几种角色:
第一个就是Web服务器,location块中定位的资源是本地html页面;
第二个是代理服务器,location块中定位资源是本机之外的资源; - 代理和重写最大的区别在于:代理的浏览器地址是不变的,这意味着代理不会通知浏览器地址的变更,也意味着浏览器将会少跳转一次;我使用fiddler进行抓取,对于重写,浏览器其实请求了两次;对于代理,浏览器只是请求了一次;
- 代理和重写最大的区别在于:代理的浏览器地址是不变的,这意味着代理不会通知浏览器地址的变更,也意味着浏览器将会少跳转一次;我使用fiddler进行抓取,对于重写,浏览器其实请求了两次;对于代理,浏览器只是请求了一次;
- nginx测试一个问题就是浏览器的缓存,我一般采用单独让firefox用于测试nginx,然后设置缓存区大小为0;选项-高级-网络中进行设置;
- 在指定rewrite的时候一定要为目标地址加上协议前缀(schema)http://;以为rewrite解析的是URI;rewrite指令有两个参数,regex和replacement,regex是一个正则匹配的表达式,最简单的形式就是网站的一部分,replacement则是一个URI(或者其自己URL)形式的一个参数;URI的结构形式为:schema:[//][[用户名[:密码@]主机名[:端口号]][/资源路径],URL的结构形式为:Schema://主机名[:端口号][/资源路径]("[]"部分为可选);可见,对于relacement参数的格式至少要符合URL,所以协议前缀是一定要添加的;
- $host只是主机,我曾经以为$host是整个请求字符串,尝试$host ~ 112\.74\.92\.187\/tao进行匹配但是总是失败(浏览器中输入112.74.92.187/tao),后来猛然醒悟到host只是介于schema和资源定位之间的那部分主机信息;
- 对于$request是一个请求体,包含Get Http/1.1之类的内容,$uri以及requet_uri通过Server节点获取都是/,不知道原因是什么;
- 镜像的机制是主网站提供一下到各个镜像的链接,镜像请求集中想一个nginx请求,然后又nginx根据请求url的不同,再跳往各个真实的镜像地址;比如mirror1.request.com,mirro2.request.com其实都是映射到同一个IP(台机器)上面,通过nginx将各个镜像进行委派;之所以这样做是因为可以通过配置nginx来改变镜像的地址,如果某个镜像出现问题,想要引导到其他IP,通过配置nginx即可;如果只是该页面呢?很多页面值都是从数据库重定义的,是否还要让数据库管理员来做?如果想要把这部分任务通过运维管理起来,那么放置到nginx,如果发生短暂的意外,只需要修改配置文件即可;
- rewrite命令中的flag,last:使用重写后的url重新再location块中执行(这个flag小心循环执行,如果重写后的地址仍然能够被同一个location匹配的话),break:使用重写后的url继续执行,redirect,将重写后的地址返回给客户端,跳转编码设定为301(临时跳转),这个flag只适用于非http/https协议;permanent:跳转编码设定为302,不在继续执行,直接将重写的地址返回给客户端;
- Nginx是模块化的架构,主要由五部分组成:Core(进程管理模型,日志,配置),Http(URI解析,gzip),Optional-Http(https支持,图片旋转), Mail,Third-Part;
- Web请求处理机制:Apache是每个请求都创建一个进程,Nginx则是创建一个线程;前者模型简单,后者节约资源;
- 同步/异步以及阻塞/非阻塞,同步异步是指请求方的请求进程在发送请求后(等待回应)是否挂起,阻塞非阻塞则是指接收方收到请求后,在等待IO处理的时候是否挂起;异步非阻塞的处理机制通常是非常高效的;
- 事件驱动机制,和传统的顺序驱动实现了解耦,通过事件收集器进行解耦;组成部分:事件接收器(队列+轮训器),事件发送器(dispatcher)以及事件处理器;
- Nginx提供的事件驱动模型:select,poll,这两者区别在于select是维护三个队列,读,写,异常,poll只是维护一个队列,不过在事件描述中增加了类型描述;epoll这是poll的升华,等待着内核通知变更,避免了整个队列轮训(一旦队列数量很大,效率损耗更大了);但是windows不支持poll以及epoll;
- 对Nginx进行系统参数优化,从IPv4(系统参数),网络连接(nginx),CPU(nginx)以及事件驱动(nginx)四个方面进行优化;
- 对Nginx进行系统参数优化,从IPv4(系统参数),网络连接(nginx),CPU(nginx)以及事件驱动(nginx)四个方面进行优化;
- IIS,apache这些发布工具的用意其实和Nginx是一样的:处理socket请求;所以你会发现及时没有部署到IIS/apache,在浏览器中敲入localhost:8093依然可以出发nginx的处理,因为nginx在监听所有的对于8093端口的请求,即使没有发布;同样道理,对于nginx的功能监听到了对于某个端口的请求,然后把这个请求进行处理:发送给另外一个具有监听功能的对象,可以是nginx,可以使IIS,可以是tomcat;其实这些和http有关系,在浏览器中敲入路径默认就是http协议来对请求进行编码处理(可以通过前缀ftp等来强制协议,如此,nginx也就无法监听到该请求,因为nginx的配置是在http块中,这意味着只是监听http协议);tomcat其实还有很大的一块:内置了对于servlet集成,所以JSP以及servlet开发可以在tomcat中跑;
- nginx.pid是一个nginx启动完毕之后创建的文件;
- 配置文件需要nginx -s reload才能够实现修改配置生效,加载配置文件是master进程的事情,首先会check文件是否合法,合法了将会通知旧有的worker进程消退,创建新的worker进程;
- nginx -s reopen则是用来重新打开nginx的日志文件,因为mv文件之后,因为文件的inode信息不变,所以系统的日志仍然输出到旧有的文件中去;所以需要reopen来重新定位日志文件inode(日志流将根据新的inode输出到对应的日志文件的);
- nginx -s stop | quit,前者是快速,后者则是优雅的等待各个进程处理完毕当前任务后,优雅的退出;stop意思是停止,立即,quit,则是退出,不急不忙之意;
- 在server中配置location块,其本质含义是对请求的uri进行匹配,进而决定将请求如何进行处理;处理有两种方式,一种是匹配部分是和物理的路径一直,这个时候需要指定root来让root+匹配路径+index一起来定位物理路径下的网页(如果uri中未指定请求的具体资源,如果指定了,比如http://localhost:8093/server1/location1/pptv.htm,就不需要附加index部分);另外一种方式是匹配的路径和物理路径无关,这个时候需要配置alias,alias是完整的请求路径名称,可能是物理路径,也可能是一个http请求路径;
- Rewrite的本质其实是向客户端(浏览器)回应了(response)一个重定向指令(附带着重写的地址),客户端接收后,将会设置浏览器的地址栏,然后再次向重写的地址发送请求;
- 如果想要把外部请求转接为外部资源,需要在location中配置proxy_pass,这样匹配的请求将会被重定位到proxy_pass资源;代理服务器有两种,一种是正向代理,一种是反向代理,正向代理,请求端和代理服务器一般是在同一个局域网,对于请求进行处理转接,可以理解为请求方来自内部,需要代理服务器将请求资源定位到互联网或者内部网络;反向代理则是请求方来自外部,需要代理服务器定位到本地(网络)内资源;
- nginx启动只要在命令行中敲入nginx即可;停止,需要使用kill -9 + processId,至于processId使用ps -ef | grep nginx命令;如果是多个PID可以在命令输入多次kill,之间使用";"做分割,即可一次性删掉多个数据;
- 配置文件(/etc/nginx/nginx.conf)的work_processes后面要么跟数字,要么跟auto;来决定工作进程个数;
以上是关于Nginx笔记的主要内容,如果未能解决你的问题,请参考以下文章
nginx.conf 忽略了 nginx-ingress 配置映射片段
[原创]java WEB学习笔记61:Struts2学习之路--通用标签 property,uri,param,set,push,if-else,itertor,sort,date,a标签等(代码片段