搭建这个环境可把我折腾坏了,持续将近一周,总是出现各种错误(自己有点笨而已)。特此写下这篇文章来记录自己踩过的坑

服务器环境

  1. 服务器vps - 本人使用的是 搬瓦工 (bandwagonhost.com已被墙,此站点亦为官方站点),个人感觉速度还可以,用了也很久了。
  2. 操作系统CentOS 7 x64(以下操作都以全新CentOS为准 不含radius配置)

系统配置说明(可跳过)

  1. 配置epel Repository

    wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm
    rpm -ivh epel-release-7-9.noarch.rpm
  2. 配置vim 编辑/etc/vimrc(目的:防止打开config.php文件时乱码)

    /etc/vimrc
    # 设置行号
    set nu
    set fileencodings=utf-8,gb2312,gbk,gb18030
    set termencoding=utf-8
    set fileformats=unix
    set encoding=prc
    # 设置缩进
    set ts=4
    set expandtab
    set autoindent

前端安装说明

安装lnmp

  1. 安装screen,目的:安装lnmp时间过长防止连接中断引发不必要的错误,安装教程参考 screen教程,如遇中断可使用下面命令恢复,提前是你创建了screen会话 (此步骤可跳过)

    screen -r lnmp
  2. 安装lnmp包,可去该站点查看最新可用的包

    wget http://soft.vpser.net/lnmp/lnmp1.3-full.tar.gz
    tar xvzf lnmp1.3-full.tar.gz && cd lnmp1.3-full
    ./install.sh

    安装组件 设置MySQL账户root密码、PHP、Nginx(仅供参考)
    lnmp

  3. 新建vhost,并创建数据库

    lnmp vhost add

    在enter domain时,建议填写真实域名 也可以在nginx配置文件中配置(配置server_name),可以直接通过域名访问,提前是你域名做了解析

    设置如图片所示(仅供参考)
    vhost config

  4. 配置nginx

    对Nginx进行一些细节配置,打开/usr/local/nginx/conf/vhost/{your domain}.conf,添加下面代码到 server 配置节

    location /
    {
    try_files $uri $uri/ /index.php$is_args$args;
    }

    修改root配置节,修改为root /home/wwwroot/{your domain}/public

  5. PHP程序安装

    • 下载程序代码,执行下面命令

      cd /home/wwwroot/{your domain}
      yum install git -y
      git clone https://github.com/glzjin/ss-panel-v3-mod.git tmp -b new_master && mv tmp/.git . && rm -rf tmp && git reset --hard
    • 修改网站配置,添加php对目录操作权限

      cd /home/wwwroot/{your domain}
      chown -R root:root *
      chmod -R 777 *
      chown -R www:www storage
      chattr -i .user.ini
      mv .user.ini public
      cd public
      chattr +i .user.ini # 重新添加回权限
    • 重启一下nginx

      service nginx restart

配置数据库

  1. 通过浏览器访问phpMyAdmin,地址为http://{your host ip}/phpmyadmin/(建议修改目录名称防止暴露数据库,执行如下脚本),输入MySQL帐户root和密码,选择你在添加nginx vhost时设置的数据库名称

    cd /home/wwwroot/default/
    mv phpmyadmin {new dir name}
  2. 我是直接通过SQL菜单手动执行SQL来创建数据库表的,SQL脚本 glzjin_all.sql

    这个脚本中有些小问题,需要修改一下再执行,修改代码片段/*!40101 SET .../* !40101 SET ...(*号和!号之间加个空格)

    导入glzjin_all.sql

安装PHP依赖 同步用户等信息

  1. 安装php依赖 执行如下脚本

    cd /home/wwwroot/{your domain}
    php composer.phar install
    cp config/.config.php.example config/.config.php
    vim config/.config.php
  2. 进行相应的配置(配置.config.php文件)

    主要对站点名称($System_Config['appName'])、后端访问token$System_Config['muKey'])、验证邮件配置(smtp or mailgun)、注册后获得验证码数量($System_Config['inviteNum'])、数据库配置、多用户混淆后缀($System_Config['mu_suffix']

    config/.config.php
    $System_Config['appName'] = ''; // 站点名称
    $System_Config['muKey'] = ''; // mu key用于后端python访问时的access token
    $System_Config['mailDriver'] = 'mailgun'; // 邮件 选项值为mailgun/stmp 分别对应着 #stmp #mailgun配置节组
    $System_Config['inviteNum'] = '0'; // 注册后获得的邀请码数量
    # database 数据库配置
    $System_Config['db_driver'] = 'mysql';
    $System_Config['db_host'] = 'localhost';
    $System_Config['db_database'] = '';
    $System_Config['db_username'] = '';
    $System_Config['db_password'] = '';
    $System_Config['db_charset'] = 'utf8';
    $System_Config['db_collation'] = 'utf8_general_ci';
    $System_Config['db_prefix'] = '';
    #多用户混淆参数后缀
    $System_Config['mu_suffix']='baidu.com';
    # 多用户混淆参数表达式,%5m代表取用户特征 md5 的前五位,%id 代表用户id,%suffix 代表上面这个后缀。
    $System_Config['mu_regex']='%5m%id.%suffix';

    注:muKey和mu_suffix主要用于和python后端通信使用,因此在后端python中userapiconfig.py文件进行同样的设置,具体对应如下

    userapiconfig.py
    MU_SUFFIX = '{.config.php $System_Config["mu_suffix"]}'
    WEBAPI_TOKEN = '{.config.php $System_Config["muKey"]}'
  3. 创建管理员账户,用来登录站点配置信息

    php -n xcat createAdmin
  4. 同步用户,执行如下命令

    php xcat syncusers

    编辑cron,执行crontab -e,输入以下内容

    crontab -e
    30 22 * * * php /home/wwwroot/{WEBSITE.NAME}/xcat sendDiaryMail
    */1 * * * * php /home/wwwroot/{WEBSITE.NAME}/xcat synclogin
    */1 * * * * php /home/wwwroot/{WEBSITE.NAME}/xcat syncvpn
    0 0 * * * php -n /home/wwwroot/{WEBSITE.NAME}/xcat dailyjob
    */1 * * * * php /home/wwwroot/{WEBSITE.NAME}/xcat checkjob
    */1 * * * * php -n /home/wwwroot/{WEBSITE.NAME}/xcat syncnas
  5. 没出什么问题的话,现在ss-panel-v3-mod已经能运行起来了,现在进行节点配置

    进行此步的目的是为了在userapiconfig.py中填写NODE_ID = {node id}

    • 用第3步创建的管理员登录系统后,选择左下角的管理面板

    • 进入管理面板后,选择左侧的节点列表,再点击右下角的添加按钮 主要填写节点名称、节点地址、节点IP、加密方式、流量比例、节点状态、节点类型,可参考:节点添加说明

    • 如图所示:
      添加节点

后端安装说明

后端使用的是 ShadowsocksR

安装工具

  1. 安装pip(python包管理器),执行如下命令:

    yum install python-setuptools && easy_install pip
  2. 安装libsodium

    yum -y groupinstall "Development Tools"
    wget https://github.com/jedisct1/libsodium/releases/download/1.0.10/libsodium-1.0.10.tar.gz
    tar xf libsodium-1.0.10.tar.gz && cd libsodium-1.0.10
    ./configure && make -j2 && make install
    echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.conf
    ldconfig

配置服务

  1. 下载程序源代码

    cd /usr/
    git clone -b manyuser https://github.com/glzjin/shadowsocks.git
  2. 进入shadowsocks目录,安装依赖

    cd /usr/shadowsocks
    yum -y install python-devel
    yum -y install libffi-devel
    yum -y install openssl-devel
    pip install requests
  3. 配置程序

    • 得到配置文件

      cd /usr/shadowsocks
      cp apiconfig.py userapiconfig.py
      cp config.json user-config.json
    • 编辑userapiconfig.py,以下仅贴出重要配置

      userapiconfig.py
      NODE_ID = 1 # 此处修改为之前添加的节点id eg: 3
      MU_SUFFIX = 'zhaoj.in' # 此处修改为.config.php中$System_Config['mu_suffix']
      MU_REGEX = '%5m%id.%suffix'
      API_INTERFACE = 'modwebapi' # 填写为modwebapi
      WEBAPI_URL = 'https://zhaoj.in' # 此处修改为你当前的站点
      WEBAPI_TOKEN = 'glzjin' # 此处修改为.config.php中$System_Config['muKey']
      # Mysql 数据库配置和.config.php配置一样
      MYSQL_HOST = '127.0.0.1'
      MYSQL_PORT = 3306
      MYSQL_USER = 'ss'
      MYSQL_PASS = 'ss'
      MYSQL_DB = 'shadowsocks'
  4. 执行以下命令,测试服务是否可用

    cd /usr/shadowsocks/
    python server.py # 用于调试
    • 如果服务报错,进行调试的话,主要有以下几个文件:

      • php程序中的app/Middleware/Mod_Mu.php文件,主要负责校验token(muKey)
      • php程序中的config/routes.php,主要是路由配置,查看$app->group('/mod_mu',...,此处代码块主要用于和python交互的
      • python程序中的webapi_utils.py文件,可以适当输出uri参数,观察当前请求的php地址
  5. 在第4步成功的提前下,优化程序

    • 编辑/etc/security/limits.conf,在最后添加如下代码:

      * soft nofile 51200
      * hard nofile 51200
    • 运行命令ulimit -n 51200

    • 编辑防火墙配置/etc/sysctl.conf配置如下,配置完成后使用systcl -p使其生效

      fs.file-max = 51200
      net.core.rmem_max = 67108864
      net.core.wmem_max = 67108864
      net.core.netdev_max_backlog = 250000
      net.core.somaxconn = 4096
      net.ipv4.tcp_syncookies = 1
      net.ipv4.tcp_tw_reuse = 1
      net.ipv4.tcp_tw_recycle = 0
      net.ipv4.tcp_fin_timeout = 30
      net.ipv4.tcp_keepalive_time = 1200
      net.ipv4.ip_local_port_range = 10000 65000
      net.ipv4.tcp_max_syn_backlog = 8192
      net.ipv4.tcp_max_tw_buckets = 5000
      net.ipv4.tcp_fastopen = 3
      net.ipv4.tcp_rmem = 4096 87380 67108864
      net.ipv4.tcp_wmem = 4096 65536 67108864
      net.ipv4.tcp_mtu_probing = 1
  6. 安装配置supervisord

    • 安装supervisord,执行如下脚本

      yum install supervisor python-pip -y
      pip install supervisor==3.1
      chkconfig supervisord on
      wget https://github.com/glzjin/ssshell-jar/raw/master/supervisord.conf -O /etc/supervisord.conf
      wget https://github.com/glzjin/ssshell-jar/raw/master/supervisord -O /etc/init.d/supervisord
    • 编辑/etc/supervisord.conf,将最后一段修改如下:

      [program:mu]
      command=python /root/shadowsocks/server.py
      directory=/root/shadowsocks
      autorestart=true
      startsecs=10
      startretries=36
      redirect_stderr=true
      user=root ; setuid to this UNIX account to run the program
      log_stdout=true ; if true, log program stdout (default true)
      log_stderr=true ; if true, log program stderr (def false)
      logfile=/var/log/mu.log ; child log path, use NONE for none; default AUTO
      ;logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB)
      ;logfile_backups=10 ; # of logfile backups (default 10)
    • 编辑/etc/init.d/supervisord在这两行之间添加ulimit -n 51200

      echo -n $"Starting supervisord: "
      ulimit -n 51200
      daemon supervisord -c /etc/supervisord.conf
    • 启动supervisord,执行以下命令

      service supervisord start
    • 关于升级

      cd /usr/shadowsocks
      git pull

主要参考资料: