我正在使用带有nginx + unicorn + rails的 Rails Stack用于生产服务器,但出于测试目的,我将其暂存在 Vagrant 下。在执行此操作时,我遇到了 rails 应用程序的一个奇怪行为,其中经常没有提供一个或其他资产,即没有提供 application.css,因此整个页面显示时没有应用任何样式。
我用谷歌搜索了这个问题,发现 Vagrant 的 FS 驱动程序没有完全实现,这会在使用 Apache 时带来一些问题(没有发现任何关于 nginx 的提及)。解决这个问题的方法是通过添加sendfile off 来禁用 sendfile;到配置文件。而且……没用。
此外,我查看了日志(Rails、unicorn 和 nginx),发现当文件没有被提供时,任何日志中都没有提到它。这让我想到问题可能出在 Vagrant通过 VM共享rails app文件夹的机制中。正如 vagrant 的网站所述,Vagrant 使用 Virtual Box 的共享文件夹,与其他替代方案相比速度相当慢(如图所示),解决方法是设置 NFS 共享文件夹。所以,我决定试一试 NFS,结果是……还是一样的。不幸的是,有些资产无法提供服务。
有人对此有任何想法吗?我已经搜索了很长一段时间,但没有找到除我在这里描述的那些之外的任何指针。
我在用着:
Mac OS X 10.6.8 + rbenv(开发)
Vagrant + nginx + rbenv + unicorn + bundler(到阶段)
独角兽.rb
rails_env = ENV['RAILS_ENV'] || 'production'
app_directory = File.expand_path(File.join(File.dirname(__FILE__), ".."))
worker_processes 4
working_directory app_directory
listen "/tmp/appname.sock", :backlog => 64
#listen "#{app_directory}/tmp/sockets/appname.sock", :backlog => 64
timeout 30
pid "#{app_directory}/tmp/pids/unicorn.pid"
stderr_path "#{app_directory}/log/unicorn.stderr.log"
stdout_path "#{app_directory}/log/unicorn.stdout.log"
preload_app true
GC.respond_to?(:copy_on_write_friendly=) and
GC.copy_on_write_friendly = true
before_fork do |server, worker|
defined?(ActiveRecord::Base) and
ActiveRecord::Base.connection.disconnect!
end
after_fork do |server, worker|
defined?(ActiveRecord::Base) and
ActiveRecord::Base.establish_connection
end
/etc/nginx/sites-enabled/appname
upstream unicorn_server {
server unix:/tmp/appname.sock fail_timeout=0;
}
server {
listen 80;
client_max_body_size 4G;
server_name _;
keepalive_timeout 5;
# Location of our static files
root /home/appname/www/current/public;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://unicorn_server;
break;
}
}
error_page 500 502 503 504 /500.html;
location = /500.html {
root /home/hemauto/www/current/public;
}
}