在Apache中整合JSP和PHP

 

我们最希望任何事都是完美的,如在企业应用中,我们只需要选择一个Web平台就可以部署所有的企业应用。但往往理想与现实相去甚远。在现实世界中,信息系统往往是由很多不同的操作系统、平台以及应用环境混合而成的。而且为了保持与旧的系统兼容,系统总是将当前的技术和以前的遗留技术进行混合,这样周而复始。就使系统变得越来越复杂。

对于这样的恶性变化会使很多人疲于奔命,尤其是开发人员,他们将面临几乎令人崩溃般的挑战。尤其是要将两个或更多的技术部署在同一个应用时更是如此。如本文要给出的例子中,就是将PHP和JSP程序同时部署在运行于Apache中的同一个应用程序中。在这个例子中,将提供一种方法来快速地部署这两种Web程序。开发人员也可以借鉴这种方法来处理其他类似的难题。

也许有很多人会问,我应该如做也能将基于PHP和JSP的Web程序部署在同一个Web应用程序中呢?下面我就来回答这个问题。这个问题的基本答案就是先将apache配置成PHP Web服务器,并使用Apache来处理所有的PHP/CGI请求,同时使用Tomcat处理所有的其他请求(包括JSP请求)。在开始之前,让我们先看看需要哪些软件:

完成本文的例子需要三个软件:
1. Apache HTTP Server 
2. Apache Tomcat 
3. Apache Tomcat Connectors

一、解决方案所使用的技术

对于上述的问题,我们有几个解决方案可以考虑。这些解决方案如下所示:

1. 使Apache服务器作为主要的或默认的请求处理器,只传递Servlet/JSP请求给Java容器。

2. 将Java容器作为主要或默认的请求处理器,只允许PHP/CGI请求由Apache处理。

3. 不使用Apache,并在Tomcat中运行PHP/CGI程序。

上述的前两种解决方案类似。这两种方法都是将大量的请求引入某一个服务器(Tomcat或Apache),然后使用别外的服务器处理个别的请求(JSP或PHP)。第三种方法虽然看起来比较简单,很诱人。但Apache在处理PHP时的效率是非常高的,并且提供了更安全的机制,因此,Tomcat并不合适处理PHP程序。

在本文中我们将采用第二种方案,就是将Tomcat作为主要的Web服务器来接收大部分请求,同时Apache作为后备服务器来处理PHP/CGI请求,它们的关系如图1所示。如果读者对第一种方法情有独衷,可以很容易地根据第二种方法来设置。

图1  Tomcat作为主要的请求处理器,Apache作为辅助请求处理器

二、配置Apache
 
    在整个处理过程中的第一步是非常重要的,同时也是最复杂的。也就是需要安装Apache服务器,然后对Apache进行配置,以支持Apache Tomcat。对于安装来说,我们可以在google或baidu上搜索相关文章,这个本文不太详细讲述。但如何去配置它呢,首先我们需要使用一个Apache Tomcat connector,我们可以选择mod_jk或mod_jk2。在这里我强烈推荐使用mod_jk,因为mod_jk早在三年前就被放弃了。我们首先打开Apache的配置文件httpd.conf,将看到如下的内容:

#
# Use name-based virtual hosting.
#
#NameVirtualHost *:80
 
#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for requests without a known
# server name.
#

在下面的部分,将建立一个VirtualHost节点,它将捕捉所有的在80端口的HTTP请求,
并将它们按着上述的方法进行映射(Tomcat是默认的,Apache只处理PHP和CGI请求)。

<VirtualHost *:80>
    # Set DocumentRoot equal to Tomcat ROOT context
    DocumentRoot /www/webapps/ROOT
 
    # Exclude PHP & CGI (let Apache handle)
    SetEnvIf Request_URI \.php no-jk
    SetEnvIf Request_URI \.cgi no-jk
 
# 通过mod_jk,处理每一个请求(除了PHP和CGI)
# 将处理从Apache传给Tomcat
    JkMount /* myWorker
 
</VirtualHost>
 
在上面的描述中,我们应该很容易将其变能第一种方法,也就是只向JkMount处理jsp或servlet请求到Tomcat上

一查我们对环境进行了正确的配置,我们就可以将应用程序打包并发布到Web服务器了。将应用程序发布到Apache上和发布到Tomcat上没什么不同,都需要建立一个WEB-INF/web.xml文件,所不同的是如果请求的是PHP或CGI程序,将绕过Tomcat直接传给Apache来处理。

尽管改变Apache的根目录(默认是'dtdocs')对于发布应用程序并不方便。但我们可以将Apache的根目录指向Tomcat的发布目录。这样PHP/CGI就可以和JSP打在同一个WAR/EAR包中。我们只要简单地目录中放置JSP、HTML和PHP页即可完成发布。这对于开发,还是测试都是非常方便的。

另外,将PHP、JSP和CGI发布到同一个目录中还可以使它们共享相同的支持文件(CSS、JS、images等)的内容。还有,这个模型提供了一个Web应用程序的完整结构,以及从Java Web目录中调用PHP/CGI程序变得更简单(相对而言)。
 
四、总结

无论你在工作中是否被要求集成遗留的Web应用程序到新的Web程序中,或是将某个开源系统加进定制的Web应用中,或简单地将两个不同的Web应用集成到一起,你都有可能将不同的技术集成到同一个Web应用中。总之一句话,将不同的技术转换到同一种技术平台上是最好的解决方案

在Apache中整合JSP和PHP的更多相关文章

  1. eclipse 中springboot2.0整合jsp 出现No Java compiler available for configuration options compilerClassName

    今天使用eclipse创建springboot整合jsp出现一个问题,在idea中并没有遇到这个问题.最后发现是需要在eclipse中添加一个eclipse依赖,依赖如下: <dependenc ...

  2. Idea中SpringBoot整合JSP

    最近在学习SpringBoot,看到SpringBoot整合jsp,顺带记录一下. 1.创建一个SpringBoot项目 点击Next 注意:packaging选中War,点击Next Webà选中W ...

  3. apache+tomcat整合后的编码问题

    apache+tomcat整合提供webserver服务的方式是为了实现两个目的:一是方便利用apache http server将客户请求均衡的分给tomcat1,tomcat2....去处理,即负 ...

  4. apache+tomcat整合

    一 .Apache与Tomcat的比较 apache支持静态页面,tomcat支持动态的,比如servlet等. 一般使用apache+tomcat的话,apache只是作为一个转发,对jsp的处理是 ...

  5. apache FtpServer 整合spring部署

    我们在项目中可能会出现这样的需求,使用ftp上传很大的文件后对需要对文件进行相应的逻辑处理,这时我们可以使用apache ftpServer来处理这段逻辑,只要我们做相应的部署和编写我们的逻辑代码,这 ...

  6. spring boot整合jsp的那些坑(spring boot 学习笔记之三)

    Spring Boot 整合 Jsp 步骤: 1.新建一个spring boot项目 2.修改pom文件 <dependency>            <groupId>or ...

  7. SpringBoot整合Jsp和Thymeleaf (附工程)

    前言 本篇文章主要讲述SpringBoot整合Jsp以及SpringBoot整合Thymeleaf,实现一个简单的用户增删改查示例工程.事先说明,有三个项目,两个是单独整合的,一个是将它们整合在一起的 ...

  8. JAVA SpringBoot2 整合 JSP视图模板 整合 Ueditor富文本编辑器

    一般涉及到后台管理系统,就少不了富文本编辑器,这个可以图,文,视频混排的高级工具,笔者通过对比,发现目前市场上最好的三方库还当属百度的 ueditor 近年来 SpringBoot 框架可谓越来越火, ...

  9. Spring boot整合jsp

    这几天在集中学习Spring boot+Shiro框架,因为之前view层用jsp比较多,所以想在spring boot中配置jsp,但是spring boot官方不推荐使用jsp,因为jsp相对于一 ...

随机推荐

  1. 201621123034 《Java程序设计》第9周学习总结

    作业09-集合与泛型 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 答:Map的HashMap中使用嵌套类static class Node<K,V& ...

  2. cfq调度器

    cfq调度是block层最复杂的一个调度器,主要思想是是说每个进程平均享用IO带宽,实现方法是在时间上对进程进行划分,以此达到平均占用IO的目的.带着几个问题去看cfq 1)现在进程来了之后,是插入到 ...

  3. 【bzoj3779】重组病毒 LCT+树上倍增+DFS序+树状数组区间修改区间查询

    题目描述 给出一棵n个节点的树,每一个节点开始有一个互不相同的颜色,初始根节点为1. 定义一次感染为:将指定的一个节点到根的链上的所有节点染成一种新的颜色,代价为这条链上不同颜色的数目. 现有m次操作 ...

  4. JS获取照片拍摄的角度属性,用于旋转控制

    我工作十余年,从负责一个模块,到负责一个产品,再到负责整个支付平台的架构设计,包括业务架构.产品架构到应用架构,再到技术架构,是一个从点到面逐渐转型的过程,同样是个“自相似”的现象,我一开始写博客,再 ...

  5. UltraEdit 删除空行

    UltraEdit 删除空行 数据里有大量的空行,想在UltraEdit里删除,在网上搜了很多方法都不管用,功夫不负有心人,最后终于找到了可用的方法: 搜索—>替换,在“查找什么”里输入:\n( ...

  6. js获取url参数,操作url参数

    function getParam(key) { var tmp = location.search; tmp = decodeURIComponent(tmp); var index = tmp.i ...

  7. CodeVs1515 跳

    题目描述 Description 邪教喜欢在各种各样空间内跳. 现在,邪教来到了一个二维平面.在这个平面内,如果邪教当前跳到了(x,y),那么他下一步可以选择跳到以下4个点:(x-1,y), (x+1 ...

  8. lightgbm 学习笔记

    首先是配置文件参数.参考自https://lightgbm.apachecn.org/#/docs/6 配置参数实在是太多了,大家还是去原文档查表吧orz 参数名 可选参数 作用 config= 自填 ...

  9. 通过OpenGL ES在iOS平台实践增强现实(一)

    http://ios.9tech.cn/news/2013/1108/38495.html 1.本文采用OpenGL ES 1固定渲染管线实现,目标为在设备拍摄到的现实世界中,绘制世界坐标轴,并根据设 ...

  10. 【原创】Linux环境下的图形系统和AMD R600显卡编程(9)——R600显卡的3D引擎和图形流水线

    1. R600 3D引擎 R600核心是AMD一款非常重要的GPU核心,这个核心引入了统一处理器架构,其寄存器和指令集同以前的GPU 都完全不同,对其编程也有比较大的区别. 图1显示了R600 GPU ...