nginx 为什么jQuery Ajax/Comet页面请求返回空响应,而我可以直接访问它们?

eqqqjvef  于 2023-10-17  发布在  Nginx
关注(0)|答案(1)|浏览(102)

我正在尝试使用Apache编写一个应用程序,使用Nginx作为前端,将相关请求存储到我编写的一个小应用程序中。它所做的就是epoll一些套接字并使用文件描述符。下面是一些代码片段:
Nginx配置:

upstream cometutils {
  server unix:/tmp/cutil_socket;
}
...
location /test {
  proxy_buffering off;
  proxy_read_timeout 120;
  proxy_set_header  X-Real-IP  $remote_addr;
  proxy_pass http://cometutils;
}

JS代码:

var kdata="foo=bar";
$.ajax({
  async:true,
  url:"http://127.0.0.1/test",
  data:kdata,
  type:"GET",
  dataType:"text",
  cache:"false",
  success:function(retval)
  {
    alert(retval);
  }
});

相关的C++代码,给你一个给予关于它做什么的想法:

//fd is the file descriptor.
string resp="HTTP/1.1 200 OK\n\nContent-Type: text/plain\n\nHi there\n";
send(fd,resp.c_str(),resp.length(),0);
resp="sadsadasd\n";
sleep(2);
send(fd,resp.c_str(),resp.length(),0);
close(fd);

我100%确定这个程序没有问题,它可以完美地与几乎所有使用套接字通信的东西一起工作,包括...
.常规页面请求;例如,键入http://127.0.0.1/test?blabla=...将使浏览器首先显示"Hi there!"文本,然后在两秒钟后显示第二条消息并终止连接。
但是,aMessage请求根本没有收到任何东西(响应体只是空的)。当它应该已经收到第一条消息并且服务器端send()指示它已经发送了它应该发送的所有字节,但是第二个send()返回-1时,它立即终止(调用alert()函数)。
我还尝试使用beforeSend属性和普通的xmlhttprequest对象来直接处理onreadystatechange回调,但它们根本没有帮助(readyState永远不会变成3,响应会立即终止)。
任何关于原因的想法都是值得赞赏的。

jtw3ybtb

jtw3ybtb1#

看起来你有一个Comet风格的应用程序,其中Nginx被用作AJAX请求的前端代理,使用套接字将它们转发到C应用程序。C应用程序异步发送响应。
以下是您面临的问题的一些可能原因:
1.**Nginx中的Buffering:**您的Nginx配置中包含proxy_buffering off;,该配置禁用Buffering。这通常对流式传输很好,但如果有问题,您可能希望尝试启用缓冲。在Nginx location block中添加以下行:

proxy_buffering on;

1.**响应时间:**Comet风格的应用程序通常依赖于响应时间。确保服务器端代码在预期的时间发送响应。您已经提到了常规的页面请求可以正常工作,因此服务器端代码可能会正常工作。
1.**AJAX超时:**AJAX请求的默认超时对于长轮询Comet应用程序可能太短。你已经在Nginx中设置了proxy_read_timeout 120;,但你可能还想增加AJAX请求的超时时间:

timeout: 120000,  // Set the AJAX timeout to 120 seconds

1.**错误处理:**在AJAX请求中包含错误回调,以捕获任何错误:

error: function(jqXHR, textStatus, errorThrown) {
  console.log('AJAX Error:', textStatus, errorThrown);
}

检查浏览器控制台是否有错误消息。
1.**检测网络流量:**使用浏览器开发工具检测网络流量。查看标题和响应内容。检查是否有任何错误或意外行为。
1.**Content-Type Header:**确保您的C++应用程序正确设置了Content-Type头。在您的代码中,您将其设置为text/plain,但请确保这与实际内容相匹配。

string resp = "HTTP/1.1 200 OK\nContent-Type: text/plain\n\nHi there\n";

1.**不使用Nginx进行测试:**要隔离问题,您可能需要直接测试C服务器,而不需要中间使用Nginx。这将帮助您确定问题是否与Nginx配置或C服务器有关。
1.**Nginx错误提示:**检查Nginx错误日志(/var/log/nginx/error.log)是否有任何与请求重复相关的错误消息。
通过解决这些问题并可能调整配置,您应该能够识别并解决AJAX请求在Comet应用程序中没有收到预期响应的问题。

相关问题