起源
在大部分的生产环境中,基本上使用的都是java程序,从而促进了各类应用程序中间件的产生,在这里大概有几种,tomcat做为最著名的开源servlet容器,jboss也是开源的,并且有管理界面,主要是redhat的,而weblogic则是oracle的商业中间件,而webspare则是IBM的商业中间件,其余的几个例如jetty,resin用的也就比较少了。html
在安装tomcat的时候,每次首先须要安装的是jdk,提供jvm虚拟机,jre运行环境,从而每次安装jdk的时候,有几种选择,生产环境基本上使用的都是openjdk,不会产生版权的问题,在开发环境通常使用的是oracle的jdk。在安装完jdk以后,通常都要输出一个环境变量为JAVA_HOME。java
在java中,JVM也分为几种,一种是oracle的JRokit虚拟机,主要是使用在weblogic上面;一种是IBM的J9虚拟机,主要使用在IBM的webspare中;一种则是Hotspot,主要使用在openJDK上面。node
在生产环境中,servlet的变化为,tomcat——webspare——jboss,小的时候使用开源的,由于免费;慢慢变大,由于维护问题,变成收费;愈来愈大,又采起了开源,由于免费。前任使用的是weblogic。python
配置apache反代tomcat
在使用apache反向代理tomcat提供服务的时候,主要的请求模型以下所示:linux
客户端浏览器发送http请求到apache,而后apache将用户的请求反响代理到后端的tomcat服务器之中,在apache进行反代的时候,可使用http协议或者是ajp协议,而ajp协议的运行效率比http效率更高,从而通常使用的是ajp协议。nginx
apache在进行反向代理的时候,必须存在几个模块,具体以下:web
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
[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
apache的主要配置文件以下:bootstrap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
[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个线程。
查看管理进程的命令使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[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服务以后,服务端的响应以下所示:
1
2
3
4
5
6
7
8
9
|
[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服务器统计数据以下: