【问题标题】:How to change default port of a Rails 4 app?如何更改 Rails 4 应用程序的默认端口?
【发布时间】:2013-08-07 12:24:23
【问题描述】:

我知道我可以通过-p 选项在另一个端口上启动rails 服务器。但只要我启动 webrick,我想为每个应用程序设置另一个端口。

有什么想法吗?

问候 费利克斯

【问题讨论】:

    标签: port ruby-on-rails-4 webrick


    【解决方案1】:

    将此附加到config/boot.rb:

    require 'rails/commands/server'
    
    module DefaultOptions
      def default_options
        super.merge!(Port: 3001)
      end
    end
    
    Rails::Server.send(:prepend, DefaultOptions)
    

    注意:需要 ruby​​ >= 2.0。

    【讨论】:

    • prepend是公开的,不需要经过send:Rails::Server.prepend(DefaultOptions)
    • 在最近的版本中没有。需要发送:api.rubyonrails.org/classes/Rails/Server.html
    • 如何从应用程序中的某个位置检索此端口?
    • 谢谢,这在尝试更改默认绑定地址时也有效 :)。你能解释一下代码的作用吗?
    • 我喜欢这个,因为它允许我使用rails server (像往常一样)运行服务器,而不是选择需要调用其他东西的答案。
    【解决方案2】:

    快速解决方案:追加到Rakefile

    task :server do
      `bundle exec rails s -p 8080`
    end
    

    然后运行rake server

    【讨论】:

      【解决方案3】:

      选项 1:

      您可以像这样启动 WEBrick:

          rails server -p 8080
      

      8080 是您的端口。如果您愿意,可以将其放入 bash 脚本中以方便使用。

      选项 2:

      您可以安装 $ gem install foreman,并使用 foreman 来启动您在 Procfile 中定义的生产网络服务器(例如 unicorn),如下所示:$ foreman run web。如果 unicorn 是您的 Web 服务器,您可以在 unicorn 配置文件中指定端口(与大多数服务器选择一样)。这种方法的好处不仅在于您可以在配置中设置端口,而且您使用的环境更接近生产环境。

      【讨论】:

        【解决方案4】:

        如果您将默认选项放在 config/boot.rb 上,则 rake 和 rails 的所有命令属性都会失败(例如:rake -Trails g model user)! 因此,请将其附加到 bin/rails 之后行 require_relative '../config/boot' 并且代码仅针对 rails 服务器命令执行:

        if ARGV.first == 's' || ARGV.first == 'server'
          require 'rails/commands/server'
          module Rails
            class Server
              def default_options
                super.merge(Host:  '0.0.0.0', Port: 3000)
              end
            end
          end
        end
        

        bin/rails 文件如下所示:

        #!/usr/bin/env ruby
        APP_PATH = File.expand_path('../../config/application',  __FILE__)
        require_relative '../config/boot'
        
        # Set default host and port to rails server
        if ARGV.first == 's' || ARGV.first == 'server'
          require 'rails/commands/server'
          module Rails
            class Server
              def default_options
                super.merge(Host:  '0.0.0.0', Port: 3000)
              end
            end
          end
        end
        
        require 'rails/commands'
        

        【讨论】:

        • 当你说“失败”时,你是什么意思?它似乎对我有用。
        【解决方案5】:

        对于 Rails 5.1:

        # config/boot.rb
        
        # ... existing code
        
        require 'rails/command'
        require 'rails/commands/server/server_command'
        
        Rails::Command::ServerCommand.send(:remove_const, 'DEFAULT_PORT')
        Rails::Command::ServerCommand.const_set('DEFAULT_PORT', 3333)
        

        【讨论】:

          猜你喜欢
          • 2021-07-31
          • 2015-04-09
          • 1970-01-01
          • 2020-02-03
          • 1970-01-01
          • 2015-05-24
          • 2016-11-02
          • 2011-10-19
          • 1970-01-01
          相关资源
          最近更新 更多