nginx的5个特点(2017/05/19 徐有容整理)
    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

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

1:   对于tomcat大家都很熟悉,只需要修改server.xml配置文件即可,这里我们以apache-tomcat-6.0.14为例,分别在server目录,解压缩并命名为:apache-tomcat-6.0.14_1、apache-tomcat-6.0.14_2。

第一处端口修改:
  
 <!--  修改port端口:18006 俩个tomcat不能重复,端口随意,别太小-->  
 <Server port="18006" shutdown="SHUT                                                                                                                                                     DOWN">     第二处端口修改: 
  
 <!-- port="18081" tomcat监听端口,随意设置,别太小 -->  
 <Connector port="18081" protocol="HTTP/1.1"   
                connectionTimeout="20000"   
                redirectPort="8443" />   
   第三处端口修改:
  
 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />     Engine元素增加jvmRoute属性:
  
 <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">

    两个tomcat的端口别重复,保证能启动起来,另一个tomcat配置希捷省略,监听端口为18080,附件中我们将上传所有的配置信息。
2.在conf下新增一个proxy.conf和gzip.conf文件,前者是使用代理需要的,后者是使用gzip压缩需要的
Proxy.conf

Gzip.conf

3:修改配置Nginx.conf文件 

upstream localhost {  
       #根据ip计算将请求分配各那个后端tomcat,许多人误认为可以解决session问题,其实并不能。  
       #同一机器在多网情况下,路由切换,ip可能不同  
       #ip_hash;   
       server localhost:18081;  
       server localhost:18080;  
      }      server {  
             listen       80;  
             server_name  localhost;                 location / {  
                     proxy_connect_timeout   3;  
                     proxy_send_timeout      30;  
                     proxy_read_timeout      30;  
                         proxy_pass http://localhost;  
             }     }  
 }

4: session共享
添加memcached
(1)将memcached的依赖包放到tomcat 6.0.32\lib文件夹下

(2)修改tomcat 6.0.32\conf\context.xml文件,在<context></context>标签内加入如下代码

这里的memcachedNodes是填写memcached节点,多个节点用空格分开,在这里我是在三台主机上部署memcached,配置了三个memcached节点。
配置完成后重新启动tomcat。解决session共享问题