Skip to content
New issue

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

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

Already on GitHub? # 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
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests