1

我正在使用带有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;
    }
  }
4

0 回答 0