摘要: 本文将指导您在Ubuntu/Debian上从Ruby和Rails开始,一步一步的安装配置Ruby on Rails环境,并结合Nginx运行环境获得优异的性能。AD:【51CTO译文】Nginx已经成为世界第三大Web服务器,在国内十大网站使用的Web服务器调查中,Nginx也名列前茅。Ruby on Rails是近几年开始流行的新一代Web开发语言,其易用、敏捷的特性收到很多Web开发人员的瞩目...  阅读全文
posted @ 2011-12-08 19:06 小马歌 阅读(958) | 评论 (0)编辑 收藏
 

最新心血来潮的想学一门新的东西,听说用ROR的开发效率会很高,所以就选择了ruby on rails,安装的时候真是不顺心,这里把自己的安装心得记下来:

1) 安装ruby

           下载安装包:http://rubyforge.org/frs/?group_id=167,我下载的是rubyinstaller-1.8.7-p302.exe

    装完后,可以用ruby -v 测试是否安装成功,如图,要是出现了版本 就说明安装成功了

image

2)安装rubygems

      Rubygems是ruby的包管理器工具,它使得ruby包的安装十分简单,只需要一条命令就可以从远程服务器上下载相应的包,如果相应的应用包含其他扩展,rubygems 也会提示你从远程安装所依赖的扩展。安装后 rubygems 会运行相应的程序生成 rdoc 帮助文档(类似于 javadoc )。目前已经成为 ruby 事实上的包管理器标准了。

下载地址:http://rubyforge.org/projects/rubygems/

我下载的是rubygems-1.3.7,解压后执行目录下的setup.rb,安装完成以后,用如下命令检查:

gem –v

image

3、安装rails

      a)远程安装:gem install rails –remote

       下面来自于网上的说明我没有采用这种方式安装,因为我家 的网速太慢了。

然后会自动输出:  
Install required dependency activerecord? 
Install required dependency actionpack? 
Install required dependency actionmailer? 
Install required dependency activeresource? 
依次yes依赖文件,然后显示: 
Successfully installed rails-2.1.0 
Successfully installed activerecord-2.1.0 
Successfully installed actionpack-2.1.0 
Successfully installed actionmailer-2.1.0 
Successfully installed activeresource-2.1.0 
Installing ri documentation for activerecord-2.1.0... 
Installing ri documentation for actionpack-2.1.0... 
Installing ri documentation for actionmailer-2.1.0... 
Installing ri documentation for activeresource-2.1.0... 
Installing RDoc documentation for activerecord-2.1.0... 
Installing RDoc documentation for actionpack-2.1.0... 
Installing RDoc documentation for actionmailer-2.1.0... 
Installing RDoc documentation for activeresource-2.1.0... 
看看版本:rails -v 
输出:Rails 2.1.0 
搞定

     b)本地手动安装:

   需要下载

    activesupport

http://files.rubyforge.vm.bytemark.co.uk/activesupport/activesupport-2.2.3.gem 

            activerecord

http://files.rubyforge.vm.bytemark.co.uk/activerecord/activerecord-2.2.3.gem

            actionpack

http://files.rubyforge.vm.bytemark.co.uk/actionpack/actionpack-2.2.3.gem 

     actionmailer

http://rubyforge.org/frs/download.php/64424/actionmailer-2.2.3.gem

    rake 
http://files.rubyforge.vm.bytemark.co.uk/rake/rake-0.8.7.gem

   activeresource

  http://rubyforge.org/frs/download.php/64419/activeresource-2.2.3.gem

    rails     http://rubyforge.org/frs/download.php/64426/rails-2.2.3.gem

下载完成之后将所有文件放在同一个文件夹下面依次安装:(eg:D:\ruby)

    然后执行命令

   (D: --> D:\>cd D:\ruby)

     gem install  activesupport

     gem install  activerecord

     gem install  actionpack

     gem install  actionmailer

     gem install  rake

     gem install  rails    

成功安装之后检查命令

    rails –v

image

证明安装成功

4、创建Web应用

      在命令行下输入 rails HelloWorld,比如当前的路径是 E:\Ruby on Rails>rails HelloWorld,便会在E:\Ruby on Rails下创建一个HelloWorld文件夹。

image

如果需要指定路径可以rails C://test,具体可以看官方API:http://api.rubyonrails.org/

5、在当前目录(HelloWorld)下,运行 ruby script\server 启动服务,关于webrick服务器更多的信息可以访问http://www.webrick.org/

image

6、浏览器中输入http://localhost:3000/,如果看到以下页面,说明OK

image

7、写一个HelloWorld的Web程序,ruby script\generate controller HelloWorld命令

image

然后找到hello_world_controller.rb

  •  
    1. class HelloWorldController < ApplicationController 
    2.   def index    
    3.     render:text=>"hello world"
    4.   end   
    5. end
  • 输入以下代码,保存

  • 如果未启动服务需要重启第五步操作。

在浏览器中打开http://localhost:3000/hello_world,就会看见结果,但我这里出现一个错误:

image

    在网上看到一个解决方法:

    这是由于没有装sqlite3数据库,http://files.cnblogs.com/geek007/sqlite3.rar 这里下载,

    然后解压到ruby的bin目录:D:\ruby\bin,命令行执行:gem install "D:\Program Files\Ruby187\bin\sqlite3-ruby-1.2.3-mswin32.gem"

image

安装成功后,按照第五步重启服务器,在浏览器中访问

http://localhost:3000/hello_World

image

Ok,大功告成~呵呵,开心~~~

 

PS: 手工安装非常麻烦,可以从 http://instantrails.rubyforge.org/  下载InstantRails,全部搞定。

参考资源:

   http://rubyforge.org

   http://api.rubyonrails.org/

posted @ 2011-12-08 16:55 小马歌 阅读(284) | 评论 (0)编辑 收藏
 
 Linux 平台上安装和配置 Ruby on Rails 详解
 
ruby on rails推荐的生产运行环境是Linux/FreeBSD/Unix,即Unix系列的操作系统,采用lighttpd+FCGI的解决方案。以下我将以Linux操作系统,lighttpd+FCGI,MySQL数据库为例,从源代码编译安装开始讲解。
 
在安装之前,应该确认Linux操作系统已经安装好gcc编译器,否则请用Linux安装光盘先行安装gcc编译器:
gcc –v
如能返回gcc版本号,则gcc正确安装。
 
一、安装 Ruby 解析器
 
一些Linux发行版本,MacOSX操作系统都自带Ruby解析器,但是我仍然建议自行下载ruby源代码编译安装。因为一方面可以自己定制ruby安装的路径,另一方面可以在编译过程中自行添加更多的特性。
 
ruby的源代码可以从Ruby官方网站下载:
 
下载源代码包到本地Linux主机,然后解压缩,进入该目录,进行配置,编译和安装:
tar xzvf ruby-1.8.5.tar.gz
cd ruby-1.8.5
./configure –prefix=/usr/local/ruby
make && make install
如果想浏览所有的configure参数,可以:
./configure –help |more
如果不定制安装的目录,默认将安装到/usr/local目录下面。然而我建议自行定制一个ruby的安装目录,例如/usr/local/ruby,这样便于以后的升级,不会和操作系统其他软件混在一起。
 
安装好以后,修改操作系统PATH路径,加入/usr/local/ruby/bin:
export PATH=/usr/local/ruby/bin:$PATH
将我们自己安装的ruby放在系统PATH前面,避免操作系统自带的ruby造成的干扰。在Linux上,一般将设置放在/etc/profile中,便于对全局生效。
 
二、安装 ruby on rails
 
在安装rails之前,要先安装rubygems。rubygems是ruby的在线包管理工具,可以从rubyforge下载rubygems:
下载好源代码包,解压缩,安装:
tar xzvf rubygems-0.9.0.tgz
cd rubygems-0.9.0/
ruby setup.rb
 
然后就可以安装rails了,在确认服务器已经连接互联网的情况下执行:
gem install rails –y
即通过gem从rubyforge网站下载rails所有依赖包安装。
 
安装好rails以后,可以执行:
rails –v
确认一下rails的版本。
 
 
三、安装 ruby 的数据库适配器
 
rails发行包中已经自带纯ruby的MySQL数据库适配器,然而对于生产环境来说,我们仍然应该下载安装C版本的数据库适配器,以达到更好的性能。下载mysql-ruby-2.7.3.tar.gz:
tar xzvf mysql-ruby-2.7.3.tar.gz
cd mysql-ruby-2.7.3
ruby extconf.rb --with-mysql-dir=/opt/mysql5
make && make install
注意--with-mysql-dir应该指向MySQL数据库的安装路径,如果数据库服务器和Web服务器不在同一台机器上,那么Web服务器上也必须安装MySQL软件,因为ruby的C版本MySQL适配器需要在编译的时候联接MySQL的系统库。
 
 
四、安装 Ruby  FCGI 支持
 
由于ruby的fcgi支持库需要在编译的时候联接FCGI的系统库,因此我们需要先安装FCGI库,下载FCGI源代码发行包:
tar xzvf fcgi-2.4.0.tar.gz
cd fcgi-2.4.0
./configure --prefix=/usr/local/fcgi
make && make install
同样,将fcgi安装在自己指定的目录下,而不是默认的/usr/local,避免多个软件混在一起。
 
然后就可以安装ruby的fcgi支持库了,下载ruby-fcgi-0.8.7.tar.gz:
tar xzvf ruby-fcgi-0.8.7.tar.gz
cd ruby-fcgi-0.8.7
ruby install.rb config -- --with-fcgi-include=/usr/local/fcgi/include --with-fcgi-lib=/usr/local/fcgi/lib
ruby install.rb setup
ruby install.rb install
 
五、安装 lighttpd Web Server
 
安装 Lighttpd
 
在安装lighttpd之前,应该确认操作系统已经安装pcre,即Perl兼容的规则表达式库:
rpm –qa |grep pcre
如果没有,请从Linux安装光盘里面安装。
 
然后下载lighttpd:
tar xzvf lighttpd-1.4.13.tar.gz
cd lighttpd-1.4.13
./configure --prefix=/usr/local/lighttpd
 
configure完毕以后,会给出一个激活的模块和没有激活模块的清单,可以检查一下,是否自己需要的模块都已经激活,在enable的模块中一定要有“mod_rewrite”这一项,否则重新检查pcre是否安装。然后编译安装:
make && make install
 
编译后配置:
cp doc/sysconfig.lighttpd /etc/sysconfig/lighttpd
mkdir /etc/lighttpd
cp doc/lighttpd.conf /etc/lighttpd/lighttpd.conf
 
如果你的Linux是RedHat/CentOS,那么:
cp doc/rc.lighttpd.redhat /etc/init.d/lighttpd
如果你的Linux是SuSE,那么:
cp doc/rc.lighttpd /etc/init.d/lighttpd
如果你的Linux是ubuntu,那么需要自己创建启动脚本,lighttpd官方wiki上面已经给出来该脚本,地址在:
其他Linux发行版本可以自行参考该文件内容进行修改,或者自己写一个控制脚本,也不过举手之劳:
C代码 
  1. #!/bin/sh  
  2.   
  3. case "$1" in   
  4.   start)           
  5.     /usr/local/lighttpd/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf > /dev/null 2>&1  
  6.     ;;  
  7.   stop)   
  8.     killall lighttpd  
  9.     ;;  
  10.   restart)   
  11.    $0 stop  
  12.    sleep 1  
  13.    $0 start   
  14.    ;;  
  15.   *)   
  16.   echo "Usage: lighttpd.sh {start|stop|restart}"   
  17.   ;;   
  18. esac  
  19.   
  20. exit 0   

 

然后修改/etc/init.d/lighttpd,把
LIGHTTPD_BIN=/usr/sbin/lighttpd
改为
LIGHTTPD_BIN=/usr/local/lighttpd/sbin/lighttpd
 
此脚本用来控制lighttpd的启动关闭和重起:
/etc/init.d/lighttpd start
/etc/init.d/lighttpd stop
/etc/init.d/lighttpd restart
 
如果你希望服务器启动的时候就启动lighttpd,那么:
chkconfig lighttpd on
 
这样lighttpd就安装好了,接下来需要配置lighttpd。
 
配置 Lighttpd
 
修改/etc/lighttpd/lighttpd.conf
 
1)server.modules
取消需要用到模块的注释,mod_rewrite,mod_access,mod_fastcgi,mod_simple_vhost,mod_cgi,mod_compress,mod_accesslog是一般需要用到的。
 
2)server.document-root, server.error-log,accesslog.filename需要指定相应的目录
 
3)用什么权限来运行lighttpd
server.username            = "nobody"
server.groupname           = "nobody"
从安全角度来说,不建议用root权限运行web server,可以自行指定普通用户权限。
 
4)静态文件压缩
compress.cache-dir         = "/tmp/lighttpd/cache/compress"
compress.filetype          = ("text/plain", "text/html","text/javascript","text/css")
可以指定某些静态资源类型使用压缩方式传输,节省带宽,对于大量AJAX应用来说,可以极大提高页面加载速度。
 
5)配置ruby on rails
 
最简单的配置如下:
$HTTP["host"] == "www.xxx.com" {
 server.document-root = "/yourrails/public"
 server.error-handler-404 = "/dispatch.fcgi"
 fastcgi.server = (".fcgi" =>
    ("localhost" =>
      ("min-procs" => 10,
       "max-procs" => 10,
       "socket" => "/tmp/lighttpd/socket/rails.socket",
       "bin-path" => "/yourrails/public/dispatch.fcgi",
       "bin-environment" => ("RAILS_ENV" => "production")
      )
    )
 )
}
即由lighttpd启动10个FCGI进程,lighttpd和FCGI之间使用本机Unix Socket通信。
 
Lighttpd的FAQ:无法启动Ruby on Rails
 
FastCGI的启动脚本位于Rails应用目录下面public/dispatch.fcgi,如果无法启动Lighttpd,报告FastCGI错误,你可以尝试着手工运行该脚本cd public && ./dispatch.fcgi,看看是否可以运行。一般来说,很多人都是在Windows下面创建Rails项目,导致dispatch.fcgi脚本的ruby运行路径指向windows下面的ruby,部署到Linux上面就无法运行了,另外一方面Windows上面创建的Rails项目在Linux上面dispatch.fcgi没有可执行权限,所以也需要授予可执行权限。
 
 
六、安装 ImageMagick  RMagic
 
RMagic是ruby处理图片需要用到的库,很多ruby应用由于都涉及图片处理的功能,往往需要依赖RMagic,但安装ImageMagick和RMagic相当烦琐,需要特别的说明。
 
安装 ImageMagick
ImageMagick是用C语言实现的图形处理库,有Unix版本和Windows版本。对于Unix版本来说,安装比较麻烦些,另外不建议安装ImageMagick二进制版本,往往会导致缺少某些图片处理功能,导致RMagic安装失败。下载ImageMagick源代码,解压缩,配置:
tar xzvf ImageMagick-6.2.9-0.tar.gz
cd tar xzvf ImageMagick-6.2.9
./configure --prefix=/usr/local/ImageMagick
 
观察配置后给出来的支持图形格式,看看该图形格式支持是否是yes,如果不是,那么必须先安装该图形格式的本地库。例如,你应该检查是否已经安装如下rpm包:
rpm –qa |grep libpng
rpm –qa |grep libpng-devel
rpm –qa |grep libjpeg
rpm –qa |grep gd-devel
如果你希望支持tiff格式,还应该检查
rpm –qa |grep libtiff
如果没有安装,那么在Linux安装光盘找到相应rpm包安装上,再次configure直到确认需要的图形格式全部支持为止,然后编译安装:
make && make install
 
由于ImageMagic被安装在我们自行指定的/usr/local/ImageMagick,后面安装RMagic会找不到需要用到的ImageMagic的命令和库,因此需要配置一下操作系统:
 
编辑/etc/profile里面的PATH环境变量,在最后面加入:
export PATH=/usr/local/ruby/bin:/usr/local/ImageMagick/bin:$PATH
 
编辑/etc/ld.so.conf,加入:
/usr/local/ImageMagick/lib
执行命令:
ldconfig
将ImageMagick的库加入系统联接库
 
然后注销当前用户重新登录,便于环境变量修改生效,执行:
convert logo: logo.gif
看是否正确生成一个logo.gif的图片文件。
 
安装 RMagic
在rubyfoge上面下载RMagic的源代码发行包,不要下载gem包,然后解压缩编译:
./configure
make && make install
 
如果配置和编译过程没有报错,即大功告成。
 
对于MacOSX来说,安装RMagic以上步骤会出错,请参考:
 
总体来说,ImageMagick和RMagic的安装很容易出错,安装起来比较困难,如果碰到无法解决的问题,可以通过Google寻求解决办法。
 
如果你在安装过程当中,遇到了什么问题,请看:Lighttpd和RoR安装配置的疑难解答
posted @ 2011-12-08 13:40 小马歌 阅读(310) | 评论 (0)编辑 收藏
 

在zope实例所采用的python的路径中,找到site-packages目录,在此目录中建立一个sitecustomize.py文件,设置相应的权限。文件的内容如下:

import sys

sys.setdefaultencoding("utf-8")  

重启zope实例,这样将解决很多unicodedecodeerror错误。

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

#for python2.7 on ubuntu
/etc/python2.7/sitecustomize.py

#for python2.6 on centOS
/usr/local/lib/python2.6/site-packages/sitecustomize.py

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

http://www.grabner-online.de/div_into/html/ch09s04s03.html
# sitecustomize.py                   
# this file can be anywhere in your Python path,
# but it usually goes in ${pythondir}/lib/site-packages/
import sys
sys.setdefaultencoding('iso-8859-1')

 sitecustomize.py is a special script; Python will try to import it on startup, so any code in it will be run automatically. As the comment mentions, it can go anywhere (as long as import can find it), but it usually goes in the site-packages directory within your Python lib directory. 
 setdefaultencoding function sets, well, the default encoding. This is the encoding scheme that Python will try to use whenever it needs to auto-coerce a unicode string into a regular string.

posted @ 2011-12-08 13:21 小马歌 阅读(1417) | 评论 (0)编辑 收藏
 
    给自己架了个Wiki http://wiki.apt-blog.net作为自己的知识管理工具。虽然这个博客本来就是工具之一,也累积了快两年了,但经常碰到有些小东西,不值得为之写篇博客,很有用,但用完就忘记。个人wiki适合做写细小的笔记,当累积一定的时候还可以整理成博客。

Wiki我选择了用Python的MoinMoin,一定程度上受CPYUG社区 ZoomQuiet 大妈的推荐影响,首次试用感觉非常impresive,所以就定了。再加上 GraphViz 工具的支持,实在的强大。

在vps上服务,肯定是无视apache的,内存有限。之前架设过用来上Twitter奶瓶腿,是Nginx + php-cgi的方案,nginx是必须的。

Python跟web前端的架构方式有太多选择了,五花八门,MoinMoin的发行包里面都提供了moin.cgi moin.scgi moin.ajp moin.fcgi moin.wsgi等多种启动方式。MoinMoin里面全部通过内置的flup作为中间件提供这些接口,目前我仅尝试使用了fastcgi和wsgi。

虽然解压了moin的源码包就可以直接运行里面的wikiserver.py来本地访问了,但在服务器上通常是由nginx/lighttpd等服务来综合转发。php的话是通过spawn-fcgi启动一些php-cgi的进程,服务器接受到动态的请求就通过本地socket跟php-cgi通讯,返回的结果展现回给客户。php-cgi是使用FastCGI协议的。

MoinMoin 源码当中wiki/server/moin.fcgi就是一个类似php-cgi功能的fastcgi服务,类似地可以使用spawn-fcgi来启动moin.fcgi,作为后端的处理进程。

Running MoinMoin Wiki with Nginx via FastCGI and Flup该文章很形象解释了fastcgi的角色,以及提供了一段很方便的服务脚本来启动spawn-fcgi

Client ----> Nginx Web Frontend -----------+                                            | fastcgi_pass                                           \|/                             +-------------------------+               moin.fcgi     | spawn-fcgi-moin.socket  | spawn-fcgi ---------------> |           or            |                             |     localhost:port      |                             +-------------------------+ 

但是文章当中的nginx配置不完整,而且复杂了,这是我的配置:

server {         listen   80; ## listen for ipv4         server_name  wiki.apt-blog.net;   access_log  /var/log/nginx/wiki.apt-blog.net.access.log;         error_log   /var/log/nginx/wiki.apt-blog.net.error_log;   location / {                 include fastcgi_params;                 fastcgi_param PATH_INFO $fastcgi_script_name;                 fastcgi_param SCRIPT_NAME /;                 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;                 if (!-f $request_filename) {                         fastcgi_pass unix:/var/run/spawn-fcgi-moin.socket;                 }         } }

当然那文章中的配置有考虑对静态文件直接由nginx服务,不通过flup这一层,有一定优化,这里省去了这些。其实增多一个/moin_static193(据版本号不同而不同)的location即可,可参考后面使用uwsgi做服务时候的配置。

文章还提到wikiconfig.py里面一个fix_script_name变量,是1.9版本新加入的,需要xxx.com/wiki这样访问的童鞋就不用像以前版本那样要在nginx配置里面写一大堆东西了。

Fastcgi就这么多,不算太复杂。Fastcgi虽然很流行,但弊端不少,首先是速度,在一台虚拟机上测试,用ab居然跑出每秒20个请求的速度……虽然平均下来还是有5、60次,但真的,唉。php-cgi还支持产生多个工作进程以并行和均衡请求,提高效率,fastcgi似乎就没这样的东西了。

刚好这天observer专栏杂记写了一篇配置Nginx+uwsgi更方便地部署python应用,当中也提到fcgi和 mod_python的各种不便,然后介绍了uwgi,高性能、多应用。

uwgi充当了python解析器的角色,使用wsgi的接口和Python程序交互,这个过程中做了优化,和上层nginx之间则设计了更加轻量的协议。nginx0.8.40以后官方默认带了uwgi的协议模块,所以使用很方便。

uwgi的文档有些简略,但是重点都是在wiki/Example里面了。 MoinMoin在uwgi的配置在其中一句带过:

/usr/bin/uwsgi -s /tmp/moin.sock --wsgi-file wiki/server/moin.wsgi -M -p 4

uwgi的-w参数是把某个py文件作为module,import使用,但是wsgi文件不被认识,所以新版里面多了这么个--wsgi-file参数。但是如果是多站点呢!

nginx配置的虚拟主机里面的uwsgi_param UWSGI_SCRIPT参数会让uwgi按模块导入名称,相当于命令行里面的-w,但是moinmoin的moin.wsgi文件,不是py结尾,只能用--wsgi-file参数。扫了一圈uwgi的wiki/ExampleRunOnNginx,都没提到这个问题,倒是在这里提到在旧版的uwgi当中没有--wsgi-file参数,需要把wsgi文件改名成py结尾来导入,好吧,确实那样成功了。

至于性能,一开始我发现uwgi占的内存也不少,一个worker时候就占了20M多的内存,所以没开更多的工作进程;Fastcgi也差不多,然后用Apache Benchmark测试,好像两者区别不大。于是看了下fcgi vs. gunicorn vs. uWSGI的测评,才发现uwgi要开多个worker进程才有性能!于是开了8个,性能出来了,秒请求马上就上千! 显然是uwgi打开了多个进程,充分利用了机器的CPU,还做了均衡请求。

最后,我的Wiki使用uwgi后的nginx配置:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 
server {     server_name  wiki.apt-blog.net;     access_log  /var/log/nginx/wiki.apt-blog.net.access.log;     error_log   /var/log/nginx/wiki.apt-blog.net.error_log;     location / {         include uwsgi_params;         #uwsgi_pass 127.0.0.1:9096;         uwsgi_pass unix:///tmp/uswgi.sock;         uwsgi_param UWSGI_PYHOME /usr/local/lib/moinmoin;         uwsgi_param UWSGI_CHDIR /var/local/wiki-moinmoin/server;         uwsgi_param UWSGI_SCRIPT moin_wsgi;     }     location /moin_static193/ {         alias /usr/local/lib/moinmoin/lib/python2.6/site-packages/MoinMoin/web/static/htdocs/;     } }

完整配置指南:

#安装 sudo -s add-apt-repository ppa:nginx/stable add-apt-repository ppa:uwsgi/release apt-get update apt-get install nginx uwsgi-python python-virtualenv   #组件配置 cat >/etc/uwsgi-python/apps-enabled/uwsgi.xml << EOF <uwsgi>   <limit-as>256</limit-as>   <processes>6</processes>   <memory-report/>   <vhost/>   <no-site/> </uwsgi> EOF   cat >/etc/nginx/sites-enabled/moinmoin << EOF server {     listen   80;     access_log  /var/log/nginx/wiki.access_log;     error_log   /var/log/nginx/wiki.error_log;   client_max_body_size 64;     server_name wiki.mydomian.com;     location / {                 include uwsgi_params;                 uwsgi_pass unix:///var/run/uwsgi-python/uwsgi/socket;                 uwsgi_param UWSGI_PYHOME /var/www/moinmoin/python-home/;                 uwsgi_param UWSGI_CHDIR /var/www/moinmoin/;                 uwsgi_param UWSGI_SCRIPT moin_wsgi;                 uwsgi_param UWSGI_SCHEME $scheme;                 uwsgi_param REMOTE_USER $remote_user;         } } EOF   #Python环境预备 mkdir /var/www/moinmoin virtualenv /var/www/moinmoin/python-home cd /tmp wget http://static.moinmo.in/files/moin-1.9.3.tar.gz tar xvfz moin-1.9.3.tar.gz source /var/www/moinmoin/python-env/bin/activate cd /tmp/moin-1.9.3 python setup.py install deactivate   #MoinMoin环境 cp -r /tmp/moin-1.9.3/wiki /var/www/moinmoin cd /var/www/moinmoin/wiki cp config/wikiconfig.py wikiconfig.py cp server/moin.wsgi moin_wsgi.py sed -i '/# a2)/isys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))'   #可选 rm -rf config server   #重启 /etc/init.d/nginx restart /etc/init.d/uwsgi-python restart

 

tags: 
posted in PythonUnix/Linux by BOYPT

Follow comments via the RSS Feed | Leave a comment | Trackback URL

posted @ 2011-12-07 17:47 小马歌 阅读(683) | 评论 (0)编辑 收藏
 

之前一直使用Nginx+Fastcgi来搭建python web服务器,本文介绍Nginx+UWSGI组合来实现。uWSGI 是一个快速的、纯C语言开发的、自维护的、对开发者友好的WSGI服务器,旨在提供专业的 Python web应用发布和开发。它更符合python web的标准协议,速度要比Fastcgi要快、性能更加稳定。
一、安装平台
1、安装pcre

cd /home
mkdir -p /home/install/nginx && cd /home/install/nginx
wget http://ftp.exim.llorien.org/pcre/pcre-8.00.tar.gz
tar -zxvf pcre-8.00.tar.gz
cd pcre-8.00
./configure
make && make install
cd ..


2、安装Nginx


wget http://nginx.org/download/nginx-0.8.50.tar.gz
tar -zxvf nginx-0.8.50.tar.gz
cd nginx-0.8.50/
./configure --user=nobody --group=nobody --prefix=/usr/local/nginx --with-http_stub_status_module --with-cc-opt='-O3' --with-cpu-opt=opteron
make && make install
cd ..


3、安装python&Mysql-python


wget http://www.python.org/ftp/python/2.5.1/Python-2.5.1.tgz
tar -zxvf Python-2.5.1.tgz
cd Python-2.5.1
./configure && make && make install
echo "export PATH=/$PATH:/usr/local/bin" >> /etc/profile
source /etc/profile


4、安装MySql-python


cd ../
wget http://downloads.sourceforge.net/project/mysql-python/mysql-python/1.2.2/MySQL-python-1.2.2.tar.gz?r=&ts=1285248455&use_mirror=nchc
cd MySQL-python-1.2.2
python setup.py install


5、安装Django


wget http://www.djangoproject.com/download/1.2.3/tarball/
tar -zxvf Django-1.2.3.tar.gz
cd Django-1.2.3
python setup.py install
cd ..


6、安装uWSGI


wget http://projects.unbit.it/downloads/uwsgi-0.9.6.2.tar.gz
tar -zxvf uwsgi-0.9.6.2.tar.gz
cd uwsgi-0.9.6.2
make
cp uwsgi /usr/bin

二、平台配置
1、平台环境说明
  1.1、项目位置:/opt/www/Purgesys
   创建项目方法:


cd /opt/www
django-admin.py startproject Purgesys


  1.2、查看项目(出现以下文件结构说明项目已创建成功)
  #tree Purgesys


Purgesys
|-- __init__.py
|-- manage.py
|-- settings.py
`-- urls.py


2、Nginx相关配置
#cd /usr/local/nginx/conf
#vi django_uwsgi.conf


# Django project
server {
        listen  80;
        server_name purgesys.domain.com;


        location / {
            uwsgi_pass   127.0.0.1:9000;
            include     uwsgi_params;
            access_log  off;
        }

        location ^~ /static {
                root   /opt/www/Purgesys;
        }

        location ^~ /admin/ {
            uwsgi_pass   127.0.0.1:9000;
            include  uwsgi_params;
            access_log   off;
        }

        location ~* ^.+/.(mpg|avi|mp3|swf|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|txt|tar|mid|midi|wav|rtf|mpeg)$ {
            root   /opt/www/Purgesys/static;
            access_log   off;
        }

}



*Nginx-0.8.50默认已添加uwsgi输出头支持
include uwsgi_params; 
#vi nginx.conf
追加子配置文件django_uwsgi.conf


http{
........
include django_uwsgi.conf;
}


3、UWSGI配置
#mkdir -p /home/uwsgi;cd /home/uwsgi
#mkdir -p /opt/www/logs
#vi uwsgi.xml

<uwsgi>
  <socket>127.0.0.1:9000</socket>
  <listen>200</listen>
  <master>true</master>
  <pidfile>/usr/local/nginx/uwsgi.pid</pidfile>
  <processes>8</processes>
  <pythonpath>/opt/www/Purgesys</pythonpath>
  <pythonpath>/opt/www/</pythonpath>
  <module>django_wsgi</module>
  <profiler>true</profiler>
  <memory-report>true</memory-report>
  <enable-threads>true</enable-threads>
  <logdate>true</logdate>
  <limit-as>6048</limit-as>
  <daemonize>/opt/www/logs/django.log</daemonize>
</uwsgi>


4、创建应用模块
cd /opt/www/Purgesys
vi django_wsgi.py


import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'Purgesys.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()


5、启动服务
#/usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml
#/usr/local/nginx/sbin/nginx

6、查看进程
#[liuts@webserver nginx]# ps -ef|grep uwsgi|grep -v grep

root     21652     1  0 17:12 ?        00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml
root     21653 21652  0 17:12 ?        00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml
root     21654 21652  0 17:12 ?        00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml
root     21655 21652  0 17:12 ?        00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml
root     21656 21652  0 17:12 ?        00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml
root     21657 21652  0 17:12 ?        00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml
root     21658 21652  0 17:12 ?        00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml
root     21659 21652  0 17:12 ?        00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml
root     21660 21652  0 17:12 ?        00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml


7、监听端口
#[liuts@webserver nginx]# netstat -an|grep 9000

tcp        0      127.0.0.1:9000                0.0.0.0:*                   LISTEN


8、访问测试
输入http://serverip/
 
大功告成!

*附uwsgi启动脚本
#cd /home/uwsgi
#vi uwsgiserver.sh


#!/bin/bash
if [ $1 = start ];then
  psid=`ps aux|grep "uwsgi"|grep -v "grep"|wc -l`
  if [ $psid -gt 2 ];then
    echo "uwsgi is running!"
    exit 0
  else
    /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml
  fi
  echo "Start uwsgi service [OK]"
elif [ $1 = stop ];then
  killall -9 uwsgi
  echo "Stop uwsgi service [OK]"
elif [ $1 = restart ];then
  killall -9 uwsgi
  /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml
  echo "Restart uwsgi service [OK]"
else
  echo "Usages: sh uwsgiserver.sh [start|stop|restart]"
fi


#sh uwsgiserver.sh start
[uWSGI] parsing config file /home/uwsgi/uwsgi.xml
Start uwsgi service [OK]

posted @ 2011-12-07 17:07 小马歌 阅读(1199) | 评论 (0)编辑 收藏
 
     摘要: 简介对象关系映射器(Object Relational Mappers,ORM)在过去数年吸引了不少人的目光。主要原因是 ORM 经常会在 Web 应用程序框架中被提起,因为它是快速开发(Rapid Development)栈中的关键组件。Django 和 Ruby on Rails 等 Web 框架采用了设计一个独立栈的方法,将自主开发的 ORM 紧密集成到该框架中。而其他框架,如 Pylons...  阅读全文
posted @ 2011-12-07 15:32 小马歌 阅读(963) | 评论 (0)编辑 收藏
 

简介:
  这是一套运行在nginx + perl环境下的的web框架,可以像java的servlet那样的写服务或简单网页。

 入门步骤:

  1. 安装nginx时增加perl模块参数,使nginx支持perl模块。
  2. nginx.conf里配置一个perl的模块路径,配置npweb服务入口。
  3. 写一个helloworld,即完成了npweb的试用。
  4. 具体操作请看相关文章。

 适用业务:

  1. 可以用来做memcache的web接口
  2. 可以用来做mysql数据库的web接口
  3. 可以用来做ajax数据接口
  4. 可以用来做xml接口
  5. 一切简单的高效的接口都可以用这个来开发 

----------------------------------------------------------------------------------------------------------------------

Npweb入门示例

如果按步骤来做并且不出问题,那么你将体验到npweb的乐趣。

第一步:安装nginx,以下是安装脚本,如果安装正常就进入第二步。

 

准备目录

mkdir -p /opt/src/nginx

mkdir -p /opt/modules/nginx-0.7.65

cd /opt/src/nginx

 

准备依赖包

yum install gcc -y

yum install pcre-devel -y

yum install openssl-devel -y

yum install zlib-devel -y

 

准备依赖程序

wget http://github.com/gnosek/nginx-upstream-fair/tarball/master

tar -xzvf gnosek-nginx-upstream-fair-2131c73.tar.gz

mv gnosek-nginx-upstream-fair-2131c73 /opt/modules/

 

下载nginx

wget http://nginx.org/download/nginx-0.7.65.tar.gz

tar -xzvf nginx-0.7.65.tar.gz

cd nginx-0.7.65

 

配置

./configure --prefix=/opt/modules/nginx-0.7.65 \

         --with-http_stub_status_module \

         --with-http_perl_module \

         --with-http_addition_module \

         --with-http_realip_module \

         --with-http_sub_module \

         --add-module=/opt/modules/gnosek-nginx-upstream-fair-2131c73

 

安装

make

make install

第二步:部署npweb框架

Npweb框架非常简洁,只有一个文件(Action.pm),只要将这个文件置于一个能让nginx有权限访问内部文件的文件夹即可。

         这里我们将框架部署到/opt/npweb

第三步:编写hello.pm,并将文件放置在/opt/npweb_app目录下。

/opt/npweb_app目录是你开发的web程序的目录,其中需要放置一个lib目录以保存自定义的一些pm模块,在示例中的RequestUtil就是其中的一个模块。

文件内容如下:

 

package hello; # 此处很关键,一定要与文件名保持一致!!!!!!!!

use RequestUtil; # 此处引入了一个外部模块

 

sub doExecute {

         ($r) = @_;

         $r->send_http_header("text/html");

 

         # 取得参数的 Map------------------------------------------------------

         my %param = RequestUtil::params( $r->args );

 

         # 获得具体参数

         my $w = $param{'w'};

 

         # 回显

         $r->print("hellow " . $w);

}

文件结尾必需加这个,perl语法规定的。

1;

第四步:配置nginx.conf,这一步是很关键的,主要是将框架和webapp配置到nginx下,以达到访问功能的作用。

 

#user  nobody;

#worker_processes  1;

worker_processes 2;

 

#error_log  logs/error.log;

#error_log  logs/error.log  notice;

#error_log  logs/error.log  info;

 

#pid        logs/nginx.pid;

 

worker_rlimit_nofile 65535;

events {

        use epoll;

        worker_connections 65535;

}

 

http {

 

        include       mime.types;

        default_type  application/octet-stream;

 

        server_names_hash_bucket_size 128;

        client_header_buffer_size 32k;

        large_client_header_buffers 4 32k;

        client_max_body_size 8m;

 

        #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

        #                  '$status $body_bytes_sent "$http_referer" '

        #                  '"$http_user_agent" "$http_x_forwarded_for"';

 

        #access_log  logs/access.log  main;

 

        sendfile        on;

        tcp_nopush     on;

 

        keepalive_timeout  0;

 

        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;

        gzip_vary on;

        # 此处开始配置

        perl_modules  /opt/npweb; #框架的目录

        perl_require  Action.pm; #框架的入口

 

        server{

                # 此处配置框架的设置

                set $CONTEXT_PATH '/perl'; # uri的访问路径,如:http:// test.perl.nginx /perl

                set $APPLICATION_PATH '/opt/npweb_app/'; # web服务的路径,在该路径下需要放置一个lib目录,以放置一些自自定模块。

 

                listen 80;

 

                server_name test.perl.nginx;

                location /perl { # 此处需与$CONTEXT_PATH保持一致

                        perl Action::execute; # 此处如此配置,不用更改

                }

        }

 

}

第五步:访问http://test.perl.nginx/perl/hello?w=world,如果网页上回显了您输入的参数,那么恭喜您,您的第一个npweb程序成功了。

针对第五步的补充:需要将test.perl.nginx指向你所部署的服务器IP。推荐使用Windows Hosts Editor。

posted @ 2011-12-07 14:53 小马歌 阅读(608) | 评论 (0)编辑 收藏
 

淘宝Web服务器 Tengine

淘宝网现在已经将其服务器平台软件Tengine 开源,Tengine基于Nginx,针对大流量网站需求增加了很多功能特性和性能优化。以下沿引项目主页上的特性介绍:

  • 继承Nginx-1.0.10的所有特性;
  • 组合多个CSS、JavaScript文件的访问请求变成一个请求;
  • 支持管道和syslog形式的日志和抽样;
  • 自动根据CPU数目设置亲缘性;
  • 监控系统的负载和资源占用从而对系统进行保护;
  • 显示对运维人员更友好的出错信息,便于定位出错机器;
  • 更强大的访问速度限制模块;
  • backtrace模块,程序崩溃的时候可以显示出错的调用栈

淘宝Web服务器 Tengine

Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler(俄文:Рамблер)使用。  其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页伺服器中表现较好.目前使用nginx网站用户有:新浪、网易、 腾讯,另外知名的微网志Plurk也使用nginx。


 

官方网站:http://www.open-open.com/lib/view/home/1322869904827

posted @ 2011-12-05 17:26 小马歌 阅读(228) | 评论 (0)编辑 收藏
 

今天在两台服务器同步备份在用户权限上纠结了很多,主要关于这个问题网上的配置方法不一,源自rsync版本不一致。

rsync同步备份服务器配置

Rsync 版本

[root@mail video]# rsync –version 
rsync  version 3.0.6  protocol version 30 
Copyright (C) 1996-2009 by Andrew Tridgell, Wayne Davison, and others. 
Web site: rsync.samba.org 
Capabilities: 
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints, 
    socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace, 
    append, ACLs, xattrs, iconv, no symtimes

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you 
are welcome to redistribute it under certain conditions.  See the GNU 
General Public Licence for details.

服务器同步任务需求

  • 服务器A与服务器B同步备份,这里只说明服务器A同步到服务器B,服务器B还原到服务器A。
  • 考虑安全因素,使用普通用户进行同步。
  • 使用cronjob,定时同步。

错误提示

错误发生在rsync 3.0.6版本,64位 CentOS5.5 系统。

首页这篇文章主要解决的错误是以下:

@ERROR: auth failed on module *** 
rsync error: error starting client-server protocol (code 5) at main.c(1503) [receiver=3.0.6]

*** 是你/etc/rsyncd.conf 中配置的模块,我这里用

password file must not be other-accessible 
continuing without password file 
Password: 
@ERROR: auth failed on module *** 
rsync error: error starting client-server protocol (code 5) at main.c(1503) [receiver=3.0.6]

Rsync 配置

#vi /etc/rsyncd.conf

uid = nobody 
gid = nobody 
max connections = 4 
read only = true 
#hosts allow = 202.207.177.180 
hosts allow = * 
transfer logging = true 
log format = %h %o %f %l %b 
log file = /var/log/rsyncd.log 
slp refresh = 300 
log file = /var/log/rsyncd.log 
pid file = /var/run/rsyncd.pid 
lock file = /var/run/rsyncd.lock

[web] 
path = /home/admin/public_html 
comment = Mirror to Hk server 
read only = true 
list = false 
auth users = lixiphp

[test] 
path = /home/admin/domains/test 
read only = false 
auth users = lixiphp 
secrets file = /etc/rsyncd.secrets

配置普通用户密码

[root@mail video]# vi /etc/rsyncd.secrets

格式为: username:password

rsync_user:rsyncofpass

设置权限为只读:

chmod 600 /etc/rsyncd.secrets

首次启动rsync

rsync –daemon –config=/etc/rsyncd.conf

如果提示

failed to create pid file /var/run/rsyncd.pid: File exists

使用指令

rm -rf /var/run/rsyncd.pid

重启已经在运行的rsync

[root@mail video]# ps -ef | grep rsync 
root     27284     1  0 10:26 ?        00:00:00 rsync –daemon –config=/etc/rsyncd.conf 
root     30516 29986  0 18:35 pts/3    00:00:00 grep rsync 
[root@mail video]# kill -9 27284 
[root@mail video]# rsync –daemon –config=/etc/rsyncd.conf

这样服务器A配置成功!


服务器B配置

一般错误都会发生在服务器B,注意这部分的讲解!

通过CentOS yum install rsync,安装rsync服务。

在rsync安装之后,运行以下指令同步备份:

rsync -vzrtopg –progress –delete –password-file=/home/admin/admin_backups/password.rsync rsync://lixiphp@203.171.237.245/test  /home/admin/admin_backups/test

地址rsync://lixiphp@203.171.237.245/test,lixiphp为服务器A用户,203.171.237.245服务器A IP地址或者域名 test为服务器A配置模块

密码存放在/home/admin/admin_backups/password.rsync,这里存放位置,可自由安排。

password.rsync内容格式为: password

rsyncofpass

设置权限为只读:

chmod 600 /home/admin/admin_backups/password.rsync

解决错误

用户密码错误

@ERROR: auth failed on module test 
rsync error: error starting client-server protocol (code 5) at main.c(1503) [receiver=3.0.6]

检查服务器A存储密码文件和服务器B密码文件。

  • 服务器A密码文件 /etc/rsyncd.secrets 格式为: username:password
  • 服务器B密码文件 password.rsync 格式为:password

文件权限错误

password file must not be other-accessible 
continuing without password file 
Password: 
@ERROR: auth failed on module *** 
rsync error: error starting client-server protocol (code 5) at main.c(1503) [receiver=3.0.6]

检查服务器A存储密码文件和服务器B密码文件。

  • 服务器A密码文件 /etc/rsyncd.secrets 权限为600: chmod 600 /etc/rsyncd.secrets
  • 服务器B密码文件 password.rsync 权限为600:chmod 600 password.rsync

定时任务

[root@hk admin_backups]# vi backup.sh

内容如下:

#/bin/sh 
rsync -vzrtopg –progress –delete –password-file=/home/admin/admin_backups/password.rsync rsync://lixiphp@203.171.237.245/test  /home/admin/admin_backups/test

添加定时任务:

[root@hk admin_backups]# crontab –e

添加以下内容:

*/1 * * * * /home/admin/admin_backups/backup.sh > /dev/null 2>&1

每个一分钟从服务器A同步到服务器B!

服务器B向下备份到服务器A

rsync -vzrtopg –progress –delete –password-file=/home/admin/admin_backups/password.rsync  /home/admin/admin_backups/test rsync://lixiphp@203.171.237.245/test

请确保服务器A同步用户lixiphp,对模块test所在目录有读、写、执行的权限。

posted @ 2011-12-02 12:42 小马歌 阅读(7191) | 评论 (0)编辑 收藏
仅列出标题
共95页: First 上一页 45 46 47 48 49 50 51 52 53 下一页 Last