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.
- data/NEWS +27 -0
- data/README +1 -1
- data/bin/passenger-install-nginx-module +3 -1
- data/build/config.rb +2 -1
- data/build/cxx_tests.rb +7 -3
- data/build/documentation.rb +5 -40
- data/build/nginx.rb +0 -1
- data/build/packaging.rb +0 -6
- data/build/rake_extensions.rb +5 -0
- data/doc/Architectural overview.html +344 -77
- data/doc/Security of user switching support.html +338 -71
- data/doc/Users guide Apache with comments.html +4830 -0
- data/doc/Users guide Apache.html +695 -428
- data/doc/Users guide Apache.idmap.txt +80 -0
- data/doc/Users guide Apache.txt +5 -5
- data/doc/Users guide Nginx.html +591 -313
- data/doc/Users guide Nginx.txt +9 -3
- data/doc/Users guide Standalone.html +344 -77
- data/ext/boost/src/pthread/thread.cpp +1 -1
- data/ext/common/AccountsDatabase.h +1 -1
- data/ext/common/Constants.h +2 -2
- data/ext/common/Logging.h +2 -1
- data/ext/common/LoggingAgent/FilterSupport.h +107 -3
- data/ext/common/Session.h +1 -1
- data/ext/common/Utils.cpp +2 -0
- data/ext/common/Utils/Dechunker.h +232 -0
- data/ext/common/Utils/HttpHeaderBufferer.h +165 -0
- data/ext/common/Utils/StrIntUtils.cpp +51 -15
- data/ext/common/Utils/StrIntUtils.h +3 -0
- data/ext/common/Utils/StreamBoyerMooreHorspool.h +506 -0
- data/ext/nginx/Configuration.c +36 -282
- data/ext/nginx/ContentHandler.c +17 -0
- data/ext/nginx/HelperAgent.cpp +397 -39
- data/ext/oxt/tracable_exception.cpp +3 -1
- data/ext/ruby/extconf.rb +1 -0
- data/ext/ruby/passenger_native_support.c +3 -0
- data/helper-scripts/prespawn +113 -31
- data/lib/phusion_passenger.rb +2 -2
- data/lib/phusion_passenger/standalone/runtime_installer.rb +3 -2
- data/lib/phusion_passenger/standalone/start_command.rb +12 -12
- data/test/cxx/DechunkerTest.cpp +216 -0
- data/test/cxx/FilterSupportTest.cpp +31 -4
- data/test/cxx/HttpHeaderBuffererTest.cpp +203 -0
- data/test/cxx/UtilsTest.cpp +46 -3
- data/test/integration_tests/hello_world_rack_spec.rb +7 -0
- data/test/stub/rack/config.ru +6 -1
- data/test/stub/rails_apps/1.2/empty/public/dispatch.cgi +1 -1
- data/test/stub/rails_apps/1.2/empty/public/dispatch.fcgi +1 -1
- data/test/stub/rails_apps/1.2/empty/public/dispatch.rb +1 -1
- data/test/stub/rails_apps/2.0/empty/public/dispatch.cgi +1 -1
- data/test/stub/rails_apps/2.0/empty/public/dispatch.fcgi +1 -1
- data/test/stub/rails_apps/2.0/empty/public/dispatch.rb +1 -1
- data/test/stub/rails_apps/2.2/empty/public/dispatch.cgi +1 -1
- data/test/stub/rails_apps/2.2/empty/public/dispatch.fcgi +1 -1
- data/test/stub/rails_apps/2.2/empty/public/dispatch.rb +1 -1
- metadata +20 -403
- data/doc/Doxyfile +0 -241
- data/doc/cxxapi/AbstractSpawnManager_8h_source.html +0 -141
- data/doc/cxxapi/Account_8h_source.html +0 -206
- data/doc/cxxapi/AccountsDatabase_8h_source.html +0 -161
- data/doc/cxxapi/AgentBase_8h_source.html +0 -70
- data/doc/cxxapi/AgentsStarter_8h_source.html +0 -112
- data/doc/cxxapi/BCrypt_8h_source.html +0 -104
- data/doc/cxxapi/Blowfish_8h_source.html +0 -134
- data/doc/cxxapi/Bucket_8h_source.html +0 -118
- data/doc/cxxapi/Constants_8h_source.html +0 -79
- data/doc/cxxapi/ContentHandler_8h_source.html +0 -95
- data/doc/cxxapi/DirectoryMapper_8h_source.html +0 -311
- data/doc/cxxapi/EventedClient_8h_source.html +0 -733
- data/doc/cxxapi/EventedMessageServer_8h_source.html +0 -358
- data/doc/cxxapi/EventedServer_8h_source.html +0 -326
- data/doc/cxxapi/Exceptions_8h_source.html +0 -393
- data/doc/cxxapi/FileDescriptor_8h_source.html +0 -324
- data/doc/cxxapi/Hooks_8h_source.html +0 -76
- data/doc/cxxapi/HttpStatusExtractor_8h_source.html +0 -382
- data/doc/cxxapi/IniFile_8h_source.html +0 -527
- data/doc/cxxapi/Logging_8h_source.html +0 -796
- data/doc/cxxapi/MessageChannel_8h_source.html +0 -776
- data/doc/cxxapi/MessageClient_8h_source.html +0 -328
- data/doc/cxxapi/MessageReadersWriters_8h_source.html +0 -539
- data/doc/cxxapi/MessageServer_8h_source.html +0 -612
- data/doc/cxxapi/PoolOptions_8h_source.html +0 -549
- data/doc/cxxapi/Process_8h_source.html +0 -286
- data/doc/cxxapi/RandomGenerator_8h_source.html +0 -191
- data/doc/cxxapi/ResourceLocator_8h_source.html +0 -166
- data/doc/cxxapi/SafeLibev_8h_source.html +0 -180
- data/doc/cxxapi/ScgiRequestParser_8h_source.html +0 -406
- data/doc/cxxapi/ServerInstanceDir_8h_source.html +0 -378
- data/doc/cxxapi/Session_8h_source.html +0 -501
- data/doc/cxxapi/SpawnManager_8h_source.html +0 -647
- data/doc/cxxapi/StaticContentHandler_8h_source.html +0 -69
- data/doc/cxxapi/StaticString_8h_source.html +0 -329
- data/doc/cxxapi/StringListCreator_8h_source.html +0 -114
- data/doc/cxxapi/Utils_8h_source.html +0 -469
- data/doc/cxxapi/annotated.html +0 -87
- data/doc/cxxapi/apache2_2Configuration_8h_source.html +0 -82
- data/doc/cxxapi/classAgentWatcher-members.html +0 -54
- data/doc/cxxapi/classAgentWatcher.html +0 -419
- data/doc/cxxapi/classClient-members.html +0 -38
- data/doc/cxxapi/classClient.html +0 -123
- data/doc/cxxapi/classHooks-members.html +0 -40
- data/doc/cxxapi/classHooks.html +0 -153
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager-members.html +0 -40
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager.html +0 -187
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.map +0 -3
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1ArgumentException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1ArgumentException.html +0 -56
- data/doc/cxxapi/classPassenger_1_1ArrayMessage-members.html +0 -37
- data/doc/cxxapi/classPassenger_1_1ArrayMessage.html +0 -113
- data/doc/cxxapi/classPassenger_1_1BufferedUpload-members.html +0 -38
- data/doc/cxxapi/classPassenger_1_1BufferedUpload.html +0 -112
- data/doc/cxxapi/classPassenger_1_1BusyException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1BusyException.html +0 -54
- data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +0 -51
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +0 -41
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +0 -223
- data/doc/cxxapi/classPassenger_1_1EOFException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1EOFException.html +0 -61
- data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.map +0 -3
- data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1EventFd-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1EventFd.html +0 -52
- data/doc/cxxapi/classPassenger_1_1EventedClient-members.html +0 -59
- data/doc/cxxapi/classPassenger_1_1EventedClient.html +0 -531
- data/doc/cxxapi/classPassenger_1_1EventedMessageServer-members.html +0 -37
- data/doc/cxxapi/classPassenger_1_1EventedMessageServer.html +0 -59
- data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.map +0 -3
- data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1EventedServer-members.html +0 -37
- data/doc/cxxapi/classPassenger_1_1EventedServer.html +0 -93
- data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.map +0 -3
- data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1FileDescriptor-members.html +0 -41
- data/doc/cxxapi/classPassenger_1_1FileDescriptor.html +0 -178
- data/doc/cxxapi/classPassenger_1_1FileDescriptorPair-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1FileDescriptorPair.html +0 -52
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +0 -58
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.map +0 -3
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +0 -41
- data/doc/cxxapi/classPassenger_1_1FileSystemException.html +0 -66
- data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.map +0 -3
- data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor-members.html +0 -39
- data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor.html +0 -128
- data/doc/cxxapi/classPassenger_1_1IOException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1IOException.html +0 -61
- data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.map +0 -4
- data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +0 -57
- data/doc/cxxapi/classPassenger_1_1MessageChannel.html +0 -839
- data/doc/cxxapi/classPassenger_1_1MessageServer-members.html +0 -49
- data/doc/cxxapi/classPassenger_1_1MessageServer.html +0 -407
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext.html +0 -58
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.map +0 -3
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext-members.html +0 -41
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext.html +0 -165
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.map +0 -3
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler-members.html +0 -39
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler.html +0 -173
- data/doc/cxxapi/classPassenger_1_1Process-members.html +0 -44
- data/doc/cxxapi/classPassenger_1_1Process.html +0 -290
- data/doc/cxxapi/classPassenger_1_1RandomGenerator-members.html +0 -37
- data/doc/cxxapi/classPassenger_1_1RandomGenerator.html +0 -79
- data/doc/cxxapi/classPassenger_1_1ResourceLocator-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1ResourceLocator.html +0 -51
- data/doc/cxxapi/classPassenger_1_1RuntimeException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1RuntimeException.html +0 -54
- data/doc/cxxapi/classPassenger_1_1SafeLibev-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1SafeLibev.html +0 -51
- data/doc/cxxapi/classPassenger_1_1ScalarMessage-members.html +0 -37
- data/doc/cxxapi/classPassenger_1_1ScalarMessage.html +0 -76
- data/doc/cxxapi/classPassenger_1_1ScgiRequestParser-members.html +0 -50
- data/doc/cxxapi/classPassenger_1_1ScgiRequestParser.html +0 -285
- data/doc/cxxapi/classPassenger_1_1SecurityException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1SecurityException.html +0 -56
- data/doc/cxxapi/classPassenger_1_1Session-members.html +0 -53
- data/doc/cxxapi/classPassenger_1_1Session.html +0 -556
- data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.map +0 -3
- data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +0 -39
- data/doc/cxxapi/classPassenger_1_1SpawnException.html +0 -101
- data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +0 -42
- data/doc/cxxapi/classPassenger_1_1SpawnManager.html +0 -292
- data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.map +0 -3
- data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1StandardSession-members.html +0 -54
- data/doc/cxxapi/classPassenger_1_1StandardSession.html +0 -394
- data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.map +0 -3
- data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1StaticString-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1StaticString.html +0 -56
- data/doc/cxxapi/classPassenger_1_1SyntaxError-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1SyntaxError.html +0 -54
- data/doc/cxxapi/classPassenger_1_1SystemException-members.html +0 -40
- data/doc/cxxapi/classPassenger_1_1SystemException.html +0 -155
- data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.map +0 -4
- data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException-members.html +0 -40
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException.html +0 -61
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.map +0 -3
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1TimeoutException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1TimeoutException.html +0 -54
- data/doc/cxxapi/classPassenger_1_1Uint16Message-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1Uint16Message.html +0 -51
- data/doc/cxxapi/classPassenger_1_1Uint32Message-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1Uint32Message.html +0 -51
- data/doc/cxxapi/classServer-members.html +0 -36
- data/doc/cxxapi/classServer.html +0 -49
- data/doc/cxxapi/classServerInstanceDirToucher-members.html +0 -36
- data/doc/cxxapi/classServerInstanceDirToucher.html +0 -47
- data/doc/cxxapi/classes.html +0 -52
- data/doc/cxxapi/definitions_8h_source.html +0 -36
- data/doc/cxxapi/doxygen.css +0 -532
- data/doc/cxxapi/doxygen.png +0 -0
- data/doc/cxxapi/files.html +0 -76
- data/doc/cxxapi/ftv2blank.png +0 -0
- data/doc/cxxapi/ftv2doc.png +0 -0
- data/doc/cxxapi/ftv2folderclosed.png +0 -0
- data/doc/cxxapi/ftv2folderopen.png +0 -0
- data/doc/cxxapi/ftv2lastnode.png +0 -0
- data/doc/cxxapi/ftv2link.png +0 -0
- data/doc/cxxapi/ftv2mlastnode.png +0 -0
- data/doc/cxxapi/ftv2mnode.png +0 -0
- data/doc/cxxapi/ftv2node.png +0 -0
- data/doc/cxxapi/ftv2plastnode.png +0 -0
- data/doc/cxxapi/ftv2pnode.png +0 -0
- data/doc/cxxapi/ftv2vertline.png +0 -0
- data/doc/cxxapi/functions.html +0 -103
- data/doc/cxxapi/functions_0x62.html +0 -82
- data/doc/cxxapi/functions_0x63.html +0 -102
- data/doc/cxxapi/functions_0x64.html +0 -102
- data/doc/cxxapi/functions_0x65.html +0 -88
- data/doc/cxxapi/functions_0x66.html +0 -100
- data/doc/cxxapi/functions_0x67.html +0 -167
- data/doc/cxxapi/functions_0x68.html +0 -88
- data/doc/cxxapi/functions_0x69.html +0 -96
- data/doc/cxxapi/functions_0x6b.html +0 -80
- data/doc/cxxapi/functions_0x6c.html +0 -88
- data/doc/cxxapi/functions_0x6d.html +0 -88
- data/doc/cxxapi/functions_0x6e.html +0 -86
- data/doc/cxxapi/functions_0x6f.html +0 -94
- data/doc/cxxapi/functions_0x70.html +0 -94
- data/doc/cxxapi/functions_0x72.html +0 -110
- data/doc/cxxapi/functions_0x73.html +0 -171
- data/doc/cxxapi/functions_0x74.html +0 -85
- data/doc/cxxapi/functions_0x75.html +0 -85
- data/doc/cxxapi/functions_0x77.html +0 -92
- data/doc/cxxapi/functions_0x7e.html +0 -79
- data/doc/cxxapi/functions_enum.html +0 -49
- data/doc/cxxapi/functions_eval.html +0 -67
- data/doc/cxxapi/functions_func.html +0 -531
- data/doc/cxxapi/functions_vars.html +0 -278
- data/doc/cxxapi/graph_legend.dot +0 -22
- data/doc/cxxapi/graph_legend.html +0 -92
- data/doc/cxxapi/graph_legend.png +0 -0
- data/doc/cxxapi/group__Core.html +0 -46
- data/doc/cxxapi/group__Core.map +0 -3
- data/doc/cxxapi/group__Core.png +0 -0
- data/doc/cxxapi/group__Exceptions.html +0 -53
- data/doc/cxxapi/group__Hooks.html +0 -42
- data/doc/cxxapi/group__Hooks.map +0 -3
- data/doc/cxxapi/group__Hooks.png +0 -0
- data/doc/cxxapi/group__Support.html +0 -538
- data/doc/cxxapi/hierarchy.html +0 -101
- data/doc/cxxapi/index.html +0 -16
- data/doc/cxxapi/inherit__graph__0.map +0 -3
- data/doc/cxxapi/inherit__graph__0.md5 +0 -1
- data/doc/cxxapi/inherit__graph__0.png +0 -0
- data/doc/cxxapi/inherit__graph__1.map +0 -3
- data/doc/cxxapi/inherit__graph__1.md5 +0 -1
- data/doc/cxxapi/inherit__graph__1.png +0 -0
- data/doc/cxxapi/inherit__graph__10.map +0 -3
- data/doc/cxxapi/inherit__graph__10.md5 +0 -1
- data/doc/cxxapi/inherit__graph__10.png +0 -0
- data/doc/cxxapi/inherit__graph__11.map +0 -4
- data/doc/cxxapi/inherit__graph__11.md5 +0 -1
- data/doc/cxxapi/inherit__graph__11.png +0 -0
- data/doc/cxxapi/inherit__graph__12.map +0 -3
- data/doc/cxxapi/inherit__graph__12.md5 +0 -1
- data/doc/cxxapi/inherit__graph__12.png +0 -0
- data/doc/cxxapi/inherit__graph__13.map +0 -3
- data/doc/cxxapi/inherit__graph__13.md5 +0 -1
- data/doc/cxxapi/inherit__graph__13.png +0 -0
- data/doc/cxxapi/inherit__graph__14.map +0 -3
- data/doc/cxxapi/inherit__graph__14.md5 +0 -1
- data/doc/cxxapi/inherit__graph__14.png +0 -0
- data/doc/cxxapi/inherit__graph__15.map +0 -3
- data/doc/cxxapi/inherit__graph__15.md5 +0 -1
- data/doc/cxxapi/inherit__graph__15.png +0 -0
- data/doc/cxxapi/inherit__graph__16.map +0 -5
- data/doc/cxxapi/inherit__graph__16.md5 +0 -1
- data/doc/cxxapi/inherit__graph__16.png +0 -0
- data/doc/cxxapi/inherit__graph__17.map +0 -3
- data/doc/cxxapi/inherit__graph__17.md5 +0 -1
- data/doc/cxxapi/inherit__graph__17.png +0 -0
- data/doc/cxxapi/inherit__graph__18.map +0 -3
- data/doc/cxxapi/inherit__graph__18.md5 +0 -1
- data/doc/cxxapi/inherit__graph__18.png +0 -0
- data/doc/cxxapi/inherit__graph__19.map +0 -4
- data/doc/cxxapi/inherit__graph__19.md5 +0 -1
- data/doc/cxxapi/inherit__graph__19.png +0 -0
- data/doc/cxxapi/inherit__graph__2.map +0 -3
- data/doc/cxxapi/inherit__graph__2.md5 +0 -1
- data/doc/cxxapi/inherit__graph__2.png +0 -0
- data/doc/cxxapi/inherit__graph__20.map +0 -3
- data/doc/cxxapi/inherit__graph__20.md5 +0 -1
- data/doc/cxxapi/inherit__graph__20.png +0 -0
- data/doc/cxxapi/inherit__graph__21.map +0 -3
- data/doc/cxxapi/inherit__graph__21.md5 +0 -1
- data/doc/cxxapi/inherit__graph__21.png +0 -0
- data/doc/cxxapi/inherit__graph__22.map +0 -3
- data/doc/cxxapi/inherit__graph__22.md5 +0 -1
- data/doc/cxxapi/inherit__graph__22.png +0 -0
- data/doc/cxxapi/inherit__graph__23.map +0 -3
- data/doc/cxxapi/inherit__graph__23.md5 +0 -1
- data/doc/cxxapi/inherit__graph__23.png +0 -0
- data/doc/cxxapi/inherit__graph__24.map +0 -3
- data/doc/cxxapi/inherit__graph__24.md5 +0 -1
- data/doc/cxxapi/inherit__graph__24.png +0 -0
- data/doc/cxxapi/inherit__graph__25.map +0 -3
- data/doc/cxxapi/inherit__graph__25.md5 +0 -1
- data/doc/cxxapi/inherit__graph__25.png +0 -0
- data/doc/cxxapi/inherit__graph__26.map +0 -3
- data/doc/cxxapi/inherit__graph__26.md5 +0 -1
- data/doc/cxxapi/inherit__graph__26.png +0 -0
- data/doc/cxxapi/inherit__graph__27.map +0 -3
- data/doc/cxxapi/inherit__graph__27.md5 +0 -1
- data/doc/cxxapi/inherit__graph__27.png +0 -0
- data/doc/cxxapi/inherit__graph__28.map +0 -3
- data/doc/cxxapi/inherit__graph__28.md5 +0 -1
- data/doc/cxxapi/inherit__graph__28.png +0 -0
- data/doc/cxxapi/inherit__graph__29.map +0 -3
- data/doc/cxxapi/inherit__graph__29.md5 +0 -1
- data/doc/cxxapi/inherit__graph__29.png +0 -0
- data/doc/cxxapi/inherit__graph__3.map +0 -4
- data/doc/cxxapi/inherit__graph__3.md5 +0 -1
- data/doc/cxxapi/inherit__graph__3.png +0 -0
- data/doc/cxxapi/inherit__graph__30.map +0 -3
- data/doc/cxxapi/inherit__graph__30.md5 +0 -1
- data/doc/cxxapi/inherit__graph__30.png +0 -0
- data/doc/cxxapi/inherit__graph__31.map +0 -4
- data/doc/cxxapi/inherit__graph__31.md5 +0 -1
- data/doc/cxxapi/inherit__graph__31.png +0 -0
- data/doc/cxxapi/inherit__graph__32.map +0 -3
- data/doc/cxxapi/inherit__graph__32.md5 +0 -1
- data/doc/cxxapi/inherit__graph__32.png +0 -0
- data/doc/cxxapi/inherit__graph__33.map +0 -3
- data/doc/cxxapi/inherit__graph__33.md5 +0 -1
- data/doc/cxxapi/inherit__graph__33.png +0 -0
- data/doc/cxxapi/inherit__graph__34.map +0 -3
- data/doc/cxxapi/inherit__graph__34.md5 +0 -1
- data/doc/cxxapi/inherit__graph__34.png +0 -0
- data/doc/cxxapi/inherit__graph__35.map +0 -3
- data/doc/cxxapi/inherit__graph__35.md5 +0 -1
- data/doc/cxxapi/inherit__graph__35.png +0 -0
- data/doc/cxxapi/inherit__graph__36.map +0 -5
- data/doc/cxxapi/inherit__graph__36.md5 +0 -1
- data/doc/cxxapi/inherit__graph__36.png +0 -0
- data/doc/cxxapi/inherit__graph__37.map +0 -3
- data/doc/cxxapi/inherit__graph__37.md5 +0 -1
- data/doc/cxxapi/inherit__graph__37.png +0 -0
- data/doc/cxxapi/inherit__graph__38.map +0 -3
- data/doc/cxxapi/inherit__graph__38.md5 +0 -1
- data/doc/cxxapi/inherit__graph__38.png +0 -0
- data/doc/cxxapi/inherit__graph__39.map +0 -3
- data/doc/cxxapi/inherit__graph__39.md5 +0 -1
- data/doc/cxxapi/inherit__graph__39.png +0 -0
- data/doc/cxxapi/inherit__graph__4.map +0 -3
- data/doc/cxxapi/inherit__graph__4.md5 +0 -1
- data/doc/cxxapi/inherit__graph__4.png +0 -0
- data/doc/cxxapi/inherit__graph__40.map +0 -3
- data/doc/cxxapi/inherit__graph__40.md5 +0 -1
- data/doc/cxxapi/inherit__graph__40.png +0 -0
- data/doc/cxxapi/inherit__graph__41.map +0 -3
- data/doc/cxxapi/inherit__graph__41.md5 +0 -1
- data/doc/cxxapi/inherit__graph__41.png +0 -0
- data/doc/cxxapi/inherit__graph__5.map +0 -3
- data/doc/cxxapi/inherit__graph__5.md5 +0 -1
- data/doc/cxxapi/inherit__graph__5.png +0 -0
- data/doc/cxxapi/inherit__graph__6.map +0 -3
- data/doc/cxxapi/inherit__graph__6.md5 +0 -1
- data/doc/cxxapi/inherit__graph__6.png +0 -0
- data/doc/cxxapi/inherit__graph__7.map +0 -3
- data/doc/cxxapi/inherit__graph__7.md5 +0 -1
- data/doc/cxxapi/inherit__graph__7.png +0 -0
- data/doc/cxxapi/inherit__graph__8.map +0 -3
- data/doc/cxxapi/inherit__graph__8.md5 +0 -1
- data/doc/cxxapi/inherit__graph__8.png +0 -0
- data/doc/cxxapi/inherit__graph__9.map +0 -3
- data/doc/cxxapi/inherit__graph__9.md5 +0 -1
- data/doc/cxxapi/inherit__graph__9.png +0 -0
- data/doc/cxxapi/inherits.html +0 -165
- data/doc/cxxapi/main.html +0 -28
- data/doc/cxxapi/modules.html +0 -36
- data/doc/cxxapi/namespacePassenger.html +0 -585
- data/doc/cxxapi/namespacemembers.html +0 -190
- data/doc/cxxapi/namespacemembers_enum.html +0 -48
- data/doc/cxxapi/namespacemembers_eval.html +0 -57
- data/doc/cxxapi/namespacemembers_func.html +0 -114
- data/doc/cxxapi/namespacemembers_type.html +0 -54
- data/doc/cxxapi/namespaces.html +0 -37
- data/doc/cxxapi/nginx_2Configuration_8h_source.html +0 -126
- data/doc/cxxapi/ngx__http__passenger__module_8h_source.html +0 -95
- data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard-members.html +0 -36
- data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard.html +0 -51
- data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +0 -67
- data/doc/cxxapi/structPassenger_1_1PoolOptions.html +0 -647
- data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash-members.html +0 -36
- data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash.html +0 -51
- data/doc/cxxapi/tab_b.gif +0 -0
- data/doc/cxxapi/tab_l.gif +0 -0
- data/doc/cxxapi/tab_r.gif +0 -0
- data/doc/cxxapi/tabs.css +0 -105
- data/doc/cxxapi/tree.html +0 -249
- data/doc/template/horo.rb +0 -613
- data/ext/libev/config.h +0 -122
- 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
|
+
|
data/doc/Users guide Apache.txt
CHANGED
@@ -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
|
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
|
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 "
|
1954
|
+
==== I get a "403 Forbidden" error ====
|
1955
1955
|
|
1956
1956
|
See next subsection.
|
1957
1957
|
|
data/doc/Users guide Nginx.html
CHANGED
@@ -1,16 +1,35 @@
|
|
1
|
-
<!DOCTYPE html
|
2
|
-
|
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="
|
6
|
-
<meta name="generator" content="AsciiDoc 8.6.
|
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
|
-
|
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
|
-
|
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
|
-
|
109
|
+
#email {
|
93
110
|
}
|
94
|
-
|
95
|
-
font-family: sans-serif;
|
111
|
+
#revnumber, #revdate, #revremark {
|
96
112
|
}
|
97
113
|
|
98
|
-
|
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
|
-
|
120
|
+
#footer-text {
|
106
121
|
float: left;
|
107
122
|
padding-bottom: 0.5em;
|
108
123
|
}
|
109
|
-
|
124
|
+
#footer-badges {
|
110
125
|
float: right;
|
111
126
|
padding-bottom: 0.5em;
|
112
127
|
}
|
113
128
|
|
114
|
-
|
129
|
+
#preamble {
|
115
130
|
margin-top: 1.5em;
|
116
131
|
margin-bottom: 1.5em;
|
117
132
|
}
|
118
|
-
div.
|
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
|
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
|
166
|
-
|
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 #
|
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
|
-
|
346
|
+
#footer-badges { display: none; }
|
354
347
|
}
|
355
348
|
|
356
|
-
|
349
|
+
#toc {
|
357
350
|
margin-bottom: 2.5em;
|
358
351
|
}
|
359
352
|
|
360
|
-
|
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
|
-
|
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
|
-
|
487
|
-
|
488
|
-
|
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’s <
|
897
|
+
through Nginx’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’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’s <
|
657
|
-
directory to the <
|
923
|
+
<div class="paragraph"><p>To specify a Ruby installation, prepend your Ruby installation’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
|
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
|
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
|
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 <
|
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
|
708
|
-
tar xzvf ~/YourDownloadsFolder/passenger-x.x.x.tar.gz</
|
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
|
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 <
|
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’s configure script with <
|
1006
|
+
To do this, run Nginx’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
|
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’ll probably have to specify something like <
|
1014
|
+
so you’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’ll
|
751
|
-
have to specify <
|
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
|
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’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 <
|
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 & 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
|
771
|
-
passenger_ruby ...;</
|
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…</p></div>
|
792
1059
|
<div class="listingblock">
|
793
|
-
<div class="content">
|
794
|
-
<pre
|
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
|
-
}</
|
1077
|
+
}</pre>
|
811
1078
|
</div></div>
|
812
1079
|
<div class="paragraph"><p>…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
|
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
|
-
}</
|
1098
|
+
}</pre>
|
832
1099
|
</div></div>
|
833
1100
|
<div class="paragraph"><p>After you’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 <
|
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 >= 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 <
|
1141
|
+
<td class="content">The default <span class="monospaced">RAILS_ENV</span> environment in which deployed Rails applications
|
875
1142
|
are run, is “production”. 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’s root must point to your Ruby on Rails application’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
|
1153
|
+
<div class="content monospaced">
|
1154
|
+
<pre>http {
|
888
1155
|
...
|
889
1156
|
|
890
1157
|
server {
|
@@ -895,7 +1162,7 @@ host’s root must point to your Ruby on Rails application’s <em>publi
|
|
895
1162
|
}
|
896
1163
|
|
897
1164
|
...
|
898
|
-
}</
|
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’s root must point to your Ruby on Rails application’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
|
1173
|
+
<div class="content monospaced">
|
1174
|
+
<pre>http {
|
908
1175
|
...
|
909
1176
|
|
910
1177
|
server {
|
@@ -914,21 +1181,21 @@ host’s root must point to your Ruby on Rails application’s <em>publi
|
|
914
1181
|
}
|
915
1182
|
|
916
1183
|
...
|
917
|
-
}</
|
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’s document root, and have it
|
922
1189
|
point to your Ruby on Rails application’s <em>public</em> folder. For example:</p></div>
|
923
1190
|
<div class="listingblock">
|
924
|
-
<div class="content">
|
925
|
-
<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
|
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
|
-
}</
|
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
|
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
|
-
}</
|
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
|
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 <
|
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 >= 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
|
1306
|
+
<div class="content monospaced">
|
1307
|
+
<pre>/webapps/rackapp
|
1041
1308
|
|
|
1042
1309
|
+-- config.ru
|
1043
1310
|
|
|
1044
1311
|
+-- public/
|
1045
1312
|
|
|
1046
|
-
+-- tmp/</
|
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’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 <
|
1324
|
+
<td class="content">The default <span class="monospaced">RACK_ENV</span> environment in which deployed Rack applications
|
1058
1325
|
are run, is “production”. 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 “production”. 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
|
1333
|
+
<div class="content monospaced">
|
1334
|
+
<pre>$ mkdir /webapps/rack_example
|
1068
1335
|
$ mkdir /webapps/rack_example/public
|
1069
|
-
$ mkdir /webapps/rack_example/tmp</
|
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
|
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" => "text/html" }, ["hello <b>world</b>"]]
|
1080
1347
|
end
|
1081
|
-
run app</
|
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
|
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
|
-
}</
|
1363
|
+
}</pre>
|
1097
1364
|
</div></div>
|
1098
1365
|
<div class="paragraph"><p>And we’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’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
|
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’s <em>public</em> folder. You mus
|
|
1115
1382
|
passenger_enabled on;
|
1116
1383
|
}
|
1117
1384
|
...
|
1118
|
-
}</
|
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’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
|
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’s <em>public</em> folder. You mus
|
|
1135
1402
|
}
|
1136
1403
|
|
1137
1404
|
...
|
1138
|
-
}</
|
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’s document root, and have it
|
1143
1410
|
point to your Rack application’s <em>public</em> folder. For example:</p></div>
|
1144
1411
|
<div class="listingblock">
|
1145
|
-
<div class="content">
|
1146
|
-
<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
|
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
|
-
}</
|
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
|
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
|
-
}</
|
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
|
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
|
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)</
|
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 <
|
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
|
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</
|
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
|
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</
|
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
|
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</
|
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
|
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</
|
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
|
1557
|
+
<div class="content monospaced">
|
1558
|
+
<pre>require 'rubygems'
|
1292
1559
|
require 'sinatra'
|
1293
1560
|
require 'app.rb'
|
1294
1561
|
|
1295
|
-
run Sinatra::Application</
|
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’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
|
-
<
|
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’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
|
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)</
|
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’ll mark this new request with an X:</p></div>
|
1551
1818
|
<div class="listingblock">
|
1552
|
-
<div class="content">
|
1553
|
-
<pre
|
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)</
|
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’t done with their current request, the next
|
1559
1826
|
HTTP request - let’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
|
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)</
|
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’ll have a problem. Y won’t be processed for at least 60
|
@@ -1618,22 +1885,22 @@ directive, and is comparable to ngx_http_proxy_module’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
|
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;</
|
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
|
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;</
|
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
|
1937
|
+
<div class="content monospaced">
|
1938
|
+
<pre>location / {
|
1672
1939
|
passenger_pass_header X-Accel-Redirect;
|
1673
|
-
}</
|
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
|
1981
|
+
<div class="content monospaced">
|
1982
|
+
<pre>render :text => 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
|
-
}</
|
1988
|
+
}</pre>
|
1722
1989
|
</div></div>
|
1723
1990
|
<div class="paragraph"><p>…or this piece of Rack code:</p></div>
|
1724
1991
|
<div class="listingblock">
|
1725
|
-
<div class="content">
|
1726
|
-
<pre
|
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" => "text/plain" }, Response.new]
|
1737
|
-
end</
|
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’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 <username></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
|
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’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
|
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
|
-
}</
|
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 <
|
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
|
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
|
-
}</
|
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
|
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/; # <--- added
|
2121
|
-
passenger_pre_start http://bar.com:3500/; # <--- added</
|
2399
|
+
passenger_pre_start http://bar.com:3500/; # <--- 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
|
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
|
-
}</
|
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
|
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; # <----- added</
|
2424
|
+
passenger_pre_start http://myblog.com/store; # <----- added</pre>
|
2147
2425
|
</div></div>
|
2148
2426
|
<div class="paragraph"><p>The sub-URI <strong>must</strong> be included; if you don’t then the directive will have no effect.
|
2149
2427
|
The following example is wrong and won’t pre-start the store web application:</p></div>
|
2150
2428
|
<div class="listingblock">
|
2151
|
-
<div class="content">
|
2152
|
-
<pre
|
2429
|
+
<div class="content monospaced">
|
2430
|
+
<pre>passenger_pre_start http://myblog.com/; # <----- 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’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
|
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/;</
|
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
|
2486
|
+
<div class="content monospaced">
|
2487
|
+
<pre>HEAD / HTTP/1.1
|
2210
2488
|
Host: bar.com
|
2211
|
-
Connection: close</
|
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
|
2494
|
+
<div class="content monospaced">
|
2495
|
+
<pre>HEAD /store HTTP/1.1
|
2218
2496
|
Host: myblog.com
|
2219
|
-
Connection: close</
|
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 <string></h4>
|
2288
|
-
<div class="paragraph"><p>This option allows one to specify the default <
|
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 <string></h4>
|
2397
|
-
<div class="paragraph"><p>This option allows one to specify the default <
|
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 <
|
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 <
|
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 <
|
2726
|
+
<div class="paragraph"><p>The tool <span class="monospaced">passenger-memory-stats</span> allows one to easily analyze Phusion Passenger’s
|
2449
2727
|
and Apache’s real memory usage. For example:</p></div>
|
2450
2728
|
<div class="listingblock">
|
2451
|
-
<div class="content">
|
2452
|
-
<pre
|
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</
|
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’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’s internal status</h3>
|
2494
|
-
<div class="paragraph"><p>One can inspect Phusion Passenger’s internal status with the tool <
|
2772
|
+
<div class="paragraph"><p>One can inspect Phusion Passenger’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
|
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</
|
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 <
|
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
|
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</
|
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
|
2874
|
+
<div class="content monospaced">
|
2875
|
+
<pre> PID: 4281 Sessions: 2 Processed: 7 Uptime: 5m 11s
|
2598
2876
|
PID: 17468 Sessions: 8 <-+ 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"</
|
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
|
-
<
|
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
|
-
<
|
2952
|
+
<span class="monospaced">passenger-status --verbose</span> output. This password must be sent through the
|
2675
2953
|
“X-Passenger-Connect-Password” HTTP header.</p></div>
|
2676
2954
|
<div class="paragraph"><p>Example:</p></div>
|
2677
2955
|
<div class="listingblock">
|
2678
|
-
<div class="content">
|
2679
|
-
<pre
|
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</
|
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
|
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’re using Git as version control system.</p></div>
|
2764
3042
|
<div class="listingblock">
|
2765
|
-
<div class="content">
|
2766
|
-
<pre
|
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 => :app do
|
2788
3066
|
run "touch #{current_release}/tmp/restart.txt"
|
2789
3067
|
end
|
2790
|
-
end</
|
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
|
-
<
|
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’s possible that your application also calls <
|
3089
|
+
<div class="paragraph"><p>It’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 <
|
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’t
|
2817
3095
|
have any negative effects.</p></div>
|
2818
3096
|
<div class="paragraph"><p>Phusion Passenger assumes that you’re using Bundler >= 0.9.5. If you don’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
|
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
|
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
|
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’re just developing a Rails application then you probably don’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’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’ve deployed the application to. For images
|
2924
|
-
there is <
|
2925
|
-
CSS there is <
|
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><img></em> HTML tag and replace it with inline Ruby like this:</p></div>
|
2927
3205
|
<div class="listingblock">
|
2928
|
-
<div class="content">
|
2929
|
-
<pre
|
3206
|
+
<div class="content monospaced">
|
3207
|
+
<pre><%= image_tag("foo.jpg") %></pre>
|
2930
3208
|
</div></div>
|
2931
|
-
<div class="paragraph"><p>This will generate the proper image tag to <
|
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’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
|
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’re not a programmer and don’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 & 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’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 <
|
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
|
3330
|
+
<div class="content monospaced">
|
3331
|
+
<pre>/apps/foo/ <------ 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
|
-
+- ...</
|
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
|
3356
|
+
<div class="content monospaced">
|
3357
|
+
<pre>/apps/bar/ <----- 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
|
-
+- ...</
|
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
|
3370
|
+
<div class="content monospaced">
|
3371
|
+
<pre>/apps/baz/ <----- 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
|
-
+- ...</
|
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 <
|
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
|
3562
|
+
<div class="content monospaced">
|
3563
|
+
<pre>+--------------------+
|
3286
3564
|
| ApplicationSpawner |-----------[Memcached server]
|
3287
|
-
+--------------------+</
|
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
|
3570
|
+
<div class="content monospaced">
|
3571
|
+
<pre>+--------------------+
|
3294
3572
|
| ApplicationSpawner |------+----[Memcached server]
|
3295
3573
|
+--------------------+ |
|
3296
3574
|
|
|
3297
3575
|
+--------------------+ |
|
3298
3576
|
| Worker process 1 |-----/
|
3299
|
-
+--------------------+</
|
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
|
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
|
-
+--------------------+</
|
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
|
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
|
-
+-------------------------------------+</
|
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’t help.</p></div>
|
|
3385
3663
|
disappear after a fork call. So if you’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
|
-
<
|
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 <
|
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
|
3704
|
+
<div id="footnotes"><hr></div>
|
3427
3705
|
<div id="footer">
|
3428
3706
|
<div id="footer-text">
|
3429
|
-
Last updated
|
3707
|
+
Last updated 2011-08-03 11:00:00 CEST
|
3430
3708
|
</div>
|
3431
3709
|
</div>
|
3432
3710
|
</body>
|