完美解决 seafile FILE_SERVER_ROOT 配置导致的内网外网不能同时访问和上传下载的问题
我的 seafile 安装在内网,服务地址是 http://10.10.10.5:8088
,然后我使用 frp 将其暴露在了公网 https://seafile.940304.xyz
。
正常情况下在任何联网设备上都可以通过域名 seafile.940304.xyz
访问,并且能够上传和下载。但是当我处于 10.10.10.0/24
家里的内网时,我发现上传文件走了公网(seafile.940304.xyz
所在服务器),所以数据包兜了个圈再回到我家,这样的表现就是上传下载文件都非常缓慢,最大速率刚好是我的公网机器的带宽。我发现这是 seafile 系统设置当中 FILE_SERVER_ROOT
这个变量定义成了 https://seafile.940304.xyz/seafhttp
导致的,于是寻求解决办法。
一个临时办法:
当我处于家庭内网时,如果需要上传大文件,我可以手动改一下系统配置,将 FILE_SERVER_ROOT 改成 http://10.10.10.5:8088/seafhttp
,这样可以临时解决上传速度慢的问题。
但是这样未免有点低效。我开始上网搜索解决办法,看到如下这些相似的帖子:
思索再三之后,配合 gpt-4o 对我的一些建议,我发现一个不错的解决办法,因为我的家庭网络使用了 openwrt 作为网关路由器,并且当时构建的镜像使用 nginx
替代了原本的 uhttpd
作为 web server,这样就更加接近我的目标了。简单说下实现思路
- seafile 的系统设置当中,
SERVICE_URL
保持公网地址https://seafile.940304.xyz/
;FILE_SERVER_ROOT
的值保持公网地址https://seafile.940304.xyz/seafhttp
。此时非内网的公网下访问、上传、下载都没有问题 - 当我处于内网,将
seafile.940304.xyz
域名直接映射到10.10.10.1
,这是我的 openwrt 地址 - 通过 nginx 反向代理,将来自
seafile.940304.xyz
的请求全都转发到10.10.10.5:8088
以下是详细步骤。
step 1
填入公网的地址即可。SERVICE_URL
填入公网地址 https://seafile.940304.xyz/
;FILE_SERVER_ROOT
的值填入公网地址 https://seafile.940304.xyz/seafhttp
,然后保存。
step 2
打开 openwrt 后台管理页面,进入 网络
-> DHCP/DNS
-> 主机名映射
,添加一条记录,主机名 seafile.940304.xyz
,IP地址 10.10.10.1
然后保存。
这个操作是否生效了可以在本地局域网任何一台机器使用命令 nslookup seafile.940304.xyz
检查,返回结果是 10.10.10.1
则说明配置正常且生效了。否则可能还是域名对应的公网地址
step 3
nginx 配置如下,文件名 /etc/nginx/conf.d/seafile-on-pvedebian11.conf
,其中 ssl 证书和私钥 key 部分是我从我的公网机器上 copy 过来的。
server {
listen 443 ssl;
server_name seafile.940304.xyz;
ssl_certificate /etc/letsencrypt/live/940304.xyz/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/940304.xyz/privkey.pem;
access_log /var/log/nginx/seafile_access.log;
error_log /var/log/nginx/seafile_error.log;
location / {
proxy_pass http://10.10.10.5:8088;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /seafhttp {
proxy_pass http://10.10.10.5:8088/seafhttp;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
然后检查 nginx 配置是否正确和重载 nginx 服务即可。
在内网使用公网域名正常访问,并且是反向代理过的,访问、上传和下载速度都极快。可以通过 openwrt 上的 nginx 日志验证。
检查 openwrt 上 nginx 的日志文件 /var/log/nginx/seafile_access.log
[root@openwrt_ai_dk_20240831:11:54 AM /etc/nginx/conf.d] # tail -n 10 /var/log/nginx/seafile_access.log
10.10.10.108 - - [13/Oct/2024:11:03:55 +0800] "GET /api/v2.1/admin/web-settings/ HTTP/1.1" 200 1176 "https://seafile.940304.xyz/sys/web-settings/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:03:55 +0800] "GET /media/img/seafile-logo.png?t=1728788662258 HTTP/1.1" 200 12612 "https://seafile.940304.xyz/sys/web-settings/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:03:55 +0800] "GET /media/favicons/favicon.png?t=1728788662258 HTTP/1.1" 200 45439 "https://seafile.940304.xyz/sys/web-settings/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:03:55 +0800] "GET /media/custom/login-bg.jpg?t=1728788662258 HTTP/1.1" 200 338345 "https://seafile.940304.xyz/sys/web-settings/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:05:19 +0800] "GET / HTTP/1.1" 200 2227 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:05:20 +0800] "GET /api/v2.1/notifications/ HTTP/1.1" 200 689 "https://seafile.940304.xyz/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:05:20 +0800] "GET /api/v2.1/repos/?type=mine HTTP/1.1" 200 1394 "https://seafile.940304.xyz/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:24:32 +0800] "GET / HTTP/1.1" 200 2229 "https://seafile.940304.xyz/sys/web-settings/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:24:32 +0800] "GET /api/v2.1/notifications/ HTTP/1.1" 200 689 "https://seafile.940304.xyz/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:24:32 +0800] "GET /api/v2.1/repos/?type=mine HTTP/1.1" 200 1394 "https://seafile.940304.xyz/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
并且,在内网依然可以使用内网IP和端口访问,并且此时上传和下载还是走 https://seafile.940304.xyz/seafhttp
匹配到的 nginx 反向代理,即 http://10.10.10.5:8088/seafhttp
,所以还是走的内网,速度依然最佳。
于是这个问题通过设置公网地址+公网域名映射内网ip+nginx反向代理完美解决。