passenger 2.0.6 → 2.1.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of passenger might be problematic. Click here for more details.

Files changed (497) hide show
  1. data/DEVELOPERS.TXT +10 -4
  2. data/LICENSE +1 -1
  3. data/NEWS +0 -0
  4. data/Rakefile +183 -117
  5. data/benchmark/dispatcher.rb +5 -9
  6. data/bin/passenger-install-apache2-module +52 -18
  7. data/bin/passenger-memory-stats +67 -13
  8. data/bin/passenger-spawn-server +8 -4
  9. data/bin/passenger-status +21 -46
  10. data/bin/passenger-stress-test +5 -5
  11. data/debian/postinst +1 -1
  12. data/doc/ApplicationPool algorithm.txt +180 -128
  13. data/doc/Architectural overview.html +1 -778
  14. data/doc/Security of user switching support.html +1 -643
  15. data/doc/Users guide Apache.html +3127 -0
  16. data/doc/Users guide Nginx.html +1458 -0
  17. data/doc/Users guide.html +1404 -467
  18. data/doc/Users guide.txt +843 -105
  19. data/doc/cxxapi/ApplicationPoolServer_8h-source.html +751 -641
  20. data/doc/cxxapi/ApplicationPool_8h-source.html +168 -171
  21. data/doc/cxxapi/Application_8h-source.html +494 -394
  22. data/doc/cxxapi/Bucket_8h-source.html +21 -15
  23. data/doc/cxxapi/CachedFileStat_8h-source.html +191 -0
  24. data/doc/cxxapi/Configuration_8h-source.html +311 -149
  25. data/doc/cxxapi/DirectoryMapper_8h-source.html +309 -0
  26. data/doc/cxxapi/DummySpawnManager_8h-source.html +3 -4
  27. data/doc/cxxapi/Exceptions_8h-source.html +182 -165
  28. data/doc/cxxapi/FileChecker_8h-source.html +130 -0
  29. data/doc/cxxapi/Hooks_8h-source.html +2 -3
  30. data/doc/cxxapi/Logging_8h-source.html +92 -89
  31. data/doc/cxxapi/MessageChannel_8h-source.html +585 -477
  32. data/doc/cxxapi/PoolOptions_8h-source.html +305 -0
  33. data/doc/cxxapi/SpawnManager_8h-source.html +515 -540
  34. data/doc/cxxapi/StandardApplicationPool_8h-source.html +779 -679
  35. data/doc/cxxapi/SystemTime_8h-source.html +104 -0
  36. data/doc/cxxapi/Utils_8h-source.html +331 -227
  37. data/doc/cxxapi/annotated.html +6 -7
  38. data/doc/cxxapi/classClient-members.html +1 -2
  39. data/doc/cxxapi/classClient.html +1 -2
  40. data/doc/cxxapi/classHooks-members.html +5 -2
  41. data/doc/cxxapi/classHooks.html +112 -2
  42. data/doc/cxxapi/classPassenger_1_1Application-members.html +2 -3
  43. data/doc/cxxapi/classPassenger_1_1Application.html +8 -9
  44. data/doc/cxxapi/classPassenger_1_1ApplicationPool-members.html +4 -4
  45. data/doc/cxxapi/classPassenger_1_1ApplicationPool.html +42 -81
  46. data/doc/cxxapi/classPassenger_1_1ApplicationPoolServer-members.html +1 -2
  47. data/doc/cxxapi/classPassenger_1_1ApplicationPoolServer.html +3 -4
  48. data/doc/cxxapi/classPassenger_1_1ApplicationPool__inherit__graph.png +0 -0
  49. data/doc/cxxapi/classPassenger_1_1Application_1_1Session-members.html +3 -2
  50. data/doc/cxxapi/classPassenger_1_1Application_1_1Session.html +74 -3
  51. data/doc/cxxapi/classPassenger_1_1BusyException-members.html +1 -2
  52. data/doc/cxxapi/classPassenger_1_1BusyException.html +2 -3
  53. data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +1 -2
  54. data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +2 -3
  55. data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +38 -0
  56. data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +256 -0
  57. data/doc/cxxapi/classPassenger_1_1DummySpawnManager-members.html +1 -2
  58. data/doc/cxxapi/classPassenger_1_1DummySpawnManager.html +2 -3
  59. data/doc/cxxapi/{classPassenger_1_1Thread-members.html → classPassenger_1_1FileChecker-members.html} +4 -5
  60. data/doc/cxxapi/classPassenger_1_1FileChecker.html +121 -0
  61. data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +1 -2
  62. data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +2 -3
  63. data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.png +0 -0
  64. data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +2 -3
  65. data/doc/cxxapi/classPassenger_1_1FileSystemException.html +2 -3
  66. data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.png +0 -0
  67. data/doc/cxxapi/classPassenger_1_1IOException-members.html +1 -2
  68. data/doc/cxxapi/classPassenger_1_1IOException.html +2 -3
  69. data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.png +0 -0
  70. data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +5 -2
  71. data/doc/cxxapi/classPassenger_1_1MessageChannel.html +155 -5
  72. data/doc/cxxapi/{classboost_1_1this__thread_1_1enable__syscall__interruption-members.html → classPassenger_1_1RuntimeException-members.html} +2 -3
  73. data/doc/cxxapi/{classboost_1_1this__thread_1_1enable__syscall__interruption.html → classPassenger_1_1RuntimeException.html} +10 -8
  74. data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +1 -2
  75. data/doc/cxxapi/classPassenger_1_1SpawnException.html +2 -3
  76. data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +2 -3
  77. data/doc/cxxapi/classPassenger_1_1SpawnManager.html +15 -56
  78. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool-members.html +5 -4
  79. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool.html +20 -81
  80. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool__inherit__graph.png +0 -0
  81. data/doc/cxxapi/classPassenger_1_1SystemException-members.html +2 -3
  82. data/doc/cxxapi/classPassenger_1_1SystemException.html +9 -10
  83. data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.png +0 -0
  84. data/doc/cxxapi/{classboost_1_1this__thread_1_1disable__syscall__interruption-members.html → classPassenger_1_1SystemTime-members.html} +5 -3
  85. data/doc/cxxapi/classPassenger_1_1SystemTime.html +86 -0
  86. data/doc/cxxapi/classPassenger_1_1TempFile-members.html +2 -3
  87. data/doc/cxxapi/classPassenger_1_1TempFile.html +17 -9
  88. data/doc/cxxapi/definitions_8h-source.html +1 -2
  89. data/doc/cxxapi/files.html +6 -3
  90. data/doc/cxxapi/functions.html +98 -35
  91. data/doc/cxxapi/functions_func.html +60 -32
  92. data/doc/cxxapi/functions_type.html +1 -2
  93. data/doc/cxxapi/functions_vars.html +27 -2
  94. data/doc/cxxapi/graph_legend.html +1 -2
  95. data/doc/cxxapi/graph_legend.png +0 -0
  96. data/doc/cxxapi/group__Configuration.html +3 -4
  97. data/doc/cxxapi/group__Configuration.png +0 -0
  98. data/doc/cxxapi/group__Core.html +3 -4
  99. data/doc/cxxapi/group__Core.png +0 -0
  100. data/doc/cxxapi/group__Exceptions.html +4 -2
  101. data/doc/cxxapi/group__Hooks.html +1 -6
  102. data/doc/cxxapi/group__Hooks.png +0 -0
  103. data/doc/cxxapi/group__Support.html +259 -36
  104. data/doc/cxxapi/hierarchy.html +6 -7
  105. data/doc/cxxapi/inherit__graph__0.map +1 -1
  106. data/doc/cxxapi/inherit__graph__0.md5 +1 -1
  107. data/doc/cxxapi/inherit__graph__0.png +0 -0
  108. data/doc/cxxapi/inherit__graph__1.map +1 -1
  109. data/doc/cxxapi/inherit__graph__1.md5 +1 -1
  110. data/doc/cxxapi/inherit__graph__1.png +0 -0
  111. data/doc/cxxapi/inherit__graph__10.map +1 -1
  112. data/doc/cxxapi/inherit__graph__10.md5 +1 -1
  113. data/doc/cxxapi/inherit__graph__10.png +0 -0
  114. data/doc/cxxapi/inherit__graph__11.map +1 -1
  115. data/doc/cxxapi/inherit__graph__11.md5 +1 -1
  116. data/doc/cxxapi/inherit__graph__11.png +0 -0
  117. data/doc/cxxapi/inherit__graph__12.map +2 -1
  118. data/doc/cxxapi/inherit__graph__12.md5 +1 -1
  119. data/doc/cxxapi/inherit__graph__12.png +0 -0
  120. data/doc/cxxapi/inherit__graph__13.map +1 -1
  121. data/doc/cxxapi/inherit__graph__13.md5 +1 -1
  122. data/doc/cxxapi/inherit__graph__13.png +0 -0
  123. data/doc/cxxapi/inherit__graph__14.map +1 -2
  124. data/doc/cxxapi/inherit__graph__14.md5 +1 -1
  125. data/doc/cxxapi/inherit__graph__14.png +0 -0
  126. data/doc/cxxapi/inherit__graph__15.map +1 -1
  127. data/doc/cxxapi/inherit__graph__15.md5 +1 -1
  128. data/doc/cxxapi/inherit__graph__15.png +0 -0
  129. data/doc/cxxapi/inherit__graph__16.map +1 -1
  130. data/doc/cxxapi/inherit__graph__16.md5 +1 -1
  131. data/doc/cxxapi/inherit__graph__16.png +0 -0
  132. data/doc/cxxapi/inherit__graph__17.png +0 -0
  133. data/doc/cxxapi/inherit__graph__18.png +0 -0
  134. data/doc/cxxapi/inherit__graph__19.png +0 -0
  135. data/doc/cxxapi/inherit__graph__2.map +1 -1
  136. data/doc/cxxapi/inherit__graph__2.md5 +1 -1
  137. data/doc/cxxapi/inherit__graph__2.png +0 -0
  138. data/doc/cxxapi/inherit__graph__20.map +1 -1
  139. data/doc/cxxapi/inherit__graph__20.md5 +1 -1
  140. data/doc/cxxapi/inherit__graph__20.png +0 -0
  141. data/doc/cxxapi/inherit__graph__21.map +1 -1
  142. data/doc/cxxapi/inherit__graph__21.md5 +1 -1
  143. data/doc/cxxapi/inherit__graph__21.png +0 -0
  144. data/doc/cxxapi/inherit__graph__3.map +1 -1
  145. data/doc/cxxapi/inherit__graph__3.md5 +1 -1
  146. data/doc/cxxapi/inherit__graph__3.png +0 -0
  147. data/doc/cxxapi/inherit__graph__4.map +1 -1
  148. data/doc/cxxapi/inherit__graph__4.md5 +1 -1
  149. data/doc/cxxapi/inherit__graph__4.png +0 -0
  150. data/doc/cxxapi/inherit__graph__5.map +2 -1
  151. data/doc/cxxapi/inherit__graph__5.md5 +1 -1
  152. data/doc/cxxapi/inherit__graph__5.png +0 -0
  153. data/doc/cxxapi/inherit__graph__6.map +1 -1
  154. data/doc/cxxapi/inherit__graph__6.md5 +1 -1
  155. data/doc/cxxapi/inherit__graph__6.png +0 -0
  156. data/doc/cxxapi/inherit__graph__7.map +1 -1
  157. data/doc/cxxapi/inherit__graph__7.md5 +1 -1
  158. data/doc/cxxapi/inherit__graph__7.png +0 -0
  159. data/doc/cxxapi/inherit__graph__8.map +1 -1
  160. data/doc/cxxapi/inherit__graph__8.md5 +1 -1
  161. data/doc/cxxapi/inherit__graph__8.png +0 -0
  162. data/doc/cxxapi/inherit__graph__9.map +1 -2
  163. data/doc/cxxapi/inherit__graph__9.md5 +1 -1
  164. data/doc/cxxapi/inherit__graph__9.png +0 -0
  165. data/doc/cxxapi/inherits.html +30 -31
  166. data/doc/cxxapi/main.html +1 -2
  167. data/doc/cxxapi/modules.html +1 -2
  168. data/doc/cxxapi/structPassenger_1_1AnythingToString-members.html +1 -2
  169. data/doc/cxxapi/structPassenger_1_1AnythingToString.html +2 -3
  170. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4-members.html +1 -2
  171. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4.html +2 -3
  172. data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +49 -0
  173. data/doc/cxxapi/structPassenger_1_1PoolOptions.html +404 -0
  174. data/doc/cxxapi/tree.html +18 -20
  175. data/doc/images/conservative_spawning.png +0 -0
  176. data/doc/images/conservative_spawning.svg +248 -0
  177. data/doc/images/smart-lv2.png +0 -0
  178. data/doc/images/smart-lv2.svg +320 -0
  179. data/doc/rdoc/classes/ConditionVariable.html +68 -34
  180. data/doc/rdoc/classes/Exception.html +16 -16
  181. data/doc/rdoc/classes/GC.html +9 -9
  182. data/doc/rdoc/classes/IO.html +36 -17
  183. data/doc/rdoc/classes/PhusionPassenger.html +183 -0
  184. data/doc/rdoc/classes/PhusionPassenger/AbstractRequestHandler.html +511 -0
  185. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer.html +285 -242
  186. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/ServerAlreadyStarted.html +3 -3
  187. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/ServerError.html +3 -3
  188. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/ServerNotStarted.html +3 -3
  189. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/UnknownMessage.html +3 -3
  190. data/doc/rdoc/classes/PhusionPassenger/AbstractServerCollection.html +598 -0
  191. data/doc/rdoc/classes/PhusionPassenger/AdminTools.html +140 -0
  192. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ControlProcess.html +247 -0
  193. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ControlProcess/Instance.html +138 -0
  194. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AppInitError.html +36 -19
  195. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/Application.html +81 -96
  196. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/ConsoleTextTemplate.html +18 -18
  197. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/FrameworkInitError.html +20 -18
  198. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/HTMLTemplate.html +18 -18
  199. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/InitializationError.html +9 -9
  200. data/doc/rdoc/classes/PhusionPassenger/InvalidPath.html +92 -0
  201. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/MessageChannel.html +93 -92
  202. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/NativeSupport.html +55 -25
  203. data/doc/rdoc/classes/PhusionPassenger/Rack.html +91 -0
  204. data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner.html +185 -0
  205. data/doc/rdoc/classes/PhusionPassenger/Rack/RequestHandler.html +182 -0
  206. data/doc/rdoc/classes/PhusionPassenger/Railz.html +95 -0
  207. data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner.html +424 -0
  208. data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner/Error.html +98 -0
  209. data/doc/rdoc/classes/PhusionPassenger/Railz/CGIFixed.html +200 -0
  210. data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner.html +444 -0
  211. data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner/Error.html +98 -0
  212. data/doc/rdoc/classes/PhusionPassenger/Railz/RequestHandler.html +154 -0
  213. data/doc/rdoc/classes/PhusionPassenger/SpawnManager.html +408 -0
  214. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/UnknownError.html +13 -13
  215. data/doc/rdoc/classes/PhusionPassenger/Utils.html +687 -0
  216. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/VersionNotFound.html +8 -8
  217. data/doc/rdoc/classes/PhusionPassenger/WSGI.html +89 -0
  218. data/doc/rdoc/classes/PhusionPassenger/WSGI/ApplicationSpawner.html +188 -0
  219. data/doc/rdoc/classes/PlatformInfo.html +663 -159
  220. data/doc/rdoc/classes/RakeExtensions.html +4 -4
  221. data/doc/rdoc/classes/Signal.html +134 -0
  222. data/doc/rdoc/created.rid +1 -1
  223. data/doc/rdoc/files/DEVELOPERS_TXT.html +15 -10
  224. data/doc/rdoc/files/README.html +5 -7
  225. data/doc/rdoc/files/ext/{passenger → phusion_passenger}/native_support_c.html +2 -2
  226. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/abstract_request_handler_rb.html +7 -9
  227. data/doc/rdoc/files/lib/phusion_passenger/abstract_server_collection_rb.html +120 -0
  228. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/abstract_server_rb.html +7 -10
  229. data/doc/rdoc/files/lib/phusion_passenger/admin_tools/control_process_rb.html +99 -0
  230. data/doc/rdoc/files/lib/phusion_passenger/admin_tools_rb.html +92 -0
  231. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/application_rb.html +6 -8
  232. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/console_text_template_rb.html +5 -7
  233. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/constants_rb.html +4 -5
  234. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/dependencies_rb.html +6 -8
  235. data/doc/rdoc/files/lib/phusion_passenger/events_rb.html +116 -0
  236. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/exceptions_rb.html +5 -7
  237. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/html_template_rb.html +5 -7
  238. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/message_channel_rb.html +5 -7
  239. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/platform_info_rb.html +6 -7
  240. data/doc/rdoc/files/lib/phusion_passenger/rack/application_spawner_rb.html +123 -0
  241. data/doc/rdoc/files/lib/phusion_passenger/rack/request_handler_rb.html +117 -0
  242. data/doc/rdoc/files/lib/{passenger/utils_rb.html → phusion_passenger/railz/application_spawner_rb.html} +24 -17
  243. data/doc/rdoc/files/lib/phusion_passenger/railz/cgi_fixed_rb.html +126 -0
  244. data/doc/rdoc/files/lib/phusion_passenger/railz/framework_spawner_rb.html +139 -0
  245. data/doc/rdoc/files/lib/phusion_passenger/railz/request_handler_rb.html +118 -0
  246. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/simple_benchmarking_rb.html +5 -7
  247. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/spawn_manager_rb.html +40 -24
  248. data/doc/rdoc/files/lib/phusion_passenger/utils_rb.html +169 -0
  249. data/doc/rdoc/files/lib/phusion_passenger/wsgi/application_spawner_rb.html +120 -0
  250. data/doc/rdoc/files/lib/rake/extensions_rb.html +3 -4
  251. data/doc/rdoc/fr_class_index.html +37 -19
  252. data/doc/rdoc/fr_file_index.html +25 -14
  253. data/doc/rdoc/fr_method_index.html +145 -74
  254. data/ext/apache2/Application.h +145 -44
  255. data/ext/apache2/ApplicationPool.h +27 -29
  256. data/ext/apache2/ApplicationPoolServer.h +183 -72
  257. data/ext/apache2/ApplicationPoolServerExecutable.cpp +249 -42
  258. data/ext/apache2/Bucket.cpp +61 -9
  259. data/ext/apache2/Bucket.h +15 -8
  260. data/ext/apache2/CachedFileStat.cpp +114 -0
  261. data/ext/apache2/CachedFileStat.h +169 -0
  262. data/ext/apache2/Configuration.cpp +213 -22
  263. data/ext/apache2/Configuration.h +176 -13
  264. data/ext/apache2/DirectoryMapper.h +287 -0
  265. data/ext/apache2/Exceptions.h +30 -12
  266. data/ext/apache2/FileChecker.h +108 -0
  267. data/ext/apache2/Hooks.cpp +709 -493
  268. data/ext/apache2/LICENSE-CNRI.TXT +15 -0
  269. data/ext/apache2/Logging.h +26 -22
  270. data/ext/apache2/MessageChannel.h +124 -15
  271. data/ext/apache2/PoolOptions.h +283 -0
  272. data/ext/apache2/SpawnManager.h +75 -99
  273. data/ext/apache2/StandardApplicationPool.h +296 -195
  274. data/ext/apache2/SystemTime.cpp +28 -0
  275. data/ext/apache2/SystemTime.h +82 -0
  276. data/ext/apache2/Utils.cpp +172 -18
  277. data/ext/apache2/Utils.h +124 -19
  278. data/ext/boost/cstdint.hpp +4 -2
  279. data/ext/boost/current_function.hpp +67 -0
  280. data/ext/boost/detail/sp_counted_base.hpp +4 -4
  281. data/ext/boost/thread/exceptions.hpp +2 -1
  282. data/ext/boost/thread/pthread/thread.hpp +11 -3
  283. data/ext/boost/thread/pthread/thread_data.hpp +2 -1
  284. data/ext/oxt/backtrace.cpp +172 -0
  285. data/ext/oxt/backtrace.hpp +135 -0
  286. data/ext/oxt/detail/backtrace_disabled.hpp +39 -0
  287. data/ext/oxt/detail/backtrace_enabled.hpp +155 -0
  288. data/ext/oxt/detail/spin_lock_gcc_x86.hpp +82 -0
  289. data/ext/oxt/detail/spin_lock_portable.hpp +38 -0
  290. data/ext/oxt/detail/spin_lock_pthreads.hpp +97 -0
  291. data/ext/oxt/detail/tracable_exception_disabled.hpp +46 -0
  292. data/ext/oxt/detail/tracable_exception_enabled.hpp +48 -0
  293. data/ext/oxt/macros.hpp +58 -0
  294. data/ext/oxt/spin_lock.hpp +55 -0
  295. data/ext/{apache2/System.cpp → oxt/system_calls.cpp} +87 -52
  296. data/ext/oxt/system_calls.hpp +234 -0
  297. data/ext/oxt/thread.cpp +32 -0
  298. data/ext/oxt/thread.hpp +223 -0
  299. data/ext/oxt/tracable_exception.cpp +87 -0
  300. data/ext/oxt/tracable_exception.hpp +35 -0
  301. data/{lib/passenger/constants.rb → ext/phusion_passenger/extconf.rb} +14 -9
  302. data/ext/{passenger → phusion_passenger}/native_support.c +33 -6
  303. data/lib/{passenger → phusion_passenger}/abstract_request_handler.rb +209 -93
  304. data/lib/{passenger → phusion_passenger}/abstract_server.rb +23 -8
  305. data/lib/phusion_passenger/abstract_server_collection.rb +301 -0
  306. data/lib/phusion_passenger/admin_tools.rb +25 -0
  307. data/lib/phusion_passenger/admin_tools/control_process.rb +107 -0
  308. data/lib/{passenger → phusion_passenger}/application.rb +13 -16
  309. data/lib/{passenger → phusion_passenger}/console_text_template.rb +2 -2
  310. data/{ext/passenger/extconf.rb → lib/phusion_passenger/constants.rb} +5 -5
  311. data/lib/{passenger → phusion_passenger}/dependencies.rb +38 -32
  312. data/lib/phusion_passenger/events.rb +45 -0
  313. data/lib/{passenger → phusion_passenger}/exceptions.rb +12 -5
  314. data/lib/{passenger → phusion_passenger}/html_template.rb +2 -2
  315. data/lib/{passenger → phusion_passenger}/message_channel.rb +3 -2
  316. data/lib/phusion_passenger/platform_info.rb +500 -0
  317. data/lib/{passenger → phusion_passenger}/rack/application_spawner.rb +29 -22
  318. data/lib/{passenger → phusion_passenger}/rack/request_handler.rb +14 -9
  319. data/lib/{passenger → phusion_passenger}/railz/application_spawner.rb +94 -74
  320. data/lib/{passenger → phusion_passenger}/railz/cgi_fixed.rb +2 -2
  321. data/lib/{passenger → phusion_passenger}/railz/framework_spawner.rb +86 -98
  322. data/lib/{passenger → phusion_passenger}/railz/request_handler.rb +6 -6
  323. data/lib/{passenger → phusion_passenger}/simple_benchmarking.rb +0 -0
  324. data/lib/{passenger → phusion_passenger}/spawn_manager.rb +136 -128
  325. data/lib/{passenger → phusion_passenger}/templates/apache2_config_snippets.txt.erb +0 -0
  326. data/lib/{passenger → phusion_passenger}/templates/apache_must_be_compiled_with_compatible_mpm.txt.erb +0 -0
  327. data/lib/phusion_passenger/templates/app_exited_during_initialization.html.erb +38 -0
  328. data/lib/{passenger → phusion_passenger}/templates/app_init_error.html.erb +0 -0
  329. data/lib/{passenger → phusion_passenger}/templates/database_error.html.erb +0 -0
  330. data/lib/{passenger → phusion_passenger}/templates/deployment_example.txt.erb +1 -1
  331. data/lib/{passenger → phusion_passenger}/templates/error_layout.css +0 -0
  332. data/lib/{passenger → phusion_passenger}/templates/error_layout.html.erb +0 -0
  333. data/lib/{passenger → phusion_passenger}/templates/framework_init_error.html.erb +0 -0
  334. data/lib/{passenger → phusion_passenger}/templates/general_error.html.erb +0 -0
  335. data/lib/{passenger → phusion_passenger}/templates/invalid_app_root.html.erb +1 -1
  336. data/lib/{passenger → phusion_passenger}/templates/load_error.html.erb +0 -0
  337. data/lib/{passenger → phusion_passenger}/templates/no_write_permission_to_passenger_root.txt.erb +0 -0
  338. data/lib/{passenger → phusion_passenger}/templates/possible_solutions_for_compilation_and_installation_problems.txt.erb +0 -0
  339. data/lib/{passenger → phusion_passenger}/templates/run_installer_as_root.txt.erb +0 -0
  340. data/lib/{passenger → phusion_passenger}/templates/version_not_found.html.erb +0 -0
  341. data/lib/{passenger → phusion_passenger}/templates/welcome.txt.erb +0 -0
  342. data/lib/{passenger → phusion_passenger}/utils.rb +210 -44
  343. data/lib/{passenger → phusion_passenger}/wsgi/application_spawner.rb +18 -15
  344. data/lib/{passenger → phusion_passenger}/wsgi/request_handler.py +7 -1
  345. data/man/passenger-memory-stats.8 +1 -1
  346. data/misc/render_error_pages.rb +1 -1
  347. data/test/ApplicationPoolServerTest.cpp +0 -28
  348. data/test/ApplicationPoolServer_ApplicationPoolTest.cpp +4 -0
  349. data/test/ApplicationPoolTest.cpp +307 -69
  350. data/test/CachedFileStatTest.cpp +262 -0
  351. data/test/FileCheckerTest.cpp +79 -0
  352. data/test/MessageChannelTest.cpp +3 -3
  353. data/test/PoolOptionsTest.cpp +37 -0
  354. data/test/SpawnManagerTest.cpp +4 -4
  355. data/test/StandardApplicationPoolTest.cpp +4 -0
  356. data/test/SystemTimeTest.cpp +37 -0
  357. data/test/UtilsTest.cpp +137 -0
  358. data/test/integration_tests.rb +270 -23
  359. data/test/oxt/backtrace_test.cpp +128 -0
  360. data/test/oxt/oxt_test_main.cpp +25 -0
  361. data/test/oxt/syscall_interruption_test.cpp +50 -0
  362. data/test/ruby/abstract_request_handler_spec.rb +83 -0
  363. data/test/ruby/abstract_server_collection_spec.rb +246 -0
  364. data/test/ruby/application_spec.rb +3 -3
  365. data/test/ruby/message_channel_spec.rb +2 -2
  366. data/test/ruby/rack/application_spawner_spec.rb +3 -5
  367. data/test/ruby/rails/application_spawner_spec.rb +54 -15
  368. data/test/ruby/rails/framework_spawner_spec.rb +6 -8
  369. data/test/ruby/rails/minimal_spawner_spec.rb +29 -0
  370. data/test/ruby/rails/spawner_error_handling_spec.rb +1 -1
  371. data/test/ruby/rails/spawner_privilege_lowering_spec.rb +3 -3
  372. data/test/ruby/spawn_manager_spec.rb +23 -12
  373. data/test/ruby/utils_spec.rb +36 -2
  374. data/test/ruby/wsgi/application_spawner_spec.rb +47 -0
  375. data/test/stub/apache2/httpd.conf.erb +3 -5
  376. data/test/stub/message_channel.rb +2 -2
  377. data/test/stub/message_channel_2.rb +2 -2
  378. data/test/stub/message_channel_3.rb +3 -3
  379. data/test/stub/minimal-railsapp/README +0 -0
  380. data/test/stub/minimal-railsapp/config/application.rb +0 -0
  381. data/test/stub/minimal-railsapp/config/environment.rb +0 -0
  382. data/test/stub/minimal-railsapp/vendor/rails/actionmailer/lib/action_mailer.rb +0 -0
  383. data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_controller.rb +0 -0
  384. data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_pack.rb +0 -0
  385. data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_view.rb +0 -0
  386. data/test/stub/minimal-railsapp/vendor/rails/activerecord/lib/active_record.rb +0 -0
  387. data/test/stub/minimal-railsapp/vendor/rails/activeresource/lib/active_resource.rb +0 -0
  388. data/test/stub/minimal-railsapp/vendor/rails/activesupport/lib/active_support.rb +0 -0
  389. data/test/stub/minimal-railsapp/vendor/rails/activesupport/lib/active_support/whiny_nil.rb +0 -0
  390. data/test/stub/minimal-railsapp/vendor/rails/railties/lib/dispatcher.rb +0 -0
  391. data/test/stub/minimal-railsapp/vendor/rails/railties/lib/initializer.rb +0 -0
  392. data/test/stub/minimal-railsapp/vendor/rails/railties/lib/ruby_version_check.rb +0 -0
  393. data/test/stub/rails_apps/foobar/app/controllers/foo_controller.rb +8 -0
  394. data/test/stub/rails_apps/foobar/config/environments/development.rb +1 -2
  395. data/test/stub/rails_apps/mycook/app/controllers/welcome_controller.rb +21 -1
  396. data/test/stub/rails_apps/mycook/sites/some.site/public/uploads.html +26 -0
  397. data/test/stub/rails_apps/mycook/sites/some.site/public/welcome/cached.html +26 -0
  398. data/test/stub/railsapp/app/controllers/application.rb +0 -0
  399. data/test/stub/railsapp/app/controllers/bar_controller_1.rb +0 -0
  400. data/test/stub/railsapp/app/controllers/bar_controller_2.rb +1 -1
  401. data/test/stub/railsapp/app/controllers/foo_controller.rb +4 -0
  402. data/test/stub/railsapp/app/helpers/application_helper.rb +0 -0
  403. data/test/stub/railsapp/config/boot.rb +0 -0
  404. data/test/stub/railsapp/config/database.yml +0 -0
  405. data/test/stub/railsapp/config/environment.rb +0 -0
  406. data/test/stub/railsapp/config/environments/development.rb +0 -0
  407. data/test/stub/railsapp/config/environments/production.rb +0 -0
  408. data/test/stub/railsapp/config/initializers/inflections.rb +0 -0
  409. data/test/stub/railsapp/config/initializers/mime_types.rb +0 -0
  410. data/test/stub/railsapp/config/routes.rb +0 -0
  411. data/test/stub/railsapp/public/useless.txt +0 -0
  412. data/test/stub/spawn_server.rb +3 -4
  413. data/test/stub/wsgi/passenger_wsgi.pyc +0 -0
  414. data/test/support/apache2_controller.rb +57 -7
  415. data/test/support/tut.h +15 -0
  416. data/vendor/README +12 -0
  417. data/vendor/README_FOR_PACKAGERS +1 -0
  418. data/vendor/rack-0.9.1/AUTHORS +8 -0
  419. data/vendor/rack-0.9.1/COPYING +18 -0
  420. data/vendor/rack-0.9.1/ChangeLog +1423 -0
  421. data/vendor/rack-0.9.1/KNOWN-ISSUES +18 -0
  422. data/vendor/rack-0.9.1/README +306 -0
  423. data/vendor/rack-0.9.1/Rakefile +188 -0
  424. data/vendor/rack-0.9.1/SPEC +129 -0
  425. data/vendor/rack-0.9.1/lib/rack.rb +86 -0
  426. data/vendor/rack-0.9.1/lib/rack/adapter/camping.rb +22 -0
  427. data/vendor/rack-0.9.1/lib/rack/auth/abstract/handler.rb +28 -0
  428. data/vendor/rack-0.9.1/lib/rack/auth/abstract/request.rb +37 -0
  429. data/vendor/rack-0.9.1/lib/rack/auth/basic.rb +58 -0
  430. data/vendor/rack-0.9.1/lib/rack/auth/digest/md5.rb +124 -0
  431. data/vendor/rack-0.9.1/lib/rack/auth/digest/nonce.rb +51 -0
  432. data/vendor/rack-0.9.1/lib/rack/auth/digest/params.rb +55 -0
  433. data/vendor/rack-0.9.1/lib/rack/auth/digest/request.rb +40 -0
  434. data/vendor/rack-0.9.1/lib/rack/auth/openid.rb +438 -0
  435. data/vendor/rack-0.9.1/lib/rack/builder.rb +67 -0
  436. data/vendor/rack-0.9.1/lib/rack/cascade.rb +36 -0
  437. data/vendor/rack-0.9.1/lib/rack/commonlogger.rb +61 -0
  438. data/vendor/rack-0.9.1/lib/rack/conditionalget.rb +43 -0
  439. data/vendor/rack-0.9.1/lib/rack/content_length.rb +25 -0
  440. data/vendor/rack-0.9.1/lib/rack/deflater.rb +87 -0
  441. data/vendor/rack-0.9.1/lib/rack/directory.rb +150 -0
  442. data/vendor/rack-0.9.1/lib/rack/file.rb +85 -0
  443. data/vendor/rack-0.9.1/lib/rack/handler.rb +48 -0
  444. data/vendor/rack-0.9.1/lib/rack/handler/cgi.rb +57 -0
  445. data/vendor/rack-0.9.1/lib/rack/handler/evented_mongrel.rb +8 -0
  446. data/vendor/rack-0.9.1/lib/rack/handler/fastcgi.rb +86 -0
  447. data/vendor/rack-0.9.1/lib/rack/handler/lsws.rb +52 -0
  448. data/vendor/rack-0.9.1/lib/rack/handler/mongrel.rb +82 -0
  449. data/vendor/rack-0.9.1/lib/rack/handler/scgi.rb +57 -0
  450. data/vendor/rack-0.9.1/lib/rack/handler/swiftiplied_mongrel.rb +8 -0
  451. data/vendor/rack-0.9.1/lib/rack/handler/thin.rb +15 -0
  452. data/vendor/rack-0.9.1/lib/rack/handler/webrick.rb +61 -0
  453. data/vendor/rack-0.9.1/lib/rack/head.rb +19 -0
  454. data/vendor/rack-0.9.1/lib/rack/lint.rb +465 -0
  455. data/vendor/rack-0.9.1/lib/rack/lobster.rb +65 -0
  456. data/vendor/rack-0.9.1/lib/rack/methodoverride.rb +27 -0
  457. data/vendor/rack-0.9.1/lib/rack/mime.rb +204 -0
  458. data/vendor/rack-0.9.1/lib/rack/mock.rb +160 -0
  459. data/vendor/rack-0.9.1/lib/rack/recursive.rb +57 -0
  460. data/vendor/rack-0.9.1/lib/rack/reloader.rb +64 -0
  461. data/vendor/rack-0.9.1/lib/rack/request.rb +218 -0
  462. data/vendor/rack-0.9.1/lib/rack/response.rb +171 -0
  463. data/vendor/rack-0.9.1/lib/rack/session/abstract/id.rb +153 -0
  464. data/vendor/rack-0.9.1/lib/rack/session/cookie.rb +89 -0
  465. data/vendor/rack-0.9.1/lib/rack/session/memcache.rb +97 -0
  466. data/vendor/rack-0.9.1/lib/rack/session/pool.rb +73 -0
  467. data/vendor/rack-0.9.1/lib/rack/showexceptions.rb +348 -0
  468. data/vendor/rack-0.9.1/lib/rack/showstatus.rb +106 -0
  469. data/vendor/rack-0.9.1/lib/rack/static.rb +38 -0
  470. data/vendor/rack-0.9.1/lib/rack/urlmap.rb +48 -0
  471. data/vendor/rack-0.9.1/lib/rack/utils.rb +347 -0
  472. metadata +1197 -1055
  473. data/doc/cxxapi/System_8h-source.html +0 -251
  474. data/doc/cxxapi/classDirectoryMapper-members.html +0 -38
  475. data/doc/cxxapi/classDirectoryMapper.html +0 -203
  476. data/doc/cxxapi/classPassenger_1_1Thread.html +0 -100
  477. data/doc/cxxapi/classboost_1_1this__thread_1_1disable__syscall__interruption.html +0 -46
  478. data/doc/cxxapi/classboost_1_1this__thread_1_1restore__syscall__interruption-members.html +0 -33
  479. data/doc/cxxapi/classboost_1_1this__thread_1_1restore__syscall__interruption.html +0 -44
  480. data/doc/cxxapi/namespacePassenger.html +0 -208
  481. data/doc/cxxapi/namespacePassenger_1_1InterruptableCalls.html +0 -43
  482. data/doc/cxxapi/namespacemembers.html +0 -70
  483. data/doc/cxxapi/namespacemembers_func.html +0 -66
  484. data/doc/cxxapi/namespacemembers_type.html +0 -46
  485. data/doc/cxxapi/namespaces.html +0 -35
  486. data/doc/rdoc/classes/Passenger.html +0 -136
  487. data/doc/rdoc/classes/Passenger/AbstractRequestHandler.html +0 -402
  488. data/doc/rdoc/classes/Passenger/SpawnManager.html +0 -379
  489. data/doc/rdoc/classes/Passenger/Utils.html +0 -578
  490. data/ext/apache2/System.h +0 -228
  491. data/lib/passenger/platform_info.rb +0 -302
  492. data/lib/passenger/templates/app_exited_during_initialization.html.erb +0 -19
  493. data/test/stub/apache2/httpd.conf +0 -75
  494. data/test/stub/rails_apps/foobar/config/environments/test.rb +0 -22
  495. data/test/stub/rails_apps/mycook/config/environments/test.rb +0 -22
  496. data/test/stub/railsapp/config/environments/test.rb +0 -22
  497. data/test/stub/railsapp2/config/environments/test.rb +0 -22
@@ -1,643 +1 @@
1
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
2
- "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
4
- <head>
5
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
6
- <meta name="generator" content="AsciiDoc 8.2.7" />
7
- <style type="text/css">
8
- /* Debug borders */
9
- p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 {
10
- /*
11
- border: 1px solid red;
12
- */
13
- }
14
-
15
- body {
16
- margin: 1em 5% 1em 5%;
17
- }
18
-
19
- a {
20
- color: blue;
21
- text-decoration: underline;
22
- }
23
- a:visited {
24
- color: fuchsia;
25
- }
26
-
27
- em {
28
- font-style: italic;
29
- color: navy;
30
- }
31
-
32
- strong {
33
- font-weight: bold;
34
- color: #083194;
35
- }
36
-
37
- tt {
38
- color: navy;
39
- }
40
-
41
- h1, h2, h3, h4, h5, h6 {
42
- color: #527bbd;
43
- font-family: sans-serif;
44
- margin-top: 1.2em;
45
- margin-bottom: 0.5em;
46
- line-height: 1.3;
47
- }
48
-
49
- h1, h2, h3 {
50
- border-bottom: 2px solid silver;
51
- }
52
- h2 {
53
- padding-top: 0.5em;
54
- }
55
- h3 {
56
- float: left;
57
- }
58
- h3 + * {
59
- clear: left;
60
- }
61
-
62
- div.sectionbody {
63
- font-family: serif;
64
- margin-left: 0;
65
- }
66
-
67
- hr {
68
- border: 1px solid silver;
69
- }
70
-
71
- p {
72
- margin-top: 0.5em;
73
- margin-bottom: 0.5em;
74
- }
75
-
76
- ul, ol, li > p {
77
- margin-top: 0;
78
- }
79
-
80
- pre {
81
- padding: 0;
82
- margin: 0;
83
- }
84
-
85
- span#author {
86
- color: #527bbd;
87
- font-family: sans-serif;
88
- font-weight: bold;
89
- font-size: 1.1em;
90
- }
91
- span#email {
92
- }
93
- span#revision {
94
- font-family: sans-serif;
95
- }
96
-
97
- div#footer {
98
- font-family: sans-serif;
99
- font-size: small;
100
- border-top: 2px solid silver;
101
- padding-top: 0.5em;
102
- margin-top: 4.0em;
103
- }
104
- div#footer-text {
105
- float: left;
106
- padding-bottom: 0.5em;
107
- }
108
- div#footer-badges {
109
- float: right;
110
- padding-bottom: 0.5em;
111
- }
112
-
113
- div#preamble,
114
- div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
115
- div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
116
- div.admonitionblock {
117
- margin-right: 10%;
118
- margin-top: 1.5em;
119
- margin-bottom: 1.5em;
120
- }
121
- div.admonitionblock {
122
- margin-top: 2.5em;
123
- margin-bottom: 2.5em;
124
- }
125
-
126
- div.content { /* Block element content. */
127
- padding: 0;
128
- }
129
-
130
- /* Block element titles. */
131
- div.title, caption.title {
132
- color: #527bbd;
133
- font-family: sans-serif;
134
- font-weight: bold;
135
- text-align: left;
136
- margin-top: 1.0em;
137
- margin-bottom: 0.5em;
138
- }
139
- div.title + * {
140
- margin-top: 0;
141
- }
142
-
143
- td div.title:first-child {
144
- margin-top: 0.0em;
145
- }
146
- div.content div.title:first-child {
147
- margin-top: 0.0em;
148
- }
149
- div.content + div.title {
150
- margin-top: 0.0em;
151
- }
152
-
153
- div.sidebarblock > div.content {
154
- background: #ffffee;
155
- border: 1px solid silver;
156
- padding: 0.5em;
157
- }
158
-
159
- div.listingblock {
160
- margin-right: 0%;
161
- }
162
- div.listingblock > div.content {
163
- border: 1px solid silver;
164
- background: #f4f4f4;
165
- padding: 0.5em;
166
- }
167
-
168
- div.quoteblock {
169
- padding-left: 2.0em;
170
- }
171
- div.quoteblock > div.attribution {
172
- padding-top: 0.5em;
173
- text-align: right;
174
- }
175
-
176
- div.verseblock {
177
- padding-left: 2.0em;
178
- }
179
- div.verseblock > div.content {
180
- white-space: pre;
181
- }
182
- div.verseblock > div.attribution {
183
- padding-top: 0.75em;
184
- text-align: left;
185
- }
186
- /* DEPRECATED: Pre version 8.2.7 verse style literal block. */
187
- div.verseblock + div.attribution {
188
- text-align: left;
189
- }
190
-
191
- div.admonitionblock .icon {
192
- vertical-align: top;
193
- font-size: 1.1em;
194
- font-weight: bold;
195
- text-decoration: underline;
196
- color: #527bbd;
197
- padding-right: 0.5em;
198
- }
199
- div.admonitionblock td.content {
200
- padding-left: 0.5em;
201
- border-left: 2px solid silver;
202
- }
203
-
204
- div.exampleblock > div.content {
205
- border-left: 2px solid silver;
206
- padding: 0.5em;
207
- }
208
-
209
- div.imageblock div.content { padding-left: 0; }
210
- div.imageblock img { border: 1px solid silver; }
211
- span.image img { border-style: none; }
212
-
213
- dl {
214
- margin-top: 0.8em;
215
- margin-bottom: 0.8em;
216
- }
217
- dt {
218
- margin-top: 0.5em;
219
- margin-bottom: 0;
220
- font-style: normal;
221
- }
222
- dd > *:first-child {
223
- margin-top: 0.1em;
224
- }
225
-
226
- ul, ol {
227
- list-style-position: outside;
228
- }
229
- div.olist > ol {
230
- list-style-type: decimal;
231
- }
232
- div.olist2 > ol {
233
- list-style-type: lower-alpha;
234
- }
235
-
236
- div.tableblock > table {
237
- border: 3px solid #527bbd;
238
- }
239
- thead {
240
- font-family: sans-serif;
241
- font-weight: bold;
242
- }
243
- tfoot {
244
- font-weight: bold;
245
- }
246
-
247
- div.hlist {
248
- margin-top: 0.8em;
249
- margin-bottom: 0.8em;
250
- }
251
- div.hlist td {
252
- padding-bottom: 15px;
253
- }
254
- td.hlist1 {
255
- vertical-align: top;
256
- font-style: normal;
257
- padding-right: 0.8em;
258
- }
259
- td.hlist2 {
260
- vertical-align: top;
261
- }
262
-
263
- @media print {
264
- div#footer-badges { display: none; }
265
- }
266
-
267
- div#toctitle {
268
- color: #527bbd;
269
- font-family: sans-serif;
270
- font-size: 1.1em;
271
- font-weight: bold;
272
- margin-top: 1.0em;
273
- margin-bottom: 0.1em;
274
- }
275
-
276
- div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
277
- margin-top: 0;
278
- margin-bottom: 0;
279
- }
280
- div.toclevel2 {
281
- margin-left: 2em;
282
- font-size: 0.9em;
283
- }
284
- div.toclevel3 {
285
- margin-left: 4em;
286
- font-size: 0.9em;
287
- }
288
- div.toclevel4 {
289
- margin-left: 6em;
290
- font-size: 0.9em;
291
- }
292
- /* Workarounds for IE6's broken and incomplete CSS2. */
293
-
294
- div.sidebar-content {
295
- background: #ffffee;
296
- border: 1px solid silver;
297
- padding: 0.5em;
298
- }
299
- div.sidebar-title, div.image-title {
300
- color: #527bbd;
301
- font-family: sans-serif;
302
- font-weight: bold;
303
- margin-top: 0.0em;
304
- margin-bottom: 0.5em;
305
- }
306
-
307
- div.listingblock div.content {
308
- border: 1px solid silver;
309
- background: #f4f4f4;
310
- padding: 0.5em;
311
- }
312
-
313
- div.quoteblock-attribution {
314
- padding-top: 0.5em;
315
- text-align: right;
316
- }
317
-
318
- div.verseblock-content {
319
- white-space: pre;
320
- }
321
- div.verseblock-attribution {
322
- padding-top: 0.75em;
323
- text-align: left;
324
- }
325
-
326
- div.exampleblock-content {
327
- border-left: 2px solid silver;
328
- padding-left: 0.5em;
329
- }
330
-
331
- /* IE6 sets dynamically generated links as visited. */
332
- div#toc a:visited { color: blue; }
333
-
334
- /* Because IE6 child selector is broken. */
335
- div.olist2 ol {
336
- list-style-type: lower-alpha;
337
- }
338
- div.olist2 div.olist ol {
339
- list-style-type: decimal;
340
- }
341
- </style>
342
- <script type="text/javascript">
343
- /*<![CDATA[*/
344
- window.onload = function(){generateToc(3)}
345
- /* Author: Mihai Bazon, September 2002
346
- * http://students.infoiasi.ro/~mishoo
347
- *
348
- * Table Of Content generator
349
- * Version: 0.4
350
- *
351
- * Feel free to use this script under the terms of the GNU General Public
352
- * License, as long as you do not remove or alter this notice.
353
- */
354
-
355
- /* modified by Troy D. Hanson, September 2006. License: GPL */
356
- /* modified by Stuart Rackham, October 2006. License: GPL */
357
-
358
- function getText(el) {
359
- var text = "";
360
- for (var i = el.firstChild; i != null; i = i.nextSibling) {
361
- if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
362
- text += i.data;
363
- else if (i.firstChild != null)
364
- text += getText(i);
365
- }
366
- return text;
367
- }
368
-
369
- function TocEntry(el, text, toclevel) {
370
- this.element = el;
371
- this.text = text;
372
- this.toclevel = toclevel;
373
- }
374
-
375
- function tocEntries(el, toclevels) {
376
- var result = new Array;
377
- var re = new RegExp('[hH]([2-'+(toclevels+1)+'])');
378
- // Function that scans the DOM tree for header elements (the DOM2
379
- // nodeIterator API would be a better technique but not supported by all
380
- // browsers).
381
- var iterate = function (el) {
382
- for (var i = el.firstChild; i != null; i = i.nextSibling) {
383
- if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
384
- var mo = re.exec(i.tagName)
385
- if (mo)
386
- result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
387
- iterate(i);
388
- }
389
- }
390
- }
391
- iterate(el);
392
- return result;
393
- }
394
-
395
- // This function does the work. toclevels = 1..4.
396
- function generateToc(toclevels) {
397
- var toc = document.getElementById("toc");
398
- var entries = tocEntries(document.getElementsByTagName("body")[0], toclevels);
399
- for (var i = 0; i < entries.length; ++i) {
400
- var entry = entries[i];
401
- if (entry.element.id == "")
402
- entry.element.id = "toc" + i;
403
- var a = document.createElement("a");
404
- a.href = "#" + entry.element.id;
405
- a.appendChild(document.createTextNode(entry.text));
406
- var div = document.createElement("div");
407
- div.appendChild(a);
408
- div.className = "toclevel" + entry.toclevel;
409
- toc.appendChild(div);
410
- }
411
- if (entries.length == 0)
412
- document.getElementById("header").removeChild(toc);
413
- }
414
- /*]]>*/
415
- </script>
416
- <title>Security of user switching support in Passenger</title>
417
- </head>
418
- <body>
419
- <div id="header">
420
- <h1>Security of user switching support in Passenger</h1>
421
- <div id="toc">
422
- <div id="toctitle">Table of Contents</div>
423
- <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
424
- </div>
425
- </div>
426
- <h2 id="_problem_description">1. Problem description</h2>
427
- <div class="sectionbody">
428
- <div class="admonitionblock">
429
- <table><tr>
430
- <td class="icon">
431
- <img src="./images/icons/tip.png" alt="Tip" />
432
- </td>
433
- <td class="content">It is strongly recommended that you first read our
434
- <a href="Architectural%20overview.html">Architectural Overview</a>.</td>
435
- </tr></table>
436
- </div>
437
- <div class="para"><p>A straightforward implementation of Passenger will spawn Rails applications in
438
- the same user context as Apache itself. On server machines which host multiple
439
- websites for multiple users, this may not be desired. All Rails applications
440
- spawned by Passenger will be able to read and write to all directories that the
441
- web server can. So for example, Joe's Rails applications could read Jane's
442
- Rails application's <em>database.yml</em> or delete her application files. This is
443
- also a problem that typically plagues PHP web hosts.</p></div>
444
- <div class="para"><p>There are multiple ways to solve this problem. The goal of this document is to
445
- inform the reader about the solutions have we have analyzed, so that
446
- Passenger's security may be peer reviewed.</p></div>
447
- </div>
448
- <h2 id="_analysis_of_possible_solutions">2. Analysis of possible solutions</h2>
449
- <div class="sectionbody">
450
- <div class="para"><p>It seems that the only way to solve this problem on Unix, is to run each Rails
451
- application server as its owner's user and group. Passenger can make use of
452
- one of the following methods to implement this:</p></div>
453
- <div class="olist"><ol>
454
- <li>
455
- <p>
456
- Apache (and thus Passenger) must already be running as root.
457
- </p>
458
- </li>
459
- <li>
460
- <p>
461
- Using Apache's suEXEC.
462
- </p>
463
- </li>
464
- <li>
465
- <p>
466
- A setuid root wrapper application must exist, to allow non-root processes
467
- to obtain root privileges (or at least, the privilege to switch user).
468
- </p>
469
- </li>
470
- <li>
471
- <p>
472
- For each user $X that Passenger will need to switch to, there must exist
473
- a setuid $X wrapper application.
474
- </p>
475
- </li>
476
- <li>
477
- <p>
478
- Using <em>su</em>.
479
- </p>
480
- </li>
481
- <li>
482
- <p>
483
- Using <em>sudo</em>.
484
- </p>
485
- </li>
486
- </ol></div>
487
- <div class="para"><p>Let us take a look at each method in detail.</p></div>
488
- <h3 id="apache_root">2.1. Apache must already be running as root</h3><div style="clear:left"></div>
489
- <div class="para"><p>First, let us take a look at the typical Apache setup, in which Apache is bound
490
- to port 80, and uses the prefork MPM. Binding to any port lower than 1024
491
- requires root privileges, so Apache is typically run as root. This poses an
492
- unacceptable security risk, so Apache's prefork MPM will, upon receiving an
493
- HTTP request, spawn a child process with the privileges of a normal user,
494
- typically <em>www-data</em> or <em>nobody</em>.
495
- See <a href="http://httpd.apache.org/docs/2.2/mod/prefork.html">the documentation for the
496
- prefork MPM</a> - in particular the &#8220;User&#8221; and &#8220;Group&#8221; directives - for details.
497
- The process which is responsible for spawning child processes (also called the
498
- control process) is run as root. This is also true for
499
- <a href="http://httpd.apache.org/docs/2.2/mod/worker.html">the worker MPM</a>.</p></div>
500
- <div class="para"><p>Since Passenger has access to the control process, in the typical Apache setup,
501
- Passenger can already launch Rails applications as a different user. But now we
502
- have to ask this question:</p></div>
503
- <div class="exampleblock">
504
- <div class="exampleblock-content">
505
- <div class="para"><p>If Apache is not running as root, are there still any Passenger users who
506
- want to run Rails applications as different users?</p></div>
507
- </div></div>
508
- <div class="para"><p>If the answer is yes, then we cannot use this method.</p></div>
509
- <div class="para"><p>The advantage of this method is that setting up Apache to run as root is
510
- incredibly easy, and requires no new framework to be written. However, testing
511
- this method in automated unit tests will require running the unit test suit as
512
- root.</p></div>
513
- <h3 id="_using_apache_s_suexec">2.2. Using Apache's suEXEC</h3><div style="clear:left"></div>
514
- <div class="para"><p>Apache's <a href="http://httpd.apache.org/docs/2.0/suexec.html">suEXEC</a> allows one to
515
- run CGI processes as different users. But it seems that suEXEC can only be
516
- used for CGI, and is not a general-purpose mechanism. The
517
- <a href="http://alain.knaff.lu/howto/PhpSuexec/">PHP-suEXEC</a> software allows one to run
518
- PHP applications via suEXEC, but it requires patching suEXEC. If Passenger is
519
- to use suEXEC, then it is likely that we'll have to patch suEXEC. The suEXEC
520
- website strongly discourages patching.</p></div>
521
- <h3 id="_using_a_setuid_root_wrapper_application">2.3. Using a setuid root wrapper application</h3><div style="clear:left"></div>
522
- <div class="para"><p>If we use this method, we must be extremely careful. It must not be possible
523
- for arbitrary processes to gain root privileges. We want Passenger, and only
524
- Passenger, to be able to gain root privileges.</p></div>
525
- <div class="para"><p>There are multiple ways to implement this security. The first one is to use
526
- a password file, which only Apache and the wrapper can read, through
527
- the use of proper file permissions. The password file must never be world
528
- readable or writable.</p></div>
529
- <div class="para"><p>It works as follows:</p></div>
530
- <div class="olist"><ol>
531
- <li>
532
- <p>
533
- Passenger runs the wrapper.
534
- </p>
535
- </li>
536
- <li>
537
- <p>
538
- Passenger passes the content of the password file to the wrapper, via
539
- an anonymous pipe (or some other anonymous channel, that no other
540
- processes can access).
541
- </p>
542
- </li>
543
- <li>
544
- <p>
545
- The wrapper checks whether the passed content is the same as what is in
546
- the password file. If it is, then it is proven that whatever application
547
- ran the wrapper has read access to the password file, and thus is authorized
548
- to use the wrapper.
549
- </p>
550
- </li>
551
- </ol></div>
552
- <div class="para"><p>An obvious problem that arises is: how does the wrapper locate its own password
553
- file? We obviously do not want to be able to specify the password filename as
554
- an argument to the wrapper: that would defeat the point of the password file.
555
- The solution is that the filename is to be hardcoded into the binary during
556
- compile time.</p></div>
557
- <div class="para"><p>Another way to implement security is to use a whitelist of users that are
558
- allowed to use the wrapper. The wrapper can then check whether the calling
559
- process's user is in the whitelist.</p></div>
560
- <div class="para"><p>Writing a wrapper is not too hard. Furthermore, unit tests do not have to be
561
- run as root, in contrast to the run-Apache-as-root method.</p></div>
562
- <h3 id="setuid_root">2.4. Using a setuid $X wrapper application</h3><div style="clear:left"></div>
563
- <div class="para"><p>A setuid $X wrapper will work in a fashion similar to the setuid root wrapper,
564
- i.e. it will use a password file for authorization.</p></div>
565
- <div class="para"><p>Passenger does not spawn Rails applications itself, but does so via the spawn
566
- server. This spawn server is also responsible for preloading the Rails
567
- framework and the Rails application code, in order to speed up the spawning
568
- of Rails applications. See the design document of the spawn server for details.
569
- The spawn server never calls <tt>exec()</tt>: doing so will make preloading useless.
570
- If Passenger is to use a setuid $X wrapper, then it must start the spawn
571
- server via the wrapper. The spawn server itself cannot use the wrapper.</p></div>
572
- <div class="para"><p>However, doing so will make preloading less efficient. Passenger will be forced
573
- to run a spawn server for each user. The different spawn servers do not share
574
- memory with each other, so a lot of memory is wasted compared to the other
575
- methods.</p></div>
576
- <div class="para"><p>Implementing this will also take more work. One has to create a different
577
- wrapper for each user, and to install it.</p></div>
578
- <h3 id="_using_em_su_em">2.5. Using <em>su</em></h3><div style="clear:left"></div>
579
- <div class="para"><p>The standard Unix <em>su</em> tool asks for the root password. It's a bad idea for
580
- Apache to know the root password, so using <em>su</em> is not a viable alternative.</p></div>
581
- <h3 id="_using_em_sudo_em">2.6. Using <em>sudo</em></h3><div style="clear:left"></div>
582
- <div class="para"><p>It might be possible to use the <em>sudo</em> utility. sudo can be configured in
583
- such a way that the user Apache runs as can use sudo without having to enter a
584
- password.</p></div>
585
- <div class="para"><p>However, Passenger uses an anonymous communication channel (an unnamed Unix
586
- socket) to communicate with the spawn server. sudo seems to close all file
587
- descriptors before executing an application, so Passenger will have to
588
- communicate with the spawn server via a non-anonymous channel, such as a named
589
- Unix socket. Because other processes can access this channel, it can introduce
590
- potential security problems. Note that passing information via program arguments
591
- is not secure: it is possible to view that information with tools like <em>ps</em>,
592
- or (on Linux) by reading the file <tt>/proc/$PID/cmdline</tt>.</p></div>
593
- <div class="para"><p>So it seems <em>sudo</em> is not a viable alternative.</p></div>
594
- <h3 id="_common_security_issues">2.7. Common security issues</h3><div style="clear:left"></div>
595
- <div class="para"><p>Whatever method Passenger will use, the following security principles must be
596
- honored:</p></div>
597
- <div class="ilist"><ul>
598
- <li>
599
- <p>
600
- Rails applications must never be run as root.
601
- </p>
602
- </li>
603
- </ul></div>
604
- <div class="para"><p>It might also be worthy to look into suEXEC's security model for inspiration.</p></div>
605
- <div class="para"><p>Also, the following questions remain:</p></div>
606
- <div class="ilist"><ul>
607
- <li>
608
- <p>
609
- Is there a need for a user whitelist/blacklist? That is, is there a need for
610
- the ability to restrict the set of users that Passenger can switch to?
611
- </p>
612
- </li>
613
- </ul></div>
614
- </div>
615
- <h2 id="_chosen_solution">3. Chosen solution</h2>
616
- <div class="sectionbody">
617
- <div class="para"><p>Running Apache as root and writing a setuid root wrapper are the main
618
- contestants. The former is preferred, because it's easier to implement.</p></div>
619
- <div class="para"><p>We have had some conversations with people on the IRC channel #rubyonrails.
620
- Among those people, nobody has ever run Apache as non-root. Because of this
621
- we have chosen to implement the <a href="#apache_root">Running Apache as root</a>
622
- solution, until a significant number of users request us to implement the
623
- <a href="#setuid_root">setuid root wrapper</a> solution.</p></div>
624
- <div class="para"><p>Please read <a href="rdoc/index.html">the Ruby API documentation</a> &#8212; in particular
625
- that of the <em>ApplicationSpawner</em> class &#8212; for implementation details. But to
626
- make a long story short: it will switch to the owner of the file
627
- <em>config/environment.rb</em>. User whitelisting/blacklisting is currently not
628
- implemented. We rely on the system administrator to set the correct owner
629
- on that file.</p></div>
630
- <div class="para"><p>We have also not implemented suEXEC's security model. suEXEC's model is quite
631
- paranoid, and although paranoia is good to a certain extend, it can be in the
632
- way of usability while proving little extra security. We are not entirely
633
- convinced that implementing suEXEC's full security model will provide
634
- significant benefits, but if you have good reasons to think otherwise, please
635
- feel free to discuss it with us.</p></div>
636
- </div>
637
- <div id="footer">
638
- <div id="footer-text">
639
- Last updated 2008-12-01 14:21:18 CEST
640
- </div>
641
- </div>
642
- </body>
643
- </html>
1
+ asciidoc required to build docs