反向代理实现同域名下PHP和Java共存
1、背景介绍
之前一直从事PHP开发工作,公司内业务均由PHP实现,最近由于公司架构微调,分配了几个Java项目给团队,但是由于团队对Java不熟悉,有几人对Java理解程度也是略懂,这里说的略懂,真的是略懂,所以不敢直接改Java代码。那么怎么办呢?经过商量将Java项目的新需求,暂时还是用PHP来实现,但是有一个前提:域名和URL不能变,不能Java代码用一个域名,PHP用另外一个,因为项目提供的接口有被手机APP客户端调用,如果更改接口域名或者是URL,客户端要重新对接,假如将来PHP 要换回Java 又要重新对接,这样非常不方便,所以域名和接口URL不能变化。
新需求不外乎包含两种: 第一 更改之前的已有的功能;第二 新增之前没有的功能。
对于上面两种情况,第一种情况比较复杂,意味着要把Java已经实现的功能放弃(代码不用改),用PHP实现一遍,在此基础上添加新需求的功能,并且URL还不能变。第二种情况需要用PHP实现新功能,当然URL也是新的。根据上面分析,我们必须实现可以识别哪些URL是Java代码负责的,哪些URL是PHP代码负责的,并把它们分配到对应的服务器上去才行。
2、方案设计
根据上面的背景分析就是要实现PHP和Java处理同一个域名的不同URL请求,经过团队内部讨论可以用Nginx反向代理来实现,所谓的反向代理就是来自互联网的请求不直接访问web服务器,而是先访问反向代理服务器(我们这里用Nginx),之后Nginx服务器将请求转发到(内网环境)服务器。
具体方案如下:
首先,我们要给PHP站点和Java站点分别申请一个内网域名,例如(www.php.domain 和 www.java.domain)
1、假如需求是要更改之前java的已经实现的功能。由于此时由于URL已经存在,且不能更改,我们要把URL转到PHP服务器上去处理,这样的情况,可以在反向代理服务器上通过正则去匹配这个需要用PHP来实现已经存在的URL,之后把他rewrite到PHP处理路径再分发到PHP服务器处理(prox_pass www.php.domain)。
2、假如需求是要开发新功能。由于之前的URL不存在,首先要制定一个PHP处理URL路径约定(或者说规定),就是哪些路径下的请求是用PHP来处理的。例如:http://www.abc/php/* 这路径下所有请求都用PHP处理,其他路径的所有请求都用Java处理,这样根据Nginx Rewrite正则来匹配/php/ 路径之后rewrite到php处理路径,之后分发到PHP服务器(prox_pass www.php.domain)。
3、剩下的其他请求,还是需要java来处理,所以当上面两种URL都没有匹配上,自然就由java来处理,直接(prox_pass www.java.domain)
下面是架构图:

3、nginx配置文件代码
server{
listen ;
server_name www.abc.com;
#PHP处理的请求
location ^~ /php/ {
rewrite ^/php/(.*)?(.*)$ /index.php?service=$$ break; #重写到PHP处理(这里只是示例,大家根据自己路径更改)
try_files $uri @my_php;
}
#原来由java处理,现在改为PHP处理的请求
location ^~ /java/urione{
rewrite ^/java/urione(.*)$ /index.php?service=Other.GetTime$ break; #重写到PHP处理(这里只是示例,大家根据自己路径更改)
try_files $uri @my_php;
}
#原来该java处理的,现在还是由java处理
location / {
try_files $uri @my_java;
}
location @my_php {
proxy_pass http://www.php.domain:;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location @my_java {
proxy_pass http://www.java.domain:;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
反向代理实现同域名下PHP和Java共存的更多相关文章
- nginx反向代理实现跨域请求
nginx反向代理实现跨域请求 跨域请求可以通过JSONP实现,缺点是需要修改被请求的服务器端代码进行配合,稍显麻烦通过在自己服务器上配置nginx的反向代理,可以轻松实现跨域请求 思路 示例服务器A ...
- windows环境下 nginx+iis 反向代理解决跨域问题
项目基本完成,是时候花点时间整理一下最近的姿势了 1 什么是跨域? 网上对于跨域的概念会有大篇幅的文章去解释,似乎有点玄乎,初学者很容易对这个概念产生恐惧,跨域其实很简单,其实只要知道一点,无法跨域访 ...
- nginx反向代理解决跨域问题
跨域:浏览器从一个域名的网页去请求另一个域名的资源时,域名.端口.协议任一不同,都是跨域 . 下表格为前后端分离的域名,技术信息: 域名 服务器 使用技术 前端 http://b.yynf.com ...
- VUE线上通过nginx反向代理实现跨域
1.NGINX反向代理实现跨域 VUE代码中配置参考上一篇文章 nginx配置,红色框线内: 代码: location /list { proxy_set_header X-Real-IP $remo ...
- 前端通过Nginx反向代理解决跨域问题
在前面写的一篇文章SpringMVC 跨域,我们探讨了什么是跨域问题以及SpringMVC怎么解决跨域问题,解决方式主要有如下三种方式: JSONP CORS WebSocket 可是这几种方式都是基 ...
- 利用nginx 反向代理解决跨域问题
说到nginx,不得不说真的很强大,也带来很多便利用于解决一些头疼的难题. 一般来说可以用来做:静态页面的服务器.静态文件缓存服务器.网站反向代理.负载均衡服务器等等,而且实现这一切,基本只需要改改那 ...
- nginx介绍(六) - 通过反向代理实现跨域访问
前言 跨域访问问题, 相信很多人都遇到过, 并且都用不同的办法去解决过. 方法有很多种, 不一一叙述了. 这里主要使用nginx反向代理来解决跨域问题. 啥是跨域 假如你是百度开发人员, 在百度页面去 ...
- nginx反向代理解决跨域问题,使本地调试更方便
我们可能都会遇到一个这样的问题,线上环境是https://...,本地启动了项目,域名是localhost:8000等,本地想要访问线上的接口,直接在本地调试,却提示跨域,这个时候我们可以配置ngin ...
- vue反向代理解决跨域
问题描述 在项目开发的时候,接口联调的时候一般都是同域名下,且不存在跨域的情况下进行接口联调,但是当我们现在使用vue-cli进行项目打包的时候,我们在本地启动服务器后,比如本地开发服务下是 http ...
随机推荐
- eclipse maven jetty启动修改默认端口
如何修改eclipse中的maven项目jetty服务器的默认端口那?网上有很多办法,但配置上都没有效果,最后找到了简单.简洁的解决办法,就是在eclipse的jetty启动命令后面加上以下内容 je ...
- 产生唯一的临时文件mkstemp()
INUX下建立临时的方法(函数)有很多, mktemp, tmpfile等等. 今天只推荐最安全最好用的一种: mkstemp. mkstemp (建立唯一临时文件)头文件: #include < ...
- leetcode 之Longest Consecutive Sequence(六)
这题要仔细体会下哈希表的用法,要注意的是数组本身是无序的,因此需要向左右进行扩张. 另外这个思路可以进行聚类,把连续的标记为一类. int longestConsecutive(const vecto ...
- 51Nod 1352 集合计数(扩展欧几里德)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1352 题目大意: 给出N个固定集合{1,N},{2,N-1} ...
- phpmailer发送邮件出现错误:stream_socket_enable_crypto(): SSL operation failed with code 1.
如果开了调试,调试进去会看到错误提示: smtp_code:"stream_socket_enable_crypto(): SSL operation failed with code 1. ...
- 小技巧:tar命令打包目录时,排除文件和目录的命令
今天不巧要用上,百度. tar zcvf fd.tar.gz pardir --exclude=pardir/file1 --exclude=pardir/dir1
- 所有依赖的jar将提取到lib目录
1.在pom.xml添加如下内容: <build> <plugins> <plugin> <artifactId>maven-dependency-pl ...
- 使用亚马逊云服务器EC2做深度学习(一)申请竞价实例
这是<使用亚马逊云服务器EC2做深度学习>系列的第一篇文章. (一)申请竞价实例 (二)配置Jupyter Notebook服务器 (三)配置TensorFlow (四)配置好的系统 ...
- 如何设计一个基于Node.js和Express的网站架构?
前言 今年七月份,我和几个小伙伴们合伙建立了一个开发团队.业务开展如火如荼的同时,团队宣传就提上了日程,所以迫切需要搭建公司网站出来.确定目标后我们就开始考虑如果构建一个企业网站.先是进行业内调查,看 ...
- java EE : http 协议之请求报文、响应报文
1 HTTP协议特点 1)客户端->服务端(请求request)有三部份 a)请求行 b)请求头 c)请求的内容,如果没有,就是空白字符 2)服务端->客户端(响应response)有三部 ...