如何在 Oneinstack 创建的多个应用/网站中指向单一后端API(Spring Mvc)

Oneinstack 是一个很棒的前后端分离集成环境

OneinStack包含以下组合

  • lnmp(Linux + Nginx+ MySQL+ PHP)
  • lamp(Linux + Apache+ MySQL+ PHP)
  • lnmpa(Linux + Nginx+ MySQL+ PHP+ Apache):Nginx处理静态,Apache(mod_php)处理动态PHP
  • lnmt(Linux + Nginx+ MySQL+ Tomcat):Nginx处理静态,Tomcat(JDK)处理JAVA
  • lnmh(Linux + Nginx+ MySQL+ HHVM)

支持系统版本

  • CentOS 6~7(包括redhat)
  • Debian 6~9
  • Ubuntu 12~16
  • Aliyun Linux 15.1

通过Nginx Tengine OpenResty 能够很方便的将前端划分给 Nginx 处理, 后端转发给 Java或者PHP后端API处理.
能够做到完美的前后端分离, 避免前端更新版本需要提交后端发布的尴尬情况
通常前端更新都是比较频繁的, 所以不管是前端还是后端的同学, 在以前套模版开发和整体发布的时代应该都是苦不堪言的
但是现在强大的Nginx等具有反向代理功能并且性能极佳的处理方案出现,前后端分离带给用户的体验也是以前所不能比的
所以以后的前后端分离势必会变得更加流行

说正事

oneinstack1.3 版本之前 Java 的项目是部署在 tomcat 下的 webapps 目录之下的 而前端则另外放置
可以通过统一将后端转发至 127.0.0.1:8080
1.4 版本之后 官方就强制 将前端代码与 war 包放置在同一应用目录下, 因为这样不会混淆和跨应用权限, 一个前端对应一个后端
但是这种方案对于 多个端使用不同前端 但是使用同一套后端的方案是致命的 因为这样意味着要每一个端都上传发布N遍
这时候的接口转发方案 中 127.0.0.1:8080 相对的作用域就是在该应用中才能这样访问,并不是全局通用的
并且也无法通过 ip:8080 访问(除非放置在default目录下), 但是手动将接口转发至此并不能生效(会报请求头过大 应该是转发过程中请求头不停的叠加导致)
看了Tomcat的应用配置文件
Centos最新版的为例
Tomcat站点配置目录在这

1
/www/server/tomcat/conf/vhost

每一个站点都会对应一个配置文件 将不同的域名(xml中的name属性) 指向不同的应用目录
假设我有两个站点

1
2
a.xxx.com
b.xxx.com

其实只要把对应应用指向同一个目录不就搞定了吗?

1
2
3
4
5
<Host name="a.xxx.com " appBase="/www/wwwroot/a.xxx.com" unpackWARs="true" autoDeploy="true">
<Context path="" docBase="/www/wwwroot/a.xxx.com" reloadable="false" crossContext="true"/>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="a.xxx.com_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>

你可以将API部署在一个 a.xxx.com
然后将 b.xxx.com (需要指向统一后端的)对应的的 tomcat 站点配置xml文件中的两个目录 如下 修改 appBasedocBase 目录都指向那个已经部署了的 a.xxx.com 目录即可

1
2
3
4
5
<Host name="b.xxx.com " appBase="/www/wwwroot/a.xxx.com" unpackWARs="true" autoDeploy="true">
<Context path="" docBase="/www/wwwroot/a.xxx.com" reloadable="false" crossContext="true"/>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="b.xxx.com_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>

Nginx 相应站点都不需要更改转发的 这时候相对的 127.0.0.1:8080 就是同一个应用目录(a.xxx.com)啦~

坚持原创技术分享,您的支持将鼓励我继续创作!