首页 > 代码库 > nginx之查漏补缺

nginx之查漏补缺

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。


本文出自 “90后” 博客,请务必保留此出处http://lzs66.blog.51cto.com/9607068/1856546

nginx之查漏补缺