Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如何用 Unix Socket 监听? #749

Closed
aglent opened this issue Feb 3, 2021 · 23 comments
Closed

如何用 Unix Socket 监听? #749

aglent opened this issue Feb 3, 2021 · 23 comments

Comments

@aglent
Copy link

aglent commented Feb 3, 2021

前端是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;  
    }
}
......
@Jevanzhu
Copy link

Jevanzhu commented Feb 3, 2021

nginx 配置文件写错了。
proxy_pass unix:/run/cloudreve/cloudreve.sock;

把unix前面的 http:// 去掉。

再更新一条,我的cloudreve好像并不能在run文件夹里创建文件夹,所以还是会报错502。但是可以创建文件。
在cloudreve的配置文件里把unix socket的文件改成 /run/cloudreve.sock 就可以了。

@aglent
Copy link
Author

aglent commented Feb 3, 2021

nginx 配置文件写错了。
proxy_pass unix:/run/cloudreve/cloudreve.sock;

把unix前面的 http:// 去掉。

再更新一条,我的cloudreve好像并不能在run文件夹里创建文件夹,所以还是会报错502。但是可以创建文件。
在cloudreve的配置文件里把unix socket的文件改成 /run/cloudreve.sock 就可以了。

按照你的建议 我修改后 无法连接网站 显示ERR_CONNECTION_RESET 好像nginx里只要去掉http:// 就连接不上 不知是否别的地方有问题?

@Jevanzhu
Copy link

Jevanzhu commented Feb 3, 2021

你把http:// 加回去,然后把sock文件的路径改成我给你说的试试。我刚试了试,我这么做,好了。

@aglent
Copy link
Author

aglent commented Feb 3, 2021

你把http:// 加回去,然后把sock文件的路径改成我给你说的试试。我刚试了试,我这么做,好了。

cloudreve配置改成
listen = /run/cloudreve.sock
Nginx配置改成
proxy_pass http://unix:/run/cloudreve.sock
是这样吗
为什么一直不成功呢 换成端口正常
会不会是nginx的关系 我用的是docker nginx

@Jevanzhu
Copy link

Jevanzhu commented Feb 3, 2021

你把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

@aglent
Copy link
Author

aglent commented Feb 4, 2021

你把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也要映射进去

@fang-d
Copy link

fang-d commented Feb 4, 2021

我自己的环境是Ubuntu Server 20.04 ARM64 for RaspberryPi + Nginx 1.18.0 + Cloudreve 3.2.1。

几个要点:

  1. Nginx配置文件中,proxy_pass要采用http://...的格式
  2. conf.ini文件中,Listen = /**/*.sock项要放在UnixSocket节中
  3. 经测试(文末图片),.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;
    }   
}

希望能对大家有所帮助。

test.png

@wangxiaoerYah
Copy link

可以试试在unit sock 链接后面加个/
例如:proxy_pass http://unix:/run/cloudreve/cloudreve.sock/;

@fang-d
Copy link

fang-d commented Oct 26, 2021

请教一下!我按照如此配置,静态文件无法访问。应该怎么修改nginx配置呢? image image

您好!如果您的问题还没有解决,或许您可以检查一下Cloudreve服务的日志,看一下您Nginx配置文件中提到的的/run/cloudreve/cloudreve.sock文件是否能被Cloudreve正常地创建。否则Nginx可能无法正常地进行反向代理。

另外,值得一提的是,如果您按照这样的模式进行配置,Cloudreve所有的流量都是经过反向代理的,与其是否为静态资源无关。如果您想实现动静态文件分离的话,可以参考论坛的讨论试试Nginx的try_files指令。

@BrunuhVille
Copy link

之前3.4.3正常的,重新安装3.5.0版本后,之前的方法好像不行了,显示502

@wangxiaoerYah
Copy link

之前3.4.3正常的,重新安装3.5.0版本后,之前的方法好像不行了,显示502

请刷新,或者清除缓存

@wangxiaoerYah
Copy link

之前3.4.3正常的,重新安装3.5.0版本后,之前的方法好像不行了,显示502

看change log

@falconchen
Copy link

运行后 /run/cloudreve.sock 会加s权限,nginx用户甚至root都不可读取,造成502

@BrunuhVille
Copy link

运行后 /run/cloudreve.sock 会加s权限,nginx用户甚至root都不可读取,造成502

想问下大佬,有解决办法吗

@wangxiaoerYah
Copy link

运行后 /run/cloudreve.sock 会加s权限,nginx用户甚至root都不可读取,造成502

问下什么系统?

@wangxiaoerYah
Copy link

wangxiaoerYah commented May 18, 2022

@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的文件。

@wangxiaoerYah
Copy link

wangxiaoerYah commented May 18, 2022

如果你的nginx和cloudreve不是同一个用户启动,那么就会造成502错误,你可以查看nginx日志

tail -f /var/log/nginx/error.log

里面应该有Permission报错,就是不同用户之间无法直接读取。

@jinwyp
Copy link

jinwyp commented May 18, 2022

#1295

@JohyC
Copy link

JohyC commented Jul 31, 2022

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

@FansChou
Copy link

我现在遇到的问题是/run/cloudreve/cloudreve.sock文件被cloudreve创建之后的权限是0755,如果我的启动用户和nginx不一样的话,因为权限问题,nginx就无法访问/run/cloudreve/cloudreve.sock文件,socket监听就失败了。
目前采取了办法,在启动cloudreve之后触发修改这个文件的权限。
开发大佬能不能优化一下,在配置unix socket监听时,可以设置它的文件权限

@JohyC
Copy link

JohyC commented Nov 30, 2022

我现在遇到的问题是/run/cloudreve/cloudreve.sock文件被cloudreve创建之后的权限是0755,如果我的启动用户和nginx不一样的话,因为权限问题,nginx就无法访问/run/cloudreve/cloudreve.sock文件,socket监听就失败了。 目前采取了办法,在启动cloudreve之后触发修改这个文件的权限。 开发大佬能不能优化一下,在配置unix socket监听时,可以设置它的文件权限

方法有两种哈:

  1. 修改nginx或者cloudreve运行用户;nginx的话需要在nginx.conf中修改;cloudreve改 systemd Service部分就ok;(记得修改对应文件夹的权限;);
  2. .修改 systemd RuntimeDirectoryMode 运行时目录权限为0777;(让所有程序都能访问)

这问题都是21年创建的了,让开发解决估摸也不太行;最好自己把 Linux 权限问题给处理好。。。

@hatsuyuki280
Copy link
Contributor

@FansChou 你有没有试过使用运行nginx的用户运行cloudreve?

@HFO4
Copy link
Member

HFO4 commented Dec 14, 2022

3.6.0 版本中增加了设置项,socket 文件的权限可以自定义了。

@HFO4 HFO4 closed this as completed Dec 14, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests