我的macOS Seafile客户端老是出现一个问题,在成功同步完文件后,却总是变成有问题的状态。具体表现就是菜单栏上的Seafile图标右下角不是绿色的✔,而是红色的❗️,同时头像始终是默认的空白头像。检查Seafile的日志时,发现applet.log中有下面的错误:

[09/28/17 09:37:11][api] network error for http://localhost:8000/media/avatars/f/7/abab027458a0fb6569400f05f65cc9/resized/84/3826d737fe4bf832cc5bb409ee75043e.png: Connection refused

一直在网上搜是不是Seafile自己的BUG,也发现有人遇到了类似的问题。但是更多的人却是没有遇到问题。所以我也怀疑这是不是我自己的问题。

后来看到网上有人提到有个配置叫MEDIA_URL,这个看起来和这个出错的头像访问的地址很相关啊。但是看安装文档里并没有说需要配置,于是硬着头皮配置了一个,结果还是没作用。

后来突然想到,这个端口怎么那么像Nginx所反向代理的Seafile服务器的端口啊。于是考虑会不会是因为Nginx的配置问题?结果一检查发现Nginx配置相当简单,就做了一个proxy_pass,其他什么都没有配置。

于是就考虑会不会是Seafile生成这个头像的URL时,是通过客户端访问的HOST来生成的。由于Seafile躲在Nginx后面。缺省配置下,对Seafile来说自己的HOST地址就是localhost:8000。那么如果把Host变量在反向代理时传递过去会如何?于是在Nginx的配置里加上下面这几行:

proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

重启Nginx后,重启客户端,结果搞定!

上面最核心的,解决这个问题的是HOST这个header。通过这种方式反向代理转发请求后,Seafile通过HTTP Header中的HOST就能获取到真实的、客户端请求的域名了,而不是反向代理器Nginx请求的域名。

其他几个header的含义分别是:

  • X-Real-IP:转发的真实客户端IP
  • X-Forwarded-For:客户端请求的IP序列
  • X-Forwarded-Proto:转发的协议