nginx大全

Posted hongmingover

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx大全相关的知识,希望对你有一定的参考价值。

nginx大全

 

1.1什么是nginx?

nginx是一款高性能的http服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师Igor-Sysoev所开发,官方测试nginx能够支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定,所以现在很多知名的公司都在使用nginx。

1.2 nginx应用场景

1、http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。

2、虚拟主机。可以实现在一台服务器虚拟出多个网站。例如个人网站使用的虚拟主机。

3、反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。

1.3 nginx优缺点

1、占内存小,可以实现高并发连接、处理响应快。

2、可以实现http服务器、虚拟主机、反向代理、负载均衡。

3、nginx配置简单

4、可以不暴露真实服务器IP地址

1.4 nginx.conf 介绍

1.4.1 nginx.conf文件的结构

nginx的配置由特定的标识符(指令符)分为多个不同的模块。 
指令符分为简单指令和块指令。

·简单指令格式:[name parameters;]

·块指令格式:和简单指令格式有一样的结构,但其结束标识符不是分号,而是大括号,块指令内部可以包含simple directives 和block directives, 可以称块指令为上下文(e.g. events, http, server, location)

conf文件中,所有不属于块指令的简单指令,http块指令属于main上下文,server块指令http上下文。

1.4.2 配置静态访问

Web server很重要一部分工作就是提供静态页面的访问,例如images, html page。nginx可以通过不同的配置,根据request请求,从本地的目录提供不同的文件返回给客户端。 
打开安装目录下的nginx.conf文件,默认配置文件已经在http指令块中创建了一个空的server块,在nginx-1.8.0中的http块中已经创建了一个默认的server块。内容如下:

server

        listen       80;

        server_name  localhost;

        location /

            root   html;

            index  index.html index.htm;

        

        error_page   500 502 503 504  /50x.html;

        location = /50x.html

            root   html;

        

 

1.4  nginx实现反向代理

1.4.1什么是反向代理?

反向代理(Reverse-Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

启动一个Tomcat 127.0.0.1:8080

使用nginx反向代理 www.liquan.com 直接跳转到127.0.0.1:8080

1.4.1Host文件新增

127.0.0.1 www.liquan.com

127.0.0.1 www.lq.com

1.4.2 nginx.conf 配置

配置信息:

server

        listen       80;

        server_name  www.liquan.com;

        location /

            proxy_pass  http://127.0.0.1:8080;

            index  index.html index.htm;

        

    

     server

        listen       80;

        server_name  www.lq.com;

        location /

            proxy_pass  http://127.0.0.1:8081;

            index  index.html index.htm;

        

1.5 nginx实现负载均衡

1.5.1什么是负载均衡

负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

 

1.5.2负载均衡策略

1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

upstream backserver  
    server 192.168.0.14; 
    server 192.168.0.15; 

2、指定权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 
upstream backserver  
    server 192.168.0.14 weight=10; 
    server 192.168.0.15 weight=10; 

3、IP绑定 ip_hash

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream backserver

    ip_hash; 
    server 192.168.0.14:88; 
    server 192.168.0.15:80; 

4、热备

如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBBBBBBBBBBB.....

upstream mysvr  
    server 127.0.0.1:7878; 
    server 192.168.10.121:3333 backup;  #热备

5、如果你对上面4种均衡算法不是很理解,可以查看Nginx 配置详解,可能会更加容易理解点。

到这里你是不是感觉nginx的负载均衡配置特别简单与强大,那么还没完,咱们继续哈,这里扯下蛋。

关于nginx负载均衡配置的几个状态参数讲解。

  • down,表示当前的server暂时不参与负载均衡。

  • backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。

  • max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。

  • fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。

upstream mysvr  
    server 127.0.0.1:7878 weight=2 max_fails=2 fail_timeout=2;
    server 192.168.10.121:3333 weight=1 max_fails=2 fail_timeout=1;    

1.5.3配置代码

upstream backserver

     server 127.0.0.1:8080;

     server 127.0.0.1:8081;

 

server

        listen       80;

        server_name  www.liquan.com;

        location /

            proxy_pass  http://backserver;

            index  index.html index.htm;

        

 

 

1.5.4宕机轮训配置规则

server

        listen       80;

        server_name  www.liquan.com;

        location /

            proxy_pass  http://backserver;

            index  index.html index.htm;

            proxy_connect_timeout 1;

            proxy_send_timeout 1;

            proxy_read_timeout 1;

        

总结:如果你的nginx服务器给2台web服务器做代理,负载均衡算法采用轮询,那么当你的一台机器web程序iis关闭,也就是说web不能访问,那么nginx服务器分发请求还是会给这台不能访问的web服务器,如果这里的响应连接时间过长,就会导致客户端的页面一直在等待响应,对用户来说体验就打打折扣,这里我们怎么避免这样的情况发生呢。这里我配张图来说明下问题。

如果负载均衡中其中web2发生这样的情况,nginx首先会去web1请求,但是nginx在配置不当的情况下会继续分发请求道web2,然后等待web2响应,直到我们的响应时间超时,才会把请求重新分发给web1,这里的响应时间如果过长,用户等待的时间就会越长。

下面的配置是解决方案之一。

proxy_connect_timeout 1;#nginx服务器与被代理的服务器建立连接的超时时间,默认60秒

proxy_read_timeout 1; #nginx服务器想被代理服务器组发出read请求后,等待响应的超时间,默认为60秒。

proxy_send_timeout 1; #nginx服务器想被代理服务器组发出write请求后,等待响应的超时间,默认为60秒。

proxy_ignore_client_abort on;  #客户端断网时,nginx服务器是否终端对被代理服务器的请求。默认为off。

如果使用upstream指令配置啦一组服务器作为被代理服务器,服务器中的访问算法遵循配置的负载均衡规则,同时可以使用该指令配置在发生哪些异常情况时,将请求顺次交由下一组服务器处理。

proxy_next_upstream timeout;  

#反向代理upstream中设置的服务器组,出现故障时,被代理服务器返回的状态值。

状态值可以是:

error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off

  • error:建立连接或向被代理的服务器发送请求或读取响应信息时服务器发生错误。

  • timeout:建立连接,想被代理服务器发送请求或读取响应信息时服务器发生超时。

  • invalid_header:被代理服务器返回的响应头异常。

  • off:无法将请求分发给被代理的服务器。

  • http_400,....:被代理服务器返回的状态码为400,500,502,等。

1.6  nginx解决网站跨域问题

配置:

server

        listen       80;

        server_name  www.itmayiedu.com;

        location /A

            proxy_pass  http://a.a.com:81/A;

            index  index.html index.htm;

        

        location /B

            proxy_pass  http://b.b.com:81/B;

            index  index.html index.htm;

        

1.7  nginx配置防盗链

location ~ .*\\.(jpg|jpeg|JPG|png|gif|icon)$

        valid_referers blocked http://www.itmayiedu.com www.itmayiedu.com;

        if ($invalid_referer)

            return 403;

        

1.8  nginx配置DDOS

1.8.1限制请求速度

设置Nginx、Nginx Plus的连接请求在一个真实用户请求的合理范围内。比如,如果你觉得一个正常用户每两秒可以请求一次登录页面,你就可以设置Nginx每两秒钟接收一个客户端IP的请求(大约等同于每分钟30个请求)。

limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;

server

...

location /login.html

limit_req zone=one;

...

limit_req_zone命令设置了一个叫one的共享内存区来存储请求状态的特定键值,在上面的例子中是客户端IP($binary_remote_addr)。location块中的limit_req通过引用one共享内存区来实现限制访问/login.html的目的。

1.8.2限制请求速度

设置Nginx、Nginx Plus的连接数在一个真实用户请求的合理范围内。比如,你可以设置每个客户端IP连接/store不可以超过10个。

以上是关于nginx大全的主要内容,如果未能解决你的问题,请参考以下文章

如何使用pyspark查找时间范围内每分钟发生的事件

三元条件运算符的警告仅在本地范围内发生

1900年以来,世界范围内发生了哪些大型地震

在 pandas 中查找每月某个时间范围内发生的定期付款

使用 hadoop mapreduce 作业从日志文件分析时间范围内的总错误条目发生率

on事件大全