【问题标题】:How to change Rails 3 server default port in develoment?如何在开发中更改 Rails 3 服务器默认端口?
【发布时间】:2011-04-20 01:26:20
【问题描述】:

在我的开发机器上,我使用端口 10524。所以我以这种方式启动我的服务器:

rails s -p 10524

有没有办法将默认端口更改为 10524,这样我就不必每次启动服务器时都附加端口?

【问题讨论】:

  • 简单的答案是编辑 config/puma.rb 如果运行默认 puma 服务器

标签: ruby-on-rails


【解决方案1】:

首先 - 不要在您的 gem 路径中编辑任何内容!会影响所有的项目,以后会遇到很多问题……

在您的项目中以这种方式编辑script/rails

#!/usr/bin/env ruby
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.

APP_PATH = File.expand_path('../../config/application',  __FILE__)
require File.expand_path('../../config/boot',  __FILE__)

# THIS IS NEW:
require "rails/commands/server"
module Rails
  class Server
    def default_options
      super.merge({
        :Port        => 10524,
        :environment => (ENV['RAILS_ENV'] || "development").dup,
        :daemonize   => false,
        :debugger    => false,
        :pid         => File.expand_path("tmp/pids/server.pid"),
        :config      => File.expand_path("config.ru")
      })
    end
  end
end
# END OF CHANGE
require 'rails/commands'

原理很简单——你是在给服务器运行器打猴子补丁——所以它只会影响一个项目。

更新:是的,我知道 bash 脚本有更简单的解决方案,其中包含:

#!/bin/bash
rails server -p 10524

但是这个解决方案有一个严重的缺点——它很无聊。

【讨论】:

  • 甚至是别名! alias rs='rails server -p 10524'
  • 一定要把require 'rails/commands'放在你粘贴的新东西之后。否则它仍然会尝试端口3000。
  • 对我不起作用,仍然从 :3000 开始。 @Spencer 解决方案(在此页面上)如何工作
  • 在一个实例中为我工作,但不是另一个。当我不得不创建自己的脚本文件夹和 rails 文件时 -> 不是很成功。可能与 rails 是否超出脚本有关?
  • @trisweb 你能解释一下如何创建alias rs
【解决方案2】:

我喜欢将以下内容附加到config/boot.rb

require 'rails/commands/server'

module Rails
  class Server
    alias :default_options_alias :default_options
    def default_options
      default_options_alias.merge!(:Port => 3333)
    end    
  end
end

【讨论】:

  • 使用super而不是别名hack。
  • 很遗憾,如果使用super 代替别名,则会调用错误的方法。它调用::Rack::Server 版本的default_options。
  • 使用 ruby​​ 2.0 你可以prepend 一个匿名模块,而不是使用alias。这允许干净地使用super
  • 这个答案将导致 Rails::Server 在不应该定义的上下文中定义(例如,运行 Rails 控制台)。所以我建议将代码放在application.rb 的末尾,用if defined?(Rails::Server) 保护。
【解决方案3】:

再给你一个主意。创建一个使用 -p 调用 rails 服务器的 rake 任务。

task "start" => :environment do
  system 'rails server -p 3001'
end

然后调用rake start 而不是rails server

【讨论】:

    【解决方案4】:

    结合之前的两个答案,对于 Rails 4.0.4(大概是更高版本),这在 config/boot.rb 的末尾就足够了:

    require 'rails/commands/server'
    
    module Rails
      class Server
        def default_options
          super.merge({Port: 10524})
        end
      end
    end
    

    【讨论】:

    • 如何在正在运行的应用程序中检索此选项?具体来说,我要设置config.action_mailer.default_url_options,否则还是指向3000端口。
    • 我在这里添加了一个与此相关的问题:stackoverflow.com/questions/29431315/…
    【解决方案5】:

    我们使用 Puma 作为 Web 服务器,并使用 dotenv 在开发中设置环境变量。这意味着我可以为PORT 设置一个环境变量,并在 Puma 配置中引用它。

    # .env
    PORT=10524
    
    
    # config/puma.rb
    port ENV['PORT']
    

    但是,您必须使用foreman start 而不是rails s 来启动您的应用,否则无法正确读取 puma 配置。

    我喜欢这种方法,因为配置在开发和生产中的工作方式相同,您只需在必要时更改端口的值。

    【讨论】:

      【解决方案6】:

      灵感来自 Radek 和 Spencer... 在 Rails 4(.0.2 - Ruby 2.1.0 ) 上,我能够将其附加到 config/boot.rb

      # config/boot.rb
      
      # ...existing code
      
      require 'rails/commands/server'
      
      module Rails
        # Override default development
        # Server port
        class Server
          def default_options
            super.merge(Port: 3100)
          end
        end
      end
      

      default_options 中的所有其他配置仍然设置,命令行开关仍然覆盖默认值。

      【讨论】:

        【解决方案7】:

        Rails 2.3 解决方案 - script/server

        #!/usr/bin/env ruby
        require 'rack/handler'
        module Rack::Handler
          class << WEBrick
            alias_method :old_run, :run
          end
        
          class WEBrick
            def self.run(app, options={})
              options[:Port] = 3010 if options[:Port] == 3000
              old_run(app, options)
            end
          end
        end
        
        require File.dirname(__FILE__) + '/../config/boot'
        require 'commands/server'
        

        【讨论】:

        • 谢谢!我来这里是为了寻找带有 rails 2.3.18 的解决方案 :-)
        • 我确实必须在 require 'rack/handler' 之前移动 require File.dirname(__FILE__) + '/../config/boot' 才能使其工作。
        【解决方案8】:

        如果您使用 puma(我在 Rails 6+ 上使用它):

        更改所有环境的默认端口:

        如果在 ENV 中未定义,则“{3000}”部分设置默认端口。

        ~/config/puma.rb
        
        change:
            port ENV.fetch('PORT') { 3000 }
        for:
            port ENV.fetch('PORT') { 10524 }
        

        根据环境定义它,使用 Figaro gem 作为凭证​​/环境变量:

        ~/application.yml
        local_db_username: your_user_name
        ​local_db_password: your_password
        PORT: 10524
        

        您可以根据自己的环境变量管理器进行调整。

        【讨论】:

          【解决方案9】:

          您可以安装$ gem install foreman,并使用工头来启动您在Procfile 中定义的服务器,例如:

          web: bundle exec rails -p 10524
          

          您可以在此处查看foreman gem 文档:https://github.com/ddollar/foreman 了解更多信息

          这种方法的好处不仅在于您可以轻松地在配置中设置/更改端口,而且不需要添加太多代码,而且您可以在工头将运行的Procfile 中添加不同的步骤为您服务,这样您就不必在每次启动应用程序时都通过它们:

          bundle: bundle install
          web: bundle exec rails -p 10524
          ...
          ...
          

          干杯

          【讨论】:

            【解决方案10】:

            在您的 shell 中为具有指定端口的命令创建别名。

            【讨论】:

            • 在 gem 路径中编辑文件是……好吧,只为最勇敢的人准备。它不会在 gem 更新后继续存在,它不会在更多的计算机上运行,​​等等。我真的不推荐它
            • 你是对的。您的解决方案要好得多。我不知道,我可以在script/rails 中覆盖它。谢谢你。
            猜你喜欢
            • 1970-01-01
            • 2016-02-14
            • 1970-01-01
            • 1970-01-01
            • 2014-07-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多