最近遇到一个比较棘手的问题,以前给易班开发了两个应用 网薪商城 和 座位预约 ,都是使用 ssh 开发,是自己学习初期开发出来,将它部署在了 centos + tomcat 的环境上,域名对应我的二级域名 yiban.echocow.cn/YBStore 和 yiban.echocow.cn/YBSeatOrder ,后面的路径对应不同的应用,用 tomcat 做的多域名配置。而后面,又开发了一个 易运动 应用,但是这个应用完全是前后端分离的,使用 nginx 代理静态页面,vertx 做后端部署在服务器的 8000 端口,域名同样使用 yiban.echocow.cn,引用对应的路径为 /YBSport
前提
目前已有的应用,部署在 tomcat 之上
-
tomcat admin —— admin.echocow.cn
-
网薪商城 ———— yiban.echocow.cn/YBStore
-
座位预约 ———— yiban.echoocw.cn/YBSeatOrder
配置文件 server.xml 中 Service 如下
<Service name="Catalina">
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"
URIEncoding='GBK' acceptCount="500" maxThreads="400" maxHttpHeaderSize="8192" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<!-- 管理员 -->
<Host name="admin.echocow.cn" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<!-- 易班 -->
<Host name="yiban.echocow.cn" appBase="webapps/yiban" port="80" protocol="HTTP/1.1"
connectionTimeout="20000" redirectPort="8443" unpackWARs="true" autoDeploy="true">
<Context path="/YBSeatOrder" docBase="YBSeatOrder" debug="0" reloadable="true" />
<Context path="/YBStore" docBase="YBStore" debug="0" reloadable="true" />
</Host>
</Engine>
</Service>
有一个新应用 易运动 ,部署在 nginx 上,配置如下:
server {
listen 80;
server_name yiban.echocow.cn;
access_log logs/yiban.access.log main;
location /YBSport {
root /root/yiban/;
index index.html;
}
}
问题
tomcat 与 nginx 同时占用了 80 端口,只能舍掉一个,但是只能使用 nginx ,因为 tomcat 对静态页面支持是没有 nginx 好的。
所以,我必须在 不改变原来应用 和 路径 的情况下,将 tomcat 部署到 nginx 之中
解决
一开始不打算修改 tomcat 的配置的,但是后来发现不修改不行。不能使用 tomcat 的域名配置,只能使用 nginx 的域名配置,然后将 tomcat 的应用部署在本地不同端口上,使用 nginx 对不同路径的应用进行重定向至其本地端口上。
tomcat server,xml修改配置文件如下:
<!-- 8080 端口 --- 管理员 -->
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" URIEncoding='GBK'
acceptCount="500" maxThreads="400" maxHttpHeaderSize="8192" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<!-- 部署到本地 -->
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
<!-- 8081 端口 --- 易班引用 -->
<Service name="Catalina">
<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"
URIEncoding='GBK' acceptCount="500" maxThreads="400" maxHttpHeaderSize="8192" />
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
<!-- 部署到本地 -->
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps/yiban" port="80" protocol="HTTP/1.1"
connectionTimeout="20000" redirectPort="8443" unpackWARs="true" autoDeploy="true">
<Context path="/YBSeatOrder" docBase="YBSeatOrder" debug="0" reloadable="true" />
<Context path="/YBStore" docBase="YBStore" debug="0" reloadable="true" />
</Host>
</Engine>
</Service>
这样,对应下来就是
应用 | url |
---|---|
管理员 |
localhost:8080 |
网薪商城 |
localhost:8081/YBStore |
座位预约 |
localhost:8081/YBSeatOrder |
nginx 就可以对其交给不同的端口的应用来处理了:
server {
listen 80;
server_name yiban.echocow.cn;
access_log logs/yiban.access.log main;
# 易运动
location /YBSport {
root /root/yiban/;
index index.html;
}
# 网薪商城
location /YBStore {
proxy_pass http://127.0.0.1:8081/YBStore;
proxy_redirect default;
}
# 作为预约
location /YBSeatOrder/ {
proxy_pass http://127.0.0.1:8081/YBStore;
proxy_redirect default;
}
}
这样就能实现 nginx 即代理静态页面又代理 tomcat 了。