passenger 3.0.7 → 3.0.8

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 (439) hide show
  1. data/NEWS +27 -0
  2. data/README +1 -1
  3. data/bin/passenger-install-nginx-module +3 -1
  4. data/build/config.rb +2 -1
  5. data/build/cxx_tests.rb +7 -3
  6. data/build/documentation.rb +5 -40
  7. data/build/nginx.rb +0 -1
  8. data/build/packaging.rb +0 -6
  9. data/build/rake_extensions.rb +5 -0
  10. data/doc/Architectural overview.html +344 -77
  11. data/doc/Security of user switching support.html +338 -71
  12. data/doc/Users guide Apache with comments.html +4830 -0
  13. data/doc/Users guide Apache.html +695 -428
  14. data/doc/Users guide Apache.idmap.txt +80 -0
  15. data/doc/Users guide Apache.txt +5 -5
  16. data/doc/Users guide Nginx.html +591 -313
  17. data/doc/Users guide Nginx.txt +9 -3
  18. data/doc/Users guide Standalone.html +344 -77
  19. data/ext/boost/src/pthread/thread.cpp +1 -1
  20. data/ext/common/AccountsDatabase.h +1 -1
  21. data/ext/common/Constants.h +2 -2
  22. data/ext/common/Logging.h +2 -1
  23. data/ext/common/LoggingAgent/FilterSupport.h +107 -3
  24. data/ext/common/Session.h +1 -1
  25. data/ext/common/Utils.cpp +2 -0
  26. data/ext/common/Utils/Dechunker.h +232 -0
  27. data/ext/common/Utils/HttpHeaderBufferer.h +165 -0
  28. data/ext/common/Utils/StrIntUtils.cpp +51 -15
  29. data/ext/common/Utils/StrIntUtils.h +3 -0
  30. data/ext/common/Utils/StreamBoyerMooreHorspool.h +506 -0
  31. data/ext/nginx/Configuration.c +36 -282
  32. data/ext/nginx/ContentHandler.c +17 -0
  33. data/ext/nginx/HelperAgent.cpp +397 -39
  34. data/ext/oxt/tracable_exception.cpp +3 -1
  35. data/ext/ruby/extconf.rb +1 -0
  36. data/ext/ruby/passenger_native_support.c +3 -0
  37. data/helper-scripts/prespawn +113 -31
  38. data/lib/phusion_passenger.rb +2 -2
  39. data/lib/phusion_passenger/standalone/runtime_installer.rb +3 -2
  40. data/lib/phusion_passenger/standalone/start_command.rb +12 -12
  41. data/test/cxx/DechunkerTest.cpp +216 -0
  42. data/test/cxx/FilterSupportTest.cpp +31 -4
  43. data/test/cxx/HttpHeaderBuffererTest.cpp +203 -0
  44. data/test/cxx/UtilsTest.cpp +46 -3
  45. data/test/integration_tests/hello_world_rack_spec.rb +7 -0
  46. data/test/stub/rack/config.ru +6 -1
  47. data/test/stub/rails_apps/1.2/empty/public/dispatch.cgi +1 -1
  48. data/test/stub/rails_apps/1.2/empty/public/dispatch.fcgi +1 -1
  49. data/test/stub/rails_apps/1.2/empty/public/dispatch.rb +1 -1
  50. data/test/stub/rails_apps/2.0/empty/public/dispatch.cgi +1 -1
  51. data/test/stub/rails_apps/2.0/empty/public/dispatch.fcgi +1 -1
  52. data/test/stub/rails_apps/2.0/empty/public/dispatch.rb +1 -1
  53. data/test/stub/rails_apps/2.2/empty/public/dispatch.cgi +1 -1
  54. data/test/stub/rails_apps/2.2/empty/public/dispatch.fcgi +1 -1
  55. data/test/stub/rails_apps/2.2/empty/public/dispatch.rb +1 -1
  56. metadata +20 -403
  57. data/doc/Doxyfile +0 -241
  58. data/doc/cxxapi/AbstractSpawnManager_8h_source.html +0 -141
  59. data/doc/cxxapi/Account_8h_source.html +0 -206
  60. data/doc/cxxapi/AccountsDatabase_8h_source.html +0 -161
  61. data/doc/cxxapi/AgentBase_8h_source.html +0 -70
  62. data/doc/cxxapi/AgentsStarter_8h_source.html +0 -112
  63. data/doc/cxxapi/BCrypt_8h_source.html +0 -104
  64. data/doc/cxxapi/Blowfish_8h_source.html +0 -134
  65. data/doc/cxxapi/Bucket_8h_source.html +0 -118
  66. data/doc/cxxapi/Constants_8h_source.html +0 -79
  67. data/doc/cxxapi/ContentHandler_8h_source.html +0 -95
  68. data/doc/cxxapi/DirectoryMapper_8h_source.html +0 -311
  69. data/doc/cxxapi/EventedClient_8h_source.html +0 -733
  70. data/doc/cxxapi/EventedMessageServer_8h_source.html +0 -358
  71. data/doc/cxxapi/EventedServer_8h_source.html +0 -326
  72. data/doc/cxxapi/Exceptions_8h_source.html +0 -393
  73. data/doc/cxxapi/FileDescriptor_8h_source.html +0 -324
  74. data/doc/cxxapi/Hooks_8h_source.html +0 -76
  75. data/doc/cxxapi/HttpStatusExtractor_8h_source.html +0 -382
  76. data/doc/cxxapi/IniFile_8h_source.html +0 -527
  77. data/doc/cxxapi/Logging_8h_source.html +0 -796
  78. data/doc/cxxapi/MessageChannel_8h_source.html +0 -776
  79. data/doc/cxxapi/MessageClient_8h_source.html +0 -328
  80. data/doc/cxxapi/MessageReadersWriters_8h_source.html +0 -539
  81. data/doc/cxxapi/MessageServer_8h_source.html +0 -612
  82. data/doc/cxxapi/PoolOptions_8h_source.html +0 -549
  83. data/doc/cxxapi/Process_8h_source.html +0 -286
  84. data/doc/cxxapi/RandomGenerator_8h_source.html +0 -191
  85. data/doc/cxxapi/ResourceLocator_8h_source.html +0 -166
  86. data/doc/cxxapi/SafeLibev_8h_source.html +0 -180
  87. data/doc/cxxapi/ScgiRequestParser_8h_source.html +0 -406
  88. data/doc/cxxapi/ServerInstanceDir_8h_source.html +0 -378
  89. data/doc/cxxapi/Session_8h_source.html +0 -501
  90. data/doc/cxxapi/SpawnManager_8h_source.html +0 -647
  91. data/doc/cxxapi/StaticContentHandler_8h_source.html +0 -69
  92. data/doc/cxxapi/StaticString_8h_source.html +0 -329
  93. data/doc/cxxapi/StringListCreator_8h_source.html +0 -114
  94. data/doc/cxxapi/Utils_8h_source.html +0 -469
  95. data/doc/cxxapi/annotated.html +0 -87
  96. data/doc/cxxapi/apache2_2Configuration_8h_source.html +0 -82
  97. data/doc/cxxapi/classAgentWatcher-members.html +0 -54
  98. data/doc/cxxapi/classAgentWatcher.html +0 -419
  99. data/doc/cxxapi/classClient-members.html +0 -38
  100. data/doc/cxxapi/classClient.html +0 -123
  101. data/doc/cxxapi/classHooks-members.html +0 -40
  102. data/doc/cxxapi/classHooks.html +0 -153
  103. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager-members.html +0 -40
  104. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager.html +0 -187
  105. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.map +0 -3
  106. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.md5 +0 -1
  107. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.png +0 -0
  108. data/doc/cxxapi/classPassenger_1_1ArgumentException-members.html +0 -36
  109. data/doc/cxxapi/classPassenger_1_1ArgumentException.html +0 -56
  110. data/doc/cxxapi/classPassenger_1_1ArrayMessage-members.html +0 -37
  111. data/doc/cxxapi/classPassenger_1_1ArrayMessage.html +0 -113
  112. data/doc/cxxapi/classPassenger_1_1BufferedUpload-members.html +0 -38
  113. data/doc/cxxapi/classPassenger_1_1BufferedUpload.html +0 -112
  114. data/doc/cxxapi/classPassenger_1_1BusyException-members.html +0 -36
  115. data/doc/cxxapi/classPassenger_1_1BusyException.html +0 -54
  116. data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +0 -36
  117. data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +0 -51
  118. data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +0 -41
  119. data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +0 -223
  120. data/doc/cxxapi/classPassenger_1_1EOFException-members.html +0 -36
  121. data/doc/cxxapi/classPassenger_1_1EOFException.html +0 -61
  122. data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.map +0 -3
  123. data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.md5 +0 -1
  124. data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.png +0 -0
  125. data/doc/cxxapi/classPassenger_1_1EventFd-members.html +0 -36
  126. data/doc/cxxapi/classPassenger_1_1EventFd.html +0 -52
  127. data/doc/cxxapi/classPassenger_1_1EventedClient-members.html +0 -59
  128. data/doc/cxxapi/classPassenger_1_1EventedClient.html +0 -531
  129. data/doc/cxxapi/classPassenger_1_1EventedMessageServer-members.html +0 -37
  130. data/doc/cxxapi/classPassenger_1_1EventedMessageServer.html +0 -59
  131. data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.map +0 -3
  132. data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.md5 +0 -1
  133. data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.png +0 -0
  134. data/doc/cxxapi/classPassenger_1_1EventedServer-members.html +0 -37
  135. data/doc/cxxapi/classPassenger_1_1EventedServer.html +0 -93
  136. data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.map +0 -3
  137. data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.md5 +0 -1
  138. data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.png +0 -0
  139. data/doc/cxxapi/classPassenger_1_1FileDescriptor-members.html +0 -41
  140. data/doc/cxxapi/classPassenger_1_1FileDescriptor.html +0 -178
  141. data/doc/cxxapi/classPassenger_1_1FileDescriptorPair-members.html +0 -36
  142. data/doc/cxxapi/classPassenger_1_1FileDescriptorPair.html +0 -52
  143. data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +0 -36
  144. data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +0 -58
  145. data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.map +0 -3
  146. data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.md5 +0 -1
  147. data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.png +0 -0
  148. data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +0 -41
  149. data/doc/cxxapi/classPassenger_1_1FileSystemException.html +0 -66
  150. data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.map +0 -3
  151. data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.md5 +0 -1
  152. data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.png +0 -0
  153. data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor-members.html +0 -39
  154. data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor.html +0 -128
  155. data/doc/cxxapi/classPassenger_1_1IOException-members.html +0 -36
  156. data/doc/cxxapi/classPassenger_1_1IOException.html +0 -61
  157. data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.map +0 -4
  158. data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.md5 +0 -1
  159. data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.png +0 -0
  160. data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +0 -57
  161. data/doc/cxxapi/classPassenger_1_1MessageChannel.html +0 -839
  162. data/doc/cxxapi/classPassenger_1_1MessageServer-members.html +0 -49
  163. data/doc/cxxapi/classPassenger_1_1MessageServer.html +0 -407
  164. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext-members.html +0 -36
  165. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext.html +0 -58
  166. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.map +0 -3
  167. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.md5 +0 -1
  168. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.png +0 -0
  169. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext-members.html +0 -41
  170. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext.html +0 -165
  171. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.map +0 -3
  172. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.md5 +0 -1
  173. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.png +0 -0
  174. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler-members.html +0 -39
  175. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler.html +0 -173
  176. data/doc/cxxapi/classPassenger_1_1Process-members.html +0 -44
  177. data/doc/cxxapi/classPassenger_1_1Process.html +0 -290
  178. data/doc/cxxapi/classPassenger_1_1RandomGenerator-members.html +0 -37
  179. data/doc/cxxapi/classPassenger_1_1RandomGenerator.html +0 -79
  180. data/doc/cxxapi/classPassenger_1_1ResourceLocator-members.html +0 -36
  181. data/doc/cxxapi/classPassenger_1_1ResourceLocator.html +0 -51
  182. data/doc/cxxapi/classPassenger_1_1RuntimeException-members.html +0 -36
  183. data/doc/cxxapi/classPassenger_1_1RuntimeException.html +0 -54
  184. data/doc/cxxapi/classPassenger_1_1SafeLibev-members.html +0 -36
  185. data/doc/cxxapi/classPassenger_1_1SafeLibev.html +0 -51
  186. data/doc/cxxapi/classPassenger_1_1ScalarMessage-members.html +0 -37
  187. data/doc/cxxapi/classPassenger_1_1ScalarMessage.html +0 -76
  188. data/doc/cxxapi/classPassenger_1_1ScgiRequestParser-members.html +0 -50
  189. data/doc/cxxapi/classPassenger_1_1ScgiRequestParser.html +0 -285
  190. data/doc/cxxapi/classPassenger_1_1SecurityException-members.html +0 -36
  191. data/doc/cxxapi/classPassenger_1_1SecurityException.html +0 -56
  192. data/doc/cxxapi/classPassenger_1_1Session-members.html +0 -53
  193. data/doc/cxxapi/classPassenger_1_1Session.html +0 -556
  194. data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.map +0 -3
  195. data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.md5 +0 -1
  196. data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.png +0 -0
  197. data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +0 -39
  198. data/doc/cxxapi/classPassenger_1_1SpawnException.html +0 -101
  199. data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +0 -42
  200. data/doc/cxxapi/classPassenger_1_1SpawnManager.html +0 -292
  201. data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.map +0 -3
  202. data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.md5 +0 -1
  203. data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.png +0 -0
  204. data/doc/cxxapi/classPassenger_1_1StandardSession-members.html +0 -54
  205. data/doc/cxxapi/classPassenger_1_1StandardSession.html +0 -394
  206. data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.map +0 -3
  207. data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.md5 +0 -1
  208. data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.png +0 -0
  209. data/doc/cxxapi/classPassenger_1_1StaticString-members.html +0 -36
  210. data/doc/cxxapi/classPassenger_1_1StaticString.html +0 -56
  211. data/doc/cxxapi/classPassenger_1_1SyntaxError-members.html +0 -36
  212. data/doc/cxxapi/classPassenger_1_1SyntaxError.html +0 -54
  213. data/doc/cxxapi/classPassenger_1_1SystemException-members.html +0 -40
  214. data/doc/cxxapi/classPassenger_1_1SystemException.html +0 -155
  215. data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.map +0 -4
  216. data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.md5 +0 -1
  217. data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.png +0 -0
  218. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException-members.html +0 -40
  219. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException.html +0 -61
  220. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.map +0 -3
  221. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.md5 +0 -1
  222. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.png +0 -0
  223. data/doc/cxxapi/classPassenger_1_1TimeoutException-members.html +0 -36
  224. data/doc/cxxapi/classPassenger_1_1TimeoutException.html +0 -54
  225. data/doc/cxxapi/classPassenger_1_1Uint16Message-members.html +0 -36
  226. data/doc/cxxapi/classPassenger_1_1Uint16Message.html +0 -51
  227. data/doc/cxxapi/classPassenger_1_1Uint32Message-members.html +0 -36
  228. data/doc/cxxapi/classPassenger_1_1Uint32Message.html +0 -51
  229. data/doc/cxxapi/classServer-members.html +0 -36
  230. data/doc/cxxapi/classServer.html +0 -49
  231. data/doc/cxxapi/classServerInstanceDirToucher-members.html +0 -36
  232. data/doc/cxxapi/classServerInstanceDirToucher.html +0 -47
  233. data/doc/cxxapi/classes.html +0 -52
  234. data/doc/cxxapi/definitions_8h_source.html +0 -36
  235. data/doc/cxxapi/doxygen.css +0 -532
  236. data/doc/cxxapi/doxygen.png +0 -0
  237. data/doc/cxxapi/files.html +0 -76
  238. data/doc/cxxapi/ftv2blank.png +0 -0
  239. data/doc/cxxapi/ftv2doc.png +0 -0
  240. data/doc/cxxapi/ftv2folderclosed.png +0 -0
  241. data/doc/cxxapi/ftv2folderopen.png +0 -0
  242. data/doc/cxxapi/ftv2lastnode.png +0 -0
  243. data/doc/cxxapi/ftv2link.png +0 -0
  244. data/doc/cxxapi/ftv2mlastnode.png +0 -0
  245. data/doc/cxxapi/ftv2mnode.png +0 -0
  246. data/doc/cxxapi/ftv2node.png +0 -0
  247. data/doc/cxxapi/ftv2plastnode.png +0 -0
  248. data/doc/cxxapi/ftv2pnode.png +0 -0
  249. data/doc/cxxapi/ftv2vertline.png +0 -0
  250. data/doc/cxxapi/functions.html +0 -103
  251. data/doc/cxxapi/functions_0x62.html +0 -82
  252. data/doc/cxxapi/functions_0x63.html +0 -102
  253. data/doc/cxxapi/functions_0x64.html +0 -102
  254. data/doc/cxxapi/functions_0x65.html +0 -88
  255. data/doc/cxxapi/functions_0x66.html +0 -100
  256. data/doc/cxxapi/functions_0x67.html +0 -167
  257. data/doc/cxxapi/functions_0x68.html +0 -88
  258. data/doc/cxxapi/functions_0x69.html +0 -96
  259. data/doc/cxxapi/functions_0x6b.html +0 -80
  260. data/doc/cxxapi/functions_0x6c.html +0 -88
  261. data/doc/cxxapi/functions_0x6d.html +0 -88
  262. data/doc/cxxapi/functions_0x6e.html +0 -86
  263. data/doc/cxxapi/functions_0x6f.html +0 -94
  264. data/doc/cxxapi/functions_0x70.html +0 -94
  265. data/doc/cxxapi/functions_0x72.html +0 -110
  266. data/doc/cxxapi/functions_0x73.html +0 -171
  267. data/doc/cxxapi/functions_0x74.html +0 -85
  268. data/doc/cxxapi/functions_0x75.html +0 -85
  269. data/doc/cxxapi/functions_0x77.html +0 -92
  270. data/doc/cxxapi/functions_0x7e.html +0 -79
  271. data/doc/cxxapi/functions_enum.html +0 -49
  272. data/doc/cxxapi/functions_eval.html +0 -67
  273. data/doc/cxxapi/functions_func.html +0 -531
  274. data/doc/cxxapi/functions_vars.html +0 -278
  275. data/doc/cxxapi/graph_legend.dot +0 -22
  276. data/doc/cxxapi/graph_legend.html +0 -92
  277. data/doc/cxxapi/graph_legend.png +0 -0
  278. data/doc/cxxapi/group__Core.html +0 -46
  279. data/doc/cxxapi/group__Core.map +0 -3
  280. data/doc/cxxapi/group__Core.png +0 -0
  281. data/doc/cxxapi/group__Exceptions.html +0 -53
  282. data/doc/cxxapi/group__Hooks.html +0 -42
  283. data/doc/cxxapi/group__Hooks.map +0 -3
  284. data/doc/cxxapi/group__Hooks.png +0 -0
  285. data/doc/cxxapi/group__Support.html +0 -538
  286. data/doc/cxxapi/hierarchy.html +0 -101
  287. data/doc/cxxapi/index.html +0 -16
  288. data/doc/cxxapi/inherit__graph__0.map +0 -3
  289. data/doc/cxxapi/inherit__graph__0.md5 +0 -1
  290. data/doc/cxxapi/inherit__graph__0.png +0 -0
  291. data/doc/cxxapi/inherit__graph__1.map +0 -3
  292. data/doc/cxxapi/inherit__graph__1.md5 +0 -1
  293. data/doc/cxxapi/inherit__graph__1.png +0 -0
  294. data/doc/cxxapi/inherit__graph__10.map +0 -3
  295. data/doc/cxxapi/inherit__graph__10.md5 +0 -1
  296. data/doc/cxxapi/inherit__graph__10.png +0 -0
  297. data/doc/cxxapi/inherit__graph__11.map +0 -4
  298. data/doc/cxxapi/inherit__graph__11.md5 +0 -1
  299. data/doc/cxxapi/inherit__graph__11.png +0 -0
  300. data/doc/cxxapi/inherit__graph__12.map +0 -3
  301. data/doc/cxxapi/inherit__graph__12.md5 +0 -1
  302. data/doc/cxxapi/inherit__graph__12.png +0 -0
  303. data/doc/cxxapi/inherit__graph__13.map +0 -3
  304. data/doc/cxxapi/inherit__graph__13.md5 +0 -1
  305. data/doc/cxxapi/inherit__graph__13.png +0 -0
  306. data/doc/cxxapi/inherit__graph__14.map +0 -3
  307. data/doc/cxxapi/inherit__graph__14.md5 +0 -1
  308. data/doc/cxxapi/inherit__graph__14.png +0 -0
  309. data/doc/cxxapi/inherit__graph__15.map +0 -3
  310. data/doc/cxxapi/inherit__graph__15.md5 +0 -1
  311. data/doc/cxxapi/inherit__graph__15.png +0 -0
  312. data/doc/cxxapi/inherit__graph__16.map +0 -5
  313. data/doc/cxxapi/inherit__graph__16.md5 +0 -1
  314. data/doc/cxxapi/inherit__graph__16.png +0 -0
  315. data/doc/cxxapi/inherit__graph__17.map +0 -3
  316. data/doc/cxxapi/inherit__graph__17.md5 +0 -1
  317. data/doc/cxxapi/inherit__graph__17.png +0 -0
  318. data/doc/cxxapi/inherit__graph__18.map +0 -3
  319. data/doc/cxxapi/inherit__graph__18.md5 +0 -1
  320. data/doc/cxxapi/inherit__graph__18.png +0 -0
  321. data/doc/cxxapi/inherit__graph__19.map +0 -4
  322. data/doc/cxxapi/inherit__graph__19.md5 +0 -1
  323. data/doc/cxxapi/inherit__graph__19.png +0 -0
  324. data/doc/cxxapi/inherit__graph__2.map +0 -3
  325. data/doc/cxxapi/inherit__graph__2.md5 +0 -1
  326. data/doc/cxxapi/inherit__graph__2.png +0 -0
  327. data/doc/cxxapi/inherit__graph__20.map +0 -3
  328. data/doc/cxxapi/inherit__graph__20.md5 +0 -1
  329. data/doc/cxxapi/inherit__graph__20.png +0 -0
  330. data/doc/cxxapi/inherit__graph__21.map +0 -3
  331. data/doc/cxxapi/inherit__graph__21.md5 +0 -1
  332. data/doc/cxxapi/inherit__graph__21.png +0 -0
  333. data/doc/cxxapi/inherit__graph__22.map +0 -3
  334. data/doc/cxxapi/inherit__graph__22.md5 +0 -1
  335. data/doc/cxxapi/inherit__graph__22.png +0 -0
  336. data/doc/cxxapi/inherit__graph__23.map +0 -3
  337. data/doc/cxxapi/inherit__graph__23.md5 +0 -1
  338. data/doc/cxxapi/inherit__graph__23.png +0 -0
  339. data/doc/cxxapi/inherit__graph__24.map +0 -3
  340. data/doc/cxxapi/inherit__graph__24.md5 +0 -1
  341. data/doc/cxxapi/inherit__graph__24.png +0 -0
  342. data/doc/cxxapi/inherit__graph__25.map +0 -3
  343. data/doc/cxxapi/inherit__graph__25.md5 +0 -1
  344. data/doc/cxxapi/inherit__graph__25.png +0 -0
  345. data/doc/cxxapi/inherit__graph__26.map +0 -3
  346. data/doc/cxxapi/inherit__graph__26.md5 +0 -1
  347. data/doc/cxxapi/inherit__graph__26.png +0 -0
  348. data/doc/cxxapi/inherit__graph__27.map +0 -3
  349. data/doc/cxxapi/inherit__graph__27.md5 +0 -1
  350. data/doc/cxxapi/inherit__graph__27.png +0 -0
  351. data/doc/cxxapi/inherit__graph__28.map +0 -3
  352. data/doc/cxxapi/inherit__graph__28.md5 +0 -1
  353. data/doc/cxxapi/inherit__graph__28.png +0 -0
  354. data/doc/cxxapi/inherit__graph__29.map +0 -3
  355. data/doc/cxxapi/inherit__graph__29.md5 +0 -1
  356. data/doc/cxxapi/inherit__graph__29.png +0 -0
  357. data/doc/cxxapi/inherit__graph__3.map +0 -4
  358. data/doc/cxxapi/inherit__graph__3.md5 +0 -1
  359. data/doc/cxxapi/inherit__graph__3.png +0 -0
  360. data/doc/cxxapi/inherit__graph__30.map +0 -3
  361. data/doc/cxxapi/inherit__graph__30.md5 +0 -1
  362. data/doc/cxxapi/inherit__graph__30.png +0 -0
  363. data/doc/cxxapi/inherit__graph__31.map +0 -4
  364. data/doc/cxxapi/inherit__graph__31.md5 +0 -1
  365. data/doc/cxxapi/inherit__graph__31.png +0 -0
  366. data/doc/cxxapi/inherit__graph__32.map +0 -3
  367. data/doc/cxxapi/inherit__graph__32.md5 +0 -1
  368. data/doc/cxxapi/inherit__graph__32.png +0 -0
  369. data/doc/cxxapi/inherit__graph__33.map +0 -3
  370. data/doc/cxxapi/inherit__graph__33.md5 +0 -1
  371. data/doc/cxxapi/inherit__graph__33.png +0 -0
  372. data/doc/cxxapi/inherit__graph__34.map +0 -3
  373. data/doc/cxxapi/inherit__graph__34.md5 +0 -1
  374. data/doc/cxxapi/inherit__graph__34.png +0 -0
  375. data/doc/cxxapi/inherit__graph__35.map +0 -3
  376. data/doc/cxxapi/inherit__graph__35.md5 +0 -1
  377. data/doc/cxxapi/inherit__graph__35.png +0 -0
  378. data/doc/cxxapi/inherit__graph__36.map +0 -5
  379. data/doc/cxxapi/inherit__graph__36.md5 +0 -1
  380. data/doc/cxxapi/inherit__graph__36.png +0 -0
  381. data/doc/cxxapi/inherit__graph__37.map +0 -3
  382. data/doc/cxxapi/inherit__graph__37.md5 +0 -1
  383. data/doc/cxxapi/inherit__graph__37.png +0 -0
  384. data/doc/cxxapi/inherit__graph__38.map +0 -3
  385. data/doc/cxxapi/inherit__graph__38.md5 +0 -1
  386. data/doc/cxxapi/inherit__graph__38.png +0 -0
  387. data/doc/cxxapi/inherit__graph__39.map +0 -3
  388. data/doc/cxxapi/inherit__graph__39.md5 +0 -1
  389. data/doc/cxxapi/inherit__graph__39.png +0 -0
  390. data/doc/cxxapi/inherit__graph__4.map +0 -3
  391. data/doc/cxxapi/inherit__graph__4.md5 +0 -1
  392. data/doc/cxxapi/inherit__graph__4.png +0 -0
  393. data/doc/cxxapi/inherit__graph__40.map +0 -3
  394. data/doc/cxxapi/inherit__graph__40.md5 +0 -1
  395. data/doc/cxxapi/inherit__graph__40.png +0 -0
  396. data/doc/cxxapi/inherit__graph__41.map +0 -3
  397. data/doc/cxxapi/inherit__graph__41.md5 +0 -1
  398. data/doc/cxxapi/inherit__graph__41.png +0 -0
  399. data/doc/cxxapi/inherit__graph__5.map +0 -3
  400. data/doc/cxxapi/inherit__graph__5.md5 +0 -1
  401. data/doc/cxxapi/inherit__graph__5.png +0 -0
  402. data/doc/cxxapi/inherit__graph__6.map +0 -3
  403. data/doc/cxxapi/inherit__graph__6.md5 +0 -1
  404. data/doc/cxxapi/inherit__graph__6.png +0 -0
  405. data/doc/cxxapi/inherit__graph__7.map +0 -3
  406. data/doc/cxxapi/inherit__graph__7.md5 +0 -1
  407. data/doc/cxxapi/inherit__graph__7.png +0 -0
  408. data/doc/cxxapi/inherit__graph__8.map +0 -3
  409. data/doc/cxxapi/inherit__graph__8.md5 +0 -1
  410. data/doc/cxxapi/inherit__graph__8.png +0 -0
  411. data/doc/cxxapi/inherit__graph__9.map +0 -3
  412. data/doc/cxxapi/inherit__graph__9.md5 +0 -1
  413. data/doc/cxxapi/inherit__graph__9.png +0 -0
  414. data/doc/cxxapi/inherits.html +0 -165
  415. data/doc/cxxapi/main.html +0 -28
  416. data/doc/cxxapi/modules.html +0 -36
  417. data/doc/cxxapi/namespacePassenger.html +0 -585
  418. data/doc/cxxapi/namespacemembers.html +0 -190
  419. data/doc/cxxapi/namespacemembers_enum.html +0 -48
  420. data/doc/cxxapi/namespacemembers_eval.html +0 -57
  421. data/doc/cxxapi/namespacemembers_func.html +0 -114
  422. data/doc/cxxapi/namespacemembers_type.html +0 -54
  423. data/doc/cxxapi/namespaces.html +0 -37
  424. data/doc/cxxapi/nginx_2Configuration_8h_source.html +0 -126
  425. data/doc/cxxapi/ngx__http__passenger__module_8h_source.html +0 -95
  426. data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard-members.html +0 -36
  427. data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard.html +0 -51
  428. data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +0 -67
  429. data/doc/cxxapi/structPassenger_1_1PoolOptions.html +0 -647
  430. data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash-members.html +0 -36
  431. data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash.html +0 -51
  432. data/doc/cxxapi/tab_b.gif +0 -0
  433. data/doc/cxxapi/tab_l.gif +0 -0
  434. data/doc/cxxapi/tab_r.gif +0 -0
  435. data/doc/cxxapi/tabs.css +0 -105
  436. data/doc/cxxapi/tree.html +0 -249
  437. data/doc/template/horo.rb +0 -613
  438. data/ext/libev/config.h +0 -122
  439. data/ext/nginx/HttpStatusExtractor.h +0 -351
@@ -0,0 +1,80 @@
1
+ ###### Autogenerated by Mizuho, DO NOT EDIT ######
2
+ # This file maps section names to IDs so that the commenting system knows which
3
+ # comments belong to which section. Section names may be changed at will but
4
+ # IDs always stay the same, allowing one to retain old comments even if you
5
+ # rename a section.
6
+ #
7
+ # This file is autogenerated but is not a cache; you MUST NOT DELETE this
8
+ # file and you must check it into your version control system. If you lose
9
+ # this file you may lose the ability to identity old comments.
10
+ #
11
+ # Entries marked with "fuzzy" indicate that the section title has changed
12
+ # and that Mizuho has found an ID which appears to be associated with that
13
+ # section. You should check whether it is correct, and if not, fix it.
14
+
15
+ 1. Support information => support-information-1ai724i
16
+
17
+ 1.1. Supported operating systems => supported-operating-systems-18x8jzn
18
+
19
+ 1.2. Where to get support => where-to-get-support-h5oojh
20
+
21
+ 2. Installing, upgrading and uninstalling Phusion Passenger => installing-upgrading-and-uninstalling-phusion-passenger-a1zbnb
22
+
23
+ 2.1. Generic installation instructions => generic-installation-instructions-eh9xhl
24
+
25
+ 2.1.1. Overview of installation methods => overview-of-installation-methods-1rv04e2
26
+
27
+ 2.1.2. Preparation (gem and source tarball only) => preparation-gem-and-source-tarball-only--11ofr29
28
+
29
+ 2.1.3. Installing via the gem => installing-via-the-gem-6zjt30
30
+
31
+ 2.1.4. Installing via the source tarball => installing-via-the-source-tarball-mly13a
32
+
33
+ 2.1.5. Installing via a native Linux package => installing-via-a-native-linux-package-7l0t4v
34
+
35
+ 2.1.6. What does the installer do? => what-does-the-installer-do--1j2bczq
36
+
37
+ 2.2. Operating system-specific instructions and information => operating-system-specific-instructions-and-information-pqoxte
38
+
39
+ 2.2.1. MacOS X => macos-x-kvt0z1
40
+
41
+ 2.2.2. Ubuntu Linux => ubuntu-linux-1uu7vpl
42
+
43
+ 2.2.3. OpenSolaris => opensolaris-t7oylf
44
+
45
+ 2.3. Upgrading or downgrading Phusion Passenger => upgrading-or-downgrading-phusion-passenger-maq6fw
46
+
47
+ 2.3.1. Via a gem or a source tarball => via-a-gem-or-a-source-tarball-wzkten
48
+
49
+ 2.3.2. Via a native Linux package => via-a-native-linux-package-12eene2
50
+
51
+ 2.4. Unloading (disabling) Phusion Passenger from Apache without uninstalling it => unloading-disabling-phusion-passenger-from-apache-without-uninstalling-it-1rb6log
52
+
53
+ 2.5. Uninstalling Phusion Passenger => uninstalling-phusion-passenger-u9x0gk
54
+
55
+ 3. Deploying a Ruby on Rails application => deploying-a-ruby-on-rails-application-itdr6l
56
+
57
+ 3.1. Deploying to a virtual host’s root => deploying-to-a-virtual-host-s-root-148jpxy
58
+
59
+ 3.2. Deploying to a sub URI => deploying-to-a-sub-uri-cukfoc
60
+
61
+ 3.3. Redeploying (restarting the Ruby on Rails application) => redeploying-restarting-the-ruby-on-rails-application--1unls8v
62
+
63
+ 3.4. Migrations => migrations-fjdjdr
64
+
65
+ 3.5. Capistrano integration => capistrano-integration-1m5sn2y
66
+
67
+ 4. Deploying a Rack-based Ruby application => deploying-a-rack-based-ruby-application-1swt4rl
68
+
69
+ 4.1. Tutorial/example: writing and deploying a Hello World Rack application => tutorial-example-writing-and-deploying-a-hello-world-rack-application-znzu46
70
+
71
+ 4.2. Deploying to a virtual host’s root => deploying-to-a-virtual-host-s-root-5wmulv
72
+
73
+ 4.3. Deploying to a sub URI => deploying-to-a-sub-uri-l6sbwx
74
+
75
+ 4.4. Redeploying (restarting the Rack application) => redeploying-restarting-the-rack-application--vn8xzn
76
+
77
+ 4.5. Rackup specifications for various web frameworks => rackup-specifications-for-various-web-frameworks-13g881i
78
+
79
+ 4.5.1. Camping => camping-1e2lve4
80
+
@@ -247,7 +247,7 @@ about setting up Ruby on Rails and Phusion Passenger on OpenSolaris and EC2.
247
247
 
248
248
  ==== Via a gem or a source tarball ====
249
249
 
250
- To ugrade or downgrade Phusion Passenger via the gem or the source tarball, install the newer
250
+ To upgrade or downgrade Phusion Passenger via the gem or the source tarball, install the newer
251
251
  or older version as you normally would; that is, install the gem or unpack the tarball, and
252
252
  run `passenger-install-apache2-module`. Eventually `passenger-install-apache2-module` will tell
253
253
  you to copy & paste some settings into the Apache configuration file; something that looks along
@@ -345,7 +345,7 @@ done this, you need to remove the Phusion Passenger files.
345
345
  `sudo apt-get remove libapache2-mod-passenger`.
346
346
 
347
347
 
348
- == Deploying a Ruby on Rails application ==
348
+ == Deploying a Ruby on Rails 1.x or 2.x (but NOT Rails >= 3.x) application ==
349
349
 
350
350
  Suppose you have a Ruby on Rails application in '/webapps/mycook', and you own
351
351
  the domain 'www.mycook.com'. You can either deploy your application to the
@@ -490,7 +490,7 @@ a shell console, just like one would normally run migrations.
490
490
  See <<capistrano,Capistrano recipe>>.
491
491
 
492
492
 
493
- == Deploying a Rack-based Ruby application ==
493
+ == Deploying a Rack-based Ruby application (including Rails >= 3) ==
494
494
 
495
495
  Phusion Passenger supports arbitrary Ruby web applications that follow the
496
496
  link:http://rack.rubyforge.org/[Rack] interface.
@@ -935,7 +935,7 @@ The default value is 'on'.
935
935
 
936
936
  ==== PassengerUser <username> ====
937
937
  If <<user_switching,user switching support>> is enabled, then Phusion Passenger will
938
- by default run the web application as the owner if the file 'config/environment.rb'
938
+ by default run the web application as the owner of the file 'config/environment.rb'
939
939
  (for Rails apps) or 'config.ru' (for Rack apps). This option allows you to override
940
940
  that behavior and explicitly set a user to run the web application as, regardless
941
941
  of the ownership of 'environment.rb'/'config.ru'.
@@ -1951,7 +1951,7 @@ To solve this problem, please <<specifying_correct_apache_install,specify the
1951
1951
  correct Apache installation>>, and <<install_passenger,reinstall Phusion
1952
1952
  Passenger>>.
1953
1953
 
1954
- ==== I get a "304 Forbidden" error ====
1954
+ ==== I get a "403 Forbidden" error ====
1955
1955
 
1956
1956
  See next subsection.
1957
1957
 
@@ -1,16 +1,35 @@
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">
1
+ <!DOCTYPE html>
2
+ <html lang="en">
4
3
  <head>
5
- <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
6
- <meta name="generator" content="AsciiDoc 8.6.1" />
4
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5
+ <meta name="generator" content="AsciiDoc 8.6.5">
7
6
  <title>Phusion Passenger users guide, Nginx version</title>
8
7
  <style type="text/css">
9
- /* Debug borders */
10
- p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 {
11
8
  /*
12
- border: 1px solid red;
13
- */
9
+ * AsciiDoc 'flask' theme for xhtml11 and html5 backends. A shameless knock-off
10
+ * of the Flask website styling (http://flask.pocoo.org/docs/).
11
+ *
12
+ * The implementation is straight-forward, consisting of the asciidoc.css file
13
+ * followed by theme specific overrides.
14
+ *
15
+ * */
16
+
17
+
18
+ /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
19
+
20
+ /* Default font. */
21
+ body {
22
+ font-family: Georgia,serif;
23
+ }
24
+
25
+ /* Title font. */
26
+ h1, h2, h3, h4, h5, h6,
27
+ div.title, caption.title,
28
+ thead, p.table.header,
29
+ #toctitle,
30
+ #author, #revnumber, #revdate, #revremark,
31
+ #footer {
32
+ font-family: Arial,Helvetica,sans-serif;
14
33
  }
15
34
 
16
35
  body {
@@ -35,13 +54,8 @@ strong {
35
54
  color: #083194;
36
55
  }
37
56
 
38
- tt {
39
- color: navy;
40
- }
41
-
42
57
  h1, h2, h3, h4, h5, h6 {
43
58
  color: #527bbd;
44
- font-family: sans-serif;
45
59
  margin-top: 1.2em;
46
60
  margin-bottom: 0.5em;
47
61
  line-height: 1.3;
@@ -59,9 +73,11 @@ h3 {
59
73
  h3 + * {
60
74
  clear: left;
61
75
  }
76
+ h5 {
77
+ font-size: 1.0em;
78
+ }
62
79
 
63
80
  div.sectionbody {
64
- font-family: serif;
65
81
  margin-left: 0;
66
82
  }
67
83
 
@@ -77,45 +93,44 @@ p {
77
93
  ul, ol, li > p {
78
94
  margin-top: 0;
79
95
  }
96
+ ul > li { color: #aaa; }
97
+ ul > li > * { color: black; }
80
98
 
81
99
  pre {
82
100
  padding: 0;
83
101
  margin: 0;
84
102
  }
85
103
 
86
- span#author {
104
+ #author {
87
105
  color: #527bbd;
88
- font-family: sans-serif;
89
106
  font-weight: bold;
90
107
  font-size: 1.1em;
91
108
  }
92
- span#email {
109
+ #email {
93
110
  }
94
- span#revnumber, span#revdate, span#revremark {
95
- font-family: sans-serif;
111
+ #revnumber, #revdate, #revremark {
96
112
  }
97
113
 
98
- div#footer {
99
- font-family: sans-serif;
114
+ #footer {
100
115
  font-size: small;
101
116
  border-top: 2px solid silver;
102
117
  padding-top: 0.5em;
103
118
  margin-top: 4.0em;
104
119
  }
105
- div#footer-text {
120
+ #footer-text {
106
121
  float: left;
107
122
  padding-bottom: 0.5em;
108
123
  }
109
- div#footer-badges {
124
+ #footer-badges {
110
125
  float: right;
111
126
  padding-bottom: 0.5em;
112
127
  }
113
128
 
114
- div#preamble {
129
+ #preamble {
115
130
  margin-top: 1.5em;
116
131
  margin-bottom: 1.5em;
117
132
  }
118
- div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
133
+ div.imageblock, div.exampleblock, div.verseblock,
119
134
  div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
120
135
  div.admonitionblock {
121
136
  margin-top: 1.0em;
@@ -135,7 +150,6 @@ div.content { /* Block element content. */
135
150
  /* Block element titles. */
136
151
  div.title, caption.title {
137
152
  color: #527bbd;
138
- font-family: sans-serif;
139
153
  font-weight: bold;
140
154
  text-align: left;
141
155
  margin-top: 1.0em;
@@ -157,13 +171,15 @@ div.content + div.title {
157
171
 
158
172
  div.sidebarblock > div.content {
159
173
  background: #ffffee;
160
- border: 1px solid silver;
174
+ border: 1px solid #dddddd;
175
+ border-left: 4px solid #f0f0f0;
161
176
  padding: 0.5em;
162
177
  }
163
178
 
164
179
  div.listingblock > div.content {
165
- border: 1px solid silver;
166
- background: #f4f4f4;
180
+ border: 1px solid #dddddd;
181
+ border-left: 5px solid #f0f0f0;
182
+ background: #f8f8f8;
167
183
  padding: 0.5em;
168
184
  }
169
185
 
@@ -171,7 +187,7 @@ div.quoteblock, div.verseblock {
171
187
  padding-left: 1.0em;
172
188
  margin-left: 1.0em;
173
189
  margin-right: 10%;
174
- border-left: 5px solid #dddddd;
190
+ border-left: 5px solid #f0f0f0;
175
191
  color: #777777;
176
192
  }
177
193
 
@@ -182,6 +198,7 @@ div.quoteblock > div.attribution {
182
198
 
183
199
  div.verseblock > pre.content {
184
200
  font-family: inherit;
201
+ font-size: inherit;
185
202
  }
186
203
  div.verseblock > div.attribution {
187
204
  padding-top: 0.75em;
@@ -254,36 +271,12 @@ div.compact div, div.compact div {
254
271
  margin-bottom: 0.1em;
255
272
  }
256
273
 
257
- div.tableblock > table {
258
- border: 3px solid #527bbd;
259
- }
260
- thead, p.table.header {
261
- font-family: sans-serif;
262
- font-weight: bold;
263
- color: #527bbd;
264
- }
265
274
  tfoot {
266
275
  font-weight: bold;
267
276
  }
268
277
  td > div.verse {
269
278
  white-space: pre;
270
279
  }
271
- p.table {
272
- margin-top: 0;
273
- }
274
- /* Because the table frame attribute is overriden by CSS in most browsers. */
275
- div.tableblock > table[frame="void"] {
276
- border-style: none;
277
- }
278
- div.tableblock > table[frame="hsides"] {
279
- border-left-style: none;
280
- border-right-style: none;
281
- }
282
- div.tableblock > table[frame="vsides"] {
283
- border-top-style: none;
284
- border-bottom-style: none;
285
- }
286
-
287
280
 
288
281
  div.hdlist {
289
282
  margin-top: 0.8em;
@@ -350,16 +343,15 @@ div.colist td img {
350
343
  }
351
344
 
352
345
  @media print {
353
- div#footer-badges { display: none; }
346
+ #footer-badges { display: none; }
354
347
  }
355
348
 
356
- div#toc {
349
+ #toc {
357
350
  margin-bottom: 2.5em;
358
351
  }
359
352
 
360
- div#toctitle {
353
+ #toctitle {
361
354
  color: #527bbd;
362
- font-family: sans-serif;
363
355
  font-size: 1.1em;
364
356
  font-weight: bold;
365
357
  margin-top: 1.0em;
@@ -383,10 +375,223 @@ div.toclevel4 {
383
375
  font-size: 0.9em;
384
376
  }
385
377
 
378
+ span.aqua { color: aqua; }
379
+ span.black { color: black; }
380
+ span.blue { color: blue; }
381
+ span.fuchsia { color: fuchsia; }
382
+ span.gray { color: gray; }
383
+ span.green { color: green; }
384
+ span.lime { color: lime; }
385
+ span.maroon { color: maroon; }
386
+ span.navy { color: navy; }
387
+ span.olive { color: olive; }
388
+ span.purple { color: purple; }
389
+ span.red { color: red; }
390
+ span.silver { color: silver; }
391
+ span.teal { color: teal; }
392
+ span.white { color: white; }
393
+ span.yellow { color: yellow; }
394
+
395
+ span.aqua-background { background: aqua; }
396
+ span.black-background { background: black; }
397
+ span.blue-background { background: blue; }
398
+ span.fuchsia-background { background: fuchsia; }
399
+ span.gray-background { background: gray; }
400
+ span.green-background { background: green; }
401
+ span.lime-background { background: lime; }
402
+ span.maroon-background { background: maroon; }
403
+ span.navy-background { background: navy; }
404
+ span.olive-background { background: olive; }
405
+ span.purple-background { background: purple; }
406
+ span.red-background { background: red; }
407
+ span.silver-background { background: silver; }
408
+ span.teal-background { background: teal; }
409
+ span.white-background { background: white; }
410
+ span.yellow-background { background: yellow; }
411
+
412
+ span.big { font-size: 2em; }
413
+ span.small { font-size: 0.6em; }
414
+
415
+ span.underline { text-decoration: underline; }
416
+ span.overline { text-decoration: overline; }
417
+ span.line-through { text-decoration: line-through; }
418
+
419
+
420
+ /*
421
+ * xhtml11 specific
422
+ *
423
+ * */
424
+
425
+ tt {
426
+ font-family: monospace;
427
+ font-size: inherit;
428
+ color: navy;
429
+ }
430
+
431
+ div.tableblock {
432
+ margin-top: 1.0em;
433
+ margin-bottom: 1.5em;
434
+ }
435
+ div.tableblock > table {
436
+ border: 3px solid #527bbd;
437
+ }
438
+ thead, p.table.header {
439
+ font-weight: bold;
440
+ color: #527bbd;
441
+ }
442
+ p.table {
443
+ margin-top: 0;
444
+ }
445
+ /* Because the table frame attribute is overriden by CSS in most browsers. */
446
+ div.tableblock > table[frame="void"] {
447
+ border-style: none;
448
+ }
449
+ div.tableblock > table[frame="hsides"] {
450
+ border-left-style: none;
451
+ border-right-style: none;
452
+ }
453
+ div.tableblock > table[frame="vsides"] {
454
+ border-top-style: none;
455
+ border-bottom-style: none;
456
+ }
457
+
458
+
459
+ /*
460
+ * html5 specific
461
+ *
462
+ * */
463
+
464
+ .monospaced {
465
+ font-family: monospace;
466
+ font-size: inherit;
467
+ color: navy;
468
+ }
469
+
470
+ table.tableblock {
471
+ margin-top: 1.0em;
472
+ margin-bottom: 1.5em;
473
+ }
474
+ thead, p.tableblock.header {
475
+ font-weight: bold;
476
+ color: #527bbd;
477
+ }
478
+ p.tableblock {
479
+ margin-top: 0;
480
+ }
481
+ table.tableblock {
482
+ border-width: 3px;
483
+ border-spacing: 0px;
484
+ border-style: solid;
485
+ border-color: #527bbd;
486
+ border-collapse: collapse;
487
+ }
488
+ th.tableblock, td.tableblock {
489
+ border-width: 1px;
490
+ padding: 4px;
491
+ border-style: solid;
492
+ border-color: #527bbd;
493
+ }
494
+
495
+ table.tableblock.frame-topbot {
496
+ border-left-style: hidden;
497
+ border-right-style: hidden;
498
+ }
499
+ table.tableblock.frame-sides {
500
+ border-top-style: hidden;
501
+ border-bottom-style: hidden;
502
+ }
503
+ table.tableblock.frame-none {
504
+ border-style: hidden;
505
+ }
506
+
507
+ th.tableblock.halign-left, td.tableblock.halign-left {
508
+ text-align: left;
509
+ }
510
+ th.tableblock.halign-center, td.tableblock.halign-center {
511
+ text-align: center;
512
+ }
513
+ th.tableblock.halign-right, td.tableblock.halign-right {
514
+ text-align: right;
515
+ }
516
+
517
+ th.tableblock.valign-top, td.tableblock.valign-top {
518
+ vertical-align: top;
519
+ }
520
+ th.tableblock.valign-middle, td.tableblock.valign-middle {
521
+ vertical-align: middle;
522
+ }
523
+ th.tableblock.valign-bottom, td.tableblock.valign-bottom {
524
+ vertical-align: bottom;
525
+ }
526
+
527
+
528
+ /*
529
+ * Theme specific overrides of the preceding (asciidoc.css) CSS.
530
+ *
531
+ */
532
+ body {
533
+ font-family: Garamond, Georgia, serif;
534
+ font-size: 17px;
535
+ color: #3E4349;
536
+ line-height: 1.3em;
537
+ }
538
+ h1, h2, h3, h4, h5, h6,
539
+ div.title, caption.title,
540
+ thead, p.table.header,
541
+ #toctitle,
542
+ #author, #revnumber, #revdate, #revremark,
543
+ #footer {
544
+ font-family: Garmond, Georgia, serif;
545
+ font-weight: normal;
546
+ border-bottom-width: 0;
547
+ color: #3E4349;
548
+ }
549
+ div.title, caption.title { color: #596673; font-weight: bold; }
550
+ h1 { font-size: 240%; }
551
+ h2 { font-size: 180%; }
552
+ h3 { font-size: 150%; }
553
+ h4 { font-size: 130%; }
554
+ h5 { font-size: 100%; }
555
+ h6 { font-size: 100%; }
556
+ #header h1 { margin-top: 0; }
557
+ #toc {
558
+ color: #444444;
559
+ line-height: 1.5;
560
+ padding-top: 1.5em;
561
+ }
562
+ #toctitle {
563
+ font-size: 20px;
564
+ }
565
+ #toc a {
566
+ border-bottom: 1px dotted #999999;
567
+ color: #444444 !important;
568
+ text-decoration: none !important;
569
+ }
570
+ #toc a:hover {
571
+ border-bottom: 1px solid #6D4100;
572
+ color: #6D4100 !important;
573
+ text-decoration: none !important;
574
+ }
575
+ div.toclevel1 { margin-top: 0.2em; font-size: 16px; }
576
+ div.toclevel2 { margin-top: 0.15em; font-size: 14px; }
577
+ em, dt, td.hdlist1 { color: black; }
578
+ strong { color: #3E4349; }
579
+ a { color: #004B6B; text-decoration: none; border-bottom: 1px dotted #004B6B; }
580
+ a:visited { color: #615FA0; border-bottom: 1px dotted #615FA0; }
581
+ a:hover { color: #6D4100; border-bottom: 1px solid #6D4100; }
582
+ div.tableblock > table, table.tableblock { border: 3px solid #E8E8E8; }
583
+ th.tableblock, td.tableblock { border: 1px solid #E8E8E8; }
584
+ ul > li > * { color: #3E4349; }
585
+ pre, tt, .monospaced { font-family: Consolas,Menlo,'Deja Vu Sans Mono','Bitstream Vera Sans Mono',monospace; }
586
+ tt, .monospaced { font-size: 0.9em; color: black;
587
+ }
588
+ div.exampleblock > div.content, div.sidebarblock > div.content, div.listingblock > div.content { border-width: 0 0 0 3px; border-color: #E8E8E8; }
589
+ div.verseblock { border-left-width: 0; margin-left: 3em; }
590
+ div.quoteblock { border-left-width: 3px; margin-left: 0; margin-right: 0;}
591
+ div.admonitionblock td.content { border-left: 3px solid #E8E8E8; }
386
592
  </style>
387
593
  <script type="text/javascript">
388
594
  /*<![CDATA[*/
389
- window.onload = function(){asciidoc.footnotes(); asciidoc.toc(3);}
390
595
  var asciidoc = { // Namespace.
391
596
 
392
597
  /////////////////////////////////////////////////////////////////////
@@ -448,6 +653,25 @@ toc: function (toclevels) {
448
653
  }
449
654
 
450
655
  var toc = document.getElementById("toc");
656
+ if (!toc) {
657
+ return;
658
+ }
659
+
660
+ // Delete existing TOC entries in case we're reloading the TOC.
661
+ var tocEntriesToRemove = [];
662
+ var i;
663
+ for (i = 0; i < toc.childNodes.length; i++) {
664
+ var entry = toc.childNodes[i];
665
+ if (entry.nodeName == 'DIV'
666
+ && entry.getAttribute("class")
667
+ && entry.getAttribute("class").match(/^toclevel/))
668
+ tocEntriesToRemove.push(entry);
669
+ }
670
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
671
+ toc.removeChild(tocEntriesToRemove[i]);
672
+ }
673
+
674
+ // Rebuild TOC entries.
451
675
  var entries = tocEntries(document.getElementById("content"), toclevels);
452
676
  for (var i = 0; i < entries.length; ++i) {
453
677
  var entry = entries[i];
@@ -475,24 +699,44 @@ toc: function (toclevels) {
475
699
  */
476
700
 
477
701
  footnotes: function () {
478
- var cont = document.getElementById("content");
702
+ // Delete existing footnote entries in case we're reloading the footnodes.
703
+ var i;
479
704
  var noteholder = document.getElementById("footnotes");
705
+ if (!noteholder) {
706
+ return;
707
+ }
708
+ var entriesToRemove = [];
709
+ for (i = 0; i < noteholder.childNodes.length; i++) {
710
+ var entry = noteholder.childNodes[i];
711
+ if (entry.nodeName == 'DIV' && entry.getAttribute("class") == "footnote")
712
+ entriesToRemove.push(entry);
713
+ }
714
+ for (i = 0; i < entriesToRemove.length; i++) {
715
+ noteholder.removeChild(entriesToRemove[i]);
716
+ }
717
+
718
+ // Rebuild footnote entries.
719
+ var cont = document.getElementById("content");
480
720
  var spans = cont.getElementsByTagName("span");
481
721
  var refs = {};
482
722
  var n = 0;
483
723
  for (i=0; i<spans.length; i++) {
484
724
  if (spans[i].className == "footnote") {
485
725
  n++;
486
- // Use [\s\S] in place of . so multi-line matches work.
487
- // Because JavaScript has no s (dotall) regex flag.
488
- note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
726
+ var note = spans[i].getAttribute("data-note");
727
+ if (!note) {
728
+ // Use [\s\S] in place of . so multi-line matches work.
729
+ // Because JavaScript has no s (dotall) regex flag.
730
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
731
+ spans[i].innerHTML =
732
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
733
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
734
+ spans[i].setAttribute("data-note", note);
735
+ }
489
736
  noteholder.innerHTML +=
490
737
  "<div class='footnote' id='_footnote_" + n + "'>" +
491
738
  "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
492
739
  n + "</a>. " + note + "</div>";
493
- spans[i].innerHTML =
494
- "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
495
- "' title='View footnote' class='footnote'>" + n + "</a>]";
496
740
  var id =spans[i].getAttribute("id");
497
741
  if (id != null) refs["#"+id] = n;
498
742
  }
@@ -512,9 +756,32 @@ footnotes: function () {
512
756
  }
513
757
  }
514
758
  }
759
+ },
760
+
761
+ install: function(toclevels) {
762
+ var timerId;
763
+
764
+ function reinstall() {
765
+ asciidoc.footnotes();
766
+ if (toclevels) {
767
+ asciidoc.toc(toclevels);
768
+ }
769
+ }
770
+
771
+ function reinstallAndRemoveTimer() {
772
+ clearInterval(timerId);
773
+ reinstall();
774
+ }
775
+
776
+ timerId = setInterval(reinstall, 500);
777
+ if (document.addEventListener)
778
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
779
+ else
780
+ window.onload = reinstallAndRemoveTimer;
515
781
  }
516
782
 
517
783
  }
784
+ asciidoc.install(3);
518
785
  /*]]>*/
519
786
  </script>
520
787
  </head>
@@ -531,7 +798,7 @@ footnotes: function () {
531
798
  <div class="sectionbody">
532
799
  <div class="paragraph"><p><span class="image">
533
800
  <a class="image" href="http://www.phusion.nl/">
534
- <img src="images/phusion_banner.png" alt="images/phusion_banner.png" />
801
+ <img src="images/phusion_banner.png" alt="images/phusion_banner.png">
535
802
  </a>
536
803
  </span></p></div>
537
804
  <div class="paragraph"><p>Phusion Passenger is an Nginx module, which makes deploying Ruby and Ruby on
@@ -627,7 +894,7 @@ By running the Phusion Passenger installer for Nginx. This installer will
627
894
  <li>
628
895
  <p>
629
896
  By manually configuring and compiling Nginx with Phusion Passenger support,
630
- through Nginx&#8217;s <tt>--add-module</tt> configure option. Generally, using our
897
+ through Nginx&#8217;s <span class="monospaced">--add-module</span> configure option. Generally, using our
631
898
  installer is easier, so you should only use this method if you&#8217;re already
632
899
  familiar with compiling Nginx.
633
900
  </p>
@@ -636,7 +903,7 @@ By manually configuring and compiling Nginx with Phusion Passenger support,
636
903
  <div class="admonitionblock">
637
904
  <table><tr>
638
905
  <td class="icon">
639
- <img src="./images/icons/tip.png" alt="Tip" />
906
+ <img src="./images/icons/tip.png" alt="Tip">
640
907
  </td>
641
908
  <td class="content">You might have to run the installation commands in the following sections
642
909
  as <em>root</em>. If the installer fails because of permission errors, it will tell
@@ -653,8 +920,8 @@ will need to tell the operating system which Ruby installation to use, prior to
653
920
  running the Phusion Passenger installer. If you only have one Ruby installation
654
921
  (the case on most Linux systems), then you can skip this section because Phusion
655
922
  Passenger will automatically detect it.</p></div>
656
- <div class="paragraph"><p>To specify a Ruby installation, prepend your Ruby installation&#8217;s <tt>bin</tt>
657
- directory to the <tt>PATH</tt> environment variable. For example, if you have the
923
+ <div class="paragraph"><p>To specify a Ruby installation, prepend your Ruby installation&#8217;s <span class="monospaced">bin</span>
924
+ directory to the <span class="monospaced">PATH</span> environment variable. For example, if you have the
658
925
  following Ruby installations:</p></div>
659
926
  <div class="ulist"><ul>
660
927
  <li>
@@ -670,8 +937,8 @@ following Ruby installations:</p></div>
670
937
  </ul></div>
671
938
  <div class="paragraph"><p>and you want to use the latter, then type:</p></div>
672
939
  <div class="listingblock">
673
- <div class="content">
674
- <pre><tt>export PATH=/opt/myruby/bin:$PATH</tt></pre>
940
+ <div class="content monospaced">
941
+ <pre>export PATH=/opt/myruby/bin:$PATH</pre>
675
942
  </div></div>
676
943
  </div>
677
944
  <div class="sect2">
@@ -685,13 +952,13 @@ downloading the source tarball.</p></div>
685
952
  <h5 id="_gem">Gem</h5>
686
953
  <div class="paragraph"><p>First, install the Phusion Passenger gem by running:</p></div>
687
954
  <div class="listingblock">
688
- <div class="content">
689
- <pre><tt>gem install passenger</tt></pre>
955
+ <div class="content monospaced">
956
+ <pre>gem install passenger</pre>
690
957
  </div></div>
691
958
  <div class="paragraph"><p>Next, run the Phusion Passenger installer for Nginx:</p></div>
692
959
  <div class="listingblock">
693
- <div class="content">
694
- <pre><tt>passenger-install-nginx-module</tt></pre>
960
+ <div class="content monospaced">
961
+ <pre>passenger-install-nginx-module</pre>
695
962
  </div></div>
696
963
  <div class="paragraph"><p>Please follow the instructions given by the installer.</p></div>
697
964
  </div>
@@ -701,22 +968,22 @@ downloading the source tarball.</p></div>
701
968
  <a href="http://www.modrails.com/">Phusion Passenger website</a>. Extract the tarball to
702
969
  whatever location you prefer. <strong>The Phusion Passenger files are to reside in that
703
970
  location permanently.</strong> For example, if you would like Phusion Passenger to
704
- reside in <tt>/opt/passenger-x.x.x</tt>, then type:</p></div>
971
+ reside in <span class="monospaced">/opt/passenger-x.x.x</span>, then type:</p></div>
705
972
  <div class="listingblock">
706
- <div class="content">
707
- <pre><tt>cd /opt
708
- tar xzvf ~/YourDownloadsFolder/passenger-x.x.x.tar.gz</tt></pre>
973
+ <div class="content monospaced">
974
+ <pre>cd /opt
975
+ tar xzvf ~/YourDownloadsFolder/passenger-x.x.x.tar.gz</pre>
709
976
  </div></div>
710
977
  <div class="paragraph"><p>Next, run the Phusion Passenger installer for Nginx:</p></div>
711
978
  <div class="listingblock">
712
- <div class="content">
713
- <pre><tt>/opt/passenger-x.x.x/bin/passenger-install-nginx-module</tt></pre>
979
+ <div class="content monospaced">
980
+ <pre>/opt/passenger-x.x.x/bin/passenger-install-nginx-module</pre>
714
981
  </div></div>
715
982
  <div class="paragraph"><p>Please follow the instructions given by the installer.</p></div>
716
983
  <div class="admonitionblock">
717
984
  <table><tr>
718
985
  <td class="icon">
719
- <img src="./images/icons/important.png" alt="Important" />
986
+ <img src="./images/icons/important.png" alt="Important">
720
987
  </td>
721
988
  <td class="content">Please do not remove the passenger-x.x.x folder after installation.
722
989
  Furthermore, the passenger-x.x.x folder must be accessible by Nginx.</td>
@@ -729,31 +996,31 @@ Furthermore, the passenger-x.x.x folder must be accessible by Nginx.</td>
729
996
  <div class="paragraph"><p>By default, the installer is interactive. If you want to automate installation,
730
997
  then you can do so by passing various answers to the installer through command
731
998
  line options.</p></div>
732
- <div class="paragraph"><p>Please run the installer with <tt>--help</tt> for a list of available command line
999
+ <div class="paragraph"><p>Please run the installer with <span class="monospaced">--help</span> for a list of available command line
733
1000
  options.</p></div>
734
1001
  </div>
735
1002
  </div>
736
1003
  <div class="sect2">
737
1004
  <h3 id="_installing_phusion_passenger_for_nginx_manually">2.4. Installing Phusion Passenger for Nginx manually</h3>
738
1005
  <div class="paragraph"><p>You can also install Phusion Passenger the way you install any other Nginx module.
739
- To do this, run Nginx&#8217;s configure script with <tt>--add-module=/path-to-passenger-root/ext/nginx</tt>.</p></div>
1006
+ To do this, run Nginx&#8217;s configure script with <span class="monospaced">--add-module=/path-to-passenger-root/ext/nginx</span>.</p></div>
740
1007
  <div class="paragraph"><p>If you installed Phusion Passenger via the gem, then <em>path-to-passenger-root</em>
741
1008
  can be obtained with the command:</p></div>
742
1009
  <div class="listingblock">
743
- <div class="content">
744
- <pre><tt>passenger-config --root</tt></pre>
1010
+ <div class="content monospaced">
1011
+ <pre>passenger-config --root</pre>
745
1012
  </div></div>
746
1013
  <div class="paragraph"><p>This will probably output something along the lines of <em>/usr/lib/ruby/gems/1.8/gems/passenger-x.x.x</em>,
747
- so you&#8217;ll probably have to specify something like <tt>--add-module=/usr/lib/ruby/gems/1.8/gems/passenger-x.x.x/ext/nginx</tt>.</p></div>
1014
+ so you&#8217;ll probably have to specify something like <span class="monospaced">--add-module=/usr/lib/ruby/gems/1.8/gems/passenger-x.x.x/ext/nginx</span>.</p></div>
748
1015
  <div class="paragraph"><p>If you installed Phusion Passenger via a source tarball, then <em>path-to-passenger-root</em>
749
1016
  is the directory which contains the Phusion Passenger source code. So if you
750
1017
  extracted the Phusion Passenger source code to <em>/opt/passenger-x.x.x</em>, then you&#8217;ll
751
- have to specify <tt>--add-module=/opt/passenger-x.x.x/ext/nginx</tt>.</p></div>
1018
+ have to specify <span class="monospaced">--add-module=/opt/passenger-x.x.x/ext/nginx</span>.</p></div>
752
1019
  <div class="paragraph"><p>After having installed Nginx with Phusion Passenger support, you must paste the following
753
1020
  line into your Nginx configuration file:</p></div>
754
1021
  <div class="listingblock">
755
- <div class="content">
756
- <pre><tt>passenger_root /path-to-passenger-root;</tt></pre>
1022
+ <div class="content monospaced">
1023
+ <pre>passenger_root /path-to-passenger-root;</pre>
757
1024
  </div></div>
758
1025
  <div class="paragraph"><p>After having done so, restart Nginx.</p></div>
759
1026
  </div>
@@ -762,13 +1029,13 @@ line into your Nginx configuration file:</p></div>
762
1029
  <div class="paragraph"><p>Whether you&#8217;re upgrading/downgrading Phusion Passenger or Nginx itself (or perhaps both),
763
1030
  Nginx will have to be recompiled and reinstalled. The procedure is exactly the same as
764
1031
  a normal installation so just follow the instructions in section 2.3 or 2.4.</p></div>
765
- <div class="paragraph"><p>When following the installation instructions, eventually <tt>passenger-install-nginx-module</tt>
1032
+ <div class="paragraph"><p>When following the installation instructions, eventually <span class="monospaced">passenger-install-nginx-module</span>
766
1033
  or this document will instruct you to copy &amp; paste some settings into the Nginx
767
1034
  configuration file; something that looks along the lines of:</p></div>
768
1035
  <div class="listingblock">
769
- <div class="content">
770
- <pre><tt>passenger_root ...;
771
- passenger_ruby ...;</tt></pre>
1036
+ <div class="content monospaced">
1037
+ <pre>passenger_root ...;
1038
+ passenger_ruby ...;</pre>
772
1039
  </div></div>
773
1040
  <div class="paragraph"><p>Because you already had Phusion Passenger installed, you already had similar settings
774
1041
  in your Nginx configuration file, just with different values. <strong>Replace</strong> the old settings with
@@ -790,8 +1057,8 @@ Nginx.</p></div>
790
1057
  and comment out all Phusion Passenger configuration directives.</p></div>
791
1058
  <div class="paragraph"><p>For example, if your configuration file looks like this&#8230;</p></div>
792
1059
  <div class="listingblock">
793
- <div class="content">
794
- <pre><tt>...
1060
+ <div class="content monospaced">
1061
+ <pre>...
795
1062
 
796
1063
  http {
797
1064
  passenger_root /somewhere/passenger-x.x.x;
@@ -807,12 +1074,12 @@ http {
807
1074
  passenger_enabled on;
808
1075
  passenger_use_global_queue on;
809
1076
  }
810
- }</tt></pre>
1077
+ }</pre>
811
1078
  </div></div>
812
1079
  <div class="paragraph"><p>&#8230;then comment out the relevant directives, so that it looks like this:</p></div>
813
1080
  <div class="listingblock">
814
- <div class="content">
815
- <pre><tt>...
1081
+ <div class="content monospaced">
1082
+ <pre>...
816
1083
 
817
1084
  http {
818
1085
  # passenger_root /somewhere/passenger-x.x.x;
@@ -828,7 +1095,7 @@ http {
828
1095
  # passenger_enabled on;
829
1096
  # passenger_use_global_queue on;
830
1097
  }
831
- }</tt></pre>
1098
+ }</pre>
832
1099
  </div></div>
833
1100
  <div class="paragraph"><p>After you&#8217;ve done this, save the file and restart Nginx.</p></div>
834
1101
  </div>
@@ -840,7 +1107,7 @@ done this, you need to remove the Phusion Passenger files.</p></div>
840
1107
  <div class="ulist"><ul>
841
1108
  <li>
842
1109
  <p>
843
- If you installed Phusion Passenger via a gem, then type <tt>gem uninstall passenger</tt>.
1110
+ If you installed Phusion Passenger via a gem, then type <span class="monospaced">gem uninstall passenger</span>.
844
1111
  You might have to run this as root.
845
1112
  </p>
846
1113
  </li>
@@ -859,7 +1126,7 @@ Nginx binary.</p></div>
859
1126
  </div>
860
1127
  </div>
861
1128
  <div class="sect1">
862
- <h2 id="deploying_a_ror_app">3. Deploying a Ruby on Rails application</h2>
1129
+ <h2 id="deploying_a_ror_app">3. Deploying a Ruby on Rails 1.x or 2.x (but NOT Rails &gt;= 3) application</h2>
863
1130
  <div class="sectionbody">
864
1131
  <div class="paragraph"><p>Suppose you have a Ruby on Rails application in <em>/webapps/mycook</em>, and you own
865
1132
  the domain <em>www.mycook.com</em>. You can either deploy your application to the
@@ -869,9 +1136,9 @@ accessible from a sub URL, such as <em>http://www.mycook.com/railsapplication</e
869
1136
  <div class="admonitionblock">
870
1137
  <table><tr>
871
1138
  <td class="icon">
872
- <img src="./images/icons/note.png" alt="Note" />
1139
+ <img src="./images/icons/note.png" alt="Note">
873
1140
  </td>
874
- <td class="content">The default <tt>RAILS_ENV</tt> environment in which deployed Rails applications
1141
+ <td class="content">The default <span class="monospaced">RAILS_ENV</span> environment in which deployed Rails applications
875
1142
  are run, is &#8220;production&#8221;. You can change this by changing the
876
1143
  <a href="#RailsEnv">rails_env</a> configuration option.</td>
877
1144
  </tr></table>
@@ -883,8 +1150,8 @@ host&#8217;s root must point to your Ruby on Rails application&#8217;s <em>publi
883
1150
  <div class="paragraph"><p>Inside the <em>server</em> block, set <em>passenger_enabled on</em>.</p></div>
884
1151
  <div class="paragraph"><p>For example:</p></div>
885
1152
  <div class="listingblock">
886
- <div class="content">
887
- <pre><tt>http {
1153
+ <div class="content monospaced">
1154
+ <pre>http {
888
1155
  ...
889
1156
 
890
1157
  server {
@@ -895,7 +1162,7 @@ host&#8217;s root must point to your Ruby on Rails application&#8217;s <em>publi
895
1162
  }
896
1163
 
897
1164
  ...
898
- }</tt></pre>
1165
+ }</pre>
899
1166
  </div></div>
900
1167
  <div class="paragraph"><p>Then restart Nginx. The application has now been deployed.</p></div>
901
1168
  </div>
@@ -903,8 +1170,8 @@ host&#8217;s root must point to your Ruby on Rails application&#8217;s <em>publi
903
1170
  <h3 id="deploying_rails_to_sub_uri">3.2. Deploying to a sub URI</h3>
904
1171
  <div class="paragraph"><p>Suppose that you already have a <em>server</em> virtual host entry:</p></div>
905
1172
  <div class="listingblock">
906
- <div class="content">
907
- <pre><tt>http {
1173
+ <div class="content monospaced">
1174
+ <pre>http {
908
1175
  ...
909
1176
 
910
1177
  server {
@@ -914,21 +1181,21 @@ host&#8217;s root must point to your Ruby on Rails application&#8217;s <em>publi
914
1181
  }
915
1182
 
916
1183
  ...
917
- }</tt></pre>
1184
+ }</pre>
918
1185
  </div></div>
919
1186
  <div class="paragraph"><p>And you want your Ruby on Rails application to be accessible from the URL
920
1187
  <em>http://www.phusion.nl/rails</em>.</p></div>
921
1188
  <div class="paragraph"><p>To do this, make a symlink in the virtual host&#8217;s document root, and have it
922
1189
  point to your Ruby on Rails application&#8217;s <em>public</em> folder. For example:</p></div>
923
1190
  <div class="listingblock">
924
- <div class="content">
925
- <pre><tt>ln -s /webapps/mycook/public /websites/phusion/rails</tt></pre>
1191
+ <div class="content monospaced">
1192
+ <pre>ln -s /webapps/mycook/public /websites/phusion/rails</pre>
926
1193
  </div></div>
927
1194
  <div class="paragraph"><p>Next, set <em>passenger_enabled on</em> and add a <a href="#PassengerBaseURI">passenger_base_uri</a>
928
1195
  option to the <em>server</em> block:</p></div>
929
1196
  <div class="listingblock">
930
- <div class="content">
931
- <pre><tt>http {
1197
+ <div class="content monospaced">
1198
+ <pre>http {
932
1199
  ...
933
1200
 
934
1201
  server {
@@ -940,25 +1207,25 @@ option to the <em>server</em> block:</p></div>
940
1207
  }
941
1208
 
942
1209
  ...
943
- }</tt></pre>
1210
+ }</pre>
944
1211
  </div></div>
945
1212
  <div class="paragraph"><p>Then restart Nginx. The application has now been deployed.</p></div>
946
1213
  <div class="admonitionblock">
947
1214
  <table><tr>
948
1215
  <td class="icon">
949
- <img src="./images/icons/tip.png" alt="Tip" />
1216
+ <img src="./images/icons/tip.png" alt="Tip">
950
1217
  </td>
951
1218
  <td class="content">
952
1219
  <div class="paragraph"><p>You can deploy multiple Rails applications under a virtual host, by specifying
953
1220
  <a href="#PassengerBaseURI">passenger_base_uri</a> multiple times. For example:</p></div>
954
1221
  <div class="listingblock">
955
- <div class="content">
956
- <pre><tt>server {
1222
+ <div class="content monospaced">
1223
+ <pre>server {
957
1224
  ...
958
1225
  passenger_base_uri /app1;
959
1226
  passenger_base_uri /app2;
960
1227
  passenger_base_uri /app3;
961
- }</tt></pre>
1228
+ }</pre>
962
1229
  </div></div>
963
1230
  </td>
964
1231
  </tr></table>
@@ -986,8 +1253,8 @@ By creating or modifying the file <em>tmp/restart.txt</em> in the Rails
986
1253
  <div class="paragraph"><p>For example, to restart our example MyCook application, we type this in the
987
1254
  command line:</p></div>
988
1255
  <div class="listingblock">
989
- <div class="content">
990
- <pre><tt>touch /webapps/mycook/tmp/restart.txt</tt></pre>
1256
+ <div class="content monospaced">
1257
+ <pre>touch /webapps/mycook/tmp/restart.txt</pre>
991
1258
  </div></div>
992
1259
  <div class="paragraph"><p>Please note that, unlike earlier versions of Phusion Passenger, <em>restart.txt</em>
993
1260
  is not automatically deleted. Phusion Passenger checks whether the timestamp
@@ -998,7 +1265,7 @@ be restarted.</p></div>
998
1265
  <h3 id="_migrations">3.4. Migrations</h3>
999
1266
  <div class="paragraph"><p>Phusion Passenger is not related to Ruby on Rails migrations in any way. To
1000
1267
  run migrations on your deployment server, please login to your deployment
1001
- server (e.g. with <em>ssh</em>) and type <tt>rake db:migrate RAILS_ENV=production</tt> in
1268
+ server (e.g. with <em>ssh</em>) and type <span class="monospaced">rake db:migrate RAILS_ENV=production</span> in
1002
1269
  a shell console, just like one would normally run migrations.</p></div>
1003
1270
  </div>
1004
1271
  <div class="sect2">
@@ -1008,7 +1275,7 @@ a shell console, just like one would normally run migrations.</p></div>
1008
1275
  </div>
1009
1276
  </div>
1010
1277
  <div class="sect1">
1011
- <h2 id="deploying_a_rack_app">4. Deploying a Rack-based Ruby application</h2>
1278
+ <h2 id="deploying_a_rack_app">4. Deploying a Rack-based Ruby application (including Rails &gt;= 3)</h2>
1012
1279
  <div class="sectionbody">
1013
1280
  <div class="paragraph"><p>Phusion Passenger supports arbitrary Ruby web applications that follow the
1014
1281
  <a href="http://rack.rubyforge.org/">Rack</a> interface.</p></div>
@@ -1036,14 +1303,14 @@ folder must contain at least three entries:</p></div>
1036
1303
  </ul></div>
1037
1304
  <div class="paragraph"><p>So <em>/webapps/rackapp</em> must, at minimum, look like this:</p></div>
1038
1305
  <div class="listingblock">
1039
- <div class="content">
1040
- <pre><tt>/webapps/rackapp
1306
+ <div class="content monospaced">
1307
+ <pre>/webapps/rackapp
1041
1308
  |
1042
1309
  +-- config.ru
1043
1310
  |
1044
1311
  +-- public/
1045
1312
  |
1046
- +-- tmp/</tt></pre>
1313
+ +-- tmp/</pre>
1047
1314
  </div></div>
1048
1315
  <div class="paragraph"><p>Suppose you own the domain <em>www.rackapp.com</em>. You can either deploy your application
1049
1316
  to the virtual host&#8217;s root (i.e. the application will be accessible from the root URL,
@@ -1052,9 +1319,9 @@ accessible from a sub URL, such as <em>http://www.rackapp.com/rackapp</em>).</p>
1052
1319
  <div class="admonitionblock">
1053
1320
  <table><tr>
1054
1321
  <td class="icon">
1055
- <img src="./images/icons/note.png" alt="Note" />
1322
+ <img src="./images/icons/note.png" alt="Note">
1056
1323
  </td>
1057
- <td class="content">The default <tt>RACK_ENV</tt> environment in which deployed Rack applications
1324
+ <td class="content">The default <span class="monospaced">RACK_ENV</span> environment in which deployed Rack applications
1058
1325
  are run, is &#8220;production&#8221;. You can change this by changing the
1059
1326
  <a href="#RackEnv">rack_env</a> configuration option.</td>
1060
1327
  </tr></table>
@@ -1063,28 +1330,28 @@ are run, is &#8220;production&#8221;. You can change this by changing the
1063
1330
  <h3 id="_tutorial_example_writing_and_deploying_a_hello_world_rack_application">4.1. Tutorial/example: writing and deploying a Hello World Rack application</h3>
1064
1331
  <div class="paragraph"><p>First we create a Phusion Passenger-compliant Rack directory structure:</p></div>
1065
1332
  <div class="listingblock">
1066
- <div class="content">
1067
- <pre><tt>$ mkdir /webapps/rack_example
1333
+ <div class="content monospaced">
1334
+ <pre>$ mkdir /webapps/rack_example
1068
1335
  $ mkdir /webapps/rack_example/public
1069
- $ mkdir /webapps/rack_example/tmp</tt></pre>
1336
+ $ mkdir /webapps/rack_example/tmp</pre>
1070
1337
  </div></div>
1071
1338
  <div class="paragraph"><p>Next, we write a minimal "hello world" Rack application:</p></div>
1072
1339
  <div class="listingblock">
1073
- <div class="content">
1074
- <pre><tt>$ cd /webapps/rack_example
1340
+ <div class="content monospaced">
1341
+ <pre>$ cd /webapps/rack_example
1075
1342
  $ some_awesome_editor config.ru
1076
1343
  ...type in some source code...
1077
1344
  $ cat config.ru
1078
1345
  app = proc do |env|
1079
1346
  [200, { "Content-Type" =&gt; "text/html" }, ["hello &lt;b&gt;world&lt;/b&gt;"]]
1080
1347
  end
1081
- run app</tt></pre>
1348
+ run app</pre>
1082
1349
  </div></div>
1083
1350
  <div class="paragraph"><p>Finally, we deploy it by adding the following configuration options to
1084
1351
  the Nginx configuration file:</p></div>
1085
1352
  <div class="listingblock">
1086
- <div class="content">
1087
- <pre><tt>http {
1353
+ <div class="content monospaced">
1354
+ <pre>http {
1088
1355
  ...
1089
1356
  server {
1090
1357
  listen 80;
@@ -1093,7 +1360,7 @@ the Nginx configuration file:</p></div>
1093
1360
  passenger_enabled on;
1094
1361
  }
1095
1362
  ...
1096
- }</tt></pre>
1363
+ }</pre>
1097
1364
  </div></div>
1098
1365
  <div class="paragraph"><p>And we&#8217;re done! After an Nginx restart, the above Rack application will be available
1099
1366
  under the URL <em>http://www.rackexample.com/</em>.</p></div>
@@ -1105,8 +1372,8 @@ root must point to your Rack application&#8217;s <em>public</em> folder. You mus
1105
1372
  <em>passenger_enabled on</em> in the <em>server</em> block.</p></div>
1106
1373
  <div class="paragraph"><p>For example:</p></div>
1107
1374
  <div class="listingblock">
1108
- <div class="content">
1109
- <pre><tt>http {
1375
+ <div class="content monospaced">
1376
+ <pre>http {
1110
1377
  ...
1111
1378
  server {
1112
1379
  listen 80;
@@ -1115,7 +1382,7 @@ root must point to your Rack application&#8217;s <em>public</em> folder. You mus
1115
1382
  passenger_enabled on;
1116
1383
  }
1117
1384
  ...
1118
- }</tt></pre>
1385
+ }</pre>
1119
1386
  </div></div>
1120
1387
  <div class="paragraph"><p>Then restart Nginx. The application has now been deployed.</p></div>
1121
1388
  </div>
@@ -1123,8 +1390,8 @@ root must point to your Rack application&#8217;s <em>public</em> folder. You mus
1123
1390
  <h3 id="deploying_rack_to_sub_uri">4.3. Deploying to a sub URI</h3>
1124
1391
  <div class="paragraph"><p>Suppose that you already have a virtual host:</p></div>
1125
1392
  <div class="listingblock">
1126
- <div class="content">
1127
- <pre><tt>http {
1393
+ <div class="content monospaced">
1394
+ <pre>http {
1128
1395
  ...
1129
1396
 
1130
1397
  server {
@@ -1135,21 +1402,21 @@ root must point to your Rack application&#8217;s <em>public</em> folder. You mus
1135
1402
  }
1136
1403
 
1137
1404
  ...
1138
- }</tt></pre>
1405
+ }</pre>
1139
1406
  </div></div>
1140
1407
  <div class="paragraph"><p>And you want your Rack application to be accessible from the URL
1141
1408
  <em>http://www.phusion.nl/rack</em>.</p></div>
1142
1409
  <div class="paragraph"><p>To do this, make a symlink in the virtual host&#8217;s document root, and have it
1143
1410
  point to your Rack application&#8217;s <em>public</em> folder. For example:</p></div>
1144
1411
  <div class="listingblock">
1145
- <div class="content">
1146
- <pre><tt>ln -s /webapps/rackapp/public /websites/phusion/rack</tt></pre>
1412
+ <div class="content monospaced">
1413
+ <pre>ln -s /webapps/rackapp/public /websites/phusion/rack</pre>
1147
1414
  </div></div>
1148
1415
  <div class="paragraph"><p>Next, set <em>passenger_enabled on</em> and add a <a href="#PassengerBaseURI">passenger_base_uri</a>
1149
1416
  option to the <em>server</em> block:</p></div>
1150
1417
  <div class="listingblock">
1151
- <div class="content">
1152
- <pre><tt>http {
1418
+ <div class="content monospaced">
1419
+ <pre>http {
1153
1420
  ...
1154
1421
 
1155
1422
  server {
@@ -1161,25 +1428,25 @@ option to the <em>server</em> block:</p></div>
1161
1428
  }
1162
1429
 
1163
1430
  ...
1164
- }</tt></pre>
1431
+ }</pre>
1165
1432
  </div></div>
1166
1433
  <div class="paragraph"><p>Then restart Nginx. The application has now been deployed.</p></div>
1167
1434
  <div class="admonitionblock">
1168
1435
  <table><tr>
1169
1436
  <td class="icon">
1170
- <img src="./images/icons/tip.png" alt="Tip" />
1437
+ <img src="./images/icons/tip.png" alt="Tip">
1171
1438
  </td>
1172
1439
  <td class="content">
1173
1440
  <div class="paragraph"><p>You can deploy multiple Rack applications under a virtual host, by specifying
1174
1441
  <a href="#PassengerBaseURI">passenger_base_uri</a> multiple times. For example:</p></div>
1175
1442
  <div class="listingblock">
1176
- <div class="content">
1177
- <pre><tt>server {
1443
+ <div class="content monospaced">
1444
+ <pre>server {
1178
1445
  ...
1179
1446
  passenger_base_uri /app1;
1180
1447
  passenger_base_uri /app2;
1181
1448
  passenger_base_uri /app3;
1182
- }</tt></pre>
1449
+ }</pre>
1183
1450
  </div></div>
1184
1451
  </td>
1185
1452
  </tr></table>
@@ -1207,8 +1474,8 @@ By creating or modifying the file <em>tmp/restart.txt</em> in the Rack
1207
1474
  <div class="paragraph"><p>For example, to restart our example application, we type this in the
1208
1475
  command line:</p></div>
1209
1476
  <div class="listingblock">
1210
- <div class="content">
1211
- <pre><tt>touch /webapps/rackapp/tmp/restart.txt</tt></pre>
1477
+ <div class="content monospaced">
1478
+ <pre>touch /webapps/rackapp/tmp/restart.txt</pre>
1212
1479
  </div></div>
1213
1480
  </div>
1214
1481
  <div class="sect2">
@@ -1217,8 +1484,8 @@ command line:</p></div>
1217
1484
  <div class="sect3">
1218
1485
  <h4 id="_camping">4.5.1. Camping</h4>
1219
1486
  <div class="listingblock">
1220
- <div class="content">
1221
- <pre><tt>require 'rubygems'
1487
+ <div class="content monospaced">
1488
+ <pre>require 'rubygems'
1222
1489
  require 'rack'
1223
1490
  require 'camping'
1224
1491
 
@@ -1228,37 +1495,37 @@ Camping.goes :Blog
1228
1495
  ...your application code here...
1229
1496
  ##### End Camping application
1230
1497
 
1231
- run Rack::Adapter::Camping.new(Blog)</tt></pre>
1498
+ run Rack::Adapter::Camping.new(Blog)</pre>
1232
1499
  </div></div>
1233
- <div class="paragraph"><p>For Camping versions 2.0 and up, using <tt>run Blog</tt> as the final line will do.</p></div>
1500
+ <div class="paragraph"><p>For Camping versions 2.0 and up, using <span class="monospaced">run Blog</span> as the final line will do.</p></div>
1234
1501
  </div>
1235
1502
  <div class="sect3">
1236
1503
  <h4 id="_halcyon">4.5.2. Halcyon</h4>
1237
1504
  <div class="listingblock">
1238
- <div class="content">
1239
- <pre><tt>require 'rubygems'
1505
+ <div class="content monospaced">
1506
+ <pre>require 'rubygems'
1240
1507
  require 'halcyon'
1241
1508
  $LOAD_PATH.unshift(Halcyon.root / 'lib')
1242
1509
  Halcyon::Runner.load_config Halcyon.root/'config'/'config.yml'
1243
- run Halcyon::Runner.new</tt></pre>
1510
+ run Halcyon::Runner.new</pre>
1244
1511
  </div></div>
1245
1512
  </div>
1246
1513
  <div class="sect3">
1247
1514
  <h4 id="_mack">4.5.3. Mack</h4>
1248
1515
  <div class="listingblock">
1249
- <div class="content">
1250
- <pre><tt>ENV["MACK_ENV"] = ENV["RACK_ENV"]
1516
+ <div class="content monospaced">
1517
+ <pre>ENV["MACK_ENV"] = ENV["RACK_ENV"]
1251
1518
  load("Rakefile")
1252
1519
  require 'rubygems'
1253
1520
  require 'mack'
1254
- run Mack::Utils::Server.build_app</tt></pre>
1521
+ run Mack::Utils::Server.build_app</pre>
1255
1522
  </div></div>
1256
1523
  </div>
1257
1524
  <div class="sect3">
1258
1525
  <h4 id="_merb">4.5.4. Merb</h4>
1259
1526
  <div class="listingblock">
1260
- <div class="content">
1261
- <pre><tt>require 'rubygems'
1527
+ <div class="content monospaced">
1528
+ <pre>require 'rubygems'
1262
1529
  require 'merb-core'
1263
1530
 
1264
1531
  Merb::Config.setup(
@@ -1269,30 +1536,30 @@ Merb.environment = Merb::Config[:environment]
1269
1536
  Merb.root = Merb::Config[:merb_root]
1270
1537
  Merb::BootLoader.run
1271
1538
 
1272
- run Merb::Rack::Application.new</tt></pre>
1539
+ run Merb::Rack::Application.new</pre>
1273
1540
  </div></div>
1274
1541
  </div>
1275
1542
  <div class="sect3">
1276
1543
  <h4 id="_ramaze">4.5.5. Ramaze</h4>
1277
1544
  <div class="listingblock">
1278
- <div class="content">
1279
- <pre><tt>require "rubygems"
1545
+ <div class="content monospaced">
1546
+ <pre>require "rubygems"
1280
1547
  require "ramaze"
1281
1548
  Ramaze.trait[:essentials].delete Ramaze::Adapter
1282
1549
  require "start"
1283
1550
  Ramaze.start!
1284
- run Ramaze::Adapter::Base</tt></pre>
1551
+ run Ramaze::Adapter::Base</pre>
1285
1552
  </div></div>
1286
1553
  </div>
1287
1554
  <div class="sect3">
1288
1555
  <h4 id="_sinatra">4.5.6. Sinatra</h4>
1289
1556
  <div class="listingblock">
1290
- <div class="content">
1291
- <pre><tt>require 'rubygems'
1557
+ <div class="content monospaced">
1558
+ <pre>require 'rubygems'
1292
1559
  require 'sinatra'
1293
1560
  require 'app.rb'
1294
1561
 
1295
- run Sinatra::Application</tt></pre>
1562
+ run Sinatra::Application</pre>
1296
1563
  </div></div>
1297
1564
  </div>
1298
1565
  </div>
@@ -1326,7 +1593,7 @@ The default is <em>ruby</em>.</p></div>
1326
1593
  <div class="admonitionblock">
1327
1594
  <table><tr>
1328
1595
  <td class="icon">
1329
- <img src="./images/icons/tip.png" alt="Tip" />
1596
+ <img src="./images/icons/tip.png" alt="Tip">
1330
1597
  </td>
1331
1598
  <td class="content">
1332
1599
  <div class="title">"What spawn method should I use?"</div>
@@ -1335,7 +1602,7 @@ understand it, as it&#8217;s mostly a technical detail. You can basically follow
1335
1602
  <div class="sidebarblock">
1336
1603
  <div class="content">
1337
1604
  <div class="paragraph"><p>If your application works on Mongrel, but not on Phusion Passenger, then set
1338
- <tt>passenger_spawn_method</tt> to <em>conservative</em>. Otherwise, leave it at <em>smart-lv2</em> (the default).</p></div>
1605
+ <span class="monospaced">passenger_spawn_method</span> to <em>conservative</em>. Otherwise, leave it at <em>smart-lv2</em> (the default).</p></div>
1339
1606
  </div></div>
1340
1607
  <div class="paragraph"><p>However, we do recommend you to try to understand it. The <em>smart</em> and <em>smart-lv2</em> spawn
1341
1608
  methods bring many benefits.</p></div>
@@ -1539,31 +1806,31 @@ we&#8217;re currently in a state where all backend processes have 3 requests in
1539
1806
  </ul></div>
1540
1807
  <div class="paragraph"><p>The situation looks like this:</p></div>
1541
1808
  <div class="listingblock">
1542
- <div class="content">
1543
- <pre><tt>Backend process A: [* ] (1 request in queue)
1809
+ <div class="content monospaced">
1810
+ <pre>Backend process A: [* ] (1 request in queue)
1544
1811
  Backend process B: [*** ] (3 requests in queue)
1545
1812
  Backend process C: [*** ] (3 requests in queue)
1546
- Backend process D: [*** ] (3 requests in queue)</tt></pre>
1813
+ Backend process D: [*** ] (3 requests in queue)</pre>
1547
1814
  </div></div>
1548
1815
  <div class="paragraph"><p>Each process is currently serving short-running requests.</p></div>
1549
1816
  <div class="paragraph"><p>Phusion Passenger will forward the next request to backend process A. A will
1550
1817
  now have 2 items in its queue. We&#8217;ll mark this new request with an X:</p></div>
1551
1818
  <div class="listingblock">
1552
- <div class="content">
1553
- <pre><tt>Backend process A: [*X ] (2 request in queue)
1819
+ <div class="content monospaced">
1820
+ <pre>Backend process A: [*X ] (2 request in queue)
1554
1821
  Backend process B: [*** ] (3 requests in queue)
1555
1822
  Backend process C: [*** ] (3 requests in queue)
1556
- Backend process D: [*** ] (3 requests in queue)</tt></pre>
1823
+ Backend process D: [*** ] (3 requests in queue)</pre>
1557
1824
  </div></div>
1558
1825
  <div class="paragraph"><p>Assuming that B, C and D still aren&#8217;t done with their current request, the next
1559
1826
  HTTP request - let&#8217;s call this Y - will be forwarded to backend process A as
1560
1827
  well, because it has the least number of items in its queue:</p></div>
1561
1828
  <div class="listingblock">
1562
- <div class="content">
1563
- <pre><tt>Backend process A: [*XY ] (3 requests in queue)
1829
+ <div class="content monospaced">
1830
+ <pre>Backend process A: [*XY ] (3 requests in queue)
1564
1831
  Backend process B: [*** ] (3 requests in queue)
1565
1832
  Backend process C: [*** ] (3 requests in queue)
1566
- Backend process D: [*** ] (3 requests in queue)</tt></pre>
1833
+ Backend process D: [*** ] (3 requests in queue)</pre>
1567
1834
  </div></div>
1568
1835
  <div class="paragraph"><p>But if request X happens to be a long-running request that needs 60 seconds to
1569
1836
  complete, then we&#8217;ll have a problem. Y won&#8217;t be processed for at least 60
@@ -1618,22 +1885,22 @@ directive, and is comparable to ngx_http_proxy_module&#8217;s <em>proxy_set_head
1618
1885
  Nginx variables in the value are interpolated.</p></div>
1619
1886
  <div class="paragraph"><p>For example:</p></div>
1620
1887
  <div class="listingblock">
1621
- <div class="content">
1622
- <pre><tt># Application will see a CGI environment "APP_NAME" with value "my super blog".
1888
+ <div class="content monospaced">
1889
+ <pre># Application will see a CGI environment "APP_NAME" with value "my super blog".
1623
1890
  passenger_set_cgi_param APP_NAME "my super blog";
1624
1891
 
1625
1892
  # Nginx variables are interpolated.
1626
- passenger_set_cgi_param EXTRA_REQUEST_METHOD method=$request_method;</tt></pre>
1893
+ passenger_set_cgi_param EXTRA_REQUEST_METHOD method=$request_method;</pre>
1627
1894
  </div></div>
1628
1895
  <div class="paragraph"><p>If you want to set an HTTP header, then you must set it in the CGI environment name
1629
1896
  format, i.e. <em>HTTP_*</em>:</p></div>
1630
1897
  <div class="listingblock">
1631
- <div class="content">
1632
- <pre><tt># !!!THIS IS WRONG!!! Don't do this!
1898
+ <div class="content monospaced">
1899
+ <pre># !!!THIS IS WRONG!!! Don't do this!
1633
1900
  passenger_set_cgi_param X-Forwarded-For 127.0.0.2;
1634
1901
 
1635
1902
  # Instead, write it like this:
1636
- passenger_set_cgi_param HTTP_X_FORWARDED_FOR 127.0.0.2;</tt></pre>
1903
+ passenger_set_cgi_param HTTP_X_FORWARDED_FOR 127.0.0.2;</pre>
1637
1904
  </div></div>
1638
1905
  <div class="paragraph"><p>This option may occur in the following places:</p></div>
1639
1906
  <div class="ulist"><ul>
@@ -1667,10 +1934,10 @@ the final response. This directive allows one to force Nginx to pass those heade
1667
1934
  anyway, similar to how <em>proxy_pass_header</em> works.</p></div>
1668
1935
  <div class="paragraph"><p>For example:</p></div>
1669
1936
  <div class="listingblock">
1670
- <div class="content">
1671
- <pre><tt>location / {
1937
+ <div class="content monospaced">
1938
+ <pre>location / {
1672
1939
  passenger_pass_header X-Accel-Redirect;
1673
- }</tt></pre>
1940
+ }</pre>
1674
1941
  </div></div>
1675
1942
  <div class="paragraph"><p>This option may occur in the following places:</p></div>
1676
1943
  <div class="ulist"><ul>
@@ -1711,19 +1978,19 @@ the application response as quickly as possible and will take care of slow clien
1711
1978
  <div class="paragraph"><p>However, keep in mind that enabling this option will make streaming responses
1712
1979
  impossible. Consider for example this piece of Rails code:</p></div>
1713
1980
  <div class="listingblock">
1714
- <div class="content">
1715
- <pre><tt>render :text =&gt; lambda { |response, output|
1981
+ <div class="content monospaced">
1982
+ <pre>render :text =&gt; lambda { |response, output|
1716
1983
  10.times do |i|
1717
1984
  output.write("entry #{i}\n")
1718
1985
  output.flush
1719
1986
  sleep 1
1720
1987
  end
1721
- }</tt></pre>
1988
+ }</pre>
1722
1989
  </div></div>
1723
1990
  <div class="paragraph"><p>&#8230;or this piece of Rack code:</p></div>
1724
1991
  <div class="listingblock">
1725
- <div class="content">
1726
- <pre><tt>class Response
1992
+ <div class="content monospaced">
1993
+ <pre>class Response
1727
1994
  def each
1728
1995
  10.times do |i|
1729
1996
  yield("entry #{i}\n")
@@ -1734,7 +2001,7 @@ end
1734
2001
 
1735
2002
  app = lambda do |env|
1736
2003
  [200, { "Content-Type" =&gt; "text/plain" }, Response.new]
1737
- end</tt></pre>
2004
+ end</pre>
1738
2005
  </div></div>
1739
2006
  <div class="paragraph"><p>When response buffering is turned on, Phusion Passenger will wait until
1740
2007
  the application is done sending the entire response before forwarding it
@@ -1767,6 +2034,17 @@ In an <em>if</em> configuration scope.
1767
2034
  </ul></div>
1768
2035
  <div class="paragraph"><p>In each place, it may be specified at most once. The default value is <em>on</em>.</p></div>
1769
2036
  </div>
2037
+ <div class="sect3">
2038
+ <h4 id="_passenger_buffer_size">5.5.6. passenger_buffer_size</h4>
2039
+ </div>
2040
+ <div class="sect3">
2041
+ <h4 id="_passenger_buffers">5.5.7. passenger_buffers</h4>
2042
+ </div>
2043
+ <div class="sect3">
2044
+ <h4 id="_passenger_busy_buffer_size">5.5.8. passenger_busy_buffer_size</h4>
2045
+ <div class="paragraph"><p>These options have the same effect as proxy_module&#8217;s similarly named options.
2046
+ They can be used to modify the maximum allowed HTTP header size.</p></div>
2047
+ </div>
1770
2048
  </div>
1771
2049
  <div class="sect2">
1772
2050
  <h3 id="_security_options">5.6. Security options</h3>
@@ -1779,7 +2057,7 @@ The default value is <em>on</em>.</p></div>
1779
2057
  <div class="sect3">
1780
2058
  <h4 id="_passenger_user_lt_username_gt">5.6.2. passenger_user &lt;username&gt;</h4>
1781
2059
  <div class="paragraph"><p>If <a href="#user_switching">user switching support</a> is enabled, then Phusion Passenger will
1782
- by default run the web application as the owner if the file <em>config/environment.rb</em>
2060
+ by default run the web application as the owner of the file <em>config/environment.rb</em>
1783
2061
  (for Rails apps) or <em>config.ru</em> (for Rack apps). This option allows you to override
1784
2062
  that behavior and explicitly set a user to run the web application as, regardless
1785
2063
  of the ownership of <em>environment.rb</em>/<em>config.ru</em>.</p></div>
@@ -1916,7 +2194,7 @@ The default value is <em>6</em>.</p></div>
1916
2194
  <div class="admonitionblock">
1917
2195
  <table><tr>
1918
2196
  <td class="icon">
1919
- <img src="./images/icons/tip.png" alt="Tip" />
2197
+ <img src="./images/icons/tip.png" alt="Tip">
1920
2198
  </td>
1921
2199
  <td class="content">We strongly recommend you to <a href="#reducing_memory_usage">use Ruby Enterprise Edition</a>. This allows you to reduce the memory usage of your Ruby on Rails applications
1922
2200
  by about 33%. And it&#8217;s not hard to install.</td>
@@ -1949,8 +2227,8 @@ the given number of processes will be kept around even when instances are being
1949
2227
  but <a href="#PassengerPreStart">passenger_pre_start</a> explains the rationale behind it.</p></div>
1950
2228
  <div class="paragraph"><p>For example, suppose that you have the following configuration:</p></div>
1951
2229
  <div class="listingblock">
1952
- <div class="content">
1953
- <pre><tt>http {
2230
+ <div class="content monospaced">
2231
+ <pre>http {
1954
2232
  ...
1955
2233
  passenger_max_pool_size 15;
1956
2234
  passenger_pool_idle_time 10;
@@ -1961,7 +2239,7 @@ but <a href="#PassengerPreStart">passenger_pre_start</a> explains the rationale
1961
2239
  root /webapps/foobar/public;
1962
2240
  passenger_min_instances 3;
1963
2241
  }
1964
- }</tt></pre>
2242
+ }</pre>
1965
2243
  </div></div>
1966
2244
  <div class="paragraph"><p>When you start Nginx, there are 0 application instances for <em>foobar.com</em>. Things will
1967
2245
  stay that way until someone visits <em>foobar.com</em>. Suppose that there is only 1 visitor.
@@ -2019,7 +2297,7 @@ more often. Since spawning is a relatively slow operation, some visitors may
2019
2297
  notice a small delay when they visit your Rails/Rack website. However, it will also
2020
2298
  free up resources used by applications more quickly.</p></div>
2021
2299
  <div class="paragraph"><p>The optimal value depends on the average time that a visitor spends on a single
2022
- Rails/Rack web page. We recommend a value of <tt>2 * x</tt>, where <tt>x</tt> is the average
2300
+ Rails/Rack web page. We recommend a value of <span class="monospaced">2 * x</span>, where <span class="monospaced">x</span> is the average
2023
2301
  number of seconds that a visitor spends on a single Rails/Rack web page. But your
2024
2302
  mileage may vary.</p></div>
2025
2303
  <div class="paragraph"><p>When this value is set to <em>0</em>, application instances will not be shutdown unless
@@ -2082,8 +2360,8 @@ any number of times.</p></div>
2082
2360
  <h5 id="_example_1_basic_usage">Example 1: basic usage</h5>
2083
2361
  <div class="paragraph"><p>Suppose that you have the following web applications.</p></div>
2084
2362
  <div class="listingblock">
2085
- <div class="content">
2086
- <pre><tt>server {
2363
+ <div class="content monospaced">
2364
+ <pre>server {
2087
2365
  listen 80;
2088
2366
  server_name foo.com;
2089
2367
  root /webapps/foo/public;
@@ -2095,15 +2373,15 @@ server {
2095
2373
  server_name bar.com;
2096
2374
  root /webapps/bar/public;
2097
2375
  passenger_enabled on;
2098
- }</tt></pre>
2376
+ }</pre>
2099
2377
  </div></div>
2100
2378
  <div class="paragraph"><p>You want both of them to be pre-started during Nginx startup. The URL for
2101
2379
  foo.com is <em>http://foo.com/</em> (or, equivalently, <em>http://foo.com:80/</em>) and
2102
2380
  the URL for bar.com is <em>http://bar.com:3500/</em>. So we add two passenger_pre_start
2103
2381
  directives, like this:</p></div>
2104
2382
  <div class="listingblock">
2105
- <div class="content">
2106
- <pre><tt>server {
2383
+ <div class="content monospaced">
2384
+ <pre>server {
2107
2385
  listen 80;
2108
2386
  server_name foo.com;
2109
2387
  root /webapps/foo/public;
@@ -2118,38 +2396,38 @@ server {
2118
2396
  }
2119
2397
 
2120
2398
  passenger_pre_start http://foo.com/; # &lt;--- added
2121
- passenger_pre_start http://bar.com:3500/; # &lt;--- added</tt></pre>
2399
+ passenger_pre_start http://bar.com:3500/; # &lt;--- added</pre>
2122
2400
  </div></div>
2123
2401
  </div>
2124
2402
  <div class="sect4">
2125
2403
  <h5 id="_example_2_pre_starting_apps_that_are_deployed_in_sub_uris">Example 2: pre-starting apps that are deployed in sub-URIs</h5>
2126
2404
  <div class="paragraph"><p>Suppose that you have a web application deployed in a sub-URI <em>/store</em>, like this:</p></div>
2127
2405
  <div class="listingblock">
2128
- <div class="content">
2129
- <pre><tt>server {
2406
+ <div class="content monospaced">
2407
+ <pre>server {
2130
2408
  listen 80;
2131
2409
  server_name myblog.com;
2132
2410
  root /webapps/wordpress;
2133
2411
  rails_base_uri /store;
2134
- }</tt></pre>
2412
+ }</pre>
2135
2413
  </div></div>
2136
2414
  <div class="paragraph"><p>Then specify the <em>server_name</em> valuue followed by the sub-URI, like this:</p></div>
2137
2415
  <div class="listingblock">
2138
- <div class="content">
2139
- <pre><tt>server {
2416
+ <div class="content monospaced">
2417
+ <pre>server {
2140
2418
  listen 80;
2141
2419
  server_name myblog.com;
2142
2420
  root /webapps/wordpress;
2143
2421
  rails_base_uri /store;
2144
2422
  }
2145
2423
 
2146
- passenger_pre_start http://myblog.com/store; # &lt;----- added</tt></pre>
2424
+ passenger_pre_start http://myblog.com/store; # &lt;----- added</pre>
2147
2425
  </div></div>
2148
2426
  <div class="paragraph"><p>The sub-URI <strong>must</strong> be included; if you don&#8217;t then the directive will have no effect.
2149
2427
  The following example is wrong and won&#8217;t pre-start the store web application:</p></div>
2150
2428
  <div class="listingblock">
2151
- <div class="content">
2152
- <pre><tt>passenger_pre_start http://myblog.com/; # &lt;----- WRONG! Missing "/store" part.</tt></pre>
2429
+ <div class="content monospaced">
2430
+ <pre>passenger_pre_start http://myblog.com/; # &lt;----- WRONG! Missing "/store" part.</pre>
2153
2431
  </div></div>
2154
2432
  </div>
2155
2433
  <div class="sect4">
@@ -2162,8 +2440,8 @@ after a few minutes of inactivity. If you don&#8217;t want that to happen, then
2162
2440
  you should combine passenger_pre_start with
2163
2441
  <a href="#PassengerMinInstances">passenger_min_instances</a>, like this:</p></div>
2164
2442
  <div class="listingblock">
2165
- <div class="content">
2166
- <pre><tt>server {
2443
+ <div class="content monospaced">
2444
+ <pre>server {
2167
2445
  listen 80;
2168
2446
  server_name foo.com;
2169
2447
  root /webapps/foo/public;
@@ -2180,7 +2458,7 @@ server {
2180
2458
  }
2181
2459
 
2182
2460
  passenger_pre_start http://foo.com/;
2183
- passenger_pre_start http://bar.com:3500/;</tt></pre>
2461
+ passenger_pre_start http://bar.com:3500/;</pre>
2184
2462
  </div></div>
2185
2463
  </div>
2186
2464
  <div class="sect4">
@@ -2205,18 +2483,18 @@ in example 1 resolves to 209.85.227.99; Phusion Passenger will
2205
2483
  send the following HTTP request to 127.0.0.1 port 3500 (and not to 209.85.227.99
2206
2484
  port 3500):</p></div>
2207
2485
  <div class="listingblock">
2208
- <div class="content">
2209
- <pre><tt>HEAD / HTTP/1.1
2486
+ <div class="content monospaced">
2487
+ <pre>HEAD / HTTP/1.1
2210
2488
  Host: bar.com
2211
- Connection: close</tt></pre>
2489
+ Connection: close</pre>
2212
2490
  </div></div>
2213
2491
  <div class="paragraph"><p>Similarly, for example 2, Phusion Passenger will send the following HTTP request
2214
2492
  to 127.0.0.1 port 80:</p></div>
2215
2493
  <div class="listingblock">
2216
- <div class="content">
2217
- <pre><tt>HEAD /store HTTP/1.1
2494
+ <div class="content monospaced">
2495
+ <pre>HEAD /store HTTP/1.1
2218
2496
  Host: myblog.com
2219
- Connection: close</tt></pre>
2497
+ Connection: close</pre>
2220
2498
  </div></div>
2221
2499
  </div>
2222
2500
  <div class="sect4">
@@ -2285,7 +2563,7 @@ error messages should be written to instead.</p></div>
2285
2563
  <h3 id="_ruby_on_rails_specific_options">5.9. Ruby on Rails-specific options</h3>
2286
2564
  <div class="sect3">
2287
2565
  <h4 id="RailsEnv">5.9.1. rails_env &lt;string&gt;</h4>
2288
- <div class="paragraph"><p>This option allows one to specify the default <tt>RAILS_ENV</tt> value.</p></div>
2566
+ <div class="paragraph"><p>This option allows one to specify the default <span class="monospaced">RAILS_ENV</span> value.</p></div>
2289
2567
  <div class="paragraph"><p>This option may occur in the following places:</p></div>
2290
2568
  <div class="ulist"><ul>
2291
2569
  <li>
@@ -2394,7 +2672,7 @@ In an <em>if</em> configuration scope.
2394
2672
  <h3 id="_rack_specific_options">5.10. Rack-specific options</h3>
2395
2673
  <div class="sect3">
2396
2674
  <h4 id="RackEnv">5.10.1. rack_env &lt;string&gt;</h4>
2397
- <div class="paragraph"><p>This option allows one to specify the default <tt>RACK_ENV</tt> value.</p></div>
2675
+ <div class="paragraph"><p>This option allows one to specify the default <span class="monospaced">RACK_ENV</span> value.</p></div>
2398
2676
  <div class="paragraph"><p>This option may occur in the following places:</p></div>
2399
2677
  <div class="ulist"><ul>
2400
2678
  <li>
@@ -2439,17 +2717,17 @@ compatibility reasons.</p></div>
2439
2717
  maintenance and troubleshooting.</p></div>
2440
2718
  <div class="sect2">
2441
2719
  <h3 id="_inspecting_memory_usage">6.1. Inspecting memory usage</h3>
2442
- <div class="paragraph"><p>Process inspection tools such as <tt>ps</tt> and <tt>top</tt> are useful, but they
2720
+ <div class="paragraph"><p>Process inspection tools such as <span class="monospaced">ps</span> and <span class="monospaced">top</span> are useful, but they
2443
2721
  <a href="http://groups.google.com/group/phusion-passenger/msg/1fd1c233456d3180">rarely show the correct memory usage</a>.
2444
- The real memory usage is usually lower than what <tt>ps</tt> and <tt>top</tt> report.</p></div>
2722
+ The real memory usage is usually lower than what <span class="monospaced">ps</span> and <span class="monospaced">top</span> report.</p></div>
2445
2723
  <div class="paragraph"><p>There are many technical reasons why this is so, but an explanation is beyond
2446
2724
  the scope of this Users Guide. We kindly refer the interested reader to
2447
2725
  operating systems literature about <em>virtual memory</em> and <em>copy-on-write</em>.</p></div>
2448
- <div class="paragraph"><p>The tool <tt>passenger-memory-stats</tt> allows one to easily analyze Phusion Passenger&#8217;s
2726
+ <div class="paragraph"><p>The tool <span class="monospaced">passenger-memory-stats</span> allows one to easily analyze Phusion Passenger&#8217;s
2449
2727
  and Apache&#8217;s real memory usage. For example:</p></div>
2450
2728
  <div class="listingblock">
2451
- <div class="content">
2452
- <pre><tt>[bash@localhost root]# passenger-memory-stats
2729
+ <div class="content monospaced">
2730
+ <pre>[bash@localhost root]# passenger-memory-stats
2453
2731
  ------------- Apache processes --------------.
2454
2732
  PID PPID Threads VMSize Private Name
2455
2733
  ---------------------------------------------.
@@ -2472,7 +2750,7 @@ PID Threads VMSize Private Name
2472
2750
  23791 1 26.8 MB 2.9 MB Passenger ApplicationSpawner: /var/www/projects/app1-foobar
2473
2751
  23793 1 26.9 MB 17.1 MB Rails: /var/www/projects/app1-foobar
2474
2752
  ### Processes: 4
2475
- ### Total private dirty RSS: 27.76 M</tt></pre>
2753
+ ### Total private dirty RSS: 27.76 M</pre>
2476
2754
  </div></div>
2477
2755
  <div class="paragraph"><p>The <em>Private</em> or <em>private dirty RSS</em> field shows the <strong>real</strong> memory usage of processes. Here,
2478
2756
  we see that all the Apache worker processes only take less than 1 MB memory each.
@@ -2481,7 +2759,7 @@ This is a lot less than the 50 MB-ish memory usage as shown in the <em>VMSize</e
2481
2759
  <div class="admonitionblock">
2482
2760
  <table><tr>
2483
2761
  <td class="icon">
2484
- <img src="./images/icons/note.png" alt="Note" />
2762
+ <img src="./images/icons/note.png" alt="Note">
2485
2763
  </td>
2486
2764
  <td class="content">Private dirty RSS reporting only works on Linux. Unfortunately other operating systems
2487
2765
  don&#8217;t provide facilities for determining processes' private dirty RSS. On non-Linux systems,
@@ -2491,11 +2769,11 @@ the Resident Set Size is reported instead.</td>
2491
2769
  </div>
2492
2770
  <div class="sect2">
2493
2771
  <h3 id="_inspecting_phusion_passenger_8217_s_internal_status">6.2. Inspecting Phusion Passenger&#8217;s internal status</h3>
2494
- <div class="paragraph"><p>One can inspect Phusion Passenger&#8217;s internal status with the tool <tt>passenger-status</tt>.
2772
+ <div class="paragraph"><p>One can inspect Phusion Passenger&#8217;s internal status with the tool <span class="monospaced">passenger-status</span>.
2495
2773
  This tool must typically be run as root. For example:</p></div>
2496
2774
  <div class="listingblock">
2497
- <div class="content">
2498
- <pre><tt>[bash@localhost root]# passenger-status
2775
+ <div class="content monospaced">
2776
+ <pre>[bash@localhost root]# passenger-status
2499
2777
  ----------- General information -----------
2500
2778
  max = 6
2501
2779
  count = 1
@@ -2504,7 +2782,7 @@ inactive = 1
2504
2782
 
2505
2783
  ----------- Domains -----------
2506
2784
  /var/www/projects/app1-foobar:
2507
- PID: 9617 Sessions: 0 Processed: 7 Uptime: 2m 23s</tt></pre>
2785
+ PID: 9617 Sessions: 0 Processed: 7 Uptime: 2m 23s</pre>
2508
2786
  </div></div>
2509
2787
  <div class="paragraph"><p>The <em>general information</em> section shows the following information:</p></div>
2510
2788
  <div class="dlist"><dl>
@@ -2545,7 +2823,7 @@ The number of application instances that are currently <strong>not</strong> proc
2545
2823
  requests, i.e. are idle. Idle application instances will be shutdown after a while,
2546
2824
  as can be specified with <a href="#PassengerPoolIdleTime">PassengerPoolIdleTime (Apache)</a>/<a href="#PassengerPoolIdleTime">passenger_pool_idle_time (Nginx)</a> (unless this
2547
2825
  value is set to 0, in which case application instances are never shut down via idle
2548
- time). The value of <em>inactive</em> equals <tt>count - active</tt>.
2826
+ time). The value of <em>inactive</em> equals <span class="monospaced">count - active</span>.
2549
2827
  </p>
2550
2828
  </dd>
2551
2829
  </dl></div>
@@ -2584,22 +2862,22 @@ Shows for how long the application instance has been running.
2584
2862
  application instances should be fairly close to each other. For example, this is fairly
2585
2863
  normal:</p></div>
2586
2864
  <div class="listingblock">
2587
- <div class="content">
2588
- <pre><tt> PID: 4281 Sessions: 2 Processed: 7 Uptime: 5m 11s
2865
+ <div class="content monospaced">
2866
+ <pre> PID: 4281 Sessions: 2 Processed: 7 Uptime: 5m 11s
2589
2867
  PID: 4268 Sessions: 0 Processed: 5 Uptime: 4m 52s
2590
2868
  PID: 4265 Sessions: 1 Processed: 6 Uptime: 5m 38s
2591
- PID: 4275 Sessions: 1 Processed: 7 Uptime: 3m 14s</tt></pre>
2869
+ PID: 4275 Sessions: 1 Processed: 7 Uptime: 3m 14s</pre>
2592
2870
  </div></div>
2593
2871
  <div class="paragraph"><p>But if you see a "spike", i.e. an application instance has an unusually high number of
2594
2872
  sessions compared to the others, then there might be a problem:</p></div>
2595
2873
  <div class="listingblock">
2596
- <div class="content">
2597
- <pre><tt> PID: 4281 Sessions: 2 Processed: 7 Uptime: 5m 11s
2874
+ <div class="content monospaced">
2875
+ <pre> PID: 4281 Sessions: 2 Processed: 7 Uptime: 5m 11s
2598
2876
  PID: 17468 Sessions: 8 &lt;-+ Processed: 2 Uptime: 4m 47s
2599
2877
  PID: 4265 Sessions: 1 | Processed: 6 Uptime: 5m 38s
2600
2878
  PID: 4275 Sessions: 1 | Processed: 7 Uptime: 3m 14s
2601
2879
  |
2602
- +---- "spike"</tt></pre>
2880
+ +---- "spike"</pre>
2603
2881
  </div></div>
2604
2882
  <div class="paragraph"><p>Possible reasons why spikes can occur:</p></div>
2605
2883
  <div class="olist arabic"><ol class="arabic">
@@ -2633,7 +2911,7 @@ the Apache error log.</p></div>
2633
2911
  <div class="admonitionblock">
2634
2912
  <table><tr>
2635
2913
  <td class="icon">
2636
- <img src="./images/icons/note.png" alt="Note" />
2914
+ <img src="./images/icons/note.png" alt="Note">
2637
2915
  </td>
2638
2916
  <td class="content">It is safe to kill application instances, even in live environments. Phusion Passenger
2639
2917
  will restart killed application instances, as if nothing bad happened.</td>
@@ -2668,15 +2946,15 @@ Other debugging use cases.
2668
2946
  </ul></div>
2669
2947
  <div class="paragraph"><p>All individual application processes are accessible via HTTP, so you can use standard
2670
2948
  HTTP tools like <em>curl</em>. The exact addresses can be obtained with the command
2671
- <tt>passenger-status --verbose</tt>. These sockets are all bound to 127.0.0.1, but the port
2949
+ <span class="monospaced">passenger-status --verbose</span>. These sockets are all bound to 127.0.0.1, but the port
2672
2950
  number is dynamically assigned. As a security measure, the sockets are also protected
2673
2951
  with a process-specific random password, which you can see in the
2674
- <tt>passenger-status --verbose</tt> output. This password must be sent through the
2952
+ <span class="monospaced">passenger-status --verbose</span> output. This password must be sent through the
2675
2953
  &#8220;X-Passenger-Connect-Password&#8221; HTTP header.</p></div>
2676
2954
  <div class="paragraph"><p>Example:</p></div>
2677
2955
  <div class="listingblock">
2678
- <div class="content">
2679
- <pre><tt>bash# passenger-status --verbose
2956
+ <div class="content monospaced">
2957
+ <pre>bash# passenger-status --verbose
2680
2958
  ----------- General information -----------
2681
2959
  max = 6
2682
2960
  count = 2
@@ -2692,7 +2970,7 @@ Waiting on global queue: 0
2692
2970
  Password: nFfVOX1F8LjZ90HJh28Sd_htJOsgRsNne2QXKf8NIXw
2693
2971
  * PID: 24250 Sessions: 0 Processed: 4 Uptime: 1s
2694
2972
  URL : http://127.0.0.1:57933
2695
- Password: _RGXlQ9EGDGJKLevQ_qflUtF1KmxEo2UiRzMwIE1sBY</tt></pre>
2973
+ Password: _RGXlQ9EGDGJKLevQ_qflUtF1KmxEo2UiRzMwIE1sBY</pre>
2696
2974
  </div></div>
2697
2975
  <div class="paragraph"><p>Here we see that the web application <em>rack.test</em> has two processes.
2698
2976
  Process 24235 is accessible via <a href="http://127.0.0.1:58122">http://127.0.0.1:58122</a>, and
@@ -2700,8 +2978,8 @@ process 24250 is accessible via <a href="http://127.0.0.1:57933">http://127.0.0.
2700
2978
  <div class="paragraph"><p>To access 24235 we must send its password, <em>nFfVOX1F8LjZ90HJh28Sd_htJOsgRsNne2QXKf8NIXw</em>,
2701
2979
  through the <em>X-Passenger-Connect-Password</em> HTTP header, like this:</p></div>
2702
2980
  <div class="listingblock">
2703
- <div class="content">
2704
- <pre><tt>bash# curl -H "X-Passenger-Connect-Password: nFfVOX1F8LjZ90HJh28Sd_htJOsgRsNne2QXKf8NIXw" http://127.0.0.1:58122/</tt></pre>
2981
+ <div class="content monospaced">
2982
+ <pre>bash# curl -H "X-Passenger-Connect-Password: nFfVOX1F8LjZ90HJh28Sd_htJOsgRsNne2QXKf8NIXw" http://127.0.0.1:58122/</pre>
2705
2983
  </div></div>
2706
2984
  </div>
2707
2985
  </div>
@@ -2762,8 +3040,8 @@ Please visit the website for details.</p></div>
2762
3040
  The following Capistrano recipe demonstrates Phusion Passenger support.
2763
3041
  It assumes that you&#8217;re using Git as version control system.</p></div>
2764
3042
  <div class="listingblock">
2765
- <div class="content">
2766
- <pre><tt>set :application, "myapp"
3043
+ <div class="content monospaced">
3044
+ <pre>set :application, "myapp"
2767
3045
  set :domain, "example.com"
2768
3046
  set :repository, "ssh://#{domain}/path-to-your-git-repo/#{application}.git"
2769
3047
  set :use_sudo, false
@@ -2787,7 +3065,7 @@ namespace :deploy do
2787
3065
  task :restart, :roles =&gt; :app do
2788
3066
  run "touch #{current_release}/tmp/restart.txt"
2789
3067
  end
2790
- end</tt></pre>
3068
+ end</pre>
2791
3069
  </div></div>
2792
3070
  </div>
2793
3071
  <div class="sect2">
@@ -2804,15 +3082,15 @@ If you have a <em>.bundle/environment.rb</em> in your application root, then Phu
2804
3082
  <li>
2805
3083
  <p>
2806
3084
  Otherwise, if you have a <em>Gemfile</em>, then Phusion Passenger will automatically call
2807
- <tt>Bundler.setup()</tt> before loading your application.
3085
+ <span class="monospaced">Bundler.setup()</span> before loading your application.
2808
3086
  </p>
2809
3087
  </li>
2810
3088
  </ul></div>
2811
- <div class="paragraph"><p>It&#8217;s possible that your application also calls <tt>Bundler.setup</tt> during loading, e.g. in
3089
+ <div class="paragraph"><p>It&#8217;s possible that your application also calls <span class="monospaced">Bundler.setup</span> during loading, e.g. in
2812
3090
  <em>config.ru</em> or in <em>config/boot.rb</em>. This is the case with Rails 3, and is also the case if you
2813
3091
  modified your <em>config/boot.rb</em> according to the
2814
3092
  <a href="http://gembundler.com/rails23.html">Bundler Rails 2.3 instructions</a>.
2815
- This leads to <tt>Bundler.setup</tt> being called twice, once before the application startup file
3093
+ This leads to <span class="monospaced">Bundler.setup</span> being called twice, once before the application startup file
2816
3094
  is required and once during application startup. However this is harmless and doesn&#8217;t
2817
3095
  have any negative effects.</p></div>
2818
3096
  <div class="paragraph"><p>Phusion Passenger assumes that you&#8217;re using Bundler &gt;= 0.9.5. If you don&#8217;t want Phusion
@@ -2847,8 +3125,8 @@ move it to <em>/usr/local/passenger/</em>, then do this:</p></div>
2847
3125
  Run the following command:
2848
3126
  </p>
2849
3127
  <div class="listingblock">
2850
- <div class="content">
2851
- <pre><tt>mv /opt/passenger /usr/local/passenger</tt></pre>
3128
+ <div class="content monospaced">
3129
+ <pre>mv /opt/passenger /usr/local/passenger</pre>
2852
3130
  </div></div>
2853
3131
  </li>
2854
3132
  <li>
@@ -2856,8 +3134,8 @@ Run the following command:
2856
3134
  Edit your Apache configuration file, and set:
2857
3135
  </p>
2858
3136
  <div class="listingblock">
2859
- <div class="content">
2860
- <pre><tt>PassengerRoot /usr/local/passenger</tt></pre>
3137
+ <div class="content monospaced">
3138
+ <pre>PassengerRoot /usr/local/passenger</pre>
2861
3139
  </div></div>
2862
3140
  </li>
2863
3141
  </ol></div>
@@ -2868,8 +3146,8 @@ Edit your Apache configuration file, and set:
2868
3146
  specific Ruby on Rails version. You can install a specific version with
2869
3147
  this command:</p></div>
2870
3148
  <div class="listingblock">
2871
- <div class="content">
2872
- <pre><tt>gem install rails -v X.X.X</tt></pre>
3149
+ <div class="content monospaced">
3150
+ <pre>gem install rails -v X.X.X</pre>
2873
3151
  </div></div>
2874
3152
  <div class="paragraph"><p>where <em>X.X.X</em> is the version number of Ruby on Rails.</p></div>
2875
3153
  <div class="paragraph"><p>All of these versions will exist in parallel, and will not conflict with each
@@ -2887,7 +3165,7 @@ application, as long as <em>always_restart.txt</em> exists.</p></div>
2887
3165
  <div class="admonitionblock">
2888
3166
  <table><tr>
2889
3167
  <td class="icon">
2890
- <img src="./images/icons/note.png" alt="Note" />
3168
+ <img src="./images/icons/note.png" alt="Note">
2891
3169
  </td>
2892
3170
  <td class="content">If you&#8217;re just developing a Rails application then you probably don&#8217;t need
2893
3171
  this feature. If you set <em>RailsEnv development</em> in your Apache configuration,
@@ -2921,14 +3199,14 @@ So relative URIs usually don&#8217;t work well with layout templates.</p></div>
2921
3199
  <div class="paragraph"><p>The second and highly recommended way is to always use Rails helper methods to
2922
3200
  output tags for static assets. These helper methods automatically take care
2923
3201
  of prepending the base URI that you&#8217;ve deployed the application to. For images
2924
- there is <tt>image_tag</tt>, for JavaScript there is <tt>javascript_include_tag</tt> and for
2925
- CSS there is <tt>stylesheet_link_tag</tt>. In the above example you would simply remove
3202
+ there is <span class="monospaced">image_tag</span>, for JavaScript there is <span class="monospaced">javascript_include_tag</span> and for
3203
+ CSS there is <span class="monospaced">stylesheet_link_tag</span>. In the above example you would simply remove
2926
3204
  the <em>&lt;img&gt;</em> HTML tag and replace it with inline Ruby like this:</p></div>
2927
3205
  <div class="listingblock">
2928
- <div class="content">
2929
- <pre><tt>&lt;%= image_tag("foo.jpg") %&gt;</tt></pre>
3206
+ <div class="content monospaced">
3207
+ <pre>&lt;%= image_tag("foo.jpg") %&gt;</pre>
2930
3208
  </div></div>
2931
- <div class="paragraph"><p>This will generate the proper image tag to <tt>$RAILS_ROOT/public/images/foo.jpg</tt>
3209
+ <div class="paragraph"><p>This will generate the proper image tag to <span class="monospaced">$RAILS_ROOT/public/images/foo.jpg</span>
2932
3210
  so that your images will always work no matter what sub-URI you&#8217;ve deployed to.</p></div>
2933
3211
  <div class="paragraph"><p>These helper methods are more valuable than you may think. For example they also
2934
3212
  append a timestamp to the URI to better facilitate HTTP caching. For more information,
@@ -2987,8 +3265,8 @@ able to serve, and how it knows what kind of web application it is (e.g. Rails o
2987
3265
  <div class="paragraph"><p>Phusion Passenger checks whether the virtual host is a Rails application by checking
2988
3266
  whether the following file exists:</p></div>
2989
3267
  <div class="listingblock">
2990
- <div class="content">
2991
- <pre><tt>dirname(DocumentRoot) + "/config/environment.rb"</tt></pre>
3268
+ <div class="content monospaced">
3269
+ <pre>dirname(DocumentRoot) + "/config/environment.rb"</pre>
2992
3270
  </div></div>
2993
3271
  <div class="paragraph"><p>If you&#8217;re not a programmer and don&#8217;t understand the above pseudo-code snippet, it means
2994
3272
  that Phusion Passenger will:</p></div>
@@ -3027,13 +3305,13 @@ Phusion Passenger will look for <em>config.ru</em> instead of <em>config/environ
3027
3305
  Attribution-Share Alike 3.0 Unported License</a>.</p></div>
3028
3306
  <div class="paragraph"><p><span class="image">
3029
3307
  <a class="image" href="http://creativecommons.org/licenses/by-sa/3.0/">
3030
- <img src="images/by_sa.png" alt="images/by_sa.png" />
3308
+ <img src="images/by_sa.png" alt="images/by_sa.png">
3031
3309
  </a>
3032
3310
  </span></p></div>
3033
3311
  <div class="paragraph"><p>Phusion Passenger is brought to you by <a href="http://www.phusion.nl/">Phusion</a>.</p></div>
3034
3312
  <div class="paragraph"><p><span class="image">
3035
3313
  <a class="image" href="http://www.phusion.nl/">
3036
- <img src="images/phusion_banner.png" alt="images/phusion_banner.png" />
3314
+ <img src="images/phusion_banner.png" alt="images/phusion_banner.png">
3037
3315
  </a>
3038
3316
  </span></p></div>
3039
3317
  <div class="paragraph"><p>Phusion Passenger is a trademark of Hongli Lai &amp; Ninh Bui.</p></div>
@@ -3047,10 +3325,10 @@ Attribution-Share Alike 3.0 Unported License</a>.</p></div>
3047
3325
  <div class="paragraph"><p>The root directory of an application that&#8217;s served by Phusion Passenger.</p></div>
3048
3326
  <div class="paragraph"><p>In case of Ruby on Rails applications, this is the directory that contains
3049
3327
  <em>Rakefile</em>, <em>app/</em>, <em>config/</em>, <em>public/</em>, etc. In other words, the directory
3050
- pointed to by <tt>RAILS_ROOT</tt>. For example, take the following directory structure:</p></div>
3328
+ pointed to by <span class="monospaced">RAILS_ROOT</span>. For example, take the following directory structure:</p></div>
3051
3329
  <div class="listingblock">
3052
- <div class="content">
3053
- <pre><tt>/apps/foo/ &lt;------ This is the Rails application's application root!
3330
+ <div class="content monospaced">
3331
+ <pre>/apps/foo/ &lt;------ This is the Rails application's application root!
3054
3332
  |
3055
3333
  +- app/
3056
3334
  | |
@@ -3070,13 +3348,13 @@ pointed to by <tt>RAILS_ROOT</tt>. For example, take the following directory str
3070
3348
  | |
3071
3349
  | +- ...
3072
3350
  |
3073
- +- ...</tt></pre>
3351
+ +- ...</pre>
3074
3352
  </div></div>
3075
3353
  <div class="paragraph"><p>In case of Rack applications, this is the directory that contains <em>config.ru</em>.
3076
3354
  For example, take the following directory structure:</p></div>
3077
3355
  <div class="listingblock">
3078
- <div class="content">
3079
- <pre><tt>/apps/bar/ &lt;----- This is the Rack application's application root!
3356
+ <div class="content monospaced">
3357
+ <pre>/apps/bar/ &lt;----- This is the Rack application's application root!
3080
3358
  |
3081
3359
  +- public/
3082
3360
  | |
@@ -3084,13 +3362,13 @@ For example, take the following directory structure:</p></div>
3084
3362
  |
3085
3363
  +- config.ru
3086
3364
  |
3087
- +- ...</tt></pre>
3365
+ +- ...</pre>
3088
3366
  </div></div>
3089
3367
  <div class="paragraph"><p>In case of Python (WSGI) applications, this is the directory that contains
3090
3368
  <em>passenger_wsgi.py</em>. For example, take the following directory structure:</p></div>
3091
3369
  <div class="listingblock">
3092
- <div class="content">
3093
- <pre><tt>/apps/baz/ &lt;----- This is the WSGI application's application root!
3370
+ <div class="content monospaced">
3371
+ <pre>/apps/baz/ &lt;----- This is the WSGI application's application root!
3094
3372
  |
3095
3373
  +- public/
3096
3374
  | |
@@ -3098,7 +3376,7 @@ For example, take the following directory structure:</p></div>
3098
3376
  |
3099
3377
  +- passenger_wsgi.py
3100
3378
  |
3101
- +- ...</tt></pre>
3379
+ +- ...</pre>
3102
3380
  </div></div>
3103
3381
  </div>
3104
3382
  </div>
@@ -3135,7 +3413,7 @@ programmers jargon, Phusion Passenger calls fork(), but not exec().</p></div>
3135
3413
  <div class="admonitionblock">
3136
3414
  <table><tr>
3137
3415
  <td class="icon">
3138
- <img src="./images/icons/note.png" alt="Note" />
3416
+ <img src="./images/icons/note.png" alt="Note">
3139
3417
  </td>
3140
3418
  <td class="content">Smart spawning is supported for all Ruby applications but not for WSGI applications.</td>
3141
3419
  </tr></table>
@@ -3144,8 +3422,8 @@ programmers jargon, Phusion Passenger calls fork(), but not exec().</p></div>
3144
3422
  because each worker process has its own private copy of the Rails application
3145
3423
  as well as the Rails framework. This wastes memory as well as startup time.</p></div>
3146
3424
  <div class="paragraph"><p><span class="image">
3147
- <img src="images/conservative_spawning.png" alt="Worker processes and conservative spawning" />
3148
- </span><br />
3425
+ <img src="images/conservative_spawning.png" alt="Worker processes and conservative spawning">
3426
+ </span><br>
3149
3427
  <em>Figure: Worker processes and conservative spawning. Each worker process has its
3150
3428
  own private copy of the application code and Rails framework code.</em></p></div>
3151
3429
  <div class="paragraph"><p>It is possible to make the different worker processes share the memory occupied
@@ -3170,8 +3448,8 @@ processes will share as much common
3170
3448
  memory as possible. That is, they will all share the same application and Rails
3171
3449
  framework code.</p></div>
3172
3450
  <div class="paragraph"><p><span class="image">
3173
- <img src="images/smart-lv2.png" alt="images/smart-lv2.png" />
3174
- </span><br />
3451
+ <img src="images/smart-lv2.png" alt="images/smart-lv2.png">
3452
+ </span><br>
3175
3453
  <em>Figure: Worker processes and the smart-lv2 spawn method. All worker processes,
3176
3454
  as well as the ApplicationSpawner, share the same application code and Rails
3177
3455
  framework code.</em></p></div>
@@ -3255,7 +3533,7 @@ may potentially cause problems.</p></div>
3255
3533
  <div class="paragraph"><p>The problem commonly involves socket connections that are unintentially being
3256
3534
  shared. You can fix it by closing and reestablishing the connection when Phusion
3257
3535
  Passenger is creating a new worker process. Phusion Passenger provides the API
3258
- call <tt>PhusionPassenger.on_event(:starting_worker_process)</tt> to do so. So you
3536
+ call <span class="monospaced">PhusionPassenger.on_event(:starting_worker_process)</span> to do so. So you
3259
3537
  could insert the following code in your <em>environment.rb</em>:</p></div>
3260
3538
  <div class="listingblock">
3261
3539
  <div class="content"><!-- Generator: GNU source-highlight 2.11.1
@@ -3281,22 +3559,22 @@ encounter any database issues when using smart spawning mode.</p></div>
3281
3559
  <em>environment.rb</em>. This causes the ApplicationSpawner to have a socket connection
3282
3560
  (file descriptor) to the Memcached server, as shown in the following figure:</p></div>
3283
3561
  <div class="literalblock">
3284
- <div class="content">
3285
- <pre><tt>+--------------------+
3562
+ <div class="content monospaced">
3563
+ <pre>+--------------------+
3286
3564
  | ApplicationSpawner |-----------[Memcached server]
3287
- +--------------------+</tt></pre>
3565
+ +--------------------+</pre>
3288
3566
  </div></div>
3289
3567
  <div class="paragraph"><p>Phusion Passenger then proceeds with creating a new Rails worker process, which
3290
3568
  is to process incoming HTTP requests. The result will look like this:</p></div>
3291
3569
  <div class="literalblock">
3292
- <div class="content">
3293
- <pre><tt>+--------------------+
3570
+ <div class="content monospaced">
3571
+ <pre>+--------------------+
3294
3572
  | ApplicationSpawner |------+----[Memcached server]
3295
3573
  +--------------------+ |
3296
3574
  |
3297
3575
  +--------------------+ |
3298
3576
  | Worker process 1 |-----/
3299
- +--------------------+</tt></pre>
3577
+ +--------------------+</pre>
3300
3578
  </div></div>
3301
3579
  <div class="paragraph"><p>Since a <em>fork()</em> makes a (virtual) complete copy of a process, all its file
3302
3580
  descriptors will be copied as well. What we see here is that ApplicationSpawner
@@ -3305,8 +3583,8 @@ and Worker process 1 both share the same connection to Memcached.</p></div>
3305
3583
  spawn another worker process. It does so by forking ApplicationSpawner. The
3306
3584
  result is now as follows:</p></div>
3307
3585
  <div class="literalblock">
3308
- <div class="content">
3309
- <pre><tt>+--------------------+
3586
+ <div class="content monospaced">
3587
+ <pre>+--------------------+
3310
3588
  | ApplicationSpawner |------+----[Memcached server]
3311
3589
  +--------------------+ |
3312
3590
  |
@@ -3316,7 +3594,7 @@ result is now as follows:</p></div>
3316
3594
  |
3317
3595
  +--------------------+ |
3318
3596
  | Worker process 2 |-----/
3319
- +--------------------+</tt></pre>
3597
+ +--------------------+</pre>
3320
3598
  </div></div>
3321
3599
  <div class="paragraph"><p>As you can see, Worker process 1 and Worker process 2 have the same Memcache
3322
3600
  connection.</p></div>
@@ -3332,8 +3610,8 @@ recognize. In other words: the data from both handlers get interleaved. And thus
3332
3610
  Memcached is forced to handle this as an error.</p></div>
3333
3611
  <div class="paragraph"><p>This problem can be solved by reestablishing the connection to Memcached after forking:</p></div>
3334
3612
  <div class="literalblock">
3335
- <div class="content">
3336
- <pre><tt>+--------------------+
3613
+ <div class="content monospaced">
3614
+ <pre>+--------------------+
3337
3615
  | ApplicationSpawner |------+----[Memcached server]
3338
3616
  +--------------------+ | |
3339
3617
  | |
@@ -3347,7 +3625,7 @@ Memcached is forced to handle this as an error.</p></div>
3347
3625
  | Worker process 2 |-----/ connection |
3348
3626
  +--------------------+ |
3349
3627
  | |
3350
- +-------------------------------------+</tt></pre>
3628
+ +-------------------------------------+</pre>
3351
3629
  </div></div>
3352
3630
  <div class="paragraph"><p>Worker process 2 now has its own, separate communication channel with Memcached.
3353
3631
  The code in <em>environment.rb</em> looks like this:</p></div>
@@ -3385,7 +3663,7 @@ Memcached example, doesn&#8217;t help.</p></div>
3385
3663
  disappear after a fork call. So if you&#8217;ve created any threads in environment.rb,
3386
3664
  then those threads will no longer be running in newly created worker process.
3387
3665
  You need to revive them when a new worker process is created. Use the
3388
- <tt>:starting_worker_process</tt> event that Phusion Passenger provides, like this:</p></div>
3666
+ <span class="monospaced">:starting_worker_process</span> event that Phusion Passenger provides, like this:</p></div>
3389
3667
  <div class="listingblock">
3390
3668
  <div class="content"><!-- Generator: GNU source-highlight 2.11.1
3391
3669
  by Lorenzo Bettini
@@ -3417,16 +3695,16 @@ of <em>active_record/base.rb</em> located in <em>RAILS_ROOT/lib/patches</em>, an
3417
3695
  <em>RAILS_ROOT/lib/patches</em> comes first in the Ruby load path. When conservative
3418
3696
  spawning is used, the patched version of <em>base.rb</em> is properly loaded. When
3419
3697
  <em>smart</em> (not <em>smart-lv2</em>) spawning is used, the original <em>base.rb</em> is used
3420
- because it was already loaded, so a subsequent <tt>require "active_record/base"</tt>
3698
+ because it was already loaded, so a subsequent <span class="monospaced">require "active_record/base"</span>
3421
3699
  has no effect.</p></div>
3422
3700
  </div>
3423
3701
  </div>
3424
3702
  </div>
3425
3703
  </div>
3426
- <div id="footnotes"><hr /></div>
3704
+ <div id="footnotes"><hr></div>
3427
3705
  <div id="footer">
3428
3706
  <div id="footer-text">
3429
- Last updated 2010-12-05 20:52:52 CET
3707
+ Last updated 2011-08-03 11:00:00 CEST
3430
3708
  </div>
3431
3709
  </div>
3432
3710
  </body>