Http和Nginx反代至Tomcat(LNMT、LAMT)
概述:
本章将主要介绍Http和Nginx反代至Tomcat,具体内容如下:
-
LNMT部署并实现动静分离
-
LAMT部署的实现方式;
·proxy_http_module代理配置
·proxy_ajp_module代理配置
-
Tomcat脚本(启动、停止、重启)
================================================================================
LNMT:Linux Nginx MySQL Tomcat
★工作流程(结合方式):
Client (http) --> nginx (reverse proxy)(http) --> tomcat (http connector)
实验:LNMT部署并实现动静分离
环境描述:
-
虚拟机node1(CentOS 7系统)即作为nginx服务器,又作为Tomcat服务器,客户端发来的请求首先经由nginx处理,如果为静态内容则直接由nginx响应,如果为动态内容,则由nignx反代至后端的Tomcat服务器;
实验步骤如下:
1.在node1服务器上安装nginx,这里我使用官方下载的rpm包直接安装,如下:
1
2
3
4
|
[root@centos7 ~] # cd nginx [root@centos7 nginx] # ls nginx-1.10.0-1.el7.ngx.x86_64.rpm [root@centos7 ~] # yum install -y ./nginx-1.10.0-1.el7.ngx.x86_64.rpm |
2.编辑nginx的配置文件/etc/nginx/conf.d/default.conf,在虚拟主机server中定义来自客户端请求的所有内容全部反代至后端的Tomcat服务器,如下:
1
2
3
4
5
6
7
8
9
|
# 我这里的两个虚拟主机是基于主机名定义的,所以ip相同,要想在nginx中选择反代到后端的虚拟主机,首先要定以tomcat 使用的默认虚拟主机) [root@centos7 ~] # vim /etc/nginx/conf.d/default.conf location / { proxy_pass http: //location :8080; } 或者: location / { proxy_pass http: //node1 .taotao.com:8080; } |
3.保存退出后检查nginx语法,没问题后启动nginx服务,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[root@centos7 conf.d] # nginx -t nginx: the configuration file /etc/nginx/nginx .conf syntax is ok nginx: configuration file /etc/nginx/nginx .conf test is successful [root@centos7 conf.d] # nginx [root@centos7 conf.d] # ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 25 *:514 *:* LISTEN 0 128 *:80 *:* LISTEN 0 128 *:22 *:* LISTEN 0 128 127.0.0.1:631 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 127.0.0.1:6010 *:* LISTEN 0 25 :::514 :::* LISTEN 0 1 ::ffff:127.0.0.1:8005 :::* LISTEN 0 100 :::8009 :::* LISTEN 0 100 :::8080 :::* LISTEN 0 128 :::22 :::* LISTEN 0 128 ::1:631 :::* LISTEN 0 100 ::1:25 :::* LISTEN 0 128 ::1:6010 :::* |
4.在浏览器中直接请求,可以正常访问资源,如下:
在tomcat中定义默认虚拟主机为 node1,然后在nginx中定义反代至node1的虚拟主机
反代至 localhost 虚拟主机
在自定义的Tomcat的虚拟主机的目录中/data/webapps/ROOT中添加一张静态资源图片,也可以正常访问,如下:
动静分离:
如上是把整个客户端请求的内容无论动静都反代至后端的服务器,现在通过在nginx的配置文件中定义实现动静分离,即:静态资源由nginx直接响应,动态资源由Tomcat响应。nginx配置文件修改如下:
1
2
3
4
|
# 在server中重新定义一个location,把jsp、do结尾的反代至后端Tomcat主机 location ~* \.(jsp| do )$ { proxy_pass http: //node1 .taotao.com:8080; } |
检测nginx语法,重载nginx服务
1
2
3
4
|
[root@centos7 conf.d] # nginx -t nginx: the configuration file /etc/nginx/nginx .conf syntax is ok nginx: configuration file /etc/nginx/nginx .conf test is successful [root@centos7 conf.d] # nginx -s reload |
在浏览器中分别请求静态资源和动态资源,发现因为只把动态资源代理到后端Tomcat服务,所以只有动态资源有响应,静态资源提示没有发现,如下:
现在,我们在nginx的映射根目录下提供静态资源1.jpg,再次访问可以发现可以被正常加载到,说明是由前端nginx服务器直接响应的,如下:
1
2
3
|
[root@centos7 ROOT] # mv 1.jpg /usr/share/nginx/html/ [root@centos7 ROOT] # ls /usr/share/nginx/html/ 1.jpg error_pages forum index.html messages.html |
如上,把响应的java程序部署到指定的目录即可,如果需要连接后端数据库,只需要授权一个账户即可。这就是LNMT部署的整个过程。。。
LAMT:Linux Apache(httpd) MySQL Tomcat
★httpd的代理模块:
proxy_module:反代模块
proxy_http_module:适配http协议客户端;
proxy_ajp_module:适配ajp协议客户端;
★工作流程(结合方式):
Client (http) --> httpd (proxy_http_module)(http) --> tomcat (http connector)
Client (http) --> httpd (proxy_ajp_module)(ajp) --> tomcat (ajp connector)
Client (http) --> httpd (mod_jk)(ajp) --> tomcat (ajp connector)
实验:使用httpd的proxy_module(包括:proxy_http_module和proxy_ajp_module)模块结合Tomcat,反代来自客户端或者前端独立反代服务器(nginx等)的请求
第一种方式:proxy_http_module代理配置示例:
1.首先安装httpd服务器,编辑httpd的配置文件,在/etc/httpd/conf.d中定义一个虚拟主机,配置使用proxy_module和proxy_http_module模块反代,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@centos7 httpd] # vim conf.d/http_tomcat.conf <VirtualHost *:80> ServerName node1.taotao.com ProxyRequests Off # 关闭正向代理 ProxyVia On # 添加由谁代理转发 ProxyPreserveHost On # 反代时要不要保留客户端请求的主机名,并发送给tomcat <Proxy *> Require all granted < /Proxy > ProxyPass / http: //localhost :8080/ # 注意,这里写Tomcat的主机或者虚拟主机是没有用的,要想访问Tomcat的虚拟主机,取决于用户在客户端浏览器中键入的主机名 ProxyPa***everse / http: //localhost :8080/ <Location /> Require all granted < /Location > < /VirtualHost > |
2.检测语法,启动httpd服务,在浏览器中请求,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
[root@centos7 conf.d] # httpd -t Syntax OK [root@centos7 conf.d] # systemctl start httpd [root@centos7 conf.d] # ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 25 *:514 *:* LISTEN 0 128 *:22 *:* LISTEN 0 128 127.0.0.1:631 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 127.0.0.1:6010 *:* LISTEN 0 25 :::514 :::* LISTEN 0 1 ::ffff:127.0.0.1:8005 :::* LISTEN 0 100 :::8009 :::* LISTEN 0 128 :::80 :::* LISTEN 0 100 :::8080 :::* LISTEN 0 128 :::22 :::* LISTEN 0 128 ::1:631 :::* LISTEN 0 100 ::1:25 :::* LISTEN 0 128 ::1:6010 :::* LISTEN 0 128 :::443 :::* |
第二种方式:proxy_ajp_module代理配置示例:
1.编辑httpd的配置文件,在/etc/httpd/conf.d中定义一个虚拟主机,配置使用proxy_module和proxy_http_module模块反代,如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
[root@centos7 conf.d] # cp http_tomcat.conf ajp_tomcat.conf [root@centos7 conf.d] # mv http_tomcat.conf http_tomcat.conf.bak [root@centos7 conf.d] # vim ajp_tomcat.conf [root@centos7 conf.d] # cat ajp_tomcat.conf <VirtualHost *:80> ServerName tc1.taotao.com ProxyRequests Off ProxyVia On ProxyPreserveHost On <Proxy *> Require all granted < /Proxy > ProxyPass / ajp: //192 .168.1.112:8009/ ProxyPa***everse / ajp: //192 .168.1.112:8009/ <Location /> Require all granted < /Location > < /VirtualHost > |
2.在浏览器中键入不同的Tomcat主机名后,后端Tomcat响应不同的虚拟主机,如下:
注意:
-
在使用nginx做反代时,proxy_pass 保留主机名做反代项后端Tomcat请求,所以Tomcat能够根据反代时的主机名来判定,前端反代服务器请求的是Tomcat的哪个虚拟主机;
-
但是,在使用httpd做反代时,不能通过反代(ProxyPass)时使用的主机名来判定后端Tomcat使用什么虚拟主机来响应。所以,这里的ProxyPass和ProxyPa***everse使用主机名或者IP地址是没有任何区别的,反代到后端都为ip地址,Tomcat无法判断使用哪个虚拟主机响应,只能使用默认的虚拟主机响应。为了能够使后端Tomcat能够使用不同的虚拟主机来响应,就要打开ProxyPreserveHost,保留请求时的主机名,这时客户端在浏览器中键入的主机名将会请求反代至后端的Tomcat,然后Tomcat分别对应不同的虚拟主机来响应请求。
如上,就是部署LAMT环境的整个过程。。。
Tomcat 脚本启动、停止、重启
1.在/etc/rc.d/init.d下编写tomcat的脚本
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
|
[root@centos7 ~] # vim /etc/rc.d/init.d/tomcat #!/bin/bash # Tomcat init script for Linux. # # chkconfig: 2345 96 14 # description: The Apache Tomcat servlet/JSP container. # JAVA_OPTS='-Xms64m -Xmx128' JAVA_HOME= /usr/java/latest CATALINA_BASE= /usr/local/tomcat export JAVA_HOME CATALINA_BASE case $1 in start) exec $CATALINA_BASE /bin/catalina .sh start ;; stop) exec $CATALINA_BASE /bin/catalina .sh stop ;; restart) $CATALINA_BASE /bin/catalina .sh stop sleep 2 exec $CATALINA_BASE /bin/catalina .sh start ;; *) echo "Usage: `basename $0` {start|stop|restart}" exit1 ;; esac |
2.添加到chkconfig中,并授予执行权限
1
2
|
[root@centos7 ~] # chkconfig --add tomcat [root@centos7 ~] # chmod +x /etc/rc.d/init.d/tomcat |
3.测试,重启tomcat服务,如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@centos7 ~] # service tomcat restart Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/java/latest Using CLASSPATH: /usr/local/tomcat/bin/bootstrap .jar: /usr/local/tomcat/bin/tomcat-juli .jar Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/java/latest Using CLASSPATH: /usr/local/tomcat/bin/bootstrap .jar: /usr/local/tomcat/bin/tomcat-juli .jar Tomcat started. |
概述:
本章将主要介绍Http和Nginx反代至Tomcat,具体内容如下:
-
LNMT部署并实现动静分离
-
LAMT部署的实现方式;
·proxy_http_module代理配置
·proxy_ajp_module代理配置
-
Tomcat脚本(启动、停止、重启)
================================================================================
LNMT:Linux Nginx MySQL Tomcat
★工作流程(结合方式):
Client (http) --> nginx (reverse proxy)(http) --> tomcat (http connector)
实验:LNMT部署并实现动静分离
环境描述:
-
虚拟机node1(CentOS 7系统)即作为nginx服务器,又作为Tomcat服务器,客户端发来的请求首先经由nginx处理,如果为静态内容则直接由nginx响应,如果为动态内容,则由nignx反代至后端的Tomcat服务器;
实验步骤如下:
1.在node1服务器上安装nginx,这里我使用官方下载的rpm包直接安装,如下:
1
2
3
4
|
[root@centos7 ~] # cd nginx [root@centos7 nginx] # ls nginx-1.10.0-1.el7.ngx.x86_64.rpm [root@centos7 ~] # yum install -y ./nginx-1.10.0-1.el7.ngx.x86_64.rpm |
2.编辑nginx的配置文件/etc/nginx/conf.d/default.conf,在虚拟主机server中定义来自客户端请求的所有内容全部反代至后端的Tomcat服务器,如下:
1
2
3
4
5
6
7
8
9
|
# 我这里的两个虚拟主机是基于主机名定义的,所以ip相同,要想在nginx中选择反代到后端的虚拟主机,首先要定以tomcat 使用的默认虚拟主机) [root@centos7 ~] # vim /etc/nginx/conf.d/default.conf location / { proxy_pass http: //location :8080; } 或者: location / { proxy_pass http: //node1 .taotao.com:8080; } |
3.保存退出后检查nginx语法,没问题后启动nginx服务,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[root@centos7 conf.d] # nginx -t nginx: the configuration file /etc/nginx/nginx .conf syntax is ok nginx: configuration file /etc/nginx/nginx .conf test is successful [root@centos7 conf.d] # nginx [root@centos7 conf.d] # ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 25 *:514 *:* LISTEN 0 128 *:80 *:* LISTEN 0 128 *:22 *:* LISTEN 0 128 127.0.0.1:631 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 127.0.0.1:6010 *:* LISTEN 0 25 :::514 :::* LISTEN 0 1 ::ffff:127.0.0.1:8005 :::* LISTEN 0 100 :::8009 :::* LISTEN 0 100 :::8080 :::* LISTEN 0 128 :::22 :::* LISTEN 0 128 ::1:631 :::* LISTEN 0 100 ::1:25 :::* LISTEN 0 128 ::1:6010 :::* |
4.在浏览器中直接请求,可以正常访问资源,如下:
在tomcat中定义默认虚拟主机为 node1,然后在nginx中定义反代至node1的虚拟主机
反代至 localhost 虚拟主机
在自定义的Tomcat的虚拟主机的目录中/data/webapps/ROOT中添加一张静态资源图片,也可以正常访问,如下:
动静分离:
如上是把整个客户端请求的内容无论动静都反代至后端的服务器,现在通过在nginx的配置文件中定义实现动静分离,即:静态资源由nginx直接响应,动态资源由Tomcat响应。nginx配置文件修改如下:
1
2
3
4
|
# 在server中重新定义一个location,把jsp、do结尾的反代至后端Tomcat主机 location ~* \.(jsp| do )$ { proxy_pass http: //node1 .taotao.com:8080; } |
检测nginx语法,重载nginx服务
1
2
3
4
|
[root@centos7 conf.d] # nginx -t nginx: the configuration file /etc/nginx/nginx .conf syntax is ok nginx: configuration file /etc/nginx/nginx .conf test is successful [root@centos7 conf.d] # nginx -s reload |
在浏览器中分别请求静态资源和动态资源,发现因为只把动态资源代理到后端Tomcat服务,所以只有动态资源有响应,静态资源提示没有发现,如下:
现在,我们在nginx的映射根目录下提供静态资源1.jpg,再次访问可以发现可以被正常加载到,说明是由前端nginx服务器直接响应的,如下:
1
2
3
|
[root@centos7 ROOT] # mv 1.jpg /usr/share/nginx/html/ [root@centos7 ROOT] # ls /usr/share/nginx/html/ 1.jpg error_pages forum index.html messages.html |
如上,把响应的java程序部署到指定的目录即可,如果需要连接后端数据库,只需要授权一个账户即可。这就是LNMT部署的整个过程。。。
LAMT:Linux Apache(httpd) MySQL Tomcat
★httpd的代理模块:
proxy_module:反代模块
proxy_http_module:适配http协议客户端;
proxy_ajp_module:适配ajp协议客户端;
★工作流程(结合方式):
Client (http) --> httpd (proxy_http_module)(http) --> tomcat (http connector)
Client (http) --> httpd (proxy_ajp_module)(ajp) --> tomcat (ajp connector)
Client (http) --> httpd (mod_jk)(ajp) --> tomcat (ajp connector)
实验:使用httpd的proxy_module(包括:proxy_http_module和proxy_ajp_module)模块结合Tomcat,反代来自客户端或者前端独立反代服务器(nginx等)的请求
第一种方式:proxy_http_module代理配置示例:
1.首先安装httpd服务器,编辑httpd的配置文件,在/etc/httpd/conf.d中定义一个虚拟主机,配置使用proxy_module和proxy_http_module模块反代,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@centos7 httpd] # vim conf.d/http_tomcat.conf <VirtualHost *:80> ServerName node1.taotao.com ProxyRequests Off # 关闭正向代理 ProxyVia On # 添加由谁代理转发 ProxyPreserveHost On # 反代时要不要保留客户端请求的主机名,并发送给tomcat <Proxy *> Require all granted < /Proxy > ProxyPass / http: //localhost :8080/ # 注意,这里写Tomcat的主机或者虚拟主机是没有用的,要想访问Tomcat的虚拟主机,取决于用户在客户端浏览器中键入的主机名 ProxyPa***everse / http: //localhost :8080/ <Location /> Require all granted < /Location > < /VirtualHost > |
2.检测语法,启动httpd服务,在浏览器中请求,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
[root@centos7 conf.d] # httpd -t Syntax OK [root@centos7 conf.d] # systemctl start httpd [root@centos7 conf.d] # ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 25 *:514 *:* LISTEN 0 128 *:22 *:* LISTEN 0 128 127.0.0.1:631 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 127.0.0.1:6010 *:* LISTEN 0 25 :::514 :::* LISTEN 0 1 ::ffff:127.0.0.1:8005 :::* LISTEN 0 100 :::8009 :::* LISTEN 0 128 :::80 :::* LISTEN 0 100 :::8080 :::* LISTEN 0 128 :::22 :::* LISTEN 0 128 ::1:631 :::* LISTEN 0 100 ::1:25 :::* LISTEN 0 128 ::1:6010 :::* LISTEN 0 128 :::443 :::* |
第二种方式:proxy_ajp_module代理配置示例:
1.编辑httpd的配置文件,在/etc/httpd/conf.d中定义一个虚拟主机,配置使用proxy_module和proxy_http_module模块反代,如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
[root@centos7 conf.d] # cp http_tomcat.conf ajp_tomcat.conf [root@centos7 conf.d] # mv http_tomcat.conf http_tomcat.conf.bak [root@centos7 conf.d] # vim ajp_tomcat.conf [root@centos7 conf.d] # cat ajp_tomcat.conf <VirtualHost *:80> ServerName tc1.taotao.com ProxyRequests Off ProxyVia On ProxyPreserveHost On <Proxy *> Require all granted < /Proxy > ProxyPass / ajp: //192 .168.1.112:8009/ ProxyPa***everse / ajp: //192 .168.1.112:8009/ <Location /> Require all granted < /Location > < /VirtualHost > |
2.在浏览器中键入不同的Tomcat主机名后,后端Tomcat响应不同的虚拟主机,如下:
注意:
-
在使用nginx做反代时,proxy_pass 保留主机名做反代项后端Tomcat请求,所以Tomcat能够根据反代时的主机名来判定,前端反代服务器请求的是Tomcat的哪个虚拟主机;
-
但是,在使用httpd做反代时,不能通过反代(ProxyPass)时使用的主机名来判定后端Tomcat使用什么虚拟主机来响应。所以,这里的ProxyPass和ProxyPa***everse使用主机名或者IP地址是没有任何区别的,反代到后端都为ip地址,Tomcat无法判断使用哪个虚拟主机响应,只能使用默认的虚拟主机响应。为了能够使后端Tomcat能够使用不同的虚拟主机来响应,就要打开ProxyPreserveHost,保留请求时的主机名,这时客户端在浏览器中键入的主机名将会请求反代至后端的Tomcat,然后Tomcat分别对应不同的虚拟主机来响应请求。
如上,就是部署LAMT环境的整个过程。。。
Tomcat 脚本启动、停止、重启
1.在/etc/rc.d/init.d下编写tomcat的脚本
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
|
[root@centos7 ~] # vim /etc/rc.d/init.d/tomcat #!/bin/bash # Tomcat init script for Linux. # # chkconfig: 2345 96 14 # description: The Apache Tomcat servlet/JSP container. # JAVA_OPTS='-Xms64m -Xmx128' JAVA_HOME= /usr/java/latest CATALINA_BASE= /usr/local/tomcat export JAVA_HOME CATALINA_BASE case $1 in start) exec $CATALINA_BASE /bin/catalina .sh start ;; stop) exec $CATALINA_BASE /bin/catalina .sh stop ;; restart) $CATALINA_BASE /bin/catalina .sh stop sleep 2 exec $CATALINA_BASE /bin/catalina .sh start ;; *) echo "Usage: `basename $0` {start|stop|restart}" exit1 ;; esac |
2.添加到chkconfig中,并授予执行权限
1
2
|
[root@centos7 ~] # chkconfig --add tomcat [root@centos7 ~] # chmod +x /etc/rc.d/init.d/tomcat |
3.测试,重启tomcat服务,如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@centos7 ~] # service tomcat restart Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/java/latest Using CLASSPATH: /usr/local/tomcat/bin/bootstrap .jar: /usr/local/tomcat/bin/tomcat-juli .jar Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/java/latest Using CLASSPATH: /usr/local/tomcat/bin/bootstrap .jar: /usr/local/tomcat/bin/tomcat-juli .jar Tomcat started. |