1。什么是Nginx?Nginx也是一个服务器,我们经常用它来做:比如反向代理,负载均衡,动静资源分离。反向代理:对应正向代理,如果你用过代理服务器,就会明白,当我们访问某个网站时,并不是直接访问目标网站,而是告诉代理服务器我需要访问什么目标网站,以及代理服务器向目标网站发送请求,将目标网站的访问结果转发给您。此时,您是请求代理人。反向代理是当代理服务器充当服务器的代理时。我们的访问请求并不是直接访问目标服务器,而是访问代理服务器。代理服务器决定什么样的请求以及如何访问官方服务器。负载均衡:目前大部分网站都会采用负载均衡的方式来降低单点服务器的负载压力,以应对当前用户的指数级增长。比如我们目前有3台真实服务器,我们需要根据相应的策略来判断什么样的用户。请求分配给哪个真实服务器。例如,按照轮询的方式,用户的请求一个接一个地到达代理服务器。此时代理服务器将第一个请求转发给第一个真实服务器,第二个请求转发给第二个服务器。以此类推,这样可以避免大量的用户请求全部访问同一台物理机。单台物理机的性能总是有限的。当然,这可能会导致访问服务器数据时的事务失败,也可能导致Web上的会话失败。访问问题超出了本文的范围。动静资源分离:最方便的枚举是Java的JSP与静态资源分离如:.放置在Tomcat中,用户访问后,tomcat需要将请求的静态资源文件返回给用户,如果有多个tomcat服务器,业务逻辑相同,需要在每个服务器上放置相同的资源。同时也增加了tomcat服务器的网络IO,很不划算。如果我们只将JSP请求交给tomcat,而将静态资源存放在代理服务器上,当用户请求非动态资源时,我们完全可以将代理服务器的静态资源直接返回给用户,不会增加Tomcat的压力.Tomcat只需要负责动态资源的逻辑处理和加载。基于以上Nginx的优势,我决定搭建一个Nginx+Tomcat的组合进行测试,包括参数传递,post和get传参是否受影响,Nginx的工作模式master和worker工作方式做一些粗浅的总结.如有错误,请指出。2.Nginx安装问题?安装部分我就不多说了。网上有很多教程。让我们直接从配置文件开始。避免进程切换导致上下文切换导致资源消耗,cpu信息可以查看/proc/cpuinfoworker_processes1;#error_loglogs/error.log;#error_loglogs/error.lognotice;#error_loglogs/error.loginfo;#pidlogs/nginx.pid;events{#useepollmodel使用epoll模型,采用异步非阻塞模型加速处理useepoll;worker_connections1024;}http{includemime.types;default_typeapplication/octet-stream;#log_formatmain'$remote_addr-$remote_user[$time_local]"$request"'#'$status$body_bytes_sent"$http_referer"'#'"$http_user_agent""$http_x_forwarded_for"';#access_loglogs/access.logmain;#设置通过nginxclient_max_body_size300m上传的文件大小;#使用sendfile函数在两个文件描述符之间直接传递数据(完全在内核中操作,传递),从而避免了内核缓冲区数据和用户缓冲区数据之间的拷贝,操作效率非常高,称为零拷贝。sendfileon;#tcp_nopushon;#keepalive_timeout0;#连接活跃时间keepalive_timeout65;#使用压缩数据减少IO量,但不支持数据解压的浏览器可能会产生乱码#gzipon;#静态服务器组#设置静态资源服务器访问接口上游静态。zh-jieli.com{serverlocalhost:808weight=1;}#动态服务器组upstreamzh-jieli.com{#设置Hash轮询规则#ip_hash;#weight:serverip:portweight=10#默认轮询#fair:根据后端的服务器响应时间分配#url_hash:根据url规则,让固定的请求分配到固定的服务器serverlocalhost:8080;serverlocalhost:8081;}server{listen808;server_namestatic;location/{}location~.*\.(js|css|ico|png|jpg|eot|svg|ttf|woff){#所有静态文件直接读取硬盘内容:读取静态资源存放位置root/apache-tomcat-8.5.24/webapps/ROOT;#是否缓存资源,缓存时间过期30d;#缓存30天}}server{listen80;server_namelocalhost;#charsetkoi8-r;#access_loglogs/host.access.logmain;location/{roothtml;indexindex1.htmlindex.htm;}location~.*\.(js|css|ico|png|jpg|eot|svg|ttf|woff){#proxy_cachecache_one;proxy_cache_valid2003043025d;proxy_cache_validany5d;proxy_cache_key'$host:$server_port$request_uri';add_headerX-Cache'$upstream_cache_statusfrom$host';proxy_passhttp://static.zh-jieli.com;#所有静态文件直接读取硬盘root/apache-tomcat-8.5.24/webapps/ROOT;expires30d;#缓存30天}#其他页面反向代理到tomcat容器位置^~/tomcat{indexindex;#proxy_passhttp://localhost:8080/;#设置代理服务器组proxy_passhttp://zh-jieli.com/;}error_page500502503504/50x.html;location=/50x.html{roothtml;}}}整个nginx总结work当http请求到来时,nginx会根据nginx.conf中配置的规则匹配location的正则,匹配对应的正则,进行location的内部处理。关于Nginx的location配置,附上一篇博客,很不错http://seanlook.com/2015/05/17/nginx-location-rewrite/详细列出了各种需求的location匹配规则。值得注意的是:位置匹配遵循最长原则,即满足前面要求的规则匹配后,除满足^外,将终止,继续向下匹配。在其他情况下,它会依次向下搜索,直到找到合适的位置匹配规则,然后进行处理。Nginx从模块功能上分为三个模块:Handlers(处理器模块)等模块直接处理请求,进行输出内容、修改headers信息等操作。Handlers处理器模块一般只有一个。过滤器(过滤器模块)。这类模块主要是修改其他处理器模块输出的内容,最后由Nginx输出。代理(代理模块)。这样的模块就是Nginx的HTTPUpstream之类的模块。这些模块主要与FastCGI等一些后端服务进行交互,实现服务代理、负载均衡等功能。因为是测试,所以我的两个tomcat安装在同一台本地机器上。在生产环境中,根据需要配置相应的IP。本地编写相应的测试代码+log4j将信息日志打到相应位置观察参数是否传递。TestOne.javapackagecom.nginx.controllers;importcom.nginx.utils.Log4jUtils;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestParam;@Controller@RequestMapping("/test")publicclassTestOne{@RequestMapping("/getname")publicvoidtest(@RequestParam(value="name")Stringname){//用于记录获取的参数名,可以查看日志确认Log4jUtils。getLogger().info("mynameis"+name);}}Log4jUtils.javapackagecom.nginx.utils;importorg.apache.log4j.Logger;publicclassLog4jUtils{privatestaticfinalLoggerlogger=Logger.getLogger(Logger.class);publicstaticLoggergetLogger(){returnlogger;}}demo这里简单做了两个demo程序,并进行了相应的测试。将项目打包成war包后,上传到linux服务器,移动到tomcat/webapps,在tomcat上进行热部署,测试当前tomcat是否能正常运行,因为没有差异页面,看一下登录判断。如图:以轮询方式访问8080和8081监听的tomcat。上面的方法是get请求的测试。让我们尝试发布。
