Cloudreve
Cloudreve copied to clipboard
如何用 Unix Socket 监听?
前端是trojan-go以h2协商连接,非trojan-go的https连接回落给nginx。 cloudreve用端口5212 我运行成功了 现打算改成Unix Socket 监听 按照教程 修改了配置文件和nginx 但是打开网页提示502 Bad Gateway 请指点 配置哪里不对 Cloudreve配置文件
[System]
Mode = master
Debug = false
Listen = :5212
[UnixSocket]
Listen = /run/cloudreve/cloudreve.sock
nginx
......
server {
listen 127.0.0.1:82 http2;
server_name domain.com;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
location / {
proxy_pass http://unix:/run/cloudreve/cloudreve.sock;
proxy_redirect off;
proxy_buffer_size 64k;
proxy_buffers 32 32k;
proxy_busy_buffers_size 128k;
}
}
......
nginx 配置文件写错了。
proxy_pass unix:/run/cloudreve/cloudreve.sock;
把unix前面的 http:// 去掉。
再更新一条,我的cloudreve好像并不能在run文件夹里创建文件夹,所以还是会报错502。但是可以创建文件。 在cloudreve的配置文件里把unix socket的文件改成 /run/cloudreve.sock 就可以了。
nginx 配置文件写错了。 proxy_pass unix:/run/cloudreve/cloudreve.sock;
把unix前面的 http:// 去掉。
再更新一条,我的cloudreve好像并不能在run文件夹里创建文件夹,所以还是会报错502。但是可以创建文件。 在cloudreve的配置文件里把unix socket的文件改成 /run/cloudreve.sock 就可以了。
按照你的建议 我修改后 无法连接网站 显示ERR_CONNECTION_RESET 好像nginx里只要去掉http:// 就连接不上 不知是否别的地方有问题?
你把http:// 加回去,然后把sock文件的路径改成我给你说的试试。我刚试了试,我这么做,好了。
你把http:// 加回去,然后把sock文件的路径改成我给你说的试试。我刚试了试,我这么做,好了。
cloudreve配置改成 listen = /run/cloudreve.sock Nginx配置改成 proxy_pass http://unix:/run/cloudreve.sock 是这样吗 为什么一直不成功呢 换成端口正常 会不会是nginx的关系 我用的是docker nginx
你把http:// 加回去,然后把sock文件的路径改成我给你说的试试。我刚试了试,我这么做,好了。
cloudreve配置改成 listen = /run/cloudreve.sock Nginx配置改成 proxy_pass http://unix:/run/cloudreve.sock 是这样吗 为什么一直不成功呢 换成端口正常 会不会是nginx的关系 我用的是docker nginx
你看下nginx错误日志的提示是什么。现在还是502?
有可能,你查查docker怎么使用套接字吧。
我没怎么用过docker。
你试试在docker的配置文件对应的volumes:
里面加一行- /run/cloudreve.sock:/run/cloudreve.sock
你把http:// 加回去,然后把sock文件的路径改成我给你说的试试。我刚试了试,我这么做,好了。
cloudreve配置改成 listen = /run/cloudreve.sock Nginx配置改成 proxy_pass http://unix:/run/cloudreve.sock 是这样吗 为什么一直不成功呢 换成端口正常 会不会是nginx的关系 我用的是docker nginx
你看下nginx错误日志的提示是什么。现在还是502? 有可能,你查查docker怎么使用套接字吧。 我没怎么用过docker。 你试试在docker的配置文件对应的
volumes:
里面加一行- /run/cloudreve.sock:/run/cloudreve.sock
非常感谢 加了volumes重新运行nginx后 网站正常了 原来sock也要映射进去
我自己的环境是Ubuntu Server 20.04 ARM64 for RaspberryPi + Nginx 1.18.0 + Cloudreve 3.2.1。
几个要点:
- Nginx配置文件中,
proxy_pass
要采用http://...
的格式 -
conf.ini
文件中,Listen = /**/*.sock
项要放在UnixSocket
节中 - 经测试(文末图片),.sock文件不一定要放在
/run/
目录下(Nginx和Cloudreve相应目录的权限,且两者的配置文件保持一致,理论上应该就是可行的),但放在/run/
目录下未尝不是一个好的选择
我的Cloudreve直接跑在物理机上,目前运行良好。一个可行的配置文件如下所示:
conf.ini
[System]
Mode = master
Listen = :5212
......
[UnixSocket]
Listen = /run/cloudreve.sock
Nginx:
# upstream的名字要与proxy_pass中的保持一致
upstream Cloudreve {
server unix:/run/cloudreve.sock;
server localhost:5212 backup;
}
server {
server_name your.domain.net;
# 我开了HTTPS,SSL相关配置我写在了主配置文件中
listen 443 ssl http2;
listen [::]:443 ssl http2; # IPv6
# 如果您没有开HTTPS,或许可以把上面两行注释掉,像下面这么写:
# listen 80;
# listen [::]:80; # IPv6
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://Cloudreve;
client_max_body_size 4G;
}
}
希望能对大家有所帮助。
可以试试在unit sock 链接后面加个/ 例如:proxy_pass http://unix:/run/cloudreve/cloudreve.sock/;
请教一下!我按照如此配置,静态文件无法访问。应该怎么修改nginx配置呢?
![]()
您好!如果您的问题还没有解决,或许您可以检查一下Cloudreve服务的日志,看一下您Nginx配置文件中提到的的/run/cloudreve/cloudreve.sock
文件是否能被Cloudreve正常地创建。否则Nginx可能无法正常地进行反向代理。
另外,值得一提的是,如果您按照这样的模式进行配置,Cloudreve所有的流量都是经过反向代理的,与其是否为静态资源无关。如果您想实现动静态文件分离的话,可以参考论坛的讨论试试Nginx的try_files指令。
之前3.4.3正常的,重新安装3.5.0版本后,之前的方法好像不行了,显示502
之前3.4.3正常的,重新安装3.5.0版本后,之前的方法好像不行了,显示502
请刷新,或者清除缓存
之前3.4.3正常的,重新安装3.5.0版本后,之前的方法好像不行了,显示502
看change log
运行后 /run/cloudreve.sock 会加s权限,nginx用户甚至root都不可读取,造成502
运行后 /run/cloudreve.sock 会加s权限,nginx用户甚至root都不可读取,造成502
想问下大佬,有解决办法吗
运行后 /run/cloudreve.sock 会加s权限,nginx用户甚至root都不可读取,造成502
问下什么系统?
@falconchen @BrunuhVille
如果是debian系统,我可以确认是cloudreve 的sock创建有问题,应该是gin框架没设置好。 创建sock后,你停止了cloudreve,sock不会被删除,然后,你systemctl restart cloudreve 会报错,提示sock已经被创建。我的解决办法: ps:我把cloudreve放在了nginx的网站目录,即- /var/www/APP/Cloudreve
在 /var/www/APP/Cloudreve目录与cloudreve程序同级目录下创建cloudreve_run(记得赋予执行权限 ' chmod +x /var/www/APP/Cloudreve/cloudreve_run ')
#!/bin/sh
socket="/var/www/APP/Cloudreve/cloudreve.sock"
if [ ! -f "$socket" ]; then
rm -rf $socket
fi
exec /var/www/APP/Cloudreve/cloudreve
然后配置systemctl启动:
[Unit]
Description=Cloudreve
Documentation=https://docs.cloudreve.org
After=network.target redis.service mariadb.service
Wants=network.target redis.service mariadb.service
[Service]
Type=simple
WorkingDirectory=/var/www/APP/Cloudreve
ExecStart=/var/www/APP/Cloudreve/cloudreve_run
User=www-data
Group=www-data
Restart=always
RestartSec=30s
StartLimitInterval=30
KillMode=mixed
[Install]
WantedBy=multi-user.target
注意debian的nginx默认是www-data用户 arch默认是http用户
nginx以什么用户启动的这里(systemd service)就需要填什么用户启动cloudreve。
我是debian系统所以用www-data, 然后cloudreve的conf.ini 需要设置正确:
; 启用 Unix Socket 监听
[UnixSocket]
Listen = /var/www/APP/Cloudreve/cloudreve.sock
你的nginx.conf里面的用户一定要和cloudreve.service里面的
User=www-data
Group=www-data
一致。
ps:如果你的cloudreve以www-data启动,那么离线下载的aria2也应该用这个用户启动,不然cloudreve读取不了aria2的文件。
如果你的nginx和cloudreve不是同一个用户启动,那么就会造成502错误,你可以查看nginx日志
tail -f /var/log/nginx/error.log
里面应该有Permission报错,就是不同用户之间无法直接读取。
https://github.com/cloudreve/Cloudreve/issues/1295
systemd Service 的 [RuntimeDirectory,RuntimeDirectoryMode] 两个参数将会在systemctl 运行时自动创建 所需要的 .sock unix文件,并配置其权限。 Service 用户权限部分,WorkingDirectory 工作目录 ExecStart 启动命令 请根据自己的实际情况 修改。 socket监听的systemd可以使用以下配置:
[Unit]
Description=Cloudreve
Documentation=https://docs.cloudreve.org
Wants=network.target
After=network.target
Wants=container-postgres.service
After=container-postgres.service
Wants=container-redis.service
After=container-redis.service
[Service]
User=root
Group=root
# If using Unix socket: tells systemd to create the /run/cloudreve folder, which will contain the cloudreve.sock file
# (manually creating /run/cloudreve doesn't work, because it would not persist across reboots)
WorkingDirectory=/mnt/public/www/cloudreve
RuntimeDirectory=cloudreve
RuntimeDirectoryMode=0755
ExecStart=/mnt/public/www/cloudreve/cloudreve -c /mnt/public/www/cloudreve/cloudreve.ini
Restart=on-abnormal
RestartSec=5s
KillMode=mixed
StandardOutput=null
StandardError=syslog
[Install]
WantedBy=multi-user.target
我现在遇到的问题是/run/cloudreve/cloudreve.sock文件被cloudreve创建之后的权限是0755,如果我的启动用户和nginx不一样的话,因为权限问题,nginx就无法访问/run/cloudreve/cloudreve.sock文件,socket监听就失败了。 目前采取了办法,在启动cloudreve之后触发修改这个文件的权限。 开发大佬能不能优化一下,在配置unix socket监听时,可以设置它的文件权限
我现在遇到的问题是/run/cloudreve/cloudreve.sock文件被cloudreve创建之后的权限是0755,如果我的启动用户和nginx不一样的话,因为权限问题,nginx就无法访问/run/cloudreve/cloudreve.sock文件,socket监听就失败了。 目前采取了办法,在启动cloudreve之后触发修改这个文件的权限。 开发大佬能不能优化一下,在配置unix socket监听时,可以设置它的文件权限
方法有两种哈:
- 修改nginx或者cloudreve运行用户;nginx的话需要在nginx.conf中修改;cloudreve改 systemd Service部分就ok;(记得修改对应文件夹的权限;);
- .修改 systemd RuntimeDirectoryMode 运行时目录权限为0777;(让所有程序都能访问)
这问题都是21年创建的了,让开发解决估摸也不太行;最好自己把 Linux 权限问题给处理好。。。
@FansChou 你有没有试过使用运行nginx的用户运行cloudreve?
3.6.0 版本中增加了设置项,socket 文件的权限可以自定义了。