欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

HipChat上传文件报未知错误的原因分析及解决方案

程序员文章站 2023-11-10 20:49:10
hipchat的功能类似于campfire、sazneo等在线协同工具,并且和yammer以及salesforce的chatter等企业社交平台有一定相似之处。你可以为单个...

hipchat的功能类似于campfire、sazneo等在线协同工具,并且和yammer以及salesforce的chatter等企业社交平台有一定相似之处。你可以为单个项目或者小组搭建自有的聊天室,也可以很方便的发起一对一聊天。这套 im 系统还整合了团队文件管理和分享,拖拽就能完成保存操作。

前言

hipchat是atlassian公司的一款团队协作即时通讯工具,服务端为linux(官方给的服务端就是一个虚拟机),在windows、linux、android、ios、mac等平台都有客户端软件,还可以直接在pc的web上直接聊天,对于团队协作交流需求整理的比较到位,最主要的是hipchat可以和confluence对接讨论主题(不是有confluence的需求个人觉得不如其他一些团队通讯软件)。

前些天接下了配置hipchat服务端的任务,但是使用了几天后发现,聊天时发送超过10m的文件就会报错:

HipChat上传文件报未知错误的原因分析及解决方案

嗯,而且给了个明显是废话的报错提示:在上传文件的时候出错了。

而官方文档上写的限制是50m。所以这里肯定是有问题的。

这里先给出最终解决方法:

1.登录linux,使用下面命令取得root权限

复制代码 代码如下:

sudo /bin/dont-blame-hipchat

2.编辑配置文件:

复制代码 代码如下:

vi /etc/nginx/includes/web-site

3.在大概120行的位置找到如下代码片段,添加并修改client_max_body_size 1024m;(原来是10m)

复制代码 代码如下:

# coral requests
location /v2 {
# allow larger requests for import
location ~ /v2/import/(.*) {
client_max_body_size 1024m;
rewrite ^/v2/(.*)$ /$1 break;
proxy_pass http://coral_servers;
}
# all other coral calls
client_max_body_size 1024m;
rewrite ^/v2/(.*)$ /$1 break;
proxy_pass http://coral_servers;
}

4.执行重载参数文件命令:

复制代码 代码如下:

/opt/nginx-1.4.2/sbin/nginx -s reload

如果修改完成后还不行可以试着修改该文件内其他client_max_body_size参数。

如果不行那么可能是官方版本变动导致某些文件位置变动,可以参考我后面解决问题的过程。

下面说明下我解决问题的思路。

1.确定web服务器类型

上传文件的问题是在windows桌面版本的hipchat上发现的,不过因为与浏览器访问的效果一致,我猜测后面一定是一个web服务器,于是乎打开浏览器试着在聊天界面发送文件,果然是同样的报错,不过不同的是,我可以用现代浏览器的调试工具查看下请求的报错内容,于是看到:

HipChat上传文件报未知错误的原因分析及解决方案

点进去看到:

HipChat上传文件报未知错误的原因分析及解决方案

看到了nginx,没接触过nginx,不过现在网络资料一大把,很容易就可以找到其相关资料。

(注:我这里使用的是chrome的开发者工具)

2.查找并修改配置文件

网上很容易可以搜到nginx是代理,其配置文件中的client_max_body_size字段表明了最大上传大小。故现在登录服务器

1.登录linux,使用下面命令取得root权限

复制代码 代码如下:

sudo /bin/dont-blame-hipchat

2.用命令查找nginx的配置文件:

复制代码 代码如下:

find / -name 'nginx.conf'

结果如下:

复制代码 代码如下:

/opt/atlassian/hipchat/dependencies/source/nginx-1.4.2/conf/nginx.conf
/hipchat-scm/web/application/vendor/elastica/test/nginx/nginx.conf
/etc/nginx/conf.d/nginx.conf
/etc/nginx/nginx.conf
/usr/local/src/nginx-1.4.2/conf/nginx.conf

3.编辑配置文件

复制代码 代码如下:

vi /etc/nginx/nginx.conf

改动后如下:

复制代码 代码如下:

user www-data;
worker_processes 4;
daemon off;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 2048;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format custom '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_x_forwarded_for" $http_x_forwarded_proto';
access_log /var/log/nginx/access.log custom;
server_tokens off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
client_max_body_size 1024m;
gzip on;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_proxied any;
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
proxy_buffers 8 16k;
proxy_buffer_size 16k;
server_names_hash_bucket_size 64;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}

4.执行重载参数文件命令:

复制代码 代码如下:

/opt/nginx-1.4.2/sbin/nginx -s reload

发现并没有解决问题,重启linux虚拟机,仍然没有解决问题,且重启后发现该配置文件里client_max_body_size又被改回10m了。于是后来又从怎么样重启后使得该配置文件不重置参数着手,实际证明这条思路是错误的。

该配置文件最下面有两个include语句,/etc/nginx/conf.d/目录为空,于是进入/etc/nginx/sites-enabled目录。发现里面有个链接文件

复制代码 代码如下:

root@hipchat:/etc/nginx/sites-enabled# cd /etc/nginx/sites-enabled/
root@hipchat:/etc/nginx/sites-enabled# ls -l
total 0
lrwxrwxrwx 1 root root 34 sep 17 01:19 000-web -> /etc/nginx/sites-available/000-web

于是查看文件/etc/nginx/sites-available/000-web。发现底部又是一个包含文件:

... ...

复制代码 代码如下:

server {
listen 80 default_server;
more_clear_input_headers 'x-hipchat-group';
more_clear_input_headers 'x-hipchat-user';
add_header strict-transport-security "max-age=31536000";
more_clear_input_headers 'x-hipchat-request';
more_set_input_headers 'x-hipchat-request: public';
include includes/web-site;
}

于是再找includes/web-site:

复制代码 代码如下:

root@hipchat:/etc/nginx/sites-enabled# find / -name 'web-site'
/etc/nginx/includes/web-site

5.打开该web-site文件,查找其中的client_max_body_size,最终发现120行附件location /v2中增加client_max_body_size配置项有效。

复制代码 代码如下:

# coral requests
location /v2 {
# allow larger requests for import
location ~ /v2/import/(.*) {
client_max_body_size 1024m;
rewrite ^/v2/(.*)$ /$1 break;
proxy_pass http://coral_servers;
}
# all other coral calls
client_max_body_size 1024m;
rewrite ^/v2/(.*)$ /$1 break;
proxy_pass http://coral_servers;
}

6.改完保存后,执行以下命令重新载入配置文件。

复制代码 代码如下:

/opt/nginx-1.4.2/sbin/nginx -s reload

(注:nginx路径可能会有变动,如无法执行请查找其他nginx目录)。

3.总结

这样改过以后,hipchat即可以上传50m以上文件了,当然50m也不大,但是这是官方限制,估计只有向官方反馈或者付费才能解决这个问题。

其实在使用hipchat的时候我有点搞不清楚hipchat在atlassian公司的地位,因为有许多问题。除了这次遇到的,还有自带的windows、linux、mac、ios、android等平台的客户端版本都比较老,windows端的无法发图和文件,android直接就连不上,最终是直接从官网下载最新的客户端包才解决问题,其他平台没有试过。(android版本需要到google play商店安装)。

hipchat算是一个小众软件,所以估计也没什么人会遇到这问题。本文除了记录该问题外,算是提供一种解决问题的思路。遇到这种网络连接类的问题,且服务端和客户端都不能看源代码的,就可以类似这样解决。即使服务器不是http服务器,也可以使用wireshark这类工具来查找问题。