科学上网路由器折腾记录

由于众所周知的原因,在国内必须通过一些科学的上网方式才能顺畅的访问一些技术站点。

虽然自建的shadowsocks用起来非常的顺畅,但是由于并非系统级代理,在某一些软件上会相应的麻烦一些,比如 Airmail、终端等。此外,一些周边设备,比如 iPad、iPhone、电视机、ps4什么的(并没有),如果也要直接设置的话,非常的麻烦或者几乎不可能。

好消息是我们可以把代理直接设置在路由器上来达到所有设备无缝科学上网的目的。

不过首先,你得有一个能够刷 openwrt 的路由器。openwrt 是一个开源的 linux 发行版,专门为路由器定制。当然也提供各种平台的版本。路由器刷上了之后就相当于变成一台 linux 小电脑,然后你就可以在上面进行一些定制改造与开发了。

附官网: https://openwrt.org/

由于需要折腾,又要我方便携带,而且考虑到性价比,我最终选择了淘宝上的这个路由器作为我刷机的路由器。主要看中的是其 DIY 增加了存储、USB 和散热片。而且本身外形也不错。

附淘宝链接:http://item.taobao.com/item.htm?id=39265237362(非广告,未必是适合你的选择)

如果你仅仅是需要科学上网的话,可以考虑702N之类的或者不考虑便携也可以考虑其他的。

淘宝店家内置的 openwrt 固件虽然集成了很多功能,但是版本过旧,官方源支持已经不是很好了,安装软件包有时会出现内核版本冲突。

所以我们用 openwrt 官方的固件对其进行一个替换。由于水星 MW151RM 其实就是一个 Tp-link 703N 的克隆,所以我们可以放心的使用 703N 的固件

ssh 登上路由后将固件 scp 到路由器上

[code language=”bash”]
scp openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-sysupgrade.bin root@192.168.1.1:/tmp
[/code]

并在路由器上执行命令

[code language=”bash”]
cd /tmp
sysupgrade -F -v openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-sysupgrade.bin
[/code]

等待升级完成重启。

官方固件不会自动的提供一个无线信号而需要先用线进行连接配置。插上线后浏览器访问 ip 进入 luci 界面,我的目标首先是要让路由实现一个万能中继的功能,让路由器连接一个 Wifi 同时提供一个热点可以接入。具体设置方法比较简单我就不多说了,需要注意的是搜索添加无线的时候有一个覆盖之前无线配置的钩千万别勾上。
配置完成后路由器应该就可以上网了,然后我们就要可以开始配置科学上网了。
我们需要下载2个文件,分别是 shadowsocks 和其 luci 的配置界面。
下载地址可以在这里找到 https://github.com/shadowsocks/openwrt-shadowsocks

照旧本地执行命令将目录拷贝到路由器上

[code language=”bash”]
scp -r ipks root@192.168.1.1:/tmp
[/code]

并在路由器上执行命令

[code language=”bash”]
cd /tmp/ipks
opkg install shadowsocks-libev-spec_x.x.x-x_ar71xx.ipk
opkg install luci-app-shadowsocks-spec_x.x.x-x_all.ipk
[/code]

安装完成后在路由配置界面的 service 菜单就可以看到配置了,勾选 enable。取消 使用配置文件 的钩,就能看到shadowsocks 的配置。输入你的配置即可。

这时候基本访问 google 什么的是没问题了,但是还有 DNS 污染问题没有解决。解决这个问题还有更加好的方式,比如使用 ChinaDNS 等。不过这里我就采用最简单的方式了。

在 网络 – DHCP/DNS 菜单下面 的DNS转发一项填上 127.0.0.1#5353 (端口号与 shadowsocks 内 DNS 转发设置为相同),让后勾上 hosts和解析文件 选项卡 里面的 忽略解析文件即可。

这样一个自带无缝科学上网的路由器就完成了。

还有些易用性上的改进,比如在没有网线的时候,我们经常可能会因为配置失误等原因连不上路由提供的无线网络,所以我们需要定制路由器的 reset 按钮的功能,比如我定义短按 reset 即用默认无线配置覆盖现有配置。

[code language=”bash”]
vi /etc/rc.button/reset
[/code]

我将文件改成了下面这样

[code language=”bash”]
#!/bin/sh

[ "${ACTION}" = "released" ] || exit 0

. /lib/functions.sh

logger "$BUTTON pressed for $SEEN seconds"

if [ "$SEEN" -lt 2 ]
then
logger reset wifi
cp /etc/reset/wireless /etc/config/wireless
wifi
elif [ "$SEEN" -lt 5 ]
then
echo "REBOOT" > /dev/console
sync
reboot
elif [ "$SEEN" -gt 5 ]
then
echo "FACTORY RESET" > /dev/console
jffs2reset -y && reboot &
fi
[/code]

然后只要把默认的无线配置文件放在 /etc/reset/wireless 就好了。

另外还有无线设置的问题,我们可以通过修改 /usr/lib/lua/luci/model/cbi/admin_network/wifi_add.lua 文件
将默认覆盖原来无线配置的钩子去掉,以及还可以在首页增加搜索无线的链接。

另外还有个非常方便的方式是你可以将有线口接到 wan 上,这样只要插上网线就可以上网了,不需要额外的配置。

如果要做成产品的话,易用性上可能还要再花一些功夫,比如简化配置界面和连接无线的界面,以及可能需要自动弹出页面来选择连接的无线信号。当然这些都暂时处于构想中,对于我自己个人使用,这样已经非常的足够了。

Blog搬了个家

虽然从外表上好像看不出来搬家了的样子,但是其实上,我确实是搬家了。

老的服务器使用的的Diahosting,服务很稳定几年了机器都没有重启过的。除了有的时候log打满了需要上去清理一下。

但是毕竟是几年了,还沿用着那时候的资费和配置。新兴的DO来势汹汹,价格便宜的令人发指;老牌的Linode也放下了身段,加了SSD,性能翻了翻,价格还降了一半。经过一番对比后选择了Linode的10$的plan,东京节点。测试效果不错,速度嗷嗷叫。

那么你现在看到的就是搬家后的blog啦。你还别说,速度一快起来,打字都变快了嘿嘿。

如果你也想弄个vps玩玩的话,Linode 一定是个不错的选择。

不过其实最近访问慢的诡异的原因其实是主题内引用了google fonts然后由于众所周知的原因所以慢了下来。这么好的服务国内不能用还是挺可惜的。被迫把引用从主题的css里面删除,这才快了起来。

最近折腾的玩具

MK908电视棒

MK908 上面的是小路由tp-link wr703n作为对比参考

听上去和看上去都比较low的一个玩意儿,但实际上异常的强大。先说说能干啥吧。

从最原始的用途上讲,他应该是一个android系统的电视盒子(类似小米乐视盒子、小米盒子啥的)比起正常的盒子来说,少掉的部分是红外线遥控器,所以控制的话,可能会需要一套无线键鼠啥的。淘宝上价格大概在280左右,并不算贵,要知道这货有一个4核的 A9处理器(RK3188),2G的运行内存与8G的ROM,对比起同价位的乐视啊小米盒子什么的,性能完爆几条街。

光是盒子,就有很多东西可以折腾了,尤其是一个高性能的盒子,能折腾的东西就更多了。我来列一下我试过的:

  1. 各种在线视频应用的播放(这个是最基本的也是最实用的,不得不说现在安卓电视盒的视频体验已经比在电脑上好一些了。比较好的一些有类似 RST全聚合 泰捷视频 Bilibili 搜狐TV 等。在线视频?电视直播?高清视频?这些都不是事儿。)。
  2. 无线USB设备连接:USB HUB、飞鼠、普通键鼠、Xbox360手柄接收器。都能够正常的工作。
  3. 蓝牙设备对接:filco机械键盘、蓝牙耳机、Apple Magic Trackpad。都没有问题。值得一提的是使用Trackpad时候,能同时识别很多的手指,支持基本的手势。
  4. 跑游戏模拟器:经测试,能够跑起PSP模拟器的怪物猎人(不过比较卡、掉帧,游戏体验较差)。至于PS、3DS、街机、GBA等,都能够完美的跑起来并支持前面提到的Xbox360无线手柄。当一个游戏机用也没有啥问题。
  5. 模拟x86系统(DOS、Winxp) DOS跑仙剑、大富翁2什么的没有压力。xp跑起来略卡,开机很久不过能够打开opera浏览网页。。(听上去好蛋疼哈哈)

其实到这里已经差不多了,一个价钱很便宜、U盘大小的盒子,能当网络高清播放器,又能模拟各种游戏回忆童年,还能够上上网啥的,已经非常的了不起了。但是其实还没完,这货还有更加厉害的杀手锏–可以刷Linux系统

具体的可以刷ubuntu啊lubuntu啥的。然后他就变成了一台配置还算不错的电脑了。比较遗憾的是好像显卡的3D加速驱动的不是很完美,所以显示效果一些特效什么的会有bug(也许再折腾折腾能够搞定)。但是这对于linux来说问题不大,试着装了mysql+php+nginx环境,能够稳定的运行。相当于一个性能非常强劲的树梅派。然后接下来能干啥?稳定又低功耗的arm linux系统,我觉得我已经不用再说什么了,剩下的都是想象力问题了。。

这还没完,android系统和linux系统实际上是可以共存的。你只需要在开机的菜单里面选一下进那个系统就OK了。

在硬件的组合上也能有很大的想象空间,我能想到的是给他弄个便携的投影机,或者头戴式的显示器,加一个移动电源。。

需要刷linux的请参照这个(针对MK908V5):http://www.biner.me/mk908v5-android-lubuntu-multiboot/

使用git capistrano nginx Unicorn搭建无缝部署服务器

一直做的是一些前端的工作,对服务器的配置部署没有很完整的经验。这次自己完整的配置了一台服务器,记录一下同时也可以让有相同需求的人少走一些弯路。

如果配置完成的话,只要修改好本地的版本,然后git push一下,最后运行命令 cap deploy,你的本地版本就会部署到服务器上,这个过程新旧版本是无缝切换的,听上去是不是非常的棒呢!

环境安装

首先是环境安装,这部分用了个脚本

https://raw.github.com/panlilu/scripts/master/stackscript

请务必完整的看一下脚本再进行安装

把这个wget到服务器上,适当编辑后(修改deploy账号密码,根据个人需要调整等)然后执行

$ wget https://raw.github.com/panlilu/scripts/master/stackscript
$ vi stackscript
$ sudo bash stackscript

然后就可以开始配置了,首先要对nginx进行配置:

Nginx

$ cd /usr/local/nginx/conf
$ vi nginx.conf

编辑成这样

#/usr/local/nginx/conf/nginx.conf
worker_processes  2;
worker_cpu_affinity 01 10;
worker_rlimit_nofile 51200;

error_log  /home/deploy/log/nginx/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    use epoll;
    worker_connections  51200;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    charset utf-8;
    access_log  /home/deploy/log/nginx/access.log;
    sendfile        on;
    tcp_nopush     on;

    keepalive_timeout  65;
    tcp_nodelay on;

    gzip on;
    gzip_min_length  1k;
    gzip_buffers     4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types       text/plain application/x-javascript text/css application/xml text/javascript;
    gzip_vary on;

    include /usr/local/nginx/conf/vhosts/*.conf;
}

注意上面配置文件倒数第二行,主配置文件会包含 /usr/local/nginx/conf/vhosts/ 下的.conf后缀配置文件作为虚拟主机配置

我们在/usr/local/nginx/conf/vhosts/下新建配置文件 <your_site>.com.conf

注意替换<your_site>作为你自己的域名

#/usr/local/nginx/conf/vhosts/<your_site>.com.conf

limit_conn_zone $binary_remote_addr zone=default:10m;
upstream <your_site>_backend {
    server unix:/tmp/unicorn.<your_site>.sock fail_timeout=0;
}
server {
    listen      80;
    server_name <your_site>.com www.<your_site>.com;
    root /home/deploy/app/<your_site>/current/public;
    try_files $uri/index.html $uri.html $uri @unicorn;
    location ~* ^(/assets|/favicon.ico) {
        gzip_static on;
        access_log        off;
        expires           max;
    }
    location @unicorn {
        limit_conn default 5;
        proxy_redirect     off;
        proxy_set_header   Host $host;
        proxy_set_header   X-Forwarded-Host $host;
        proxy_set_header   X-Forwarded-Server $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_buffering    on;
        proxy_pass         http://<your_site>_backend;
    }
}

配置完成后重启nginx

$ sudo /etc/init.d/nginx restart

如果重启成功没有返回什么错误,这个时候你如果域名绑定成功了,访问域名出现一个503bad gateway错误的话,说明你的配置大概已经成功了。

接下来需要配置应用了

关于如何配置本地的rails环境,我就不多说了,参考rails官网。

新建一个rails应用后,你需要对其进行一些修改:

Unicorn

首先我们要修改应用的gemfile使其包含unicorn

# Gemfile
gem "unicorn"

group :development do
  gem "capistrano"
end

然后 bundle intall 一下就安装好了

然后对unicorn进行配置

#config/unicorn.rb
rails_env = ENV['RAILS_ENV'] || 'production'
app_path = "/home/deploy/app/<your_site>/current"
listen "/tmp/unicorn.<your_site>.sock"
worker_processes 4
pid "#{app_path}/tmp/pids/unicorn.pid"
stderr_path "#{app_path}/log/unicorn.log"
stdout_path "#{app_path}/log/unicorn.log"
preload_app true
timeout 30

before_fork do |server, worker|
  old_pid = "#{app_path}/tmp/pids/unicorn.pid.oldbin"
  if File.exists?(old_pid) && server.pid != old_pid
    begin
      Process.kill("QUIT", File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
      puts "Send 'QUIT' signal to unicorn error!"
    end
  end
end

这样就完成了。

capistrano

先要安装capistrano
和安装unicorn差不多只要配置gemfile然后bundle install就行

# Gemfile
group :development do
  gem "capistrano"
end

bundle install完成之后还需要运行下面命令来生成一些文件

capify .

配置capistrano比较的麻烦,我直接帖出我已经配置好的文件

#config/deploy.rb
require "bundler/capistrano"
set :application, "<your_site>"
set :user, "deploy"
set :use_sudo, false
set :repository,  "deploy@git.<your_site>.com:repo/<your_site>.git" #请改成自己的git源
set :scm, :git
# Or: `accurev`, `bzr`, `cvs`, `darcs`, `git`, `mercurial`, `perforce`, `subversion` or `none`

set :deploy_to, "/home/deploy/app/#{application}"
set :deploy_via, :remote_cache
set :domain, "feather.<your_site>.com"

set :normalize_asset_timestamps, false   #for Solve the probem: Not precomplie assets

role :web, domain                          # Your HTTP server, Apache/etc
role :app, domain                         # This may be the same as your `Web` server
role :db,  domain, :primary => true # This is where Rails migrations will run

set :rails_env, "production"

after "deploy", "deploy:cleanup"
namespace :deploy do
  task :start, :roles => :app do
    run "cd #{deploy_to}/current/; RAILS_ENV=production bundle exec unicorn_rails -c config/unicorn.rb -D"
  end

  task :stop, :roles => :app do
    run "kill -QUIT `cat #{deploy_to}/current/tmp/pids/unicorn.pid`"
  end

  desc "Zero-downtime restart of Unicorn"
  task :restart, :roles => :app do
    run "kill -USR2 `cat #{deploy_to}/current/tmp/pids/unicorn.pid`"
  end

  task :setup_config, roles: :app do
    sudo "ln -nfs #{current_path}/config/unicorn_ini.sh /etc/init.d/unicorn_#{application}"
    run "mkdir -p #{shared_path}/config"
  end
  after "deploy:setup", "deploy:setup_config"

  desc "Make sure local git is in sync with remote."
  task :check_revision, roles: :web do
    unless `git rev-parse HEAD` == `git rev-parse origin/master`
      puts "WARNING: HEAD is not the same as origin/master"
      puts "Run `git push` to sync changes."
      exit
    end
  end

#  desc "run 'bundle install' to install Bundler's packaged gems for the current deploy"
#  task :bundle_install, :roles => :app do
#    run "cd #{current_path} && bundle install"
#  end

  before "deploy", "deploy:check_revision"

  after 'deploy:update_code' do
    run "cd #{release_path}; RAILS_ENV=production rake assets:precompile"
  end
end

# if you're still using the script/reaper helper you will need
# these http://github.com/rails/irs_process_scripts

# If you are using Passenger mod_rails uncomment this:
# namespace :deploy do
#   task :start do ; end
#   task :stop do ; end
#   task :restart, :roles => :app, :except => { :no_release => true } do
#     run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
#   end
# end

task :mongoid_create_indexes, :roles => :web do
  run "cd #{deploy_to}/current/; RAILS_ENV=production bundle exec rake db:mongoid:create_indexes"
end

Unicorn_ini.sh 这个脚本配置完成后会自动软链接到/etc/init.d/unicorn_<your_site> 的,方便控制unicorn的运行

#config/unicorn_ini.sh

#!/bin/sh
### BEGIN INIT INFO
# Provides:          unicorn
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Manage unicorn server
# Description:       Start, stop, restart unicorn server for a specific application.
### END INIT INFO
set -e

# Feel free to change any of the following variables for your app:
TIMEOUT=${TIMEOUT-60}
APP_ROOT=/home/deploy/app/<your_site>/current
PID=$APP_ROOT/tmp/pids/unicorn.pid
CMD="cd $APP_ROOT; bundle exec unicorn -D -c $APP_ROOT/config/unicorn.rb -E production"
AS_USER=deploy
set -u

OLD_PIN="$PID.oldbin"

sig () {
  test -s "$PID" && kill -$1 `cat $PID`
}

oldsig () {
  test -s $OLD_PIN && kill -$1 `cat $OLD_PIN`
}

run () {
  if [ "$(id -un)" = "$AS_USER" ]; then
    eval $1
  else
    su -c "$1" - $AS_USER
  fi
}

case "$1" in
start)
  sig 0 && echo >&2 "Already running" && exit 0
  run "$CMD"
  ;;
stop)
  sig QUIT && exit 0
  echo >&2 "Not running"
  ;;
force-stop)
  sig TERM && exit 0
  echo >&2 "Not running"
  ;;
restart|reload)
  sig HUP && echo reloaded OK && exit 0
  echo >&2 "Couldn't reload, starting '$CMD' instead"
  run "$CMD"
  ;;
upgrade)
  if sig USR2 && sleep 2 && sig 0 && oldsig QUIT
  then
    n=$TIMEOUT
    while test -s $OLD_PIN && test $n -ge 0
    do
      printf '.' && sleep 1 && n=$(( $n - 1 ))
    done
    echo

    if test $n -lt 0 && test -s $OLD_PIN
    then
      echo >&2 "$OLD_PIN still exists after $TIMEOUT seconds"
      exit 1
    fi
    exit 0
  fi
  echo >&2 "Couldn't upgrade, starting '$CMD' instead"
  run "$CMD"
  ;;
reopen-logs)
  sig USR1
  ;;
*)
  echo >&2 "Usage: $0 <start|stop|restart|upgrade|force-stop|reopen-logs>"
  exit 1
  ;;
esac

配置完成后,本地运行:

cap deploy:setup

补充

为了防止每次静态文件编译过慢,我们需要引入一个新的gem

gem 'turbo-sprockets-rails3'

服务器的路径结构是这样的

~/app/<your_site> 应用的存放目录

~/app/<your_site>/current 当前的版本

~/app/<your_site>/releases 最近的releases

~/app/<your_site>/shared 应用的公用文件,比如日志等

~/app/repo 存放git仓库

~/log log的链接

~/conf 配置文件的链接

至于git的配置我想大家都轻车熟路,我就不多说了。

参考

http://ariejan.net/2011/09/14/lighting-fast-zero-downtime-deployments-with-git-capistrano-nginx-and-unicorn/

https://gist.github.com/jrochkind/2161449

以上

ubuntu 11.04 惊艳登场

昨天ubuntu11.04出了,这次由于更换了主界面,采用了Unity界面。

从个人感觉上说提供给用户的界面更加的简单明快了,比较接近苹果的感觉。

这个界面的用户可视范围大的多了,非常适合浏览网页之类的事情。

而且在中文问题上,输入法集成的也不错,比以前好多了。

基本上免驱动,A卡使用自带开源驱动跑Unity界面无压力。

启动速度也有所改善。

还内置了ubuntu one 云存储系统,和系统结合的非常紧密。

一直犹豫要不要试试ubuntu的同学,这次真的可以试试了。

Linux下chrome/chromium字体设置

chromium在linux下很容易出现很多楷体的样子,虽然也有人喜欢,但大多数人还是很不习惯的。

然而直接在首选项-高级选项-自定义字体 里面即使都改掉,还是有大部分的网页会显示楷体。

经过几次试验发现

只要在任意网页内的可以输入文本的地方 右键-拼写检查选项-语言设置 里面设置就可以达到基本完美的效果。

解决ubuntu 10.04 chromium 下的字体锯齿问题

配置完ubuntu10.04后,个方面都很不错,但是有一个问题很困扰,那就是chromium下的中文字体问题。在经过多次尝试配置后仍然解决不了问题,在配置过chromium下的字体设置后,大部分网页显示是正常的,但在一些网站则发现比较小的字体会出现严重的字体问题,非常影响美观。

经过一番寻找,终于在ubuntu论坛找到了解决的办法。

运行命令:

sudo gedit /etc/fonts/conf.d/66-wqy-zenhei-sharp.conf

把<test compare=”more_eq” name=”pixelsize”><double>12</double></test>中的12改为16

原理是禁用了文泉驿正黑的点阵,改完注销一下再打开chromium就可以看到效果了

据说chrome也有这个问题,方法一样。

推荐个NX的网站–unix体验中心

http://www.unix-center.net/

上面是网址

Unix- Center.Net的目标是为研究、学习和使用各种版本的Unix和类Unix操作系统的教师、学生和工程技术人员提供一个体验和测试各种版本的 Unix和类Unix系统的软硬件平台。该平台能够为所有注册用户免费提供SSH/VNC服务,MySQL数据库服务,传统的C/C++、Java、 Fortran等多种语言开发环境,基于Apache、MySQL和PHP的Web应用开发环境。简单地讲,Unix-Center.Net的注册用户可以远程登录进入多个不同的操作系统,具备自己独立的用户空间和磁盘配额,享受该操作系统上普通用户的所有权限,学习和使用各种版本的Unix和类Unix 操作系统的常用命令和功能,可以将自己正在开发的应用程序上载到Unix体验中心的服务器,在不同的软硬件平台上编译和运行。

内容自己看简介,摘自官网。

ssh、vnc连接测试成功,
话说发这贴的时候我都已经激动的说不出话了……