nonocast

Stay Hungry, Stay Foolish.

.gitignore

No comments

github/gitnogre集合了针对各种语言环境的.gitignore(忽略文件)模版,算是一个All in One的Pack。其中有2部分组成,根目录下的所有xxx.gitignore是针对项目,应该根据项目类型放在项目文件夹中,而Global则是针对操作系统,应该home目录下进行全局控制。

当然你可以根据你的情况进行定制比如,
Windows + VisualStudio + Node = windows.gitignore
Mac OSX + Node + Xcode + C = osx.gitignore

scp(secure copy - remote file copy program)在ssh基础上提供shell间cp,比ftp传输很多,属于必备技能,

scp <source> <target>

其中remote shell表示方法为user@address:file-path,比如nonocast@v.nonocast.cn:~表示指向nonocast的home,

实际操作如下图,

注解:其中-r针对目录。

Enjoy.

参考内容:

接着Part 1,这里介绍一下Upstart操作方式,首先安装Upstart, debian下直接apt-get install upstart,然后输入确认内容即可。

在/etc/init下编写配置文件,如hello.conf

description "hello service"
author "nonocast"

start on startup
stop on shutdown

respawn                # restart when job dies
respawn limit 5 60     # give up restart after 5 respawns in 60 seconds

script
  # Node needs HOME to be set
  export HOME="/home/www"
  chdir /home/www/gitd
  exec sudo -u www sh -c "/usr/local/bin/coffee /home/www/gitd/app.coffee >> /var/log/hello.log 2>&1"
end script

exec表示需要upstart控制的主程序,upstart会替我们很好的照顾exec启动的程序。

然后通过sudo start hello即可启动程序,同时还支持stop, restart, status,这里的start,stop命令都是initctl start,stop的link,提一下。
如果配置文件有问题,通过/var/log/upstart下的日志查看错误原因。
通过tail -f /var/log/hello.log即时查看node日志。
通过sudo initctl list可以查看upstart所有执行的服务。
同时,如果只是修改coffee内容,对应restart就可以重新加载,而如果修改了hello.conf,则需要sudo initctl reload hello更新upstart script。

关于upstart最后再补充一句,看上去upstart只是一个更好的init.d,事实上,更好的理解是upstart是一个系统级的hook,当收到系统的event时做出对应的响应,好比说插入U盘也能触发script,同时支持自定义Event,然后通过initctl emit触发,这个和node中event/emit异曲同工,而系统启动和系统关闭只是众多event其中的一种而已,所以不要曲解了upstart。

upstart中respawn虽然也能做到程序意外退出的重启,但始终还是不够的,就像StackOverflow上所说,

I highly recommend using both Monit AND upstart. Upstart makes it easy to deamonize node.js and Monit comes packed with tons of useful app checks including memory usage, http requests, cpu usage, ...

比如说程序虽然运行,但http请求无法响应,这种情况只能依靠Monit来做更复杂的判断,保证你的服务可持续性,同时他还可以在监测异常给出邮件、短信提示,让一切尽在掌握中。

debian下sudo apt-get install monit安装。安装完成后/etc/monit/monitrc是整个monit的配置文件,而/etc/monit/conf.d下放置针对你要监控的所有script,

vi /etc/monit/conf.d/hello.monitrc

check host hello with address 127.0.0.1
     start "/sbin/start hello"
     stop "/sbin/stop hello"
     if failed port 4000 protocol HTTP
          request /
          with timeout 5 seconds
          then restart

安装monit后,monit会自动生成一个init.d script,所以还需要sudo update-rc.d hello enable将monit加入启动,重启后通过monit status就可以查看服务状态了,如果手动关闭hello(sudo stop hello),monit status会看到应用offline,如下图,

再次刷新后,就自动还原为online,同时浏览器也可以继续访问网页,所以说Upstart+Monit就基本很好的照顾了Node,Enjoy it.

参考内容:

继续上一篇的话题,debian启动默认走init.d,不过随着upstart的出现,选择差不多如下,

选择的关键指标:

  • 通用性:Debian, CentOS and others
  • 先进性:实现方式
  • 功能性:start, stop, restart, status, reload
  • 易用性:script尽可能简单
  • 依赖性:越少依赖越好
  • 容错性:支持自动重启

就当我还在纠结init.d和upstart时,突然发现pm2 startup debian就直接将pm2部署到init.d中,才发现pm2才是终极方法,当然搞清楚背后的原理总是必须的。终于体会到众里寻他千百度,蓦然回首,那人却在灯火阑珊处。

不过,pm2由于封装的太多,以至于很难透过操作看到背后运行的机理,而且文档少得可怜,同样的操作在虚拟机上就ok,但VPS怎么折腾启动都不能resurrect,一定要手动才行,很多人说竟然要cron配合手动resurrect,OMG。最后还是用了Upstart,合理的封装机制,透明的运作方式,详尽的文档,就它了。

参考内容:

Linux上的daemon等同于Windows上的service,我们更多的用Linux是作为设备服务,而非桌面交互,所以daemon就显得无比重要,因为不管是node, 还是socket server都是以daemon的形式出现,即开机启动立即提供服务,而不是需要shell进行交互。

阮一峰的blog已经将Linux的启动从宏观面上说的很清楚了,基本过程如下,

  • 加载内核: /boot
  • 启动初始化进程: /sbin/init
  • 确定运行级别: init首先加载/etc/inittab确定runlevel
  • 加载开机启动程序: init根据runlevel对应加载/etc/rcN.d下的script(rc:run command)
  • 用户登录: 完成rc后才准备用户登录,3个途径: shell, ssh, x。换句话说,在登录前服务都已经运行了。

以debian为例,daemon需要script驱动,管理方式如下,

  • 编写daemon script,放入init.d
  • update-rc.d管理script
    • update-rc.d script-name defaults, 将script在rcN.d下建立对应的link
    • update-rc.d -f script-name remove, 从rcN.d下移除script的link
    • 所有的script都应放在init.d目录下,而rcN.d仅作link即可

这里再解释一下daemon script,事实上script的生命周期很短,脚本执行完自然就结束,所以真正提供服务的程序只是在script中被调用,script只是用来控制服务而已。这个地方不是说不容易理解,而是和windows上的service有所不同,仔细体会一下。

一个最简单的daemon script如下,

#! /bin/sh
# /etc/init.d/blah
#

# Some things that run always
touch /var/lock/blah

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting script blah "
    ;;
  stop)
    echo "Stopping script blah"
    ;;
  *)
    echo "Usage: /etc/init.d/blah {start|stop}"
    exit 1
    ;;
esac

exit 0

blah一旦update-rc.d后就可以开机后自行启动,同时在shell中也可以控制script,比如/init.d/blah start或/init.d/blah stop。

参考内容:

在linode上部署ssh服务最简单的方式还是走ssh,访问的url如下,

ssh://git@vpn.nonocast.cn/~/test.git

简单说明一下,git是linode上debian的用户名,vpn.nonocast.cn是域名,也可以是ip address,~/test.git是路径,对应到/home/git/test.git,test.git是一个文件目录。

基于上述描述,需要执行一下动作,

创建用户

注:以下内容基于debian 7.5,其他系统自行对应即可。
$ useradd -m git
$ passwd git
这里要说明的是为什么不用已经创建好的用户呢,比如nonocast?考虑到权限问题,一旦你放开账号和密码给你的同事,那么你的同事就能访问你home下的所有文件,这肯定是你不愿意的,所以单独开一个git account,那么将来公开git account,那么也仅仅能访问git账户中home的内容。如果git库本身还区分security level,那么开不同的account对应即可。

最后关闭git账号访问shell,防止直接操作服务器上文件,将/bin/sh替换为/usr/bin/git-shell,vi /etc/passwd修改为如下,

git:x:1001:1001::/home/git:/usr/bin/git-shell

再次以git登录会显示,

fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to vpn.nonocast.cn closed.

continue reading...

花了一天的时间搞定vpn,首先说一下思路,vpn是虚拟网络,就是在TCP/IP之上的网络,非常高级,后面解释。所以我们要做的就是在你的电脑和linode主机间建立一个连接,然后让你电脑的所有数据包都发送至linode后返回。比如说你要访问twitter,那么请求从shanghai发起,经tokyo(linode)然后到us,us的web server返回到tokyo最后返回到shanghai。

vpn是一个大的框架,其中PPTP(Point to Point Tunneling Protocol)是vpn的一种实现,这种实现较之其他实现的优势是速度快,普及性强(mac, iOS, linux, windows都支持),缺点就是对网络设备有点要求,差点就死在这里。

continue reading...

最近一直沉溺于写文档,OMG,晚上思路实在一泡5,所以一不小心注册了Linode,虽然之前一直在Linode和DO间犹豫,最后还是选择了Linode,关键是DO还是有点慢,另外国内什么什么云的就算了,就翻墙和稳定这2点就出局了。

VPN能干什么? website, mail server, blog, git server关键还有vpn。

回顾一下整个流程,

  • 注册账号,然后选择了Linode 1024 ($10/mo),1 CPU CORE/1GB RAM/24G SSD
  • 选择tokyo,你懂的,不用解释了吧
  • 1分钟安装CentOS
  • 安装完毕后ssh root@<your-ip-address>
  • 新建用户
    [root@h705c /]# useradd nonocast
    [root@h705c /]# passwd nonocast
  • 升级权限
    $ su
    $ vi /etc/sudoers

    在root ALL=(ALL) ALL下加入nonocast ALL=(ALL) ALL即可,这个在之前的blog中介绍过。

  • 安装nginx,从nginx官网下载main version然后yum install一番,最后就是configure --prefix=/opt/nginx, make, make install
  • sudo /opt/nginx/sbin/nginx
  • http://<your-address>
  • 最后将域名指过去,万事大吉

最后效果如下图:

补充一下关于ssh lish key这样可以避免每次输入密码,这个和github一样的,

  • 首先在你的电脑上生成key: ssh-keygen,在~/.ssh下id_rsa为私钥,而id_rsa.pub则为公钥
  • ssh进入linode远端电脑,把目录建好,mkdir ~/.ssh
  • 回到你的电脑上传公钥至远端电脑,
    scp ~/.ssh/id_rsa.pub nonocast@linode.nonocast.cn:/home/nonocast/.ssh/uploaded_key.pub

    上文的格式差不多可以理解为: scp 本地文件路径 用户名@域名:远端目标文件路径,其中用户名省略即采用当前shell的用户名。

  • 确认sshd_config以下三行没有注释掉,
    RSAAuthentication yes #启用 RSA 认证
    PubkeyAuthentication yes #启用公钥私钥配对认证方式
    AuthorizedKeysFile .ssh/authorized_keys #公钥文件路径
  • 下次从我的电脑登录就无需密码牵挂

Enjoy!


如果是debian,那么步骤如下,

  • $useradd -m username //-m 自动创建home目录
  • $userdel -r username //-r 删除home目录和mail
  • ssh-keygen + ssh-copy-id, vi /etc/ssh/sshd_config中去掉AuthorizedKeysFile的注释,然后/etc/init.d/ssh restart即可
  • chsh到/bin/bash或者安装zsh (apt-get install zsh然后wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | zsh最后chsh -s /bin/zsh)
  • apt-get install nginx然后sudo service nginx start

参考文档:

尝试了Page, LaTex之后发现还是用HTML写文档最爽,控制力度绝对大,而且又有bootstrap支援,同时支持Git,当然为了避免中英文反复切换可以采用Jade。由于每次修改后都需要到Safari中cmd-r,有点麻烦。配合grunt, grunt-contrib-watch以及osascript就可以完美完成safari自动刷新,包括本地文件。

grunt中本身的Livereload对safari支持非常不好,而Chrome就很OK,不管是嵌入script还是browser extension,所以 safari还是需要osascript来搞定。

打开safari显示localhost:3000对应的script如下,

#!/usr/bin/osascript
tell application "Safari"
  open location "localhost:3000"
  activate
end tell

通过grunt则需要配合watch,内容如下,

module.exports = (grunt) ->
  grunt.loadNpmTasks 'grunt-contrib-coffee'
  grunt.loadNpmTasks 'grunt-contrib-jade'
  grunt.loadNpmTasks 'grunt-contrib-watch'

  grunt.initConfig
    watch:
      files: ['view/*.jade']
      tasks: ['reload']

  grunt.registerTask "reload", "reload safari on OS X", ->
    script = "osascript " +
        "-e 'tell application \"Safari\"' " +
        "-e 'open location \"localhost:3000\"' " +
        "-e 'activate' " +
        "-e 'end tell'"

    require("child_process").exec script

  grunt.registerTask 'default', ['watch']

Enjoy!

参考内容:


Powered by WordPress © 2014 nonocast   沪ICP备09095148号 Design by SRS Solutions