我正在使用Rails堆栈,其中 nginx + unicorn + rails 适用于生产服务器,但我正在Vagrant下进行测试以进行测试。在执行此操作时,我遇到了rails应用程序的一种奇怪行为,其中通常没有提供一个或其他资产,即application.css未被提供,因此显示整个页面时没有应用任何样式。
我已经搜索了问题并发现Vagrant的FS驱动程序没有完全实现,这会在使用Apache时带来一些问题(没有找到任何提及nginx)。此问题的解决方案是通过将 sendfile off; 添加到配置文件来禁用sendfile。并且......它没有用。
此外,我浏览了日志(Rails,unicorn和nginx)并发现当文件未提供时,在任何日志中都没有提及它。这让我想到问题可能在于Vagrant通过VM共享 rails app 文件夹所使用的机制。正如vagrant的网站所提到的,Vagrant使用Virtual Box的共享文件夹,与其他替代方案相比速度相当慢(如here所示),解决方法是设置NFS共享文件夹。所以,我决定试试NFS,结果是......同样的。不幸的是,有些资产无法提供服务。
有没有人对此有任何想法?我已经搜索了很长一段时间,但没有发现我在这里描述的任何指针。
我正在使用:
Mac OS X 10.6.8 + rbenv(开发)
Vagrant + nginx + rbenv + unicorn + bundler(到舞台)
unicorn.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的/启用的站点 - /应用程序的名字
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;
}
}