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共存的更多相关文章

  1. nginx反向代理实现跨域请求

    nginx反向代理实现跨域请求 跨域请求可以通过JSONP实现,缺点是需要修改被请求的服务器端代码进行配合,稍显麻烦通过在自己服务器上配置nginx的反向代理,可以轻松实现跨域请求 思路 示例服务器A ...

  2. windows环境下 nginx+iis 反向代理解决跨域问题

    项目基本完成,是时候花点时间整理一下最近的姿势了 1 什么是跨域? 网上对于跨域的概念会有大篇幅的文章去解释,似乎有点玄乎,初学者很容易对这个概念产生恐惧,跨域其实很简单,其实只要知道一点,无法跨域访 ...

  3. nginx反向代理解决跨域问题

    跨域:浏览器从一个域名的网页去请求另一个域名的资源时,域名.端口.协议任一不同,都是跨域 . 下表格为前后端分离的域名,技术信息:   域名 服务器 使用技术 前端 http://b.yynf.com ...

  4. VUE线上通过nginx反向代理实现跨域

    1.NGINX反向代理实现跨域 VUE代码中配置参考上一篇文章 nginx配置,红色框线内: 代码: location /list { proxy_set_header X-Real-IP $remo ...

  5. 前端通过Nginx反向代理解决跨域问题

    在前面写的一篇文章SpringMVC 跨域,我们探讨了什么是跨域问题以及SpringMVC怎么解决跨域问题,解决方式主要有如下三种方式: JSONP CORS WebSocket 可是这几种方式都是基 ...

  6. 利用nginx 反向代理解决跨域问题

    说到nginx,不得不说真的很强大,也带来很多便利用于解决一些头疼的难题. 一般来说可以用来做:静态页面的服务器.静态文件缓存服务器.网站反向代理.负载均衡服务器等等,而且实现这一切,基本只需要改改那 ...

  7. nginx介绍(六) - 通过反向代理实现跨域访问

    前言 跨域访问问题, 相信很多人都遇到过, 并且都用不同的办法去解决过. 方法有很多种, 不一一叙述了. 这里主要使用nginx反向代理来解决跨域问题. 啥是跨域 假如你是百度开发人员, 在百度页面去 ...

  8. nginx反向代理解决跨域问题,使本地调试更方便

    我们可能都会遇到一个这样的问题,线上环境是https://...,本地启动了项目,域名是localhost:8000等,本地想要访问线上的接口,直接在本地调试,却提示跨域,这个时候我们可以配置ngin ...

  9. vue反向代理解决跨域

    问题描述 在项目开发的时候,接口联调的时候一般都是同域名下,且不存在跨域的情况下进行接口联调,但是当我们现在使用vue-cli进行项目打包的时候,我们在本地启动服务器后,比如本地开发服务下是 http ...

随机推荐

  1. centos7安装Python3的过程中会和Python2.7版本冲突导致yum版本比对应,致使yum不能使用的问题。

    centos7安装Python3的过程中会和Python2.7版本冲突导致yum版本比对应,致使yum不能使用的问题. 原因:yum调用Python,启动程/usr/bin/yum就是一个python ...

  2. laravel入门教程

    参考地址:https://github.com/johnlui/Learn-Laravel-5/issues/16

  3. linux 定时执行任务 at atq atrm命令的使用

    1.at命令在指定时刻执行指定的命令序列 at [-V] [-q 队列] [-f 文档名] [-mldbv] 时间 下面对命令中的参数进行说明.-V 将标准版本号打印到标准错误中.-q queue 使 ...

  4. 查找网页元素对应的js代码

    按F12打开调试窗口,切换到Sources选项卡,最右边的Event Listener Breakpoints里勾选Mouse下的mouseover即可,当鼠标移动到图片上时触发mouseover事件 ...

  5. POJ - 1251

    Jungle Roads Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20024   Accepted: 9234 Des ...

  6. Pylint在项目中的使用

    需求背景: Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准和有潜在问题的代码. Pylint 是一个 Python 工具,除了平常代码分析 ...

  7. Linux shell 中$() ` `,${},$[] $(()),[ ] (( )) [[ ]]作用与区别

    转载自 https://blog.csdn.net/x1269778817/article/details/46535729 参考: https://stackoverflow.com/questio ...

  8. Download Percona Monitoring Plugins

    https://www.percona.com/downloads/percona-monitoring-plugins/LATEST/

  9. Three.js基础探寻八——法向材质与材质的纹理贴图

    4.法向材质 法向材质可以将材质的颜色设置为其法向量的方向,有时候对于调试很有帮助. 法向材质的设定很简单,甚至不用设置任何参数: new THREE.MeshNormalMaterial() 材质的 ...

  10. UVA 1400."Ray, Pass me the dishes!" -分治+线段树区间合并(常规操作+维护端点)并输出最优的区间的左右端点-(洛谷 小白逛公园 升级版)

    "Ray, Pass me the dishes!" UVA - 1400 题意就是线段树区间子段最大和,线段树区间合并,但是这道题还要求输出最大和的子段的左右端点.要求字典序最小 ...