nginx工作原理
nginx由核心和模块组成,核心负责查找配置文件将客户端请求映射到一个location中,location中所配置的每个指令会启动不同的模块去完成相应的工作。
nginx模块按功能区分有
Handler(处理器模块):直接处理请求,然后输出
Filters(过滤器模块):对处理器模块输出的内容进行修改
Proxies(代理器模块):与后端一些服务进行交互,实现服务代理和负载均衡等功能。
请求--->nginx内核--->handler模块--->filters模块--->http相应
nginx工作方式:有单工作进程和多工作进程
单工作进程:除主进程外,还有工作进程,工作进程是单线程的。nginx默认是单进程模式
主进程作用: 1、接收外界请求,并将请求交给工作进程处理
2、监控工作进程的运行状态
多工作进程:工作进程包含多个线程
nginx如何实现高并发和轻量级?
nginx采用异步非阻塞的事件处理机制,由进程循环处理多个准备好的事件。以epoll为例,未准备好的事件都会放入epoll中,只要有事件准备好,就会进行处理。而apache,每个请求都会独占一个工作线程,当并发数到达几千时,就同时有几千的线程在处理请求了,占用的内存非常大,线程的上下文切换带来的cpu开销也很大,性能就难以上去,同时这些开销是完全没有意义的。
nginx实现负载均衡
nginx支持的调度算法:
1、轮询(默认):根据配置文件中的顺序,把请求依次分配到不同的后端服务器上
2、weight:加权轮询,weight值越大,分配到的访问机率越高
upstream lzs.com { server 192.168.1.1 weight=2; server 192.168.1.2 weight=1; }
3、ip_hash:同一个ip的访客固定访问同一个后端服务器,解决session共享问题
upstream lzs.com { ip_hash; server 192.168.1.1 ; server 192.168.1.2 ; }
4、url_hash:同一个url的访问定向到同一个后端服务器上,提高后端缓存服务器的效率,使用这种调度算法需要下载nginx的hash软件包
5、fair:根据后端服务器的相应时间来分配,相应时间短的优先分配,使用这种调度算法需要下载nginx的upstream_fair模块
6、least_conn:最少连接,Web请求会被转发到连接数最少的服务器上。
server指令除了指定后端服务器的ip和端口外,还可以指定每个服务器在负载均衡调度中的状态,常用的状态有:
down:该server不参与负载均衡
backup:当其他server无法相应请求时才会使用这个server
upstream lzs.com { server 192.168.1.1; server 192.168.1.2 backup; }
*当调度算法为ip_hash时,状态不能是backup
location匹配规则
1、匹配分为普通匹配和正则匹配,普通匹配又分为精确匹配和最大前缀匹配。
2、先匹配普通匹配,再匹配正则匹配
3、正则匹配会覆盖最大前缀匹配
4、当普通 location 前面指定了“ ^~ ”时,该条匹配上时不再需要继续匹配
5、当匹配上精确匹配时,不再需要继续匹配
总结:匹配优先级:精确匹配>指定“^~”的普通匹配>正则匹配>最大前缀匹配
例:
location / {......} #最大前缀匹配,匹配以/开头的url,但会被正则匹配覆盖 location = / {......} #精确匹配url=/,不再继续匹配 location ^~/img/ {……} #匹配以/img/开头的url,不再继续匹配 location ~ .*\.(gif|jpg|png)$ {……} #匹配图像文件
此外,~:区分大小写
~*:不区分大小写
nginx代理部分中X-Real-IP和X-Forwarded-For的区别:
一般来说,X-Forwarded-For是用于记录代理信息的,每经过一级代理(匿名代理除外),代理服务器都会把这次请求的来源IP追加在X-Forwarded-For中
来自4.4.4.4的一个请求,header包含这样一行
X-Forwarded-For: 1.1.1.1, 2.2.2.2, 3.3.3.3
代表 请求由1.1.1.1发出,经过三层代理,第一层是2.2.2.2,第二层是3.3.3.3,而本次请求的来源IP4.4.4.4是第三层代理
而X-Real-IP,没有相关标准,上面的例子,如果配置了X-Read-IP,可能会有两种情况
// 最后一跳是正向代理,可能会保留真实客户端IPX-Real-IP: 1.1.1.1 // 最后一跳是反向代理,比如Nginx,一般会是与之直接连接的客户端IPX-Real-IP: 3.3.3.3
一般来说,使用X-Forwarded-For效果更好,可以记录完整的代理链路
nginx中的proxy_pass后url是否加/的区别
1、location /test1/ { proxy_pass http://test2; }
2、location /test1/ { proxy_pass http://test2/; }
上面两种配置,区别只在于proxy_pass转发的路径后是否带 “/”
情况1:如果访问url = http://test1/test/test.html,则被nginx代理后,请求路径会便问http://test2/test/test.html,将test/ 作为根路径,请求test/路径下的资源
情况2:如果访问url = http://test1/test/test.html,则被nginx代理后,请求路径会变为 http://test2/test.html,直接访问server的根资源
nginx中proxy_pass和rewrite的区别
proxy_pass一般用于将请求重定向到定义好的后端服务器上,不支持正则表达式匹配
rewrite一般用于修改请求中域名后边的除去传递的参数外的字符串,支持正则表达式匹配http://seanlook.com/a/we/index.php?id=1&u=str 只对/a/we/index.php重写
详细可参考博文http://blog.csdn.net/mchdba/article/details/50042387。
防盗链
盗链是指一个网站将其他大网站的资源(如音乐、下载、图片等)的地址放在自己的网站上,这样没有任何资源的网站利用了别的网站的资源来展示给浏览者,从而提高自己网站的访问量,对于原网站,一方面损失了一大部分流量,另一方面,还会加重服务器的负担。
防盗链原理:利用HTTP协议中的referer表头字段,referer会记录请求从哪里链接过来的,通过referer跟踪链接来源,一旦检测到来源不是本站即进行阻止或者返回指定的页面。
nginx中防盗链设置可参考博文http://blog.csdn.net/yuwenruli/article/details/8541952。