Nginx的五个特点

1.动静分离
        Nginx是一种轻量级,高性能,多进程的Web服务器,非常适合作为静态资源的服务器使用,而动态的访问操作可以使用稳定的Apache、Tomcat及IIS等来实现,这里就以Nginx作为代理服务器的同时,也使用其作为静态资源的服务器。
            静态资源通过绝对路径去访问,放在nginx服务器当中。
            动态资源通过url拼接字符串的方式去访问例如tomcat服务器
    2.负载均衡
        举个例子来说就是在配置三台nginx服务器,当在客户端访问nginx是刷新页面会出现三个不同的页面。
     (1)Nginx的upstream目前支持以下几种方式的分配
        1、轮询(默认)
        每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
        2、weight
        指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
        2、ip_hash
        每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
        3、fair(第三方)
        按后端服务器的响应时间来分配请求,响应时间短的优先分配。
        4、url_hash(第三方)
        按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
        
        
     (2)Session问题
        当我们确定一系列负载的服务器后,那我们的WEB站点会分布到这些服务器上。这个时候如果采用Test2 每一次请求随机访问任何一台服务器上,这样导致你访问A服务器后,下一次请求又突然转到B服务器上。这个时候与A服务器建立的Session,传到B站点服务器肯定是无法正常响应的。我们看一下常用的解决方案:

            Session或凭据缓存到独立的服务器
            Session或凭据保存数据库中
            nginx ip_hash 保持同一IP的请求都是指定到固定的一台服务器

        第一种缓存的方式比较理想,缓存的效率也比较高。但是每一台请求服务器都去访问Session会话服务器,那不是加载重了这台Session服务器的负担吗?

        第二种保存到数据库中,除了要控制Session的有效期,同时加重了数据库的负担,所以最终的转变为SQL Server 负载均衡,涉及读,写,过期,同步。

        第三种通过nginx ip_hash负载保持对同一服务器的会话,这种看起来最方便,最轻量。
     (3)文件上传下载

        如果实现了负载均衡,除了Session问题,我们还会碰到文件的上传下载问题。文件不可能上传不同的服务器上,这样会导致下载不到对应文件的问题。我们看一下下面的方案

            独立文件服务器
            文件压缩数据库

        两种方案都是常用的,我们来说一下文件压缩数据库,以前的方式都是将文件二进制压缩至关系型数据库,而现在NOSQL的流行,加上MongoDB处理文件又比较方便,所以文件压库又多了一种选择。毕竟文件服务器的效率和管理以及安全都不及数据库。
    3.反向代理
        反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
        通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务。
    4.单点故障
        某台节点服务器挂了,但是Nginx仍然会可能选中这个出故障的机器,然后就一直连接着是因为超时时间很长,具体多长不清楚,所以为了避免一直连接着,我们需要设置超时时间
        用Keepalived搭建双Nginx server集群,防止单点故障
    5.优化
        (1)高层的配置(nginx.conf)


                user www-data;  
                pid /var/run/nginx.pid;  
                worker_processes auto;  
                worker_rlimit_nofile 100000;  


            user和pid应该按默认设置 - 我们不会更改这些内容,因为更改与否没有什么不同。
            worker_processes 定义了nginx对外提供web服务时的worker进程数。最优值取决于许多因素,包括(但不限于)CPU核的数量、存储数据的硬盘数量及负载模式。不能确定的时候,将其设置为可用的CPU内核数将是一个好的开始(设置为“auto”将尝试自动检测它)。
            worker_rlimit_nofile 更改worker进程的最大打开文件数限制。如果没设置的话,这个值为操作系统的限制。设置后你的操作系统和Nginx可以处理比“ulimit -a”更多的文件,所以把这个值设高,这样nginx就不会有“too many open files”问题了。
        (2)Events模块
            events模块中包含Nginx中所有处理连接的设置。


                    events {  
                        worker_connections 2048;  
                        multi_accept on;  
                        use epoll;  
                        }


            worker_connections 设置可由一个worker进程同时打开的最大连接数。如果设置了上面提到的worker_rlimit_nofile,我们可以将这个值设得很高。
            记住,最大客户数也由系统的可用socket连接数限制(~ 64K),所以设置不切实际的高没什么好处。
            multi_accept 告诉nginx收到一个新连接通知后接受尽可能多的连接。
            use 设置用于复用客户端线程的轮询方法。如果你使用Linux 2.6+,你应该使用epoll。如果你使用*BSD,你应该使用kqueue。
            (值得注意的是如果你不知道Nginx该使用哪种轮询方法的话,它会选择一个最适合你操作系统的)
        (3)HTTP 模块
            HTTP模块控制着Nginx http处理的所有核心特性。因为这里只有很少的配置,所以我们只节选配置的一小部分。所有这些设置都应该在http模块中,甚至你不会特别的注意到这段设置。


                    http {  
                        server_tokens off;  
                        sendfile on;  
                        tcp_nopush on;  
                        tcp_nodelay on;  
                        ...  
                        }  


            server_tokens  并不会让nginx执行的速度更快,但它可以关闭在错误页面中的nginx版本数字,这样对于安全性是有好处的。
            sendfile 可以让sendfile()发挥作用。sendfile()可以在磁盘和TCP socket之间互相拷贝数据(或任意两个文件描述符)。Pre-sendfile是传送数据之前在用户空间申请数据缓冲区。之后用read()将数据从文件拷贝到这个缓冲区,write()将缓冲区数据写入网络。sendfile()是立即将数据从磁盘读到OS缓存。因为这种拷贝是在内核完成的,sendfile()要比组合read()和write()以及打开关闭丢弃缓冲更加有效(更多有关于sendfile)。
            tcp_nopush 告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送。
            tcp_nodelay 告诉nginx不要缓存数据,而是一段一段的发送--当需要及时发送数据时,就应该给应用设置这个属性,这样发送一小块数据信息时就不能立即得到返回值。


                access_log off;  
                error_log /var/log/nginx/error.log crit;  


               access_log 设置nginx是否将存储访问日志。关闭这个选项可以让读取磁盘IO操作更快(aka,YOLO)
            (4)error_log 告诉nginx只能记录严重的错误:


                keepalive_timeout 10;  
                client_header_timeout 10;  
                client_body_timeout 10;  
                reset_timedout_connection on;  
                send_timeout 10;
                
    具体优化:http://os.51cto.com/art/201404/434930.htm

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值