我正在开发一个带有 Angular 4.1.0 的 MEAN 项目。
在我的本地主机上,一切正常,没有错误。然而,当我部署到服务器时,检索具有超过 8 个问题-答案对的用户会导致 Angular 的 http 模块触发的 xhr 请求上出现 net::ERR_CONNECTION_CLOSED 错误。
我托管的数字海洋 Droplet 使用 nginx 反向代理并使用 LetsEncrypt SSL 证书。 我试过了:
client_max_body_size
增加到 20M
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 "-" "-"
请给我指出可能的方向。
登录只有7个问答对的账户后
然后,前往 mlab.com 并手动将另一个问题答案对添加到同一帐户,然后刷新页面(注意现在的问题数为 8)
最后,登录和退出同一个帐户后(注意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
错误在
函数中被捕获。被传递到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 */ }
/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
这是我需要的错误消息。
这对我有帮助!不幸的是没有错误消息。 它对我有帮助:
client_header_buffer_size 1k; large_client_header_buffers 4 4k;
我与其他人分享这个,因为在我的场景中,我花了超过两周的时间来解决问题并找出问题所在。我更改参数:
keep-alive-requests: '1000'
您可以在此处阅读更多详细信息https://stackoverflow.com/a/78368968/6655459