由于shadowsocks在服务器运行可能会不稳定,所以我们将shadowsocks的运行管理任务交给supervisor,这样如果ss挂了,supervisor会帮我们自动将shadowsocks重新启动,保证了ss的稳定性。

supervisor是什么我就不多介绍了,老高在此只强调一点,他是由python编写的,官网在此 http://supervisord.org/

本文也可作为supervisor的入门文章使用,欢迎大家交流!

需要注意的是,supervisor目前还不支持PY3,所以如果强制使用PY3安装会报错

安装

安装和配置的时候需要root权限

pip install supervisor

or

easy_install supervisor

初始化

# 初始化配置文件
# 此命令会在 /etc/下创建一个示例配置文件
echo_supervisord_conf > /etc/supervisord.conf

运行配置

老高在服务器安装的shadowsocks-libev版,所以启动命令和python版的不用:

# shadowsocks-libev启动命令
ss-server -c /home/gzm/config2.json
# 原版shadowsocks启动命令
ssserver -c /home/gzm/config2.json

现在我们准备好了启动命令,现在开始最重要的部分。

# 在/etc/supervisord.conf文件最后添加shadowsocks实例,代码如下
# 这一段配置如果配置错误,会导致supervisor的启动失败

[program:shadowsocks]
command = ss-server -c /home/gzm/config2.json
user = phpgao
autostart = true
autoresart = true
stderr_logfile = /var/log/supervisor/ss.stderr.log
stdout_logfile = /var/log/supervisor/ss.stdout.log
  • command就是ss的运行命令;
  • user是执行命令的用户;
  • autostart和autoresart指自动启动和自动重启;
  • stdout_logfile重定向程序输出到此文件;
  • stderr_logfile重定向程序错误到此文件;

需要注意的是

运行和更新

编辑完配置文件就可以开始运行supervisor了

运行supervisor

# 运行的时候使用-c指定配置文件
supervisord -c /etc/supervisord.conf
# 如果不指定配置文件
supervisord

# 那么配置文件会依次再下面的文件夹中寻找
# $CWD/supervisord.conf
# $CWD/etc/supervisord.conf
# /etc/supervisord.conf

更新配置文件

当我们修改配置后,为了使新的配置生效,我们需要通知supervisor是新配置文件生效,我们使用下面的命令:

# 使新的配置文件生效
supervisorctl update

其他命令

当supervisor运行后,管理他就不能用supervisord了,而是supervisorctl。下面是一些常用的运行命令

# 控制所有进程
supervisorctl start all
supervisorctl stop all
supervisorctl restart all
# 控制目标进程
supervisorctl stop shadowsocks
supervisorctl start shadowsocks
supervisorctl restart shadowsocks

查看日志

supervisorctl tail -f shadowsocks stdout
supervisorctl tail -f shadowsocks stderr

开机自启动

vi /etc/rc.local

# 在exit前添加以下内容
supervisord -c /etc/supervisord.conf

扩展

开始web服务管理

如此配置后我们就可以在浏览器中输入127.0.0.1:9001来管理supervisor托管的任务。

如果将回环地址127.0.0.1换为服务器的IP地址,就可以可以远程管理supervisor了。

# 在配置文件后加上服务器配置信息
[inet_http_server]
port = 127.0.0.1:9001
username = user
password = 123

# 最后不要忘了reload使之生效!
supervisorctl reload

在centos7中把supervisor配置为服务

将下面的代码保存到 /etc/systemd/system/supervisord.service,注意配置文件的路径

[Unit]
Description=Supervisor process control system for UNIX
Documentation=http://supervisord.org
After=network.target

[Service]
ExecStart=/usr/bin/supervisord -n -c /etc/supervisord.conf
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=50s

[Install]
WantedBy=multi-user.target

然后启动服务:

systemctl daemon-reload
systemctl enable supervisord
systemctl restart supervisord
systemctl status supervisord

标签: python, shadowsocks, supervisor

已有 29 条评论

  1. [...]使用supervisor托管shadowsocks,让shadowsocks运行的更稳定![...]

  2. [...]https://blog.phpgao.com/supervisor_shadowsocks.html[...]

  3. [...]请参考使用supervisor托管shadowsocks,让shadowsocks运行的更稳定![...]

  4. [...]使用supervisor托管shadowsocks,让shadowsocks运行的更稳定![...]

  5. Scott Chen Scott Chen

    我知道这个怎么回事了,版本问题,我卸载了setuptools重新装个pip再装回setuptools就可以执行supervisord -c

  6. Scott Chen Scott Chen

    好像执行不了supervisor,是因为我的python版本问题的么?

  7. 这个就不清楚了,vpn可能被墙封掉了

  8. Caprice Caprice

    运行配置时如下错误提示
    [root@localhost ~]# ssserver -c /home/gzm/config2.json

    INFO: loading config from /home/gzm/config2.json

    Traceback (most recent call last):

    File "/usr/bin/ssserver", line 9, in

    load_entry_point('shadowsocks==2.8.2', 'console_scripts', 'ssserver')()

    File "/usr/lib/python2.6/site-packages/shadowsocks/server.py", line 34, in mai n

    config = shell.get_config(False)

    File "/usr/lib/python2.6/site-packages/shadowsocks/shell.py", line 149, in get _config

    with open(config_path, 'rb') as f:

    IOError: [Errno 2] No such file or directory: '/home/gzm/config2.json'

    1. 路径不存在,你要知道你把config文件放在哪儿了

      1. Caprice Caprice

        就是不会自动生成。。昨天弄了好久好久。。自己添加一个也不能加载。。

        1. 路径写成绝对路径

        2. 本来就不是自动生成的,要自己放进去

          1. 隔一段时间再试试

          2. Caprice Caprice

            好的,我再试一下,此外还有另一个问题请教,本地我是用SS,VPN也有配置且到昨天都可以连,但是今天凌晨因为要改SS配置所以连VPN,忽然断了之后就连不上了,重装PPTP服务也不行,本地ping不通我的搬瓦工服务器ip,SS连接正常

  9. Null Null

    老高,请问一下:
    1. 服务器端我用shadowsocks(命令:/usr/bin/ssserver -c /etc/shadowsocks.json)可以运行,客户端可以上网。
    2. 服务器端用shadowsocks-libev(命令:/usr/local/bin/ss-server -c /etc/shadowsocks,同样的配置文件运行,无出错信息,但提示ss-server的帮助信息,即出现Alone童鞋的情况);用命令:ss-server -p xxxx -k xxxx -m xxxx -l xxxx却可以正常运行。
    贴一下配置文件:
    {
    "server":"0.0.0.0",
    "local_address":"127.0.0.1",
    "local_port":1086,
    "port_password":{
    "8388":"sspwd",
    "8387":"sspwd7",
    "8386":"sspwd6",
    "8385":"sspwd5",
    "8384":"sspwd4",
    "8383":"sspwd3",
    "8382":"sspwd2",
    "8381":"sspwd1",
    "8380":"sspwd0",
    "8389":"sspwd9"
    },
    "timeout":300,
    "method":"chacha20",
    "fast_open": false
    }
    后来配置文件改成单用户了,却可以正常运行。
    刚才查了一下,原来libev不直接支持多用户。修改一下/etc/supervisord.conf文件,改成如下样子:
    [program:shadowsocks-libev_p7]
    command = /usr/local/bin/ss-server -c /etc/shadowsocks-libev.d/7.json -f /tmp/ss7.pid
    user = ladder
    autostart = true
    autoresart = true
    stderr_logfile = /var/log/supervisor/ss-libev7.stderr.log
    stdout_logfile = /var/log/supervisor/ss-libev7.stdout.log

    [program:shadowsocks-libev_p8]
    command = /usr/local/bin/ss-server -c /etc/shadowsocks-libev.d/8.json -f /tmp/ss8.pid
    user = ladder
    autostart = true
    autoresart = true
    stderr_logfile = /var/log/supervisor/ss-libev8.stderr.log
    stdout_logfile = /var/log/supervisor/ss-libev8.stdout.log
    ....
    再对/etc/shadowsocks-libev.d下的7.json、8.json文件按单一用户的格式进行修改,执行
    supervisorctl update
    supervisorctl reload
    supervisorctl status
    shadowsocks-libev_p0 FATAL Exited too quickly (process log may have details)
    shadowsocks-libev_p1 FATAL Exited too quickly (process log may have details)
    shadowsocks-libev_p2 FATAL Exited too quickly (process log may have details)
    shadowsocks-libev_p3 FATAL Exited too quickly (process log may have details)
    shadowsocks-libev_p4 FATAL Exited too quickly (process log may have details)
    shadowsocks-libev_p5 FATAL Exited too quickly (process log may have details)
    shadowsocks-libev_p6 FATAL Exited too quickly (process log may have details)
    shadowsocks-libev_p7 FATAL Exited too quickly (process log may have details)
    shadowsocks-libev_p8 FATAL Exited too quickly (process log may have details)
    shadowsocks-libev_p9 FATAL Exited too quickly (process log may have details)
    v2ray RUNNING pid 742, uptime 0:00:24
    显示shadowsocks-libev错误,但ps aux 及 top命令均有显示进程,服务实际上是运行的,也可以上网。
    请问这是怎么回事呢?

    1. 检查权限,然后看看程序日志有啥输出,另外你可以试试GO语言版的,也支持多端口

  10. leng leng

    老高,我配置了supervisord.conf,也reload了,然后在浏览器输了ip+端口打不开啊

    1. 可能是防火墙挡住了

  11. Alone Alone

    请问很多时候输入了命令,控制台没有报错,也没有任何提示,直接就进行下一行命令提示。 就像按了一下回车那样。 是什么情况呢?

  12. 我按照上文的方法进行设置,在开机后可以看到supervisord进程,但看不到ss-server进程,验证后发现ss-server没有执行,这是开机启动的情况。但如果我直接执行supervisord -c /etc/supervisord.conf,则可以正常启动ss-server进程,这是什么原因呢?

  13. 如果正确配置,应该不会有错,您看看错误日志有没有信息? stderr_logfile = /var/log/supervisor/ss.stderr.log stdout_logfile = /var/log/supervisor/ss.stdout.log

    1. 不正常,开机自启动命令里指定路径了没?

    2. 我先删除了这两个日志文件,然后重启虚机,仍然是supervisor执行,ss-sever未执行,查看log,发现ss.stderr.log和ss.stdout.log这两个文件均未重新生成,这个现象正常吗?

  14. paopao paopao

    关于开机自启动那块,到底是在哪加这行命令? supervisord -c /etc/supervisord.conf

  15. ed976 ed976

    启动ss-server不用加-f pid文件吗?

添加新评论