posts - 262,  comments - 221,  trackbacks - 0
【Passenger的安装与卸载管理】
===========================================================
推荐方式是使用Pushion Passenger和Nginx的绑定install方式,这种方式可以分为:交互式和非交互式
交互式的方式下会显示并提示安装过程中输入各种参数。非交互式的方式可以运行:

  sudo passenger-install-nginx-module --help
 
查看各种静默安装的参数。其中有几个是比较关键的:

  --auto                   自动确认"按下Enter键继续"
  --prefix=DIR         设置Nginx安装目录(默认是/opt/nginx)
  --auto-download  自动下载和安装Nginx

另外一种是通过手工配置和便宜Nginx。在下载Nginx的源代码后进行编译时,添加如下的参数

  ./configure -add-module=/path-to-passenger-root/ext/nginx

这里path-to-passenger-root是Passenger的根目录。有两种方式可以获得这路径:如果是通过gem方
式安装的。可以简单运行如下命令获得Passenger的根目录:passenger-config --root 如果是通过源码
安装的,那么指定源代码解压后的根目录就可以了。

在编译完成后,修改Nginix的配置文件(/opt/nginx/conf/nginx.conf),在HTTP模块内添加如下一行后
重启Nginix即可

  passenger_root /path-to-passenger-root;
 
如果是升级或者降级Nginx或者Passenger,也是同样的步骤。  

如果要临时去除Passenger的支持又不想完全卸载Passenger的话,只要把Nginx中所有关于Passenger
的配置参数全部注释掉(通常都是以passenger-xxx打头的),并重启Nginx就可以了。

要彻底删除Passenger,首先把Nginx配置文件中所有关于Passenger的配置选项全部删除。接下来如果
是通过gem方式安装的,执行:gem uninstall passenger 或者直接删除Passenger的安装目录。然后重
新编译和安装Nginx即可。
===========================================================


【为Passenger指定Ruby的运行目录】
===========================================================
如果系统安装了多个Ruby解析器,需要指定一个Ruby运行目录。如果是通过RVM来安装Ruby解析器的,
那么RVM会将默认使用的Ruby解析器添加到PATH环境变量下。可以运行echo $PATH检测,如果没有的
话则手工添加到$PATH的最前面。

administrator@RoR-PRD:~$ rvm list

rvm rubies

   ruby-1.9.2-p290 [ i686 ]
=> ree-1.8.7-2011.03 [ i686 ]

administrator@RoR-PRD:~$ echo $PATH
/home/administrator/.rvm/gems/ree-1.8.7-2011.03@release/bin: \
/home/administrator/.rvm/gems/ree-1.8.7-2011.03@global/bin: \
/home/administrator/.rvm/rubies/ree-1.8.7-2011.03/bin: \
/home/administrator/.rvm/bin: \
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
===========================================================


【重新发布一个Rails应用】
===========================================================
重新发布一个Rails应用,只需要再次上传文件后,通知Passenger重启应用就可以。这里有两种方式:

第一种是重启Nginx。另外一种是每次在发布之前,通过如下命令新建或者更新一个名为restart.txt的文
件,让Nginx检测到文件更新(timestamp改变)而自动在下次请求到来时重启应用。

  touch /webapps/mycook/tmp/restart.txt

必须注意的是:Passenger并不会自动为部署的应用创建好DB的环境,依然需要在发布新的应用之后,
手工执行:rake db:migrate RAILS_ENV=production  
===========================================================


【Nginx中配置项的覆盖问题】
===========================================================
server {
        listen       80;
        server_name  localhost;
        root /home/administrator/deploy/demo/public/;   # <--- be sure to point to 'public'!
        passenger_enabled on;
        
        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }


上面的配置选项中,一开始将root指定为对应的Rails应用的public目录,但是在下面的location / {...}中
又将root指定为当前目录下的index.html或者index.htm,所以会覆盖前面的root配置,当在浏览器下
输入:http://localhost/时,显示的不是应用的根目录,而是Nginx的欢迎页面。

不过不建议这样配置,因为这样会令到当站点无法访问时,无法判断是Nginx的问题还是应用的问题。如
果要在本机再配置,可以这些写:

 server {
      listen 80;
      server_name 127.0.0.1;
      root /home/administrator/deploy/demo/public/;   # <--- be sure to point to 'public'!
      passenger_enabled on;
 }
 
但是URL就要变成这样:http://127.0.0.1:80/,如果使用localhost,则Nginx会默认使用server_name
+ port 来分派请求,所以当输入:http://localhost:80/时依然会被Nginx默认的服务器拦截,返回Nginx
的默认页面
===========================================================


【部署为一个URI】
===========================================================
假设现在已经有了一个server配置:

 server {
        listen 80;
        server_name www.phusion.nl;
        root /websites/phusion;
 }

我想将新的应用部署在这个sever下面,并且请求的URL是这样的:http://www.phusion.nl/rails。

首先在现有的root下面创建一个soft link,指向改Rails应用:
  sudo ln -s /home/administrator/deploy/demo/public /opt/nginx/html/demo
 
然后在原有的sever下添加如下配置:

 server {
        listen       80;
        server_name  localhost;
        passenger_enabled on;         # 新添加的
        passenger_base_uri /demo;  # 新添加的
  }
 
然后重启Nginx: sudo /etc/init.d/nginx restart。重新访问:http://localhost/demo
通过这一点,我可以实现将多个Rails应用部署在同一台机器下面的问题:只要指定不同的passenger_base_uri
===========================================================


【Passenger的配置选项】
===========================================================
>> passenger_root <directory>
指定Passenger的安装根目录

>> passenger_ruby <filename>
指定Passenger使用的Ruby解析器的目录(按照安装过程中推荐的值即可)

>> passenger_enabled on|off
可以定义在http/server/location/if ,默认off

>> passenger_base_uri <uri>
可以定义在http/server/location/if 中多次定义,为同一VPS配置多个应用

>> passenger_use_global_queue <on|off>

默认情况下Passenger使用一个全局队列(Global queue)来存放请求。当有请求到来时会首先看后端的处
理进程是否有空闲的,有的话将该请求转发给请求进程。没有的话则存储在自己的队列里面。当该功能被
关闭时,会在各个后台进程的内部自己维护一个独立的队列,而不是全局共享的。这样会出现一个情况:

假如某个后台进程因为挂起的request数量比较少,那么Passenger会把新的请求都分配到该进程。如果新
的请求都是属于比较耗时的请求,那么会造成该进程压力非常大,响应速度变慢。但其它已经处理完请求
的空闲进程却无法派上用场。

默认情况下这个参数的值是on

>> passenger_buffer_response <on|off>

当这个参数被配置为on时,Passenger会对页面的输出进行缓存。也就是将response缓存到Passenger
中,然后逐步发送到客户端。这样做的目的是为了避免在response的内容比较大时,整个应用的实例被
锁住,直到所有的内容都被完全发送到客户端为止。

默认情况下这个参数的值是on

>> passenger_friendly_error_pages on|off

可以让passenger在错误发生时以一种友好的形式来显示错误信息(包括堆栈调用,启动信息,建议等)。
强烈建议在生产环境下关闭该参数

默认情况下这个参数的值是on

>> passenger_max_pool_size <integer>

这个参数用于配置Passenger同一时刻可以并行的RoR/Rack应用实例的数量(注意是所有Rails应用)。推荐
的参数值至少等于CPU(内核的数目)。如果有2G的RAM,那么可以配置为30个。如果是只有256M内存
的VPS则建议配置为2

这个参数只能在http block中定义,默认值是6

>> passenger_min_instances <integer>

这个参数用于指定Passenger应该保留的Rails应用的数目。它会在应用第一次被访问时,让Passenger启
动等于这个数目的实例并一直保持在内存中。即便是一直处于空闲状态或者到了清除时间。

注意这个参数并不会pre-start应用!也即是说只有在应用第一次被访问时,才会创建对应数目的实例,而
不会在Nginx启动时就预先加载。所以第一次访问时有可能会比较慢。如果需要需要预加载,需要配合另外
一个参数passenger_pre_start

这个参数的默认值是1

>> passenger_max_instances_per_app <integer>

这个参数和上面max_pool_size的区别是,max_pool_size是限定Passenger可以同时启动的所有Rails/
Rack应用的数目(可以是多个app instance的总和),而这个参数是用于单独指定某个app instance的数量
的。这个参数可以限制某个app instance占用了所有的pool和CPU时间片。

这个参数的值必须小于passenger_max_pool_size,0代表单个应用的实例数量没有限制(最大值等于
max_pool_size)。

这个参数只能在http block中定义,默认值是0

>> passenger_pool_idle_time <integer>

这个参数指定了每个app instance最长的空闲时间。当一个应用在指定的时间内都没有接收到请求而处于
空闲状态的时候,它将会被销毁而回收所占用的内存。

推荐的配置时间是应用页面平均访问时间 * 2。如果设置的值过小意味着应用会经常被实例化和销毁,这
个过程比较耗时。如果是在非共享的主机环境下,或者需要7*24小时的响应,应该设置为0

当时设置为0不意味着永远不会被销毁。当另外一个app instance需要启动一个worker process但Pass-
enger已经没有工作线程了时,会强制将一个空闲状态的app instance回收以空出worker process

这个参数只能在http block中定义,默认值是300秒

>> passenger_pre_start <url>

这个参数可以让Passenger在Nginx启动时,预先加载指定的应用。但要注意的是即便是预先加载的应用
在passenger_pool_idel_time 到达时,也会被销毁。如果需要继续保留在内存中,就要搭配前面提到的
passenger_min_instances。

URL支持完整的server_name,也可以是sub-URI

这个参数只能在http block中定义,可以被定义无限次。

>> passenger_log_level <integer>

这个参数可以指定Passenger如何往Nginx的日志文件中写日志。参数值越大写入的内容越详细。总共
分为4级:0 仅显示错误和异常;1 显示有用的调试信息(供管理员定位错误用);2 显示更加详细的信息
(供开发过程使用);3 显示所有日志信息。

这个参数只能在http block中定义,默认的级别是0

>> passenger_debug_log_file <filename>

这个参数可以指定Passenger将错误和调试信息写到何处。

这个参数只能在http block中定义,默认情况下日志会写到Nginx的全局日志文件

>> rails_env <string>

这个参数允许针对不同的应用,设置不同的环境。可以在http/server/block/if block中定义,每处一次

这个参数的默认值是production
===========================================================


【分析工具】
===========================================================
>> passenger-memory-stats

这个命令需要在root用户下执行。可以使用 rvmsudo passenger-memory-stats 来查看所有的内存情况

>> passenger-status

这个命令同样需要在root用户下执行。可以使用 rvmsudo passenger-status 来查看Passenger的情况

  ----------- General information -----------
  max       = 6   # 等同于passenger_pool_max_size
  count    = 0   # 当前存活的用例,小于等于max值
  active    = 0   # 当前活跃的用例,小于等于count值
  inactive = 0   # 当前空闲的用例,等于count-active
  Waiting on global queue: 0
 
  ----------- Domains -----------
  /var/www/projects/app1-foobar:
  PID: 9617      Sessions: 0    Processed: 7       Uptime: 2m 23s
 
  Sessions: 0    # 当前应用有多少客户端连接等待处理
  Processed:7  # 截至当前为止总共处理了多少个请求  
 
  ----------- Application groups -----------

如果应用是基于Ruby on Rails的,当进程被kill掉时,日志会写在应用自身的日志文件中,而不是Nginx
的日志文件。所以先检查production.log,如果没有异常信息再检查Nginx的error.log文件
===========================================================


【其它】
===========================================================
假设在Rails应用下有Gemfile,那么Passenger会自动执行Bundle.setup()方法

当应用部署为Sub-uri的形式时,由于根路径发生了变化,所以静态资源(图片,CSS,JS)的相对路径都会
发生变化。这个时候如果使用静态路径那么所有静态资源都将找不到文件,所以无论在何种部署情况下,
都推荐使用Rails提供的帮助方法:image_tag、stylesheet_link_tag、javascript_include_tag 来创建
相对的资源路径。
===========================================================


-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要尽力打好一手烂牌。
posted on 2011-11-13 23:29 Paul Lin 阅读(10982) 评论(1)  编辑  收藏 所属分类: RoR


FeedBack:
# re: Passenger+Nginx配置摘记
2012-10-21 13:30 | 雪落无痕_1
这个写的真详细,我也是照着个配置的,

有个问题想请教下:

1.启动rails s的时候不是可以把public里的index.html删除就可以直接访问到app/views/home/index.html.erb

通过启动nginx的方式 应该怎么配置才能直接启动app/views/home/index.html.erb呢?  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
<2011年11月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

常用链接

留言簿(21)

随笔分类

随笔档案

BlogJava热点博客

好友博客

搜索

  •  

最新评论

阅读排行榜

评论排行榜