ruby-on-rails - FastCGI 不适用于 Rails 4 共享主机(Phusion 乘客)

标签 ruby-on-rails .htaccess ruby-on-rails-4 passenger fastcgi

我正在使用 Rails 4.1.6 和 ruby​​ 2.1.8p440。

目前,我想提高性能并添加配置 FastCGI。

问题:FastCGI 不工作并减慢我的 RoR APP。

到目前为止,我有这个目录结构:

  • 博客(Rails 4 应用程序)
  • public_html
  • .htaccess
  • dispatch.fcgi

  • 我的 .htaccess 文件:
    PassengerAppRoot "/home/individualki/blogs"
    PassengerBaseURI "/"
    PassengerRuby "/home/individualki/rubyvenv/ror/2.1/bin/ruby"
    RailsEnv development
    
    SetEnv RAILS_RELATIVE_URL_ROOT /dispatch
    
    RewriteEngine On
    
    RewriteRule ^(stylesheets/.*)$ - [L]
    RewriteRule ^(javascripts/.*)$ - [L]
    RewriteRule ^(images/.*)$ - [L]
    
    RewriteRule ^$ index.html [QSA]
    RewriteRule ^([^.]+)$ $1.html [QSA]
    RewriteCond %{REQUEST_FILENAME} !-f
    
    RewriteRule ^(.*)$ dispatch.fcgi [E=X-HTTP_AUTHORIZATION:%{HTTP:Authorization},QSA,L]
    

    我的 dispatch.fcgi 文件:
    #!/home/individualki/rubyvenv/ror/2.1/bin/ruby
    
    
    
    ENV['RAILS_ENV'] ||= 'development'  
    ENV['HOME'] ||= `echo ~`.strip  
    ENV['GEM_HOME'] = File.expand_path('~/.gems')  
    ENV['GEM_PATH'] = File.expand_path('~/.gems') + ":" + '/usr/lib/ruby/gems/1.8'
    
    require 'rubygems'  
    Gem.clear_paths  
    require 'fcgi'
    
    require '../home/individualki/blogs/config/boot.rb'  
    require '../home/individualki/blogs/config/environment.rb'
    
    class Rack::PathInfoRewriter  
        def initialize(app)
            @app = app
        end
    
        def cadsll(env)
            env.delete('SCRIPT_NAME')
            parts = env['REQUEST_URI'].split('?')
            env['PATH_INFO'] = parts[0]
            env['QUERY_STRING'] = parts[1].to_s
            @app.call(env)
        end
    end
    
    Rack::Handler::FastCGI.run  
    Rack::PathInfoRewriter.new(blogs::Application)  
    

    之后我重新启动了服务器
    touch tmp/restart.txt
    

    然后访问我的网络应用程序并意识到它无法正常工作。内容已加载但没有任何 Assets - 图像、css 或 js 文件。应用程序变得慢得多。

    之后,我检查了我的 Cpanel,看到我的应用程序现在使用最大进程 40/40 并且 CPU 使用率上升。那些事情以前从未发生过(至少我没有看到)

    enter image description here

    我的日志文件:
    Started GET "/dispatch/assets/parsley.js?body=1" for 85.254.76.76 at 2016-09-24 12:57:06 +0300
      Rendered /home/individualki/rubyvenv/ror/2.1/gems/actionpack-4.1.6/lib/action_dispatch/middleware/templates/routes/_route.html.erb (75.0ms)
      Rendered /home/individualki/rubyvenv/ror/2.1/gems/actionpack-4.1.6/lib/action_dispatch/middleware/templates/routes/_table.html.erb (1.6ms)
      Rendered /home/individualki/rubyvenv/ror/2.1/gems/actionpack-4.1.6/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb within rescues/layout (367.4ms)
    
    ActionController::RoutingError (No route matches [GET] "/dispatch/assets/parsley.js"):
      actionpack (4.1.6) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
      actionpack (4.1.6) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
      railties (4.1.6) lib/rails/rack/logger.rb:38:in `call_app'
      railties (4.1.6) lib/rails/rack/logger.rb:20:in `block in call'
      activesupport (4.1.6) lib/active_support/tagged_logging.rb:68:in `block in tagged'
      activesupport (4.1.6) lib/active_support/tagged_logging.rb:26:in `tagged'
      activesupport (4.1.6) lib/active_support/tagged_logging.rb:68:in `tagged'
      railties (4.1.6) lib/rails/rack/logger.rb:20:in `call'
      quiet_assets (1.1.0) lib/quiet_assets.rb:27:in `call_with_quiet_assets'
      actionpack (4.1.6) lib/action_dispatch/middleware/request_id.rb:21:in `call'
      rack (1.5.3) lib/rack/methodoverride.rb:21:in `call'
      rack (1.5.3) lib/rack/runtime.rb:17:in `call'
      activesupport (4.1.6) lib/active_support/cache/strategy/local_cache_middleware.rb:26:in `call'
      rack (1.5.3) lib/rack/lock.rb:17:in `call'
      actionpack (4.1.6) lib/action_dispatch/middleware/static.rb:64:in `call'
      rack (1.5.3) lib/rack/sendfile.rb:112:in `call'
      railties (4.1.6) lib/rails/engine.rb:514:in `call'
      railties (4.1.6) lib/rails/application.rb:144:in `call'
      /opt/passenger/lib/phusion_passenger/rack/thread_handler_extension.rb:74:in `process_request'
      /opt/passenger/lib/phusion_passenger/request_handler/thread_handler.rb:141:in `accept_and_process_next_request'
      /opt/passenger/lib/phusion_passenger/request_handler/thread_handler.rb:109:in `main_loop'
      /opt/passenger/lib/phusion_passenger/request_handler.rb:455:in `block (3 levels) in start_threads'
    
    
      Rendered /home/individualki/rubyvenv/ror/2.1/gems/actionpack-4.1.6/lib/action_dispatch/middleware/templates/routes/_route.html.erb (44.4ms)
      Rendered /home/individualki/rubyvenv/ror/2.1/gems/actionpack-4.1.6/lib/action_dispatch/middleware/templates/routes/_table.html.erb (1.4ms)
      Rendered /home/individualki/rubyvenv/ror/2.1/gems/actionpack-4.1.6/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb within rescues/layout (282.0ms)
      Rendered /home/individualki/rubyvenv/ror/2.1/gems/actionpack-4.1.6/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (1.3ms)
      Rendered /home/individualki/rubyvenv/ror/2.1/gems/actionpack-4.1.6/lib/action_dispatch/middleware/templates/routes/_route.html.erb (25.0ms)
      Rendered /home/individualki/rubyvenv/ror/2.1/gems/actionpack-4.1.6/lib/action_dispatch/middleware/templates/routes/_table.html.erb (1.6ms)
      Rendered /home/individualki/rubyvenv/ror/2.1/gems/actionpack-4.1.6/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb within rescues/layout (135.4ms)
    
    
    Started GET "/dispatch/assets/application.js?body=1" for 85.254.76.76 at 2016-09-24 12:57:07 +0300
    
    ActionController::RoutingError (No route matches [GET] "/dispatch/assets/application.js"):
      actionpack (4.1.6) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
      actionpack (4.1.6) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
      railties (4.1.6) lib/rails/rack/logger.rb:38:in `call_app'
      railties (4.1.6) lib/rails/rack/logger.rb:20:in `block in call'
      activesupport (4.1.6) lib/active_support/tagged_logging.rb:68:in `block in tagged'
      activesupport (4.1.6) lib/active_support/tagged_logging.rb:26:in `tagged'
      activesupport (4.1.6) lib/active_support/tagged_logging.rb:68:in `tagged'
      railties (4.1.6) lib/rails/rack/logger.rb:20:in `call'
      quiet_assets (1.1.0) lib/quiet_assets.rb:27:in `call_with_quiet_assets'
      actionpack (4.1.6) lib/action_dispatch/middleware/request_id.rb:21:in `call'
      rack (1.5.3) lib/rack/methodoverride.rb:21:in `call'
      rack (1.5.3) lib/rack/runtime.rb:17:in `call'
      activesupport (4.1.6) lib/active_support/cache/strategy/local_cache_middleware.rb:26:in `call'
      rack (1.5.3) lib/rack/lock.rb:17:in `call'
      actionpack (4.1.6) lib/action_dispatch/middleware/static.rb:64:in `call'
      rack (1.5.3) lib/rack/sendfile.rb:112:in `call'
      railties (4.1.6) lib/rails/engine.rb:514:in `call'
      railties (4.1.6) lib/rails/application.rb:144:in `call'
      /opt/passenger/lib/phusion_passenger/rack/thread_handler_extension.rb:74:in `process_request'
      /opt/passenger/lib/phusion_passenger/request_handler/thread_handler.rb:141:in `accept_and_process_next_request'
      /opt/passenger/lib/phusion_passenger/request_handler/thread_handler.rb:109:in `main_loop'
      /opt/passenger/lib/phusion_passenger/request_handler.rb:455:in `block (3 levels) in start_threads'
    
    
      Rendered /home/individualki/rubyvenv/ror/2.1/gems/actionpack-4.1.6/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (1.3ms)
      Rendered /home/individualki/rubyvenv/ror/2.1/gems/actionpack-4.1.6/lib/action_dispatch/middleware/templates/routes/_route.html.erb (30.7ms)
      Rendered /home/individualki/rubyvenv/ror/2.1/gems/actionpack-4.1.6/lib/action_dispatch/middleware/templates/routes/_table.html.erb (1.4ms)
      Rendered /home/individualki/rubyvenv/ror/2.1/gems/actionpack-4.1.6/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb within rescues/layout (147.0ms)
    
    
    Started GET "/dispatch/assets/co.js?body=1" for 85.254.76.76 at 2016-09-24 12:57:07 +0300
    
    ActionController::RoutingError (No route matches [GET] "/dispatch/assets/co.js"):
      actionpack (4.1.6) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
      actionpack (4.1.6) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
      railties (4.1.6) lib/rails/rack/logger.rb:38:in `call_app'
      railties (4.1.6) lib/rails/rack/logger.rb:20:in `block in call'
      activesupport (4.1.6) lib/active_support/tagged_logging.rb:68:in `block in tagged'
      activesupport (4.1.6) lib/active_support/tagged_logging.rb:26:in `tagged'
      activesupport (4.1.6) lib/active_support/tagged_logging.rb:68:in `tagged'
      railties (4.1.6) lib/rails/rack/logger.rb:20:in `call'
      quiet_assets (1.1.0) lib/quiet_assets.rb:27:in `call_with_quiet_assets'
      actionpack (4.1.6) lib/action_dispatch/middleware/request_id.rb:21:in `call'
      rack (1.5.3) lib/rack/methodoverride.rb:21:in `call'
      rack (1.5.3) lib/rack/runtime.rb:17:in `call'
      activesupport (4.1.6) lib/active_support/cache/strategy/local_cache_middleware.rb:26:in `call'
      rack (1.5.3) lib/rack/lock.rb:17:in `call'
      actionpack (4.1.6) lib/action_dispatch/middleware/static.rb:64:in `call'
      rack (1.5.3) lib/rack/sendfile.rb:112:in `call'
      railties (4.1.6) lib/rails/engine.rb:514:in `call'
      railties (4.1.6) lib/rails/application.rb:144:in `call'
      /opt/passenger/lib/phusion_passenger/rack/thread_handler_extension.rb:74:in `process_request'
      /opt/passenger/lib/phusion_passenger/request_handler/thread_handler.rb:141:in `accept_and_process_next_request'
      /opt/passenger/lib/phusion_passenger/request_handler/thread_handler.rb:109:in `main_loop'
      /opt/passenger/lib/phusion_passenger/request_handler.rb:455:in `block (3 levels) in start_threads'
    
    
      Rendered /home/individualki/rubyvenv/ror/2.1/gems/actionpack-4.1.6/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (1.2ms)
      Rendered /home/individualki/rubyvenv/ror/2.1/gems/actionpack-4.1.6/lib/action_dispatch/middleware/templates/routes/_route.html.erb (31.6ms)
      Rendered /home/individualki/rubyvenv/ror/2.1/gems/actionpack-4.1.6/lib/action_dispatch/middleware/templates/routes/_table.html.erb (1.6ms)
      Rendered /home/individualki/rubyvenv/ror/2.1/gems/actionpack-4.1.6/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb within rescues/layout (150.2ms)
    

    在此先感谢您的帮助。

    最佳答案

    缓慢可能是由于在开发模式下运行,并且来自所有 Assets 404。

    假设你从这里得到你的配置:http://danielstrunk.me/blog/2014/07/01/configuring-rails-projects-fastcgi-dreamhost-shared-hosting/

    看起来您的路径可能没有正确配置。以下是文章对此的描述:

    Here’s where things tripped me up a bit. Dreamhost doesn’t allow webrick to run on shared hosting accounts, so I had to figure out an alternative. Luckily, it’s pretty easy to get setup once you know what to look for. In the root directory of the domain you’re looking to install Redmine / your Rails app into, create a public folder. You’ll be creating two files here: dispatch.fcgi and .htaccess. Here’s what your dispatch.fcgi should look like:



    dispatch.fcgi
    #!/usr/bin/ruby
    
    # Dreamhost clears environment variables when calling dispatch.fcgi, set again
    ENV['RAILS_ENV'] ||= 'production'
    ENV['HOME'] ||= `echo ~`.strip
    ENV['GEM_HOME'] = File.expand_path('~/.gems')
    ENV['GEM_PATH'] = File.expand_path('~/.gems') + ":" + '/usr/lib/ruby/gems/1.8'
    
    require 'rubygems'
    Gem.clear_paths
    require 'fcgi'
    
    require '../your/app/config/boot.rb'
    require '../your/app/config/environment.rb'
    
    class Rack::PathInfoRewriter
        def initialize(app)
            @app = app
        end
    
        def call(env)
            env.delete('SCRIPT_NAME')
            parts = env['REQUEST_URI'].split('?')
            env['PATH_INFO'] = parts[0]
            env['QUERY_STRING'] = parts[1].to_s
            @app.call(env)
        end
    end
    
    Rack::Handler::FastCGI.run
    Rack::PathInfoRewriter.new(YourApp::Application)
    

    .htaccess
    <IfModule mod_fastcgi.c>
     AddHandler fastcgi-script .fcgi
    </IfModule>
    <IfModule mod_fcgid.c>
     AddHandler fcgid-script .fcgi
    </IfModule>
    
    Options +FollowSymLinks +ExecCGI
    
    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ dispatch.fcgi/$1 [QSA,L]
    
    ErrorDocument 500 "Rails application failed to start properly"
    

    关于ruby-on-rails - FastCGI 不适用于 Rails 4 共享主机(Phusion 乘客),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39675082/

    相关文章:

    ruby-on-rails - ruby on rails 的内部结构

    ruby-on-rails - Paypal - 使用 Rails 定期计费(适用于非美国商家)

    ruby-on-rails - rake Assets :precompile:nodigest in Rails 4

    ruby-on-rails - Rails Create 方法导致 Nil 记录

    ruby-on-rails - Ruby:打开 URI。从远程 url 获取文件名

    javascript - 成功的 AJAX 请求破坏了 jQuery 函数

    ruby-on-rails - rails 模型模板(或实例继承)选项?

    php - BuddyPress 成员(member)资料的分页

    php - godaddy 托管中的 Laravel 安装,如何使用 .htaccess 防止访问/公开

    wordpress - 301 重定向不起作用 (WordPress) - [ URL 中带有 ?m=1 的 Probler ]