2
我正在使用瘦Web服务器来服务Ruby/Sinatra应用程序。这得到了我的注意的事情是,当我运行:瘦服务器多次记录相同的请求
RACK_ENV=production rackup
每个请求都被记录像5倍,并与不同的时间戳。
[email protected]:/app$ RACK_ENV=production rackup
** Building /assets/application.js...
** Building /assets/screen.css...
>> Thin web server (v1.4.1 codename Chromeo)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:9292, CTRL+C to stop
10.0.2.2 - - [12/Aug/2012 03:54:56] "GET/HTTP/1.1" 200 4 0.0024
10.0.2.2 - - [12/Aug/2012 03:54:56] "GET/HTTP/1.1" 200 4 0.0034
10.0.2.2 - - [12/Aug/2012 03:54:56] "GET/HTTP/1.1" 200 4 0.0044
10.0.2.2 - - [12/Aug/2012 03:54:56] "GET/HTTP/1.1" 200 4 0.0054
10.0.2.2 - - [12/Aug/2012 03:54:56] "GET/HTTP/1.1" 200 4 0.0065
10.0.2.2 - - [12/Aug/2012 03:54:56] "GET/HTTP/1.1" 200 4 0.0076
10.0.2.2 - - [12/Aug/2012 03:54:56] "GET/HTTP/1.1" 200 4 0.0094
10.0.2.2 - - [12/Aug/2012 03:54:56] "GET/HTTP/1.1" 200 - 0.0102
这让我相信,不知怎的,请求被做了好几次。或者只记录多次?
当我跑得
rackup
,并尝试同样的要求。这是我得到的。
[email protected]:/app$ rackup
>> Thin web server (v1.4.1 codename Chromeo)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:9292, CTRL+C to stop
10.0.2.2 - - [12/Aug/2012 03:56:42] "GET/HTTP/1.1" 200 - 0.1228
差异基本上是状态码后的“ - ”,就像生产服务器中的最后一行日志一样。但我真的不知道这意味着什么。
我想知道是否在生产中请求被处理多次。 我正在使用Sinatra这样的路线。
class Project::Base < Sinatra::Application
..configs here
end
class Project::Routes::Home < Project::Base
get '/'
"something"
end
end
config.ru
RACK_ENV = ENV["RACK_ENV"] ||= "development" unless defined? RACK_ENV
require 'sprockets'
map '/assets' do
environment = Sprockets::Environment.new
environment.append_path 'app/assets/javascripts'
environment.append_path 'app/assets/stylesheets'
run environment
end
require File.dirname(__FILE__) + '/config/boot.rb'
use Rack::Deflater
run GRBTV::Main
./config/boot.rb
require 'rubygems'
gem 'psych'
# Require default environment config
require File.join(File.dirname(__FILE__), 'env')
# Bundler setup check
require 'bundler'
begin
Bundler.setup
rescue Bundler::BundlerError => e
$stderr.puts e.message
$stderr.puts "Run 'bundle install' to install missing gems"
exit e.status_code
end
# Sinatra
require 'sinatra/base'
require 'sinatra/flash'
require 'json'
RACK_ENV = ENV['RACK_ENV'] ||= 'development' unless defined? RACK_ENV
ROOT_DIR = File.dirname(__FILE__).gsub(/config/,'') unless defined? ROOT_DIR
# Path helper methods
# root_path("config", "settings.yml")
def root_path(*args)
File.join(ROOT_DIR, *args)
end
# relative_from_root_path("~/projects/project_name/config/settings.yml") #=> "config/settings.yml"
def relative_from_root_path(path)
Pathname.new(path).relative_path_from(Pathname.new(ROOT_DIR)).to_s
end
# public_path("images") #=> "public/images"
def public_path(*args)
root_path('public', *args)
end
# Module containers for autoloaded helpers and routes
module GRBTV
module Helpers
end
module Routes
end
end
# Attempts to require all dependencies with bundler, if this fails, bundle and then try again
require 'bundler'
Bundler.setup(:default)
Bundler.require(:default)
# Dependencies contains all required gems and core configuration
require root_path('config', 'dependencies.rb')
def app() GRBTV::Main end
./config/dependencies.rb
require File.join(File.dirname(__FILE__), './loader')
initializers = []
# Requires initializers
Loader.load_files('config/initializers/*.rb') do |file|
require file
begin
# Save Initializer module in the initializers array
file_class = File.basename(file, '.rb').camelize
initializers << "#{file_class}Initializer".constantize
rescue NameError
end
end
require 'yaml'
YAML::ENGINE.yamler = 'psych'
# Load app components
['lib/*.rb', 'app/uploaders/*.rb', 'app/models/*.rb'].each do |glob|
Loader.load_files(glob)
end
# Basic Sinatra::Application settingss
class GRBTV::Base < Sinatra::Application
def options() settings end
set :root, root_path
set :views, root_path('app', 'views')
set :public_folder, root_path('public')
set :environment, RACK_ENV.to_sym if defined? RACK_ENV
set :protection, :except => :frame_options
use Rack::MethodOverride
enable :sessions
register Sinatra::NamedRoutes
register MongoMapper
helpers Sinatra::FieldBuilder
helpers Sinatra::Warden::Helpers
# Require all helpers
Loader.load_files("app/helpers/**/*.rb") do |file|
relative_path = relative_from_root_path(file).gsub(/\.rb$/, '').gsub('app/helpers/', '')
module_name = "GRBTV::Helpers::#{relative_path.camelize}"
Loader.define_namespaces(module_name)
require file
helpers module_name.constantize
end
# Sets the default layout for every route
before do
@default_layout = :'layout'
end
before '/assets/*' do
headers['Cache-Control'] = 'public, max-age=86400'
end
end
# Load mailers
Loader.load_files('app/mailers/*.rb')
class GRBTV::Main < GRBTV::Base
# Requiring routes after extending path helpers
Loader.load_files("app/routes/**/*.rb") do |file|
relative_path= relative_from_root_path(file).gsub(/\.rb$/, '').gsub('app/routes/', '')
module_name = "GRBTV::Routes::#{relative_path.camelize}"
Loader.define_namespaces(module_name)
require file
use module_name.constantize
end
end
# Load all initializers after setup is done
initializers.each do |initializer|
GRBTV::Base.register initializer
end
格式为[Apache常用日志格式](http://httpd.apache.org/docs/1.3/logs.html#common),并在最后加上总时间。看起来您的生产机架堆栈中有多个Rack :: CommonLogger中间件实例(这将解释增加的时间值)。你如何配置你的应用程序的生产(在你的应用程序文件和你的'config.ru'文件)? – matt 2012-08-12 19:38:55
另外(这可能与你的日志记录问题无关 - 但可能是)[你不应该真的继承'Sinatra :: Application'](https://github.com/sinatra/sinatra/blob/v1.3.2/ LIB /西纳特拉/ base.rb#L1573-1579)。使用['Sinatra :: Base'代替](http://www.sinatrarb.com/intro.html#Sinatra::Base%20-%20Middleware,%20Libraries,%20and%20Modular%20Apps)。 – matt 2012-08-12 19:42:45
matt,我刚刚添加了我的config.ru,/config/boot.rb和/config/dependencies.rb的信息。这些是我的主要启动文件,以及具有所有配置的文件。我真的不知道如何只有一个Rack :: CommonLogger。而且,正如您在链接中指出的那样,我从SinatraApplication继承了子类,因为我确实需要所有的帮助器,并且需要其他控制器上的内容。这有道理吗?谢谢! – MatisMasters 2012-08-13 10:15:39