共计 4140 个字符,预计需要花费 11 分钟才能阅读完成。
在大部分的生产环境中,基本上使用的都是 java 程序,从而促进了各种应用程序中间件的产生,在这里大概有几种,tomcat 作为最著名的开源 servlet 容器,jboss 也是开源的,而且有管理界面,主要是 redhat 的,而 weblogic 则是 oracle 的商业中间件,而 webspare 则是 IBM 的商业中间件,其他的几个例如 jetty,resin 用的也就比较少了。
在安装 tomcat 的时候,每次首先需要安装的是 jdk,提供 jvm 虚拟机,jre 运行环境,从而每次安装 jdk 的时候,有几种选择,生产环境基本上使用的都是 openjdk,不会产生版权的问题,在开发环境一般使用的是 oracle 的 jdk。在安装完 jdk 之后,一般都要输出一个环境变量为 JAVA_HOME。
在 java 中,JVM 也分为几种,一种是 oracle 的 JRokit 虚拟机,主要是使用在 weblogic 上面;一种是 IBM 的 J9 虚拟机,主要使用在 IBM 的 webspare 中;一种则是 Hotspot,主要使用在 openJDK 上面。
在生产环境中,servlet 的变化为,tomcat——webspare——jboss,小的时候使用开源的,因为免费;慢慢变大,因为维护问题,变成收费;越来越大,又采取了开源,因为免费。 前任使用的是 weblogic。
在使用 apache 反向代理 tomcat 提供服务的时候,主要的请求模型如下所示:
客户端浏览器发送 http 请求到 apache,然后 apache 将用户的请求反响代理到后端的 tomcat 服务器之中,在 apache 进行反代的时候,可以使用 http 协议或者是 ajp 协议,而 ajp 协议的运行效率比 http 效率更高,从而一般使用的是 ajp 协议。
apache 在进行反向代理的时候,必须存在几个模块,具体如下:
[root@mogilenode2 extra]# httpd -M |grep proxy
proxy_module (shared)
proxy_connect_module (shared)
proxy_ftp_module (shared)
proxy_http_module (shared)
proxy_scgi_module (shared)
proxy_ajp_module (shared)
proxy_balancer_module (shared)
Syntax OK
在进行编译安装的时候,默认是不会安装代理的模块的,从而在编译的时候可以添加选项,–enable-proxy,–enable-proxy-http,–enable-proxy-ajp,如果已经安装完成,也可以采用 DSO 的机制,使用命令 apxs -ica mod_proxy.c 来进行动态装载模块。
apache 的主要配置文件如下:
[root@mogilenode2 extra]# cat httpd-vhosts.conf
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot“/usr/local/apache/htdocs”ServerName www.kel.com
ServerAlias kel.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
ProxyPass /status !
ProxyPass / ajp://192.168.1.238:8009/
ProxyPassReverse / ajp://192.168.1.238:8009/
#ProxyPass / http://192.168.1.238:8080/
#ProxyPassReverse / http://192.168.1.238:8080/
ErrorLog“logs/www.kel.com-error_log”CustomLog“logs/www.kel.com-access_log”common
</VirtualHost>
<Location /status>
SetHandler server-status
Order allow,deny
Allow from all
</Location>
在配置文件中,主要参数分别介绍如下:ServerName 表示主机名,主要用来区分虚拟主机,ProxyVia 主要是给 http 添加头部响应信息,表示经过了此 apache 服务器,ProxyRequests 主要是表示使用的正向代理还是反向代理,Off 表示使用的是反响代理,ProxyPreserverHost 表示是否将主机名反向代理给后端主机,当 tomcat 有多个虚拟主机的时候,需要开启,ProxyPass 主要用来表示反响代理到后端的哪个主机,当使用感叹号的时候,表示不反代,由 apache 直接响应,需要反代的时候,需要写上后端的协议,主机名和端口号,ProxyPass 主要是为了解决重定向的问题,其他的两个为日志信息,ServerAlias 表示主机别名,用这个名称也可以进行访问,status 主要是用来查看 apache 的状态页面信息。
查看 tomcat 的默认监听的进程:
[root@mogilenode3 ~]# ps -ef|grep java
root 3166 1 0 17:08 pts/0 00:00:25 /usr/java/latest/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
root 3219 863 0 18:00 pts/0 00:00:00 grep java
[root@mogilenode3 ~]# netstat -tnlp|grep java
tcp 0 0 :::8080 :::* LISTEN 3166/java
tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 3166/java
tcp 0 0 :::8009 :::* LISTEN 3166/java
[root@mogilenode3 ~]# pstree -p 3166|wc -l
40
根据上面可以看到,默认 tomcat 监听了三个端口,也就是三个连接器 connector,其中 8080 使用的是 http 协议,主要用来接受用户请求响应,8005 监听的本地 localhost 的地址,主要是用来管理 tomcat 进程,而 8009 使用的是 ajp 协议。在使用 apache 进行反代的时候,可以看到配置文件中,当使用 http 协议反代的时候,使用的端口是 8080,当使用 ajp 协议反代的时候,使用的端口是 8009. 可以看到默认情况下,tomcat 开启了 40 个线程。
查看管理进程的命令使用:
[root@mogilenode3 ~]# telnet 127.0.0.1 8005(直接关闭 tomcat 服务)Trying 127.0.0.1…
Connected to 127.0.0.1.
Escape character is‘^]’.
SHUTDOWN
Connection closed by foreign host.
[root@mogilenode3 ~]# ps -ef|grep java
root 3244 863 0 18:13 pts/0 00:00:00 grep java
使用网页测试,在使用网页测试的时候,主要修改 hosts 的域名解析地址:
查看响应头信息如下(会看到在 apache 中添加的指令 ProxyVia 添加的首部信息):
当关闭 tomcat 服务之后,服务端的响应如下所示:
[root@mogilenode2 ~]# curl -I http://www.kel.com
HTTP/1.1 503 Service Temporarily Unavailable
Date: Sat, 23 Sep 2017 22:27:37 GMT
Connection: close
Content-Type: text/html; charset=iso-8859-1
在查看响应码的时候,状态码为 503,表示服务暂时不可用,这种可以作为在生产环境中出问题判断问题处在哪里。
吐槽一下 apache,apache 做为最经典的 web 服务器,占用的市场份额,那么大,语法太复杂了,和 nginx 比起来一个天上一个地下,在进行动静分离的时候,nginx 更加适合,在使用和 tomcat 结合的时候,apache 适合点,毕竟都是 apache 旗下的产物,更容易结合,而且有专门的协议 ajp 来进行传输。
httpd 本来就复杂,然后 IBM 还弄了一个 webspare,俗称 WAS,结合的方式就是用 httpd,然后摇身一变编程了 IHS,语法变得更加复杂,在进行反向代理负载均衡的时候,简直就是一坨屎,不想吐槽,然而很多人追求稳定性,说 webspare,然而在使用集群的时候,体验并不是那么的好。
使用 nginx,更简单易用的 web 服务器 。
web 服务器统计数据: