竹磬网-邵珠庆の日记 生命只有一次,你可以用它来做些更多伟大的事情–Make the world a little better and easier


63月/180

Vagrant-安装教程及常见问题

发布在 邵珠庆

前言:
Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境。
它的主要意义是让所有开发人员都使用和线上服务器一样的环境,本质上和你新建一个虚拟机。
那最常见的,正常我们是怎么开发呢,大部分童鞋应该是在windows下搭建开发环境,敲代码,运行程序,达到效果git或svn提交,发布linux环境再看效果。
而vagrant virtualBox实现了把代码同步共享到linux虚拟机,而这个虚拟机你可以配成和你生产环境一样的,
说白了,通过共享文件到虚拟机,在类生产环境下运行。【让你在windows下体验到在linux开发的效果。
还有一种共享方式,可以借助IDE的develop功能通过sftp上传到服务器,然后访问服务器
三种方式总结:
【1】原始windows开发模式:windows开发-本地访问调试(与生产环境毕竟不同)-发布到linux运行
【2】vagrant virtualBox模式: windows开发 - 文件本地共享 -- 直接访问虚拟机(linux环境与生产一致)
【3】IDE develop 模式: windows开发 - 文件远程上传 -- 访问远程开发机(linux环境与生产一致)
其实【1】,与【2,3】的区别就在于,程序是在哪里运行的,windows本地?or Linux仿生产环境
(能在仿生产的环境直接开发肯定比在windows开发在放到linux更好些,开发方便避免一些环境上等的麻烦)
【2】与【3】的区别就在于文件是如何同步的:【2】是通过虚拟机文件共享实现同步;【3】直接利用sftp远程上传实现同步。
缺点:
【1】毫无疑问,它的弊端就是开发时不能模拟生产环境,可能会有衔接问题,环境有了问题不像虚拟机重安一台立刻搞定。
【3】存在的问题,比如:当切换开发分支后改动了文件a和b,当前ide选中的是a文件,ok他会自动上传更新,但是b文件不会,因为窗口你没在b文件下呀,没有那么智能不会自动触发上传更新,这点就坑了造成代码不同步,需要你自己手动触发一下相关文件的上传,尤其是依赖一些包的时候会发生丢失,得全项目上传一次;
【2】因为是本地和虚拟机的文件共享嘛,没有文件上传遗漏一说,所以还是很推荐用
目录:
一。安装虚拟机
二。Vagrantfile配置文件详解
三。连接虚拟机
四。碰到问题

一。安装虚拟机
1.添加box
vagrant box add base your_box_addres
注意:base是默认名称,主要用来标识一下你添加的box,后面的命令都是基于这个标识来操作的,你也可以用其他名称【但是用了其他名字记得在第二步用此名字init】
2.初始化
vagrant init
vagrant init box_name
如果你添加的box名称不是[base],那么需要在初始化的时候指定名称
3.启动虚拟机
vagrant up
启动过程可能比较长,耐心等待
图一.运行过程总图
图二
相关指令:

[plain] view plain copy

  1. vagrant up (启动虚拟机)
  2. vagrant halt (关闭虚拟机——对应就是关机)
  3. vagrant suspend (暂停虚拟机——只是暂停,虚拟机内存等信息将以状态文件的方式保存在本地,可以执行恢复操作后继续使用)
  4. vagrant resume (恢复虚拟机—— 与前面的暂停相对应)
  5. vagrant destroy (删除虚拟机,删除后在当前虚拟机所做进行的除开Vagrantfile中的配置都不会保留)
二.Vagrantfile配置文件详解
在我们的开发目录下有一个文件Vagrantfile,里面包含有大量的配置信息,主要包括三个方面的配置,虚拟机的配置、SSH配置、Vagrant的一些基础配置。(它的配置语法也是Ruby的)【修改配置文件,记得完后重启vagrant才能生效哦】

在我们的开发目录下有一个文件Vagrantfile,里面包含有大量的配置信息,主要包括三个方面的配置,虚拟机的配置、SSH配置、Vagrant的一些基础配置。Vagrant是使用Ruby开发的,所以它的配置语法也是Ruby的,但是我们没有学过Ruby的人还是可以跟着它的注释知道怎么配置一些基本项的配置。

具体介绍,参考:http://blog.csdn.net/chajinglong/article/details/52805915

[plain] view plain copy

  1. # -*- mode: ruby -*-
  2. # vi: set ft=ruby :
  3. # All Vagrant configuration is done below. The "2" in Vagrant.configure
  4. # configures the configuration version (we support older styles for
  5. # backwards compatibility). Please don\'t change it unless you know what
  6. # you\'re doing.
  7. Vagrant.configure(2) do |config|
  8.   # The most common configuration options are documented and commented below.
  9.   # For a complete reference, please see the online documentation at
  10.   # https://docs.vagrantup.com.
  11.   # Every Vagrant development environment requires a box. You can search for
  12.   # boxes at https://atlas.hashicorp.com/search.
  13.   config.vm.box = "base"
  14.   # Disable automatic box update checking. If you disable this, then
  15.   # boxes will only be checked for updates when the user runs
  16.   # `vagrant box outdated`. This is not recommended.
  17.   # config.vm.box_check_update = false
  18.   # Create a forwarded port mapping which allows access to a specific port
  19.   # within the machine from a port on the host machine. In the example below,
  20.   # accessing "localhost:8080" will access port 80 on the guest machine.
  21.   # config.vm.network "forwarded_port", guest: 80, host: 80
  22.   # Create a private network, which allows host-only access to the machine
  23.   # using a specific IP.
  24.   config.vm.network "private_network", ip: "192.168.33.10"
  25.   # Create a public network, which generally matched to bridged network.
  26.   # Bridged networks make the machine appear as another physical device on
  27.   # your network.
  28.   # config.vm.network "public_network"
  29.   # Share an additional folder to the guest VM. The first argument is
  30.   # the path on the host to the actual folder. The second argument is
  31.   # the path on the guest to mount the folder. And the optional third
  32.   # argument is a set of non-required options.
  33.   config.vm.synced_folder "D:/all_code/", "/home/www"
  34.   # Provider-specific configuration so you can fine-tune various
  35.   # backing providers for Vagrant. These expose provider-specific options.
  36.   # Example for VirtualBox:
  37.   #
  38.   # config.vm.provider "virtualbox" do |vb|
  39.   #   # Display the VirtualBox GUI when booting the machine
  40.   #   vb.gui = true
  41.   #
  42.   #   # Customize the amount of memory on the VM:
  43.   #   vb.memory = "1024"
  44.   # end
  45.   #
  46.   # View the documentation for the provider you are using for more
  47.   # information on available options.
  48.   # Define a Vagrant Push strategy for pushing to Atlas. Other push strategies
  49.   # such as FTP and Heroku are also available. See the documentation at
  50.   # https://docs.vagrantup.com/v2/push/atlas.html for more information.
  51.   # config.push.define "atlas" do |push|
  52.   #   push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME"
  53.   # end
  54.   # Enable provisioning with a shell script. Additional provisioners such as
  55.   # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
  56.   # documentation for more information about their specific syntax and use.
  57.   # config.vm.provision "shell", inline: <
  58.   #   sudo apt-get update
  59.   #   sudo apt-get install -y apache2
  60.   # SHELL
  61. end
三.连接虚拟机
1.虚拟机相关登录信息
vagrant ssh
这样我们就可以像连接到一台服务器一样进行操作了。
图三
2.ssh登录
window机器不支持这样的命令,必须使用第三方客户端来进行连接,例如xmoba、putty、Xshell等.

[plain] view plain copy

  1. ssh: 127.0.0.1
  2. 端口: 2222
  3. 用户名: vagrant
  4. 密码: vagrant
图四.xshell登陆举例
图五.xmoba登陆举例
3.系统信息
df -h
/vagrant这个目录是自动映射的,被映射到你刚刚建立的文件夹,这样就方便我们以后在开发机中进行开发,在虚拟机中进行运行效果测试了。
四。碰到问题:
1.vagrant up 时提示错误 cound not open file 问题
如果init指定了 add的名称test,那么init时也要说明,少了这一步
如下边错误演示与正确演示。
图六.错误演示
图七.正确演示
2.vagrant up 时提示错误:

[plain] view plain copy

  1. The guest machine entered an invalid state while waiting for it
  2. to boot. Valid states are \'starting, running\'. The machine is in the
  3. \'poweroff\' state. Please verify everything is configured
  4. properly and try again.
  5. If the provider you\'re using has a GUI that comes with it,
  6. it is often helpful to open that and watch the machine, since the
  7. GUI often has more helpful error messages than Vagrant can retrieve.
  8. For example, if you\'re using VirtualBox, run `vagrant up` while the
  9. VirtualBox GUI is open.
  10. The primary issue for this error is that the provider you\'re using
  11. is not properly configured. This is very rarely a Vagrant issue.
打开虚拟机启动,也会提示报错:

[plain] view plain copy

  1. Unable to load R3 module D:\virtualBox/VBoxDD.DLL (VBoxDD): GetLastError=1790 (VERR_UNRESOLVED_ERROR).
原因:
本目录中的以下三个文件是原始的未被破解的WIN7 64位系统主题文件:
themeservice.dll , themeui.dll ,uxtheme.dll
为了使用工具UniversalThemePatcher-x64.exe恢复主题,特地将以上3个文件,
各拷贝了一份,并重新命名如下:
themeservice.dll.backup ,themeui.dll.backup ,uxtheme.dll.backup
解决方法:
我们只须把重命名后的3个文件:
themeservice.dll.backup ,themeui.dll.backup ,uxtheme.dll.backup
拷贝到C:\Windows\System32目录下面,
然后运行工具UniversalThemePatcher-x64.exe进行恢复即可。
下载地址:http://download.csdn.net/download/ty_hf/10013443【里边有使用说明】
3.虚拟机一切正常,文件代码也映射到虚拟机,但就是不能正常访问。
a).配置文件需要删除

[plain] view plain copy

  1. sudo rm -f /etc/udev/rules.d/70-persistent-net.rules
问题就处在在持久网络设备udev规则(persistent network device udev rules)是被原VM设置好的,再用box生成新VM时,这些rules需要被更新。而这和Vagrantfile里对新VM设置private network的指令发生冲突。删除就好了。
b).如果设置了host,虚拟机里也要设置一次

[plain] view plain copy

  1. vi /etc/hosts

3.问题 default: Warning: Authentication failure. Retrying...

[plain] view plain copy

  1. Bringing machine \'default\' up with \'virtualbox\' provider...
  2. ==> default: Clearing any previously set forwarded ports...
  3. ==> default: Clearing any previously set network interfaces...
  4. ==> default: Preparing network interfaces based on configuration...
  5.     default: Adapter 1: nat
  6.     default: Adapter 2: hostonly
  7. ==> default: Forwarding ports...
  8.     default: 22 (guest) => 2222 (host) (adapter 1)
  9. ==> default: Booting VM...
  10. ==> default: Waiting for machine to boot. This may take a few minute
  11.     default: SSH address: 127.0.0.1:2222
  12.     default: SSH username: vagrant
  13.     default: SSH auth method: private key
  14.     default: Warning: Remote connection disconnect. Retrying...
  15.     default: Warning: Authentication failure. Retrying...
  16.     default: Warning: Authentication failure. Retrying...
  17.     default: Warning: Authentication failure. Retrying...
  18. Timed out while waiting for the machine to boot. This means that
  19. Vagrant was unable to communicate with the guest machine within
  20. the configured ("config.vm.boot_timeout" value) time period.
  21. If you look above, you should be able to see the error(s) that
  22. Vagrant had when attempting to connect to the machine. These errors
  23. are usually good hints as to what may be wrong.
  24. If you\'re using a custom box, make sure that networking is properly
  25. working and you\'re able to connect to the machine. It is a common
  26. problem that networking isn\'t setup properly in these boxes.
  27. Verify that authentication configurations are also setup properly,
  28. as well.
  29. If the box appears to be booting properly, you may want to increase
  30. the timeout ("config.vm.boot_timeout") value.

解决:

编辑Vagrantfile ,添加如下文件

[plain] view plain copy

  1. config.ssh.username = "vagrant"
  2. config.ssh.password = "vagrant"
然后重启vagrant 重新加载配置文件

[plain] view plain copy

  1. vagrant halt
  2. vagrant up

注意登陆的时候看下 vagrant ssh 看下你的登录信息,端口号

4.报错问题:

[plain] view plain copy

  1. Bringing machine \'default\' up with \'virtualbox\' provider...
  2. Your VM has become "inaccessible." Unfortunately, this is a critical error
  3. with VirtualBox that Vagrant can not cleanly recover from. Please open VirtualBox
  4. and clear out your inaccessible virtual machines or find a way to fix
 解决:
 http://doodlebobbers.com/vagrant-error-your-vm-has-become-inaccessible/
其实就是删除.vagrant文件夹,然后重启vagrant
5.vagrant 启动的时候报错

[plain] view plain copy

  1. A Vagrant environment or target machine is required to run this
  2. command. Run vagrant init to create a new Vagrant environment. Or,
  3. get an ID of a target machine from vagrant global-status to run
  4. this command on. A final option is to change to a directory with a
  5. Vagrantfile and to try again.

少前边步骤了,比如vagrant init;或者没有进入对应vagrant init的文件夹

6.vagrant dns解析异常,访问接口特别慢,在Vagrantfile 配置文件中添加下边代码:

[plain] view plain copy

  1. config.vm.provider :virtualbox do |vb|
  2. vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
  3. vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
7.vagrant up 又提示新报错!

[plain] view plain copy

  1. D:\vcode>vagrant up
  2. Bringing machine \'default\' up with \'virtualbox\' provider...
  3. Your VM has become "inaccessible." Unfortunately, this is a critical error
  4. with VirtualBox that Vagrant can not cleanly recover from. Please open VirtualBo
  5. x
  6. and clear out your inaccessible virtual machines or find a way to fix
  7. them.
相关资源:
官网下载:https://www.vagrantup.com/downloads.html
虚拟机等相关安装包: 链接:http://pan.baidu.com/s/1dEWSnEL 密码:ajaq
本文地址:http://blog.csdn.net/ty_hf/article/details/78314583
153月/170

最好的 ss-panel 部署教程

发布在 邵珠庆

续・为最好的 ss-panel 部署教程献上更新!
本文最后更新与 2016-02-08,更新内容详见博文底部。

今天折腾了好久 ss-panel,期间遇到了一些奇奇怪怪的问题,但是网上都没有好的解决方法。

网上那么多教程有些是写得笼统,有些还是瞎复制的。

由此萌生了想要写一篇配置 ss-panel 和 ss-manyuser 的教程,希望能够帮到需要的人。

注意,本教程 不是 图文并茂的面向小白的教程,窝希望你能够有足够的 linux 操作经验再来看这篇教程。

至少你需要熟悉 ssh 连接,熟悉 web 环境的配置,最好可以看得懂一些代码。

一、安装并配置 ss-panel

本教程打算先配置好前端,当然你想要先配置后端可以拉下去。

0x01 环境要求

作为前端的 ss-panel 是使用 PHP 编写的网页应用程序,它对你的主机运行环境有一定的要求。

  • PHP 5.6 或更高
  • MySQL 5.5 或更高
  • 支持 URL 重写的 Web 服务器(Nginx / Apache 均可)

本教程所使用的环境是 NGINX + PHP 7 + MariaDB 10。

当然其他主流 LNMP/LAMP 架构都可以(个人推荐使用 OneinStack),确保你的站点可以访问后就继续吧。

什么?你不知道上面说的那些东西是什么?那你为什么不问问神奇海螺呢?


注意,接下来的操作大部分都是在【目标服务器】的 shell 中进行的。继续阅读之前,你需要通过 SSH 等工具连接至你的服务器,它一般长这样:

shell example

如果你不晓得这是什么,神奇海螺……以下略。

0x02 下载 ss-panel 源码

ss-panel 的 GitHub 项目地址:orvice/ss-panel

使用 cd 进入你站点的 web 根目录,从 git 上 clone 源码:

# 最前面的美元符号是命令提示符,别把这个给一起输进去了

$ git clone https://github.com/orvice/ss-panel.git

当然你也可以下载源码再用 SCP/FPS 传到服务器上去。

注意源码下载完成后的目录结构,请务必保证 /public 目录在站点的根目录下。

你可以使用 $ mv ss-panel/{.,}* ./ 命令将子目录的内容移动到当前目录来。正确的目录结构应该类似于这样:

directory structure example

0x03 配置 ss-panel

执行完上面的步骤之后,你兴高采烈地访问了你的站点,却得到了无情的 403 Forbidden —— 站点根目录下竟然没有 index.php!

好吧其实没什么好奇怪的,大部分 MVC 框架都将 index.php 的入口文件放到其他子目录下了,

这样做是为了保护根目录下的配置文件等可能会导致信息泄露的敏感文件无法被访问。

接下来请按照 官方文档的说明 正确配置你的 Web 服务器。正确配置后的 NGINX 配置应该长这样:

nginx configuration sample

编辑完后重载你的 Web 服务器,然后访问你的站点……

于是你得到了一个 500 Internal Server Error(如果你没开启 display_errors 可能看不到详细报错):

Warning: require(/home/wwwroot/ss.prinzeugen.net/vendor/autoload.php): failed to open stream: No such file or directory in /home/wwwroot/ss.prinzeugen.net/bootstrap.php on line 18 Fatal error: require(): Failed opening required '/home/wwwroot/ss.prinzeugen.net/vendor/autoload.php' (include_path='.:/usr/local/php/lib/php') in /home/wwwroot/ss.prinzeugen.net/bootstrap.php on line 18

这是我们还未安装 ss-panel 所需的依赖库导致的。遂安装之:

$ curl -sS https://getcomposer.org/installer | php $ php composer.phar install

installing dependencies with composer

等待它安装完毕后接着进行配置:

$ cp .env.example .env

将 .env.example 复制一份重命名为 .env,自行修改其中的数据库等信息。

# database 数据库配置

db_driver = 'mysql'

db_host = 'localhost'

db_port = '3306'

db_database = 'ss-panel'

db_username = 'ss-panel'

db_password = 'secret'

db_charset = 'utf8'

db_collation = 'utf8_general_ci'

db_prefix = ''

数据库的创建我就不多说了,建站的一般都玩过数据库吧?

将根目录下的 db.sql 导入到数据库中即可。其他配置自行修改。

importing tables

你还需要修改 .env 中的 muKey 字段,修改为任意字符串(最好只包含 ASCII 字符),

下面配置后端的时候我们需要使用到这个 muKey:

muKey = 'api_key_just_for_test'

接下来,确保 storage 目录可写入(否则 Smarty 会报错):

$ chown -R www storage 现在访问你的站点,就可以看到 ss-panel 的首页啦:

landing page

0x03 进入 ss-panel 后台 现在访问 http://your-domain/admin 就可以进入 ss-panel 后台了。

不过细心的你可能会注意到,刚才导入数据表的时候,user 表并没有添加记录,那要咋进管理后台呢?

当然你可以在数据库中手动加一条记录,不过作者已经提供了一个更方便的方式:

$ php xcat createAdmin 在站点根目录下运行,根据提示即可创建管理员账号 (这个文字对齐真鸡儿 shi):

creating admin account

使用刚才填写的邮箱和密码进入后台:

ss-panel dashboard screenshot

到这里,作为前端的 ss-panel 就已经配置完成了。下面开始部署作为后端的 shadowsocks-manyuser


二、部署并配置 shadowsocks-manyuser

在本篇教程中我们使用 fsgmhoward/shadowsocks-py-mu 这个版本的后端。

不同于这篇教程原先推荐的 @mengskysama 版本,这个后端支持使用 MultiUser API 与前端的 ss-panel 进行用户信息交互。

这个 API 的官方介绍在这里。简单来讲,如果你通过 API 来与前端通信,你就不需要修改后端的数据库配置了,

并且可以使用「自定义加密」、「流量记录」等高级功能。

下面我只介绍使用 API 的方法,另外那个比较麻烦的方法可以在这里查看。

0x01 安装 shadowsocks-manyuser

先将代码 clone 到本地:

$ git clone https://github.com/fsgmhoward/shadowsocks-py-mu.git 源码 clone 后,

你的目录结构应该是这样的:

directory structure ss mu

其中的 shadowsocks 子目录才是我们需要的,外面的是 setup.py 的相关文件。

0x02 配置 shadowsocks-manyuser

进入 shadowsocks 目录,将 config_example.py 复制一份到 config.py:

$ cp config_example.py config.py

修改其中第 15 行和第 29~31 行的内容:

# 启用 MultiUser API API_ENABLED = True

# 就是在你的站点地址后面加个 /mu

API_URL = 'http://ss.prinzeugen.net/mu'

# 还记得上面在 .env 中填写的 muKey 吗?把它填在这里

API_PASS = 'api_key_just_for_test'

由于我们选择使用 Mu API 来与前端通信,所以我们不需要修改 config.py 中任何关于数据库的配置。

好了,现在可以试着运行一下 $ python servers.py 了(注意,是 servers.py 而不是 server.py)。

如果没错的话,应该可以看到这样的输出:

running successfully

其中 P[XXX] 表示用户端口,M[XXX] 表示加密方式,E[XXX] 表示用户的邮箱地址。

这些都会随着 ss-panel 前端中用户配置的改变而实时变化。

0x03 常见错误 FAQ

连接上 shadowsocks 试试看能不能翻墙了?八成不能。

虽然你成功的把 servers.py 跑起来了,但还可能有各种神奇的错误阻止你翻出伟大的墙。

首先国际惯例查看连接:

$ netstat -anp | grep

你的端口 正常的话,应该是这样的:

Active Internet connections (servers and established)  
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name  
tcp        0      0 0.0.0.0:62111            0.0.0.0:*               LISTEN      32083/python  
tcp        0      0 162.233.122.111:62111    115.233.233.140:47177   TIME_WAIT   -  
tcp        0      0 162.233.122.111:62111    115.233.233.140:47161   TIME_WAIT   -  
tcp        0      0 162.233.122.111:62111    115.233.233.140:47160   TIME_WAIT   -  
tcp        0      0 162.233.122.111:62111    115.233.233.140:47157   TIME_WAIT   -

如果没有来自你的 IP 的 TCP 连接的话,那八成就是防火墙的锅了,

执行 iptables 放行你的端口:

$ iptables -I INPUT -p tcp -m tcp --dport 你的端口 -j ACCEPT

$ iptables-save

ss-panel 新注册的用户所分配的端口均为其 id-1 的用户的端口号 + 1。

比如说你把 admin 用户(uid 为1)的端口改为 12450(ss-panel 中不能改,去数据库改),

那么后面注册的新用户的端口就会是 12451, 12452 这样递增的。

所以如果你要开放注册,就要这样配置你的 iptables:

# 注意是半角冒号,意为允许 12450 及以上的端口

# 也可以指定 12450:15550 这样的范围

$ iptables -I INPUT -p tcp -m tcp --dport 12450: -j ACCEPT

现在再连接 shadowsocks 就应该可以看到 TCP 连接信息了。

并且你可以在 ss-mu 后端的输出信息中看到详细的连接日志:

connection log

日志格式的详细介绍在这里:

Explanation of the log output。

三、配置 ss-manyuser 守护进程以及多节点配置

0x01 使用 supervisor 监控 ss-manyuser 运行

如果你只是想让 ss-manyuser 在后台运行的话,可以参考我写的这篇文章。

安装 supervisor (用的是上面安装过的 pip):

# 先安装 pip 包管理器

$ sudo apt-get install python-pip

# For Debian/Ubuntu

$ sudo yum install python-pip

# For CentOS

$ pip install supervisor

创建 supervisor 配置文件

# 输出至 supervisor 的默认配置路径

$ echo_supervisord_conf > /etc/supervisord.conf

运行 supervisor 服务

$ supervisord

配置 supervisor 以监控 ss-manyuser 运行

$ vim /etc/supervisord.conf

在文件尾部(当然也可以新建配置文件,不过这样比较方便)添加如下内容并酌情修改:

[program:ss-manyuser]
command = python /root/shadowsocks-py-mu/shadowsocks/servers.py  
user = root  
autostart = true  
autorestart = true

其中 command 里的目录请自行修改为你的 servers.py 所在的绝对路径。

重启 supervisor 服务以加载配置

$ killall -HUP supervisord

查看 shadowsocks-manyuser 是否已经运行:

$ ps -ef | grep servers.py root 952 739 0 15:40 ? 00:00:00

python /root/shadowsocks-rm/shadowsocks/servers.py

可以通过以下命令管理shadowsock-manyuser 的状态

$ supervisorctl {start|stop|restart} ss-manyuser

0x02 ss-panel 的多节点配置

其实多节点也没咋玄乎,说白了就是多个后端共用一个前端而已。

而且我们的后端是使用 Mu API 来与前端进行交互的,所以多节点的配置就更简单了:

只要把所有后端的 config.py 中的 API_URL 和 API_PASS 都改成一样即可(记得 API_ENABLED = True)。

四、写在后面

其他可用的前端:

esdeathlove/ss-panel-v3-mod,修改版的 ss-panel,修改了蛮多东西的,有兴趣的朋友可以去看看,他那边安装说明都写得很详细了;

sendya/shadowsocks-panel,另外一个全新的 ss-manyuser 前端,有用户等级、套餐、支付等功能,不支持使用 Mu API,部署教程在这里。

其他可用的后端:

shadowsocks-go mu,Go 语言实现,性能比 Python 版好,也支持 Mu API;

shadowsocksR manyuser SSR 版本,见仁见智。

这几个后端的部署方法大同小异,我这里就不再赘述了。

文章更新日志 2017-03-15

根据评论区推荐将后端由 mengskysama/shadowsocks-rm/manyuser 切换至 fsgmhoward/shadowsocks-py-mu; 所有后端配置均改用 Mu API v2 的方法;

使用了更加严谨的文法。


success google

至此,你已完成对 ss-panel 的部署。叫上小伙伴们一起享受自由的互联网吧 😉

如果碰到什么奇怪的错误,请评论留言(带上你的日志)

 

28月/120

11 个牛X的 CSS3 和 jQuery 制作的教程

发布在 邵珠庆

 

CSS3 为 Web 开发带来了非常令人兴奋的变化,特别是在 CSS 3D 转换、动画等特性的支持,可以轻松的创建很酷的 Web 效果。

在这篇文章中我们介绍 11 个使用 CSS3 和 jQuery 实现的特效,很酷。

使用 jQuery 和 CSS 实现的放大镜效果

简单而惊人的CSS3边框过渡效果

CSS3中的手风琴风格滑块

使用jQuery和CSS3的组合翻转滑块

用CSS3 3D变换显示产品信息

创意CSS3的动画菜单

实验CSS3的动画图像转换

3D缩略图悬停效果

CSS3和jQuery的样书

使用CSS 3D创建变换卡图片廊

CSS3和jQuery制作的模糊效果

via queness/oschina

232月/120

告诉你wamp5多站点配置教程

发布在 邵珠庆

第一要做的是安装第二个apache服务
一、找到Apache2的htppd.conf文件.例如:我的wamp是安装在G盘的,我的就是G:\wamp\Apache2\conf目录下.大家自己的是安装在哪里的自己换路径,后面不再重复说这话了。
二、复制htppd.conf,粘贴后在conf目录下后更名www2.conf(这里www2是自定义的,你想变成什么名字都可以。不过没试过中文的可行不。)
三、用用编辑器打开(用什么编辑器无所谓了,记事本就可以)打开www2.conf 找到如下代码
Listen 80
ServerName localhost:80
DocumentRoot "G:/wamp/www"
<Directory "G:/wamp/www">
更改为
Listen 8080//8080是新的apache服务监听的端口,可以自己改成自己想监听的。例如:8888
ServerName localhost:8080
DocumentRoot "G:/wamp/www2"//www2是我们第二个网站的目录
<Directory"G:/wamp/www2">
然后在G:/wamp下建一新文件夹为 www2
四、接下来就是安装服务了,
方法一:打开G:\wamp\Apache2\bin目录,新建一个txt文档,文档内容如下:(红色字部分)
httpd.exe -k install -n "www2" -f "G:\wamp\Apache2\conf\web2.conf"

保存后,更改文件名字以及后缀为www2.bat,双击运行就可以了
方法二:windows下面点击“开始”-“运行”输入“cmd”然后回车,打开命令提示符
把命令提示符切换到G:\wamp\Apache2\bin
输入
httpd.exe -kinstall -n "www2" -f "G:\wamp\Apache2\conf\web2.conf"
后按回车就可以了。
然后我们在www2下放一个html文件来做测试,在ie输入 http://localhost:8080OK。服务正常

第二要做的就是服务安装好之后 就是怎么用wamp控制台来控制新安装的服务了
一、打开wamp目录,找到wampmanager.ini用编辑器打开(用什么编辑器无所谓了,记事本就可以)
二、主要更改的有(更改过的是红色的)
1
[Services]
Name: wampapache
Name: wampmysqld

[Services]
Name: wampapache
Name: wampmysqld
Name: www2

2
[StartupAction]
Action: service; Service: wampapache; ServiceAction: startresume;Flags: ignoreerrors
Action: service; Service: wampmysqld; ServiceAction: startresume;Flags: ignoreerrors

[StartupAction]
Action: service; Service: wampapache; ServiceAction: startresume;Flags: ignoreerrors
Action: service; Service: wampmysqld; ServiceAction: startresume;Flags: ignoreerrors
Action: service; Service: www2; ServiceAction: startresume; Flags:ignoreerrors

3
[Menu.Left]
Type: separator; Caption: "WAMP5"
Type: item; Caption: "Localhost"; Action: run; FileName:"C:\WINDOWS\explorer.exe"; Parameters: "http://localhost/";Glyph: 5
Type: item; Caption: "phpMyAdmin"; Action: run; FileName:"C:\WINDOWS\explorer.exe"; Parameters: "http://localhost/phpmyadmin/"; Glyph: 5
Type: item; Caption: "www 目录(&)"; Action:shellexecute; FileName: "G:/wamp/www"; Glyph: 5

[Menu.Left]
Type: separator; Caption: "WAMP5"
Type: item; Caption: "Localhost"; Action: run; FileName:"C:\WINDOWS\explorer.exe"; Parameters: "
http://localhost/"; Glyph: 5
Type: item; Caption: "Localhost:8080"; Action: run; FileName:"C:\WINDOWS\explorer.exe"; Parameters: "
http://localhost:8080/"; Glyph: 5
Type: item; Caption: "phpMyAdmin"; Action: run; FileName:"C:\WINDOWS\explorer.exe"; Parameters: "
http://localhost/phpmyadmin/";Glyph: 5
Type: item; Caption: "www 目录(&)"; Action:shellexecute; FileName: "G:/wamp/www"; Glyph: 5
Type: item; Caption: "www2目录(&)"; Action:shellexecute; FileName: "G:/wamp/www2"; Glyph: 5

4
[StartAll]
Action: service; Service: wampapache; ServiceAction: startresume;Flags: ignoreerrors
Action: service; Service: wampmysqld; ServiceAction: startresume;Flags: ignoreerrors

[StartAll]
Action: service; Service: wampapache; ServiceAction: startresume;Flags: ignoreerrors
Action: service; Service: www2; ServiceAction: startresume; Flags:ignoreerrors
Action: service; Service: wampmysqld; ServiceAction: startresume;Flags: ignoreerrors

5
[StopAll]
Action: service; Service: wampapache; ServiceAction: stop; Flags:ignoreerrors
Action: service; Service: wampmysqld; ServiceAction: stop; Flags:ignoreerrors

[StopAll]
Action: service; Service: wampapache; ServiceAction: stop; Flags:ignoreerrors
Action: service; Service: www2; ServiceAction: stop; Flags:ignoreerrors
Action: service; Service: wampmysqld; ServiceAction: stop; Flags:ignoreerrors

6
[RestartAll]
Action: service; Service: wampapache; ServiceAction: stop; Flags:ignoreerrors waituntilterminated
Action: service; Service: wampmysqld; ServiceAction: stop; Flags:ignoreerrors waituntilterminated
Action: service; Service: wampapache; ServiceAction: startresume;Flags: ignoreerrors waituntilterminated
Action: service; Service: wampmysqld; ServiceAction: startresume;Flags: ignoreerrors waituntilterminated

[RestartAll]
Action: service; Service: wampapache; ServiceAction: stop; Flags:ignoreerrors waituntilterminated
Action: service; Service: www2; ServiceAction: stop; Flags:ignoreerrors waituntilterminated
Action: service; Service: wampmysqld; ServiceAction: stop; Flags:ignoreerrors waituntilterminated
Action: service; Service: wampapache; ServiceAction: startresume;Flags: ignoreerrors waituntilterminated
Action: service; Service: www2; ServiceAction: startresume; Flags:ignoreerrors waituntilterminated
Action: service; Service: wampmysqld; ServiceAction: startresume;Flags: ignoreerrors waituntilterminated

7
[myexit]
Action: service; Service: wampapache; ServiceAction: stop; Flags:ignoreerrors
Action: service; Service: wampmysqld; ServiceAction: stop; Flags:ignoreerrors
Action: exit

[myexit]
Action: service; Service: wampapache; ServiceAction: stop; Flags:ignoreerrors
Action: service; Service: www2; ServiceAction: stop; Flags:ignoreerrors
Action: service; Service: wampmysqld; ServiceAction: stop; Flags:ignoreerrors
Action: exit

三、更改完成之后保存,并重启wamp就ok了。下面图是我在机子上装有3个服务之后的样子了。

我不说具体的更改的用处是希望大家能自己琢磨下,想表达的观点:最好学习方法就是实践

最后,看帖子要顶哦