神马是httpnginx http 反向代理通信

当前访客身份:游客 [
当前位置:
问题描述: &
用 Hessian 实现 web service 过程中,需要创建对象时,是使用 HTTP POST 方法来传递数据的。但是在有反向代理 (nginx) 的情况下,会抛出异常 (com.caucho.hessian.client.HessianConnectionException: 411:java.io.IOException: Server returned HTTP response code: 411 for URL:http://xxxx/xxx/xxxService) 。
首先来看下 HTTP 411 错误的解释: Length Required 服务器不能处理请求,除非客户发送一个 Content-Length 头。( HTTP 1.1 新)这是因为 Hessian 与服务端通信默认是采取分块的方式 (chunked encoding) 发送数据,而反向代理要获得 Content-Length 这个头,才能处理请求,但是 Hessian 的请求中并没有加入这个参数。
解决方法: &
com.caucho.hessian.client.HessianProxyFactory 类中,有一个 boolean _chunckedPost 的域成员,其默认值为 true 。这个值就是规定 Hessian 是否以分块发送的方式与服务端交换数据的参数,因此在创建 com.caucho.hessian.client.HessianProxyFactory 的对象后(假设为 factory ),只要调用其上的 setChunckedPost() 方法,把这个属性设置为 false 即可。即 factory.setChunkedPost(false);
分块编码传输:
分块编码 (chunked encoding) 传输方式是 HTTP 1.1 协议中定义的 Web 用户向服务器提交数据的一种方法,当服务器收到 chunked 编码方式的数据时会分配一个缓冲区存放之,如果提交的数据大小未知,客户端会以一个协商好的分块大小向服务器提交数据。
The content can be broken up int each of which is prefixed by its size in bytes. A zero size chunk indicates the end of the response message. If a server is using chunked encoding it must set the Transfer-Encoding header to &chunked&.
Chunked encoding is useful when a large amount of data is being returned to the client and the total size of the response may not be known until the request has been fully processed. An example of this is generating an HTML table of results from a database query. If you wanted to use the Content-Length header you would have to buffer the whole result set before calculating the total content size. However, with chunked encoding you could just write the data one row at a time and write a zero sized chunk when the end of the query was reached.
如果不使用 Chunked encoding 传输方式,需要将要发送的数据缓存下来,计算出 content-length ,从而满足反向代理( Nginx )需要 content-length 的要求。
业务系统对 hessian 进行封装:
1.根据 HessianProxyFactoryBean 实现 MyHessianProxyFactoryBean&&
public class MyHessianProxyFactoryBean extends MyHessianClientInterceptor implements FactoryBean {&&
&&& private Object serviceProxy ;&&
&&& public void afterPropertiesSet() {
&&&&&&& super .afterPropertiesSet();
&&&&&&& this . serviceProxy = new ProxyFactory(getServiceInterface(), this )
&&&&&&&&&&&&&&& .getProxy(getBeanClassLoader());
&&& public Object getObject() {
&&&&&&& return this . serviceProxy ;
&&& public Class getObjectType() {
&&&& &&& return getServiceInterface();
&&& public boolean isSingleton() {
&&&&&&& return true ;
2.根据 HessianClientInterceptor 实现 MyHessianClientInterceptor&&
public class MyHessianClientInterceptor extends UrlBasedRemoteAccessor implements MethodInterceptor {&&
&&& private HessianProxyFactory proxyFactory = new MyHessianProxyFactory();&&
private Object hessianProxy ;&&
……………………
3.继承 HessianProxyFactory 实现 MyHessianProxyFactory&&
public class MyHessianProxyFactory extends HessianProxyFactory {&&
&&& @Override
&&& public Object create(Class api, String urlName, ClassLoader loader)
&&&&&&&&&&& throws MalformedURLException {
&&&&&&& this .setChunkedPost( false ); // 设置规定 Hessian 不以分块发送的方式与服务端交换数据,解决 hessian 和 nginx 的 411 错误
&&&&&&& if (api == null ) throw new NullPointerException(
&&&&&&&&&&&&&&& &api must not be null for HessianProxyFactory.create()& );
&&&&&&& InvocationHandler handler = null ;&&
&&&&&&& URL url = new URL(urlName);
&&&&&&& handler = new MyHessianProxy(url, this );&&
&&&&&&& return Proxy.newProxyInstance (loader, new Class[] { api, HessianRemoteObject. class },
&&&&&&&&&&&&&&& handler);
4.继承 HessianProxy 实现 MyHessianProxy
public class MyHessianProxy extends HessianProxy {
&&& public MyHessianProxy(URL url, HessianProxyFactory factory) {
&&&&&&& super (url, factory);
&&& /** Get information from the headers of response */
&&& @Override
&&& protected void parseResponseHeaders(URLConnection conn) {&&
&&& /** Add information to request headers */
&&& @Override
&&& protected void addRequestHeaders(URLConnection conn) {&&
针对该问题的简单配置:
&&&&&&&& 在 xml 配置文件中添加属性:
& property name = &chunkedPost& &
&&&&&&&&&& & value & false &/ value &
&&&&&& &/ property &
&&&&&& & property name = &readTimeout& &
&&&&&&&&&& & value & 25000 &/ value &
&&&&&& &/ property &
&&&&&&&& 该问题还可以通过修改 nginx 配置,使得 nginx 可以处理分块编码 (chunked encoding) 传输方式。据本人所知, nginx 还没有明确的解决方案,需要继续研究。
&&&&&&&& Hessian 扩展性很好,它的实现预留了一些接口,允许开发人员对其进行一定的封装,从而按自己的需求对 hessian 进行设置。
共有0个评论
更多开发者职位上
有什么技术问题吗?
鉴客的其他问题
类似的话题3814人阅读
英文原文:
在过去的几年中,web开发已经发生了很大的变化。现如今,我们期望的是能够通过web快速、动态地访问应用。在这一新的文章系列中,我们学习如何使用反向Ajax(Reverse Ajax)技术来开发事件驱动的web应用,以此来实现更好的用户体验。客户端的例子使用的是JQuery JavaScript库,在这首篇文章中,我们探索不同的反向Ajax技术,使用可下载的例子来学习使用了流(streaming)方法和长轮询(long polling)方法的Comet。
  web开发在过去的几年中有了很大的进展,我们已经远超了把静态网页链接在一起的做法,这种做法会引起浏览器的刷新,并且要等待页面的加载。现在需要的是能够通过web来访问的完全动态的应用,这些应用通常需要尽可能的快,提供近乎实时的组件。在这一新的由五部分组成的文章系列中,我们学习如何使用反向Ajax(Reverse Ajax)技术来开发事件驱动的web应用。
  在这第一篇文章中,我们要了解反向Ajax、轮询(polling)、流(streaming)、Comet和长轮询(long polling),学习如何实现不同的反向Ajax通信技术,并探讨每种方法的优点和缺点。你可以下载本文中例子的相应源代码。
  Ajax、反向Ajax和WebSocket
  异步的JavaScript和XML(Asynchronous JavaScript and XML,Ajax),一种可通过JavaScript来访问的浏览器功能特性,其允许脚本向幕后的网站发送一个HTTP请求而又无需重新加载页面。Ajax的出现已经超过了十年,尽管其名字中包含了XML,但你几乎可以在Ajax请求中传送任何的东西,最常用的数据是JSON,其与JavaScript语法很接近,且消耗更少带宽。清单1给出了这样的一个例子,Ajax请求通过某个地方的邮政编码来检索该地的名称。
  清单1. Ajax请求举例
var&url&='http://www.geonames.org/postalCodeLookupJSON?postalcode='
  +&$('#postalCode').val()&+'&country='
  +&$('#country').val()&+'&callback=?';
  $.getJSON(url,&function(data)
  $('#placeName').val(data.postalcodes[0].placeName);
  在本文可下载的源代码中,你可在listing1.html中看到这一例子的作用。
  反向Ajax(Reverse Ajax)本质上则是这样的一种概念:能够从服务器端向客户端发送数据。在一个标准的HTTP Ajax请求中,数据是发送给服务器端的,反向Ajax可以某些特定的方式来模拟发出一个Ajax请求,这些方式本文都会论及,这样的话,服务器就可以尽可能快地向客户端发送事件(低延迟通信)。
  WebSocket技术来自HTML5,是一种最近才出现的技术,许多浏览器已经支持它(Firefox、Google Chrome、Safari等等)。WebSocket启用双向的、全双工的通信信道,其通过某种被称为WebSocket握手的HTTP请求来打开连接,并用到了一些特殊的报头。连接保持在活动状态,你可以用JavaScript来写和接收数据,就像是正在用一个原始的TCP套接口一样。WebSocket会在这一文章系列的第二部分中谈及。
  反向Ajax技术
  反向Ajax的目的是允许服务器端向客户端推送信息。Ajax请求在缺省情况下是无状态的,且只能从客户端向服务器端发出请求。你可以通过使用技术模拟服务器端和客户端之间的响应式通信来绕过这一限制。
  HTTP轮询和JSONP轮询
  轮询(polling)涉及了从客户端向服务器端发出请求以获取一些数据,这显然就是一个纯粹的Ajax HTTP请求。为了尽快地获得服务器端事件,轮询的间隔(两次请求相隔的时间)必须尽可能地小。但有这样的一个缺点存在:如果间隔减小的话,客户端浏览器就会发出更多的请求,这些请求中的许多都不会返回任何有用的数据,而这将会白白地浪费掉带宽和处理资源。
  图1中的时间线说明了客户端发出了某些轮询请求,但没有信息返回这种情况,客户端必须要等到下一个轮询来获取两个服务器端接收到的事件。
  图1. 使用HTTP轮询的反向Ajax
  JSONP轮询基本上与HTTP轮询一样,不同之处则是JSONP可以发出跨域请求(不是在你的域内的请求)。清单1使用JSONP来通过邮政编码获取地名,JSONP请求通常可通过它的回调参数和返回内容识别出来,这些内容是可执行的JavaScript代码。
  要在JavaScript中实现轮询的话,你可以使用setInterval来定期地发出Ajax请求,如清单2所示:
  清单2. JavaScript轮询
setInterval(function()
  $.getJSON('events',&function(events)
    console.log(events);
  文章源代码中的轮询演示给出了轮询方法所消耗的带宽,间隔很小,但可以看到有些请求并未返回事件,清单3给出了这一轮询示例的输出。
  清单3. 轮询演示例子的输出
[client]&checking
for events...
[client]&no
[client]&checking
for events...
[client]2&events
[event]&At
Sun Jun&0515:17:14&EDT&2011
[event]&At
Sun Jun&0515:17:14&EDT&2011
[client]&checking
for events...
[client]1&events
[event]&At
Sun Jun&0515:17:16&EDT&2011
  用JavaScript实现的轮询的优点和缺点:
  1. 优点:很容易实现,不需要任何服务器端的特定功能,且在所有的浏览器上都能工作。
  2. 缺点:这种方法很少被用到,因为它是完全不具伸缩性的。试想一下,在100个客户端每个都发出2秒钟的轮询请求的情况下,所损失的带宽和资源数量,在这种情况下30%的请求没有返回数据。
  Piggyback
  捎带轮询(piggyback polling)是一种比轮询更加聪明的做法,因为它会删除掉所有非必需的请求(没有返回数据的那些)。不存在时间间隔,客户端在需要的时候向服务器端发送请求。不同之处在于响应的那部分上,响应被分成两个部分:对请求数据的响应和对服务器事件的响应,如果任何一部分有发生的话。图2给出了一个例子。
  图2. 使用了piggyback轮询的反向Ajax
  在实现piggyback技术时,通常针对服务器端的所有Ajax请求可能会返回一个混合的响应,文章的下载中有一个实现示例,如下面的清单4所示。
  清单4. piggyback代码示例
$('#submit').click(function()
  $.post('ajax',&function(data)
    var&valid&=&data.formV
    //&处理验证结果
    //&然后处理响应的其他部分(事件)
    processEvents(data.events);
  清单5给出了一些piggyback输出。
  清单5. piggyback输出示例
[client]&checking
for events...
[server]&form
valid ? true
[client]4&events
[event]&At
Sun Jun&0516:08:32&EDT&2011
[event]&At
Sun Jun&0516:08:34&EDT&2011
[event]&At
Sun Jun&0516:08:34&EDT&2011
[event]&At
Sun Jun&0516:08:37&EDT&2011
  你可以看到表单验证的结果和附加到响应上的事件,同样,这种方法也有着一些优点和缺点:
  1. 优点:没有不返回数据的请求,因为客户端对何时发送请求做了控制,对资源的消耗较少。该方法也是可用在所有的浏览器上,不需要服务器端的特殊功能。
  2. 缺点:当累积在服务器端的事件需要传送给客户端时,你却一点都不知道,因为这需要一个客户端行为来请求它们。
  使用了轮询或是捎带的反向Ajax非常受限:其不具伸缩性,不提供低延迟通信(只要事件一到达服务器端,它们就以尽可能快的速度到达浏览器端)。Comet是一个web应用模型,在该模型中,请求被发送到服务器端并保持一个很长的存活期,直到超时或是有服务器端事件发生。在该请求完成后,另一个长生存期的Ajax请求就被送去等待另一个服务器端事件。使用Comet的话,web服务器就可以在无需显式请求的情况下向客户端发送数据。
  Comet的一大优点是,每个客户端始终都有一个向服务器端打开的通信链路。服务器端可以通过在事件到来时立即提交(完成)响应来把事件推给客户端,或者它甚至可以累积再连续发送。因为请求长时间保持打开的状态,故服务器端需要特别的功能来处理所有的这些长生存期请求。图3给出了一个例子。(这一文章系列的第2部分会更加详细地解释服务器端的约束条件)。
  图3. 使用Comet的反向Ajax
  Comet的实现可以分成两类:使用流(streaming)的那些和使用长轮询(long polling)的那些。
  使用HTTP流的Comet
  在流(streaming)模式中,有一个持久连接会被打开。只会存在一个长生存期请求(图3中的#1),因为每个到达服务器端的事件都会通过这同一连接来发送。因此,客户端需要有一种方法来把通过这同一连接发送过来的不同响应分隔开来。从技术上来讲,两种常见的流技术包括Forever Iframe(隐藏的IFrame),或是被用来在JavaScript中创建Ajax请求的XMLHttpRequest对象的多部分(multi-part)特性。
  Forever Iframe
  Forever Iframe(永存的Iframe)技术涉及了一个置于页面中的隐藏Iframe标签,该标签的src属性指向返回服务器端事件的servlet路径。每次在事件到达时,servlet写入并刷新一个新的script标签,该标签内部带有JavaScript代码,iframe的内容被附加上这一script标签,标签中的内容就会得到执行。
  1. 优点:实现简单,在所有支持iframe的浏览器上都可用。
  2. 缺点: 没有方法可用来实现可靠的错误处理或是跟踪连接的状态,因为所有的连接和数据都是由浏览器通过HTML标签来处理的,因此你没有办法知道连接何时在哪一端已被断开了。
  Multi-part
XMLHttpRequest
  第二种技术,更可靠一些,是XMLHttpRequest对象上使用某些浏览器(比如说Firefox)支持的multi-part标志。Ajax请求被发送给服务器端并保持打开状态,每次有事件到来时,一个多部分的响应就会通过这同一连接来写入,清单6给出了一个例子。
  清单6. 设置Multi-part XMLHttpRequest的JavaScript代码示例
var&xhr&=&$.ajaxSettings.xhr();
xhr.multipart&=true;
xhr.open('GET',&'ajax',&true);
xhr.onreadystatechange&=&function()
  if&(xhr.readyState&==&4)
    processEvents($.parseJSON(xhr.responseText));
xhr.send(null);
  在服务器端,事情要稍加复杂一些。首先你必须要设置多部分请求,然后挂起连接。清单7展示了如何挂起一个HTTP流请求。(这一系列的第3部分会更加详细地谈及这些API。)
  清单7. 使用Servlet 3 API来在servlet中挂起一个HTTP流请求
protected&void&doGet(HttpServletRequest
req, HttpServletResponse resp)
throws ServletException, IOException {
  //&开始请求的挂起
  AsyncContext asyncContext&=&req.startAsync();
  asyncContext.setTimeout(0);
  //&给客户端发回多部分的分隔符
  resp.setContentType(&multipart/x-mixed-boundary=\&&
  +&boundary&+&\&&);
  resp.setHeader(&Connection&,&&keep-alive&);
  resp.getOutputStream().print(&--&+&boundary);
  resp.flushBuffer();
  //&把异步上下文放在列表中以被将来只用
  asyncContexts.offer(asyncContext);
  现在,每次有事件发生时你都可以遍历所有的挂起连接并向它们写入数据,如清单8所示:
  清单8. 使用Servlet 3 API来向挂起的多部分请求发送事件
for&(AsyncContext
asyncContext : asyncContexts) {
  HttpServletResponse peer&=&(HttpServletResponse)
  asyncContext.getResponse();
  peer.getOutputStream().println(&Content-Type:
application/json&);
  peer.getOutputStream().println();
  peer.getOutputStream().println(new&JSONArray()
  .put(&At&&+new&Date()).toString());
  peer.getOutputStream().println(&--&+&boundary);
  peer.flushBuffer();
  本文可下载文件的Comet-straming文件夹中的部分说明了HTTP流,在运行例子并打开主页时,你会看到只要事件一到达服务器端,虽然不同步但它们几乎立刻会出现在页面上。而且,如果打开Firebug控制台的话,你就能看到只有一个Ajax请求是打开的。如果再往下看一些,你会看到JSON响应被附在Response选项卡中,如图4所示:
  图4. HTTP流请求的FireBug视图
  照例,做法存在着一些优点和缺点:
  1. 优点:只打开了一个持久连接,这就是节省了大部分带宽使用率的Comet技术。
  2. 缺点:并非所有的浏览器都支持multi-part标志。某些被广泛使用的库,比如说用Java实现的CometD,被报告在缓冲方面有问题。例如,一些数据块(多个部分)可能被缓冲,然后只有在连接完成或是缓冲区已满时才被发送,而这有可能会带来比预期要高的延迟。
  使用HTTP长轮询的Comet
  长轮询(long polling)模式涉及了打开连接的技术。连接由服务器端保持着打开的状态,只要一有事件发生,响应就会被提交,然后连接关闭。接下来。一个新的长轮询连接就会被正在等待新事件到达的客户端重新打开。
  你可以使用script标签或是单纯的XMLHttpRequest对象来实现HTTP长轮询。
  script标签
  正如iframe一样,其目标是把script标签附加到页面上以让脚本执行。服务器端则会:挂起连接直到有事件发生,接着把脚本内容发送回浏览器,然后重新打开另一个script标签来获取下一个事件。
  1. 优点:因为是基于HTML标签的,所有这一技术非常容易实现,且可跨域工作(缺省情况下,XMLHttpRequest不允许向其他域或是子域发送请求)。
  2. 缺点:类似于iframe技术,错误处理缺失,你不能获得连接的状态或是有干涉连接的能力。
  XMLHttpRequest长轮询
  第二种,也是一种推荐的实现Comet的做法是打开一个到服务器端的Ajax请求然后等待响应。服务器端需要一些特定的功能来允许请求被挂起,只要一有事件发生,服务器端就会在挂起的请求中送回响应并关闭该请求,完全就像是你关闭了servlet响应的输出流。然后客户端就会使用这一响应并打开一个新的到服务器端的长生存期的Ajax请求,如清单9所示:
  清单9. 设置长轮询请求的JavaScript代码示例
function&long_polling()
  $.getJSON('ajax',&function(events)
    processEvents(events);
    long_polling();
long_polling();
  在后端,代码也是使用Servlet 3 API来挂起请求,正如HTTP流的做法一样,但你不需要所有的多部分处理代码,清单10给出了一个例子。
  清单10. 挂起一个长轮询Ajax请求
protected&void&doGet(HttpServletRequest
req, HttpServletResponse resp)
throws ServletException, IOException {
  AsyncContext asyncContext&=&req.startAsync();
  asyncContext.setTimeout(0);
  asyncContexts.offer(asyncContext);
  在接收到事件时,只是取出所有的挂起请求并完成它们,如清单11所示:
  清单11. 在有事件发生时完成长轮询Ajax请求
while&(!asyncContexts.isEmpty())
  AsyncContext asyncContext&=&asyncContexts.poll();
  HttpServletResponse peer&=&(HttpServletResponse)
  asyncContext.getResponse();
  peer.getWriter().write(
    new&JSONArray().put(&At&&&+&new&Date()).toString());
  peer.setStatus(HttpServletResponse.SC_OK);
  peer.setContentType(&application/json&);
  plete();
  在附带的下载源文件中,comet-long-polling文件夹包含了一个长轮询示例web应用,你可以使用 mvn jetty:run 命令来运行它。
  1. 优点:客户端很容易实现良好的错误处理系统和超时管理。这一可靠的技术还允许在与服务器端的连接之间有一个往返,即使连接是非持久的(当你的应用有许多的客户端时,这是一件好事)。它可用在所有的浏览器上;你只需要确保所用的XMLHttpRequest对象发送到的简单的Ajax请求就可以了。
  2. 缺点:相比于其他技术来说,不存在什么重要的缺点,像所有我们已经讨论过的技术一样,该方法依然依赖于无状态的HTTP连接,其要求服务器端有特殊的功能来临时挂起连接。
  因为所有现代的浏览器都支持跨域资源共享(Cross-Origin Resource Share,CORS)规范,该规范允许XHR执行跨域请求,因此基于脚本的和基于iframe的技术已成为了一种过时的需要。
  把Comet做为反向Ajax的实现和使用的最好方式是通过XMLHttpRequest对象,该做法提供了一个真正的连接句柄和错误处理。考虑到不是所有的浏览器都支持multi-part标志,且多部分流可能会遇到缓冲问题,因此建议你选择经由HTTP长轮询使用XMLHttpRequest对象(在服务器端挂起的一个简单的Ajax请求)的Comet模式,所有支持Ajax的浏览器也都支持该种做法。
  本文提供的是反向Ajax技术的一个入门级介绍,文章探索了实现反向Ajax通信的不同方法,并说明了每种实现的优势和弊端。你的具体情况和应用需求将会影响到你对最合适方法的选择。不过一般来说,如果你想要在低延迟通信、超时和错误检测、简易性,以及所有浏览器和平台的良好支持这几方面有一个最好的折中的话,那就选择使用了Ajax长轮询请求的Comet。
  请继续阅读这一系列的:该部分将会探讨第三种反向Ajax技术:WebSocket。尽管还不是所有的浏览器都支持该技术,但WebSocket肯定是一种非常好的反向Ajax通信媒介,WebSocket消除了所有与HTTP连接的无状态特性相关的限制。第2部分还会谈及由Comet和WebSocket技术带来的服务器端约束。
  代码下载
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:35007次
排名:千里之外
转载:27篇
评论:13条
(1)(1)(2)(1)(1)(1)(4)(6)(10)(8)全球最新的免费资源发布区
反向绑定域名的方法-强制绑定域名,实现负载均衡,域名内网转发
& 日 20:17 &
反向绑定域名,即用户A访问到B,B将A的请求转向C,最后实现A访问C的过程。反向绑定域名最初应该是应用在站点负载均衡和域名内网转发上,利用反向绑定域名的方法可以将用户的不同请求分发到不同的服务器上,从而实现性能均衡和减轻主服务器负担的目的。
反向绑定域名的好处有很多,比如实现动静分离,让nginx来处理静态文件,将动态内容请求分发到不同语言编写的后端程序,而这些不用语言编写的程序往运行在专门的服务器,如apache处理php,tomcat处理java,uwsgi处理python等等。
反向绑定域名在国内的应用也很广泛,有些购买了国内空间的朋友,域名没有BA的可以用一台美国的服务器充当反向绑定域名的服务器,强制将域名绑定到空间上。有些国外的空间或者网站无法访问了,也可以用反向绑定域名的方法实现空间的正常访问。
当然反向绑定域名的好处还不仅于此,本篇文章就来分享一下搭建反向绑定域名平台的方法,有关于DNS和CDN自建使用的文章,可以看看:
1、自建DNS:
2、本地DNS:
3、自建CDN加速:
反向绑定域名的方法-强制绑定域名,实现负载均衡,域名内网转发
一、利用虚拟主机空间作反向绑定域名
1、先找到一个支持自定义.htaccess,apache服务器,允许有反向代(^_^)理的权限的免费空间或者虚拟主机,将空间的.htaccess文件下载到本地,用记事本打开,将下列代码添加进去,再上传,如下:
RewriteEngine On
RewriteBase /
RewriteRule ^(.*)$ /$1 [P]
2、注意把代码中的网址替换成你想要反向绑定域名的域名,这里是强制将域名绑定到SAE空间上,用了SAE的二级域名地址,详情参考:。
3、如果你找不到支持.htaccess的URL地址重写的虚拟主机或者空间,可以直接使用7ghost这个PHP程序,只要空间支持allow_furl_open和curl、容量至少要有500K即可。如果启用缓存的话需要 写权限和空间足够大。
4、这是7ghost程序设置界面(点击放大),利用它你可以反向Dai理任何网站,详细的操作方法:。
二、利用Nginx反向绑定域名
1、如果你有VPS主机,那么可以用Nginx的反向配置来搭建一个反向绑定域名的平台了,Nginx强大之处还在于还可以变成一个缓存平台,大大加快你反向Dai理的网站的访问速度。
2、因为国内的空间不让绑定没有BA的域名,部落之前利用Nginx反向绑定域名到国内的空间上,详细方法参考:。
三、利用kangle web搭建反向绑定域名服务器
1、kangle web服务器是一款跨平台、功能强大、安全稳定、易操作的高性能web服务器和反向Dai理服务器软件,能实现强大的访问请求控制(url,ip地址,连接数/网速限制,http头,时间控制,多种http认证,#服务器负载,url重定向,url重写,内容过滤等等)。
2、与上面的采用Nginx反向配置来搭建反向绑定域名不同的是,kangle web有良好的Web操作界面,通过搭建不同的配置可以实现复杂的反向域名。详细可以参考:。
四、利用AMH和upupw来反向绑定域名
1、AMH是国内一个开源的主机面板,可以创建 LNMP、LAMP、LNMH 等不同WEB应用环境,新版本的AMH还支持apache2.4和。AMH相应的功能模块也非常地多,其中AMProxy就是一个反向绑定域名模块。
2、AMProxy的2.0版本支持缓存管理功能,支持在线关键字添加、替换,支持设置不同类型文件替换、与支持添加自定义首尾html代码块等。利用CDN智能解析功能,将不同路线、地理位置的用户解析到相应服务器,对用户访问进行缓存加速,同时减轻源站的服务器压力。
3、利用AMH反向绑定域名并成功绕过白**名单的方法,首先是要求:一个有BA号的域名、一个没有BA号的域名、一台可以访问的境外主机,美国的VPS主机就可以。
4、使用 root 账号登录 Linux 服务器。执行 amh 安装脚本:wget http://amh.sh/amh.sh && bash amh.sh 2&&1 | tee amh.log,根据提示输入选择1~3选项。输入1回车,进入安装。
5、极速安装方式大约只需要1至3分钟(以服务器性能为准),成功安装后系统会提示AMH与MySQL默认账号密码。可使用普通连接访问面板,http://ip:8888,或加密的连接访问面板,https://ip:9999
6、登陆后台找到 模块扩展 & 下载模块,大约在第3页找到 AMProxy-2.0 下载并安装。在管理模块中找到并进入设置界面,可以看到新增AMProxy反向代理网站一栏。绑定域名:输入没有BA号的域名(IP),反代域名:输入有BA号的域名(IP) 。
7、用上面的方法,默认是反代到国内主机的80端口上,可是有些主机反代到80端口后还是无法访问,下面说一下如何使用其他端口建站。这里以没有BA号的域名 bukets.net和有BA号的域名 demo.vsen.me来作演示,环境是+amh。
8、先在国内的云主机上安装upupw,然后新建虚拟主机域名输入为 demo.vsen.me,目录自设。打开upupw目录进入 Apache2\conf,找到httpd-vhosts.conf并打开(注意不要使用系统的笔记本或文本文档打开,我用的是Notepad++)
9、找到刚刚新建的虚拟主机规则,并将 servername demo.vsen.me:80 改为 servername demo.vsen.me:8000,保存并关闭。继续打开目录下的http.conf文件,在最下方 # upupw apache conf end 前增加如下代码,保存并关闭。
# 新增监听端口
Include conf/httpd-listen.conf
10、在 Apache2\conf 目录下新建 httpd-listen.conf 文件,在里面写入 Listen 8000,保存并关闭。打开系统防火墙(控制面板中),选择 例外 选项卡,点击下方的 添加端口 按钮,名称自起,端口号写入8000,确定。回到upupw面板,重启
11、没有意外的话,访问bukets.net就可以成功打开网站了。上面只做了一个网站的例子,如果以后有多个网站,那就需要重复以上步骤了。
五、利用Nginx搭建域名内网转发平台
1、Nginx反向配置非常地强大,默认我们一般是将A域名反向到B域名的80端口上,但是如果B域名的80端口无法使用了,我们可以自己指定一个端口,这样用户实际上访问的不是默认的80端口,但是用户体验上没有什么不同。
2、在一文中讲到了阿里的VPS主机不让未BA的域名绑定80端口,通过我们自定义端口成功解决此问题。
3、这里讲一下直接利用Nginx搭建域名内网转发平台的方法,原理各上面是一样的,即将一台主机设置为将监听域名的访问请求的服务器,根据不同的请求,将用户引导到不同的端口的内网服务器上。
4、先在服务器上安装并编译好Nginx,然后修改配置文件 nginx.conf,根据自己的实际情况进行相应的调整,代码说明如下:
worker_processes 1;
error_log logs/error.
pid logs/nginx.
worker_rlimit_nofile 65535;
worker_connections 65535;
include mime.
default_type application/octet-
include /usr/local/nginx/conf/reverse-proxy.
keepalive_timeout 65;
client_max_body_size 50m; #缓冲区Dai理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
client_body_buffer_size 256k;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(Dai理连接超时)
proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(Dai理接收超时)
proxy_send_timeout 300s;
proxy_buffer_size 64k; #设置Dai理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
proxy_ignore_client_ #不允许Dai理端主动关闭连接
listen 80;
location / {
index index.html index.
error_page 500 502 503 504 /50x.
location = /50x.html {
5、 接着找到Nginx反向配置文件reverse-proxy.conf,配置示例如下:
listen 80;
server_name xxx123.
location / {
proxy_set_header Host $
proxy_set_header X-Real-IP $remote_
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_
proxy_pass http://192.168.10.38:3000;
access_log logs/xxx123.tk_access.
listen 80;
server_name xxx456.
location / {
proxy_set_header Host $
proxy_set_header X-Real-IP $remote_
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_
proxy_pass http://192.168.10.40:80;
access_log logs/xxx456.tk_access.
6、 xxx123.tk、xxx456.tk是服务器监听的域名访问请求,192.168.10.38:8.10.40:80是局域网服务器,重新加载nginx配置文件,使之修改生效。
7、把域名都解析到反向Dai理服务器上,来自不同的访问请求通过上面的配置就可以分别引向不同的内网服务器上了。
8、因为用户所有的请求都是通过反向Dai理服务器中转的,内网服务器显示的访问IP都是反向Dai理服务器的,这里我们只要修改一下内网服务器的日志显示格式即可,在配置文件中加入以下代码:
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $HTTP_X_Forwarded_For';
access_log logs/access.
六、反向绑定域名方法小结
1、对于国外一些无法访问的域名,和国内没有BA号的域名,反向绑定域名可以解决访问的问题,前提是需要找到稳定快速和虚拟主机空间或者一个VPS主机,如果用作中转的服务器响应速度太慢的话,反向绑定的效果不会太好。
2、Nginx反向配置不仅可以用来当作域名转发服务,还可以实现服务器负载均衡,局域网内网转发,有兴趣的朋友可以研究一下,充分发挥好Nginx强大的低资源低消耗高性能的特性。
文章出自: 博主投稿,& 由部落编辑整理,部分代码参考博主,版权归原作者所有。本站文章除注明出处外,皆为作者原创文章,可自由引用,但请注明来源。
真的,我猜你也会喜欢的:
您或许对下面这些文章有兴趣:&&&&&&&&&&&&&&&&&&&&本月吐槽辛苦排行榜
免费资源部落博客、论坛、问答和优惠网的创建者
经常混迹于各种免费资源中,尝鲜后乐于分享给他人。用WP搭建了部落博客,没事儿就折腾Wordpress,喜欢找免费空间,但只求精,稳定,耐用。有时也会介绍一点关于建站的知识和主机、服务器的使用心得与体会。PS:此人为男。
TA的专栏:&&|&&
关于本文的作者
所属分类:
链接地址:
浏览前页:
浏览后页:
部落快速搜索栏
热门点击排行榜
网站导航栏
免费资源重点推荐
最新文章推荐
部落最新评论列表
不得不看的秘密
部落本月最受关注的热点
(热度191℃) (热度178℃) (热度145℃) (热度128℃) (热度116℃) (热度109℃) (热度98℃) (热度94℃) (热度94℃) (热度92℃) (热度83℃) (热度83℃) (热度78℃) (热度75℃) (热度68℃) (热度63℃) (热度61℃)
部落本月踩得最多的宝贝
(踩7,149次) (踩4,074次) (踩3,755次) (踩3,276次) (踩3,265次) (踩2,906次) (踩2,814次) (踩2,585次) (踩2,488次) (踩2,466次)
免费资源部落,是一个致力发布和推广来自世界各地的免费资源,包括多样实用的免费空间、各种优秀的免费软件、各样可用的免费网盘等个人博客网站。站长qi是一位很普通不过的人,长期关注网络空间、互联网、软件应用、程序开发与设计、网络应用等。免费资源部落成立的目的就是希望与更多人分享网络快乐与精彩!本站持续修改完善中,如遇不便还请谅解^_^

我要回帖

更多关于 java http 反向连接 的文章

 

随机推荐