当MongoDB文档中有超过7个子文档时,在远程服务器上出现net::ERR_CONNECTION_CLOSED错误。

9
我正在使用 Angular 4.1.0 进行 MEAN 项目开发。在本地主机上,一切顺利没有错误。但是当我部署到服务器时,检索带有超过8个问题/答案对的用户会导致 xhr 请求出现 net::ERR_CONNECTION_CLOSED 错误。我使用的digital ocean droplet上使用了nginx反向代理,并使用letsencrypt SSL证书。 我已经尝试了以下方法:
  • 重启服务器、nginx服务、node.js等。
  • 在nginx配置文件中将 client_max_body_size 增加到 20M
  • 在nginx配置文件中将 large_client_header_buffers 的大小增加到 128k
其他重要事项:
  • The GET request to qapairs?jwt=ey.. never reaches the node.js app
  • There is no mention of the request in /var/log/nginx/error.log
  • The failing requests shown in the /var/log/nginx/access.log are as follows:

    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个问题答案对的账户后 在登录只有7个问题答案对的账户后

  2. 然后,前往mlab.com并手动添加另一个问题答案对到同一帐户,然后刷新页面(请注意现在有8个问题) 然后,前往mlab.com并手动添加另一个问题答案对到同一帐户,然后刷新页面

  3. 最后,在同一帐户中登录和退出后(请注意xhr请求到qapairs?jwt=ey...返回失败状态) 最后,在同一帐户中登录和退出后

/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

The error is being caught here in the getQAPairs function. Being passed to the callback in the catch function a ProgressEvent object with a type property of error, eventPhase of 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 */
}

你提出了一个好问题,但请至少尝试筛选出代码中仅与问题相关的部分。我假设你已经调试了其中一些部分,并且对错误发生的阶段有一个大致的理解。 - Omri Luzon
谢谢您的反馈。我明天第一件事就会处理。 - Tom
@OmriLuzon 请查看修改后的答案。 - Tom
2个回答

26

解决方案:

/etc/nginx/sites-enabled/default

# 其他代码
server {
# 其他代码
# 增加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

这就是我需要的错误信息。


3
你是一个字面上的救星。我已经被卡在这里好几天了,非常感谢你! - Shivam
一样,我也遇到了504网关错误、ERR_CONNECTION_ABORTED以及各种奇怪的错误,但是在增加这些参数后问题得到了解决。谢谢! - Aaron
这个救了我的命!对于使用较新版本的nginx的任何人来说,应该使用以下代码行代替:client_header_buffer_size 1k; large_client_header_buffers 4 4k; - Kane

0

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

client_header_buffer_size 1k; large_client_header_buffers 4 4k;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接