当 mongo 文档中有超过 7 个子文档时,远程服务器上的 net::ERR_CONNECTION_CLOSED

问题描述 投票:0回答:3

我正在开发一个带有 Angular 4.1.0 的 MEAN 项目。

在我的本地主机上,一切正常,没有错误。然而,当我部署到服务器时,检索具有超过 8 个问题-答案对的用户会导致 Angular 的 http 模块触发的 xhr 请求上出现 net::ERR_CONNECTION_CLOSED 错误。

我托管的数字海洋 Droplet 使用 nginx 反向代理并使用 LetsEncrypt SSL 证书。 我试过了:

  • 重启服务器、nginx服务、node.js等
  • 在 nginx 配置文件中将
    client_max_body_size
    增加到
    20M
  • 在 nginx 配置文件中将
    large_client_header_buffers
    ' 大小增加到
    128k

其他重要事实:

  • GET
    qapairs?jwt=ey..
    请求永远不会到达 node.js 应用程序
  • /var/log/nginx/error.log
  • 中没有提及该请求
  • /var/log/nginx/access.log
    中显示的失败请求如下:

    89.15.159.19 - - [08/May/2017:14:25:53 +0000] "-" 400 0 "-" "-"
    89.15.159.19 - - [08/May/2017:14:25:53 +0000] "-" 400 0 "-" "-"
    

请给我指出可能的方向。


chrome 开发工具网络选项卡截图

  1. 登录只有7个问答对的账户后 After logging in to an account where there are only 7 question answer pairs

  2. 然后,前往 mlab.com 并手动将另一个问题答案对添加到同一帐户,然后刷新页面(注意现在的问题数为 8) After going to mlab.com and manually adding another question answer pair to same account and then refreshing the page

  3. 最后,登录和退出同一个帐户后(注意xhr请求

    qapairs?jwt=ey...
    返回了失败状态) After logging in and out of the same account

/etc/nginx/sites-enabled/default

# HTTP — redirect all traffic to HTTPS
server {
    listen 80;
    listen [::]:80 default_server ipv6only=on;
    return 301 https://$host$request_uri;
}

# etc

# HTTPS  ^ ^  proxy all requests to the Node app
server {
    # Enable HTTP/2
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name subdomain.example.com;

    # Use the Let ^ ^ s Encrypt certificates
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # Include the SSL configuration from cipherli.st
    include snippets/ssl-params.conf;

    # Increase allowed URL length     
    large_client_header_buffers 4 128k;

    # Increase max body size
    client_max_body_size 20M;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass http://subdomain.example.com:3001/;
        proxy_ssl_session_reuse off;
        proxy_set_header Host $http_host;
        proxy_cache_bypass $http_upgrade;
        proxy_redirect off;
    }
}

qa-pairs.service.ts

错误在

getQAPairs
函数中被捕获。被传递到
catch
函数中的回调函数中,具有
ProgressEvent
属性的
type
对象
error
eventPhase
2

@Injectable()
export class QaPairsService {
  /* etc */

  getQAPairs () {
    const jwt = localStorage.getItem('jwt') ? `?jwt=${localStorage.getItem('jwt')}` : ''

    return this.http.get(this.qapairsUrl + jwt)
      .map(response => {
        this.qapairs = response.json().map((qapair: IQAPair) => new QAPair(qapair))
        this.qapairsChanged.emit(this.qapairs)
        return this.qapairs
      })
      .catch(
        (error: any) => {
          error = error.json()
          this.errorsService.handleError(error)
          return Observable.throw(error)
        }
      )
  }

  /* etc */
}
node.js mongodb ssl nginx http2
3个回答
26
投票

解决方案:

/etc/nginx/sites-enabled/default

# 其他代码在这里

服务器 {

   # 这里还有其他代码

   # 增加 http2 最大大小
   http2_max_field_size 64k;
   http2_max_header_size 64k;

}

我发现这很难调试的原因是因为有

/var/log/nginx/error.log

中没有提及该请求

而且我没有意识到 nginx 有能力更详细的日志记录(废话)

因此在更改

/etc/nginx/sites-enabled/default
以包含

server { 
    error_log /var/log/nginx/error.log info;
}

我看到了

2017/05/08 16:17:04 [info] 3037#3037: *9 client exceeded http2_max_field_size limit while processing HTTP/2 connection, client: 89.15.159.19, server: 0.0.0.0:443

这是我需要的错误消息。


0
投票

这对我有帮助!不幸的是没有错误消息。 它对我有帮助:

client_header_buffer_size 1k; large_client_header_buffers 4 4k;

0
投票

我与其他人分享这个,因为在我的场景中,我花了超过两周的时间来解决问题并找出问题所在。我更改参数:

keep-alive-requests: '1000'

您可以在此处阅读更多详细信息https://stackoverflow.com/a/78368968/6655459

© www.soinside.com 2019 - 2024. All rights reserved.