Ik heb een probleem met Ruby on Rails op een productieserver. De RoR applicatie is gemaakt op mijn Ubuntu laptop en draait met WEBrick probleemloos. Ook op de (CentOS) productieserver werkt de applicatie via WEBrick prima. Echter, wanneer ik met Capistrano deploy en de applicatie door Lighttpd met de Fastcgi dispatcher wordt geserveerd, wordt er op een of andere manier bij het parsen een null byte aan de URL toegevoegd, waardoor de bijbehorende actie niet uitgevoerd kan worden.
Neem bijvoorbeeld de URL:
www.url.nl/paginas/contact
Dit is dus de controller 'paginas' met de actie 'contact'. Afhankelijk van de Rails versie die ik gebruik krijg ik dan een foutmelding in de browser en het volgende in de logfile:
Rails 2.0.2:
Rails 2.1.0:
De error is weliswaar verschillend, maar in beide gevallen wordt deze veroorzaakt door de null byte die al bij de parameters aan de action is toegevoegd. Een pagina die een ID op het eind heeft gaat wel goed, maar ook hier is een null byte toegevoegd:
www.url.nl/paginas/weergeven/1
Nu weet ik dat een null byte wordt gebruikt om het einde van een string aan te duiden, maar ergens in de communicatie gaat er toch iets mis aangezien deze ineens als onderdeel van de URL gezien wordt.
Googlen op het probleem levert me niks op, er zijn wel mensen die Rails gebruiken en een vergelijkbare foutmelding krijgen, maar dit wordt dan steevast veroorzaakt door een eigen programmeerfout. In algemenere zin op 'null byte' en 'url' zoeken schiet ook niet echt op, aangezien dit heel veel hits over security geeft. Ook in combinatie met 'Lighttpd' of 'Fastcgi' kom ik niet verder.
De productieserver is een CentOS 5.0 server, met LXAdmin als control panel en Lighttpd als webserver, die de Fastcgi dispatcher gebruikt voor de RoR applicaties.
Is iemand bekend met dit verschijnsel en zo ja, hoe los ik het op
. Aangezien ik meerdere domeinen op de server heb draaien is het niet echt een optie om het control panel eraf te smijten en ipv Lighttpd+Fastcgi met Apache+Mongrel te werken.
Neem bijvoorbeeld de URL:
www.url.nl/paginas/contact
Dit is dus de controller 'paginas' met de actie 'contact'. Afhankelijk van de Rails versie die ik gebruik krijg ik dan een foutmelding in de browser en het volgende in de logfile:
Rails 2.0.2:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
| Processing PaginasController#contact (for ###.###.###.### at 2008-06-27 10:12:58) [GET]
Session ID: 21a929ccf52f2339393c630f122f3933
Parameters: {"action"=>"contact\000", "controller"=>"paginas"}
ArgumentError (string contains null byte):
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_view/base.rb:464:in `file?'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_view/base.rb:464:in `find_base_path_for'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/base.rb:1485:in `find'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_view/base.rb:464:in `each'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_view/base.rb:464:in `find'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_view/base.rb:464:in `find_base_path_for'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_view/base.rb:446:in `find_full_template_path'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_view/base.rb:379:in `full_template_path'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_view/base.rb:452:in `template_exists?'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_view/base.rb:483:in `find_template_extension_from_handler'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_view/base.rb:482:in `each'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_view/base.rb:482:in `find_template_extension_from_handler'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_view/base.rb:474:in `find_template_extension_for'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_view/base.rb:396:in `pick_template_extension'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_view/base.rb:407:in `file_exists?'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/base.rb:1251:in `template_exists?'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/base.rb:1163:in `perform_action_without_filters'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/filters.rb:697:in `call_filters'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/filters.rb:689:in `perform_action_without_benchmark'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue'
/usr/lib/ruby/1.8/benchmark.rb:293:in `measure'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/rescue.rb:199:in `perform_action_without_caching'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/caching.rb:678:in `perform_action'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/connection_adapters/abstract/query_cache.rb:33:in `cache'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/query_cache.rb:8:in `cache'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/caching.rb:677:in `perform_action'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/base.rb:524:in `send'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/base.rb:524:in `process_without_filters'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/filters.rb:685:in `process_without_session_management_support'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/session_management.rb:123:in `process'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/base.rb:388:in `process'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/dispatcher.rb:171:in `handle_request'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/dispatcher.rb:115:in `dispatch'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/dispatcher.rb:126:in `dispatch_cgi'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/dispatcher.rb:9:in `dispatch'
/usr/lib/ruby/gems/1.8/gems/rails-2.0.2/lib/fcgi_handler.rb:101:in `process_request'
/usr/lib/ruby/gems/1.8/gems/rails-2.0.2/lib/fcgi_handler.rb:149:in `with_signal_handler'
/usr/lib/ruby/gems/1.8/gems/rails-2.0.2/lib/fcgi_handler.rb:99:in `process_request'
/usr/lib/ruby/gems/1.8/gems/rails-2.0.2/lib/fcgi_handler.rb:77:in `process_each_request'
/usr/lib/ruby/gems/1.8/gems/fcgi-0.8.7/lib/fcgi.rb:612:in `each_cgi'
/usr/lib/ruby/gems/1.8/gems/fcgi-0.8.7/lib/fcgi.rb:117:in `session'
/usr/lib/ruby/gems/1.8/gems/fcgi-0.8.7/lib/fcgi.rb:104:in `each_request'
/usr/lib/ruby/gems/1.8/gems/fcgi-0.8.7/lib/fcgi.rb:36:in `each'
/usr/lib/ruby/gems/1.8/gems/fcgi-0.8.7/lib/fcgi.rb:609:in `each_cgi'
/usr/lib/ruby/gems/1.8/gems/rails-2.0.2/lib/fcgi_handler.rb:76:in `process_each_request'
/usr/lib/ruby/gems/1.8/gems/rails-2.0.2/lib/fcgi_handler.rb:50:in `process!'
/usr/lib/ruby/gems/1.8/gems/rails-2.0.2/lib/fcgi_handler.rb:24:in `process!'
/home/NAAM/ror/URL.nl//shh/public/dispatch.fcgi:24
Rendering /home/NAAM/ror/URL.nl/shh-cap/releases/20080627081738/public/500.html (500 Internal Server Error) |
Rails 2.1.0:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
| Processing PaginasController#contact (for ###.###.###.### at 2008-06-27 10:09:56) [GET]
Session ID: 21a929ccf52f2339393c630f122f3933
Parameters: {"action"=>"contact\000", "controller"=>"paginas"}
ActionController::UnknownAction (No action responded to contact):
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/filters.rb:580:in `call_filters'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/filters.rb:573:in `perform_action_without_benchmark'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue'
/usr/lib/ruby/1.8/benchmark.rb:293:in `measure'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/rescue.rb:201:in `perform_action_without_caching'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/caching/sql_cache.rb:13:in `perform_action'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/connection_adapters/abstract/query_cache.rb:33:in `cache'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/query_cache.rb:8:in `cache'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/caching/sql_cache.rb:12:in `perform_action'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/base.rb:529:in `send'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/base.rb:529:in `process_without_filters'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/filters.rb:569:in `process_without_session_management_support'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/session_management.rb:130:in `process'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/base.rb:389:in `process'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/dispatcher.rb:149:in `handle_request'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/dispatcher.rb:107:in `dispatch'
/usr/lib/ruby/1.8/thread.rb:135:in `synchronize'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/dispatcher.rb:104:in `dispatch'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/dispatcher.rb:120:in `dispatch_cgi'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/dispatcher.rb:35:in `dispatch'
/usr/lib/ruby/gems/1.8/gems/rails-2.1.0/lib/fcgi_handler.rb:103:in `process_request'
/usr/lib/ruby/gems/1.8/gems/rails-2.1.0/lib/fcgi_handler.rb:153:in `with_signal_handler'
/usr/lib/ruby/gems/1.8/gems/rails-2.1.0/lib/fcgi_handler.rb:101:in `process_request'
/usr/lib/ruby/gems/1.8/gems/rails-2.1.0/lib/fcgi_handler.rb:78:in `process_each_request'
/usr/lib/ruby/gems/1.8/gems/fcgi-0.8.7/lib/fcgi.rb:612:in `each_cgi'
/usr/lib/ruby/gems/1.8/gems/fcgi-0.8.7/lib/fcgi.rb:117:in `session'
/usr/lib/ruby/gems/1.8/gems/fcgi-0.8.7/lib/fcgi.rb:104:in `each_request'
/usr/lib/ruby/gems/1.8/gems/fcgi-0.8.7/lib/fcgi.rb:36:in `each'
/usr/lib/ruby/gems/1.8/gems/fcgi-0.8.7/lib/fcgi.rb:609:in `each_cgi'
/usr/lib/ruby/gems/1.8/gems/rails-2.1.0/lib/fcgi_handler.rb:77:in `process_each_request'
/usr/lib/ruby/gems/1.8/gems/rails-2.1.0/lib/fcgi_handler.rb:76:in `catch'
/usr/lib/ruby/gems/1.8/gems/rails-2.1.0/lib/fcgi_handler.rb:76:in `process_each_request'
/usr/lib/ruby/gems/1.8/gems/rails-2.1.0/lib/fcgi_handler.rb:50:in `process!'
/usr/lib/ruby/gems/1.8/gems/rails-2.1.0/lib/fcgi_handler.rb:24:in `process!'
/home/NAAM/ror/URL.nl//shh/public/dispatch.fcgi:24
Rendering /home/NAAM/ror/URL.nl/shh-cap/releases/20080627080008/public/404.html (404 Not Found) |
De error is weliswaar verschillend, maar in beide gevallen wordt deze veroorzaakt door de null byte die al bij de parameters aan de action is toegevoegd. Een pagina die een ID op het eind heeft gaat wel goed, maar ook hier is een null byte toegevoegd:
www.url.nl/paginas/weergeven/1
code:
1
2
3
4
5
6
| Processing PaginasController#weergeven (for ###.###.###.### at 2008-06-27 10:14:50) [GET]
Session ID: 21a929ccf52f2339393c630f122f3933
Parameters: {"action"=>"weergeven", "id"=>"1\000", "controller"=>"paginas"}
Rendering template within layouts/paginas
Rendering paginas/weergeven
Completed in 0.09765 (10 reqs/sec) | Rendering: 0.08033 (82%) | DB: 0.00000 (0%) | 200 OK [http://www.URL.nl/paginas/weergeven/1] |
Nu weet ik dat een null byte wordt gebruikt om het einde van een string aan te duiden, maar ergens in de communicatie gaat er toch iets mis aangezien deze ineens als onderdeel van de URL gezien wordt.
Googlen op het probleem levert me niks op, er zijn wel mensen die Rails gebruiken en een vergelijkbare foutmelding krijgen, maar dit wordt dan steevast veroorzaakt door een eigen programmeerfout. In algemenere zin op 'null byte' en 'url' zoeken schiet ook niet echt op, aangezien dit heel veel hits over security geeft. Ook in combinatie met 'Lighttpd' of 'Fastcgi' kom ik niet verder.
De productieserver is een CentOS 5.0 server, met LXAdmin als control panel en Lighttpd als webserver, die de Fastcgi dispatcher gebruikt voor de RoR applicaties.
Is iemand bekend met dit verschijnsel en zo ja, hoe los ik het op
[ Voor 100% gewijzigd door bigben04 op 27-06-2008 11:04 ]