在Freebsd下搭建Rails生产环境

freebsd以其简洁、高效、安全完全征服了我,相见恨晚。其气质就是有追求的程序一样,什么可以被清清楚楚,明明白白的看到,控制到。再也不用suse, redhat这些发行版,太花了。先从一个nice的内核开始!

 

===================

 

编译内核

 

去掉本机不用的硬件支持,去掉不用文件系统NTFS, IPV6这些东西。

 

内核选项除了能明确其意义的去掉没关系。但改一些参数,还是到sysctl里调,除非能有一个度量的结果。否则网上说的那些优化参数绝大多数过时了,帮不到你什么忙。若不知,勿调。

 

 

如果系统没有kernel的源码,就用sysinstall在CD里装一下,这种方法最简洁!

 

sysintall这种不用X系统的图形化配置工具,真是让人非常喜爱。并不是什么都要命令行。

 

在/usr/src下

 

make buildkernel KERNCONF=*

记得install

make installkernel KERNCONF=*

 

 

===========================

 

安装Port技巧

 

用portsnap fetch extract update 比svup方便,高效的多

 

绝大多数软件都可以在port下找到,包括ruby、nginx, mongodb,这比自己去下源码安装方便多了

 

在编译时,为了不总弹出编译选项选择,最快编译好。

 

export BATCH="yes"

make -DBATCH install clean

 

使用axel加速port下载
   a.axel(据说能搞定文件夹钳套,不错!推荐使用 )
   cd /usr/ports/ftp/axel
   make install clean
   vi /etc/make.conf 加入
   FETCH_CMD=axel -a
   DISABLE_SIZE=yes
   vi /usr/local/etc/axelrc 修改代码
   #num_connections = 4
   num_connections = 10

 

=================

 

安装必要的利器

 

freebsd虽然简约,但高级的利器如bash, vim还是不能少的。用其它的难爱。有了port非常方便,在windows下装个软件也没有这么方便啊!

 

在port里install bash

chsh 改bash为自己的shell

 

同样的,在vim里 make install clean

 

=================

 

用pkg_add包安装

 

用port下源代码安装太费时间,直接用pkg_add要快的多,推荐安装那些非关键软件,版本新旧没有太大关系,而关键软件还是用port安装!pkg_add安装好处是快,不好的地方,会直接安装依赖的软件包,而这些软件包有可能会产生冲突。

 

pkg_add -r vim

 

vim, bash, svn都用apk_add安装

 

==============

 

清理服务

 

关掉sendmail, freebsd是个干净的系统,不知为何,sendmail被打开了呢。在rc.conf中

 

sendmail_enable="NONE"

打开sshd

 

sshd_enable='YES'

 

这样的Freebsd非常nice,总共才用了28M内存!

 

==============

 

 

 

防火墙

 

ipfilter要比官方的ipfw要精小,规则要明了一点,决定使用之。

 

规则:

 

pass in quick on em1 proto tcp from any to any port=22 flags S keep state
pass in quick on em1 proto tcp from any to any port=80 flags S keep state
pass in quick  proto icmp from any to any  icmp-type 8 keep state

pass out quick  proto icmp from any to any  icmp-type 8 keep state
#pass out quick  proto tcp from any to any  keep state
#pass out quick  proto udp from any to any  keep state

block out quick all
block in quick all

 

以下几条由于最后二条,就不再使用

block in log quick all with short
block in log quick all with ipopts
block in log quick all with frag
block in log quick all with opt lsrr
block in log quick all with opt ssrr

 

当需要向外部要安装软件什么的,就可以去掉#,打开对外通讯

==============

 

安全:

 

有些敏感的文件如psswd, ipf.rules都要设成600,中有root才有权限查阅

 

 

accton打开系统计帐功能

 

用newsyslog配置日志文件压缩与归档

 

mongod服务默认打开了27017,28017,等于打开了数据库大门!在启动参数里加上--bind_ip 127.0.0.1,不向外开放端口,这样外部就访问不到了!

 

 

=================

 

硬件性能测量

 

只有测度才能有进步,理论上我们应清楚所有硬件、带宽、操作系统、应用软件的吞吐量,与所用代价。

 

测试硬件性能有unixbench, 测试带宽有iperf, 服务则用 iperf -sD -p80 (开到80测试用)

 

测试硬盘,做一个简单的benchmark,不用像windows系统找第三方软件, 用diskinfo -vt /dev/ad0就搞定!

 

==============

 

RoR生产环境搭建

 

基本环境:

 

用port安装ruby, mongo, nginx

 

安装gem

 

注意的是在freebsd, gem不在ruby发行中,需要独立安装,port目录/usr/ports/devel/ruby-gems

 

安装rails后bundle

 

有了gem就可以装rails, 装好rails 3×就用了bundle。

 

如果用了iconv, 需要在单独装

在/usr/ports/convert/ruby-iconv

 

生产环境不用装文档gem install --no-rdoc --no-ri ×××,是不是有点洁癖!

 

项目环境

 

只用在本地装capistrano把项目部署装到服务器(本项目用svn,没有就用pkg_add装一个),项目上去就好办了, bundle install 把组件都装上!

 

bundle install --without=development  (去除没有必要的gem包)

 

 

 

capistrano

 

在本地安装,远程部署到生产服务环境。

 

为了把Unicorn集成进去,需要把unicorn启动,停止和重启写到cap任务中。

 

namespace :deploy do
  desc "start unicorn"
  task :start, :roles => :app do
      run "cd #{current_path} && /usr/local/bin/unicorn_rails -c #{current_path}/config/unicorn.rb -E production -D" 
  end

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

  desc "restart unicorn"
  task :restart, :roles => :app, :except => { :no_release => true } do
      run "kill -USR2 `cat #{current_path}/tmp/pids/unicorn.pid`"
  end
end

 

 

 

Nginx+Unicorn

 

unicorn作为应为服务器可以用unix socket端口侦听

worker_processes 3
working_directory "/yourapp"

# This loads the application in the master process before forking
# worker processes
# Read more about it here:
# http://unicorn.bogomips.org/Unicorn/Configurator.html
preload_app true

timeout 30

# This is where we specify the socket.
# We will point the upstream Nginx module to this socket later on
listen "/yourapp/tmp/sockets/unicorn.sock", :backlog => 64

pid "/yourapp/tmp/pids/unicorn.pid"

# Set the path of the log files inside the log folder of the testapp
stderr_path "/yourapp/log/unicorn.stderr.log"
stdout_path "/yourapp/log/unicorn.stdout.log"

 

======

 

常用路径

mongod启动脚本:/usr/local/etc/rc.d/mongod

 

你可能感兴趣的:(Freebsd)