Ruby支持
从版本0.9.7-dev起,一个Ruby (Rack/Rails) 插件正式发布。官方用于Ruby应用的modifier数字是7,因此,记得在你的web服务器配置中设置它。
插件可以被嵌入到uWSGI核心中,或者作为一个动态加载的插件构建。
插件仍然不支持一些uWSGI标准的特性,例如:
- UDP请求管理
- SharedArea —— uWSGI组件间共享内存页 (support on the way)
- uWSGI队列框架
见 Ruby API支持 页,以获取当前支持的特性列表。
为Ruby支持构建uWSGI
你可以在 buildconf
目录中找到 rack.ini
。这个配置将会构建一个嵌入了Ruby解释器的uWSGI。要用这个配置构建uWSGI,你会需要Ruby头文件/开发包。
- python uwsgiconfig.py --build rack
所得uWSGI二进制文件可以运行Ruby应用。
也存在一个 rackp.ini
构建配置;这将会构建一个Ruby作为插件支持的uWSGI;在这个例子中,记得带 plugins=rack
选项调用uWSGI。
关于内存消费的一个注意事项
默认情况下,这个插件的内存管理是非常积极的 (因为Ruby可以轻松消耗掉内存,就像它正变得过时一样)。会默认在每个请求之后调用Ruby垃圾回收器。如果你的应用在每次请求都创建大量的对象的话,这或许会损害你的性能。你可以使用 OptionRubyGcFreq 选项来调整回收的频率。像往常一样,这并没有一本万利的值,因此,实验一下吧。
如果你的应用在不受控制的情况下内存泄漏,那么在使用 max-requests
选项重启之前考虑限制一个worker可以管理的请求数。使用 limit-as
也有用。
关于线程和fiber的一个注意事项
添加Ruby 1.8中的线程支持在讨论之外。这个版本中的线程支持实际上对一个像uWSGI这样的服务器而言是没用的。Ruby 1.9有一个非常类似于Python的线程模式,它的支持从uWSGI 1.9.14起,就可以使用”rbthreads”插件来实现。
fiber是Ruby 1.9的一个新特性。它们是协程/绿色线程/停止恢复/合作多线程,或者任何你喜欢的对这类有趣技术的称呼的实现。见 FiberLoop
。
在uWSGI上运行Rack应用
这个例子向你展示如何在uWSGI上运行一个Sinatra应用。
config.ru
- require 'rubygems'
- require 'sinatra'
- get '/hi' do
- "Hello World!"
- end
- run Sinatra::Application
然后调用uWSGI (如果你将Ruby支持作为插件构建,那么使用 —plugins
):
- ./uwsgi -s :3031 -M -p 4 -m --post-buffering 4096 --rack config.ru
- ./uwsgi --plugins rack -s :3031 -M -p 4 -m --post-buffering 4096 --rack config.ru
注解
根据Rack规范, post-buffering
是必须的。
注解
由于Sinatra有一个内建的日志记录系统,因此你或许希望用 disable-logging
选项来禁用uWSGI对请求的日志记录。
在uWSGI上运行Ruby on Rails应用
由于编写正式的文档并不十分有趣,这里是几个uWSGI上的Rails应用的例子。
运行typo
- sudo gem install typo
- typo install /tmp/mytypo
- ./uwsgi -s :3031 --lazy-apps --master --processes 4 --memory-report --rails /tmp/mytypo --post-buffering 4096 --env RAILS_ENV=production
–lazy-apps这里是至关重要的,因为typo (就像许多应用一样) 并非fork友好型的 (它不期望在master中加载,然后调用fork())。使用这个选项,应用会在每个worker中完全加载一次。
Nginx配置:
- location / {
- root "/tmp/mytypo/public";
- include "uwsgi_params";
- uwsgi_modifier1 7;
- if (!-f $request_filename) {
- uwsgi_pass 127.0.0.1:3031;
- }
- }
运行Radiant
- sudo gem install radiant
- radiant /tmp/myradiant
- cd /tmp/myradiant
- # (edit config/database.yml to fit)
- rake production db:bootstrap
- ./uwsgi -s :3031 -M -p 2 -m --rails /tmp/myradiant --post-buffering 4096 --env RAILS_ENV=production
Apache配置 (直接映射静态路径):
- DocumentRoot /tmp/myradiant/public
- <Directory /tmp/myradiant/public>
- Allow from all
- </Directory>
- <Location />
- uWSGISocket 127.0.0.1:3032
- SetHandler uwsgi-handler
- uWSGIForceScriptName /
- uWSGImodifier1 7
- </Location>
- <Location /images>
- SetHandler default-handler
- </Location>
- <Location /stylesheets>
- SetHandler default-handler
- </Location>
- <Location /javascripts>
- SetHandler default-handler
- </Location>
Rails和SSL
你或许希望使用 HTTPS
/ UWSGI_SCHEME https
uwsgi协议参数来告知应用它运行在HTTPS之下。
对于Nginx:
- uwsgi_param HTTPS on; # Rails 2.x apps
- uwsgi_param UWSGI_SCHEME https; # Rails 3.x apps