前几天来了一个面试的哥们,自称是高级工程师。他说自己负责开发、打包、上线,我就问了下他,用的什么服务器?他告诉我测试环境用tomcat,生产用nginx。我一头雾水,这两个玩意还能互相替换?
我又问了下他,nginx负载是怎么配置的?他说是运维给配置的,他只负责把服务路径发给运维。
我想着nginx不熟,那tomcat总熟悉一些吧。tomcat配置里AJP端口是干什么用的?他说只知道启动端口,停止端口,还有一个端口是什么一直没关心过。
我忽然想起一首歌曲,你的酒馆对我打了烊。这里还是简单记录分享下吧,nginx就是一个服务器,和IIS类似,就是可以把图片、html等文件扔上去解析浏览的一个服务器。tomcat也是一个服务器,也可以解析静态资源,但是更多的是一个servlet容器,用来解析动态数据。
我们常常使用nginx做静态资源伺服器,同时做负载均衡,将请求反向代理到tomcat服务器,由tomcat解析动态数据并返回。
那AJP端口只是apache服务器代理请求到tomcat时所使用的端口,apache服务器配合tomcat时会用到。如果使用nginx的话,直接关掉就好了,用不着。
下面我启动一个nginx,两个tomcat简单模拟一下nginx+tomcat是怎么玩的。先准备两个tomcat,我这里在windos上演示,使用tomcat-9.0.21。分别修改一下两个tomcat的端口为18005、18080,28005、28080。AJP端口用不到,直接把这行注释掉。
为了方便区分两个tomcat,我把其中一个tomcat下webapp下ROOT文件清空,只放一个index.html用于展示。直接启动两个tomcat,window下console日志如果乱码,请修改一下conf/logging.properties文件里面的console日志编码格式。
启动后,端口号18080正常显示,这里贴一下修改后的28080端口的tomcat页面,可自行随意添加修改。
两个tomcat均可正常访问,接下来配置下nginx负载均衡,比较简单:
http { include mime.types; default_type application/octet-stream; upstream putiwushu { server 127.0.0.1:18080 weight=1; server 127.0.0.1:28080 weight=4; } server { listen 80; server_name localhost; location / { proxy_pass http://putiwushu; } }}
这里把nginx启动下,当前的域名是localhost,端口是默认的80,请求已代理转发到2个tomcat集群。刷新页面,会看到页面在两个tomcat之间来回切换,集群响应正常。nginx和tomcat的详细配置可以自行研究一下,功能很强大。