Passenger
|
00001 /* 00002 * Phusion Passenger - http://www.modrails.com/ 00003 * Copyright (c) 2008, 2009 Phusion 00004 * 00005 * "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui. 00006 * 00007 * Permission is hereby granted, free of charge, to any person obtaining a copy 00008 * of this software and associated documentation files (the "Software"), to deal 00009 * in the Software without restriction, including without limitation the rights 00010 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00011 * copies of the Software, and to permit persons to whom the Software is 00012 * furnished to do so, subject to the following conditions: 00013 * 00014 * The above copyright notice and this permission notice shall be included in 00015 * all copies or substantial portions of the Software. 00016 * 00017 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00018 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00019 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00020 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00021 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00022 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 00023 * THE SOFTWARE. 00024 */ 00025 #ifndef _PASSENGER_CONFIGURATION_H_ 00026 #define _PASSENGER_CONFIGURATION_H_ 00027 00028 #ifdef __cplusplus 00029 #include "Utils.h" 00030 #include "MessageChannel.h" 00031 #include "Logging.h" 00032 #endif 00033 00034 /* The APR headers must come after the Passenger headers. See Hooks.cpp 00035 * to learn why. 00036 * 00037 * MessageChannel.h must be included -- even though we don't actually use 00038 * MessageChannel.h in here, it's necessary to make sure that apr_want.h 00039 * doesn't b0rk on 'struct iovec'. 00040 */ 00041 #include <apr_pools.h> 00042 #include <httpd.h> 00043 #include <http_config.h> 00044 00045 /** 00046 * @defgroup Configuration Apache module configuration 00047 * @ingroup Core 00048 * @{ 00049 */ 00050 00051 #ifdef __cplusplus 00052 #include <set> 00053 #include <string> 00054 00055 namespace Passenger { 00056 00057 using namespace std; 00058 00059 /** 00060 * Per-directory configuration information. 00061 * 00062 * Use the getter methods to query information, because those will return 00063 * the default value if the value is not specified. 00064 */ 00065 struct DirConfig { 00066 enum Threeway { ENABLED, DISABLED, UNSET }; 00067 enum SpawnMethod { SM_UNSET, SM_SMART, SM_SMART_LV2, SM_CONSERVATIVE }; 00068 00069 Threeway enabled; 00070 00071 std::set<std::string> railsBaseURIs; 00072 std::set<std::string> rackBaseURIs; 00073 00074 /** Whether to autodetect Rails applications. */ 00075 Threeway autoDetectRails; 00076 00077 /** Whether to autodetect Rack applications. */ 00078 Threeway autoDetectRack; 00079 00080 /** Whether to autodetect WSGI applications. */ 00081 Threeway autoDetectWSGI; 00082 00083 /** Whether mod_rewrite should be allowed for Rails applications. */ 00084 Threeway allowModRewrite; 00085 00086 /** The environment (i.e. value for RAILS_ENV) under which 00087 * Rails applications should operate. */ 00088 const char *railsEnv; 00089 00090 /** The path to the application's root (for example: RAILS_ROOT 00091 * for Rails applications, directory containing 'config.ru' 00092 * for Rack applications). If this value is NULL, the default 00093 * autodetected path will be used. 00094 */ 00095 const char *appRoot; 00096 00097 /** The environment (i.e. value for RACK_ENV) under which 00098 * Rack applications should operate. */ 00099 const char *rackEnv; 00100 00101 /** The Rails spawn method to use. */ 00102 SpawnMethod spawnMethod; 00103 00104 /** 00105 * The idle timeout, in seconds, of Rails framework spawners. 00106 * May also be 0 (which indicates that the framework spawner should 00107 * never idle timeout) or -1 (which means that the value is not specified). 00108 */ 00109 long frameworkSpawnerTimeout; 00110 00111 /** 00112 * The idle timeout, in seconds, of Rails application spawners. 00113 * May also be 0 (which indicates that the application spawner should 00114 * never idle timeout) or -1 (which means that the value is not specified). 00115 */ 00116 long appSpawnerTimeout; 00117 00118 /** 00119 * The maximum number of requests that the spawned application may process 00120 * before exiting. A value of 0 means unlimited. 00121 */ 00122 unsigned long maxRequests; 00123 00124 /** Indicates whether the maxRequests option was explicitly specified 00125 * in the directory configuration. */ 00126 bool maxRequestsSpecified; 00127 00128 /** 00129 * The maximum amount of memory (in MB) the spawned application may use. 00130 * A value of 0 means unlimited. 00131 */ 00132 unsigned long memoryLimit; 00133 00134 /** Indicates whether the memoryLimit option was explicitly specified 00135 * in the directory configuration. */ 00136 bool memoryLimitSpecified; 00137 00138 /** Whether symlinks in the document root path should be resolved. 00139 * The implication of this is documented in the users guide, section 00140 * "How Phusion Passenger detects whether a virtual host is a web application". 00141 */ 00142 Threeway resolveSymlinksInDocRoot; 00143 00144 /** Whether high performance mode should be turned on. */ 00145 Threeway highPerformance; 00146 00147 /** Whether global queuing should be used. */ 00148 Threeway useGlobalQueue; 00149 00150 /** 00151 * Whether encoded slashes in URLs should be supported. This however conflicts 00152 * with mod_rewrite support because of a bug/limitation in Apache, so it's one 00153 * or the other. 00154 */ 00155 Threeway allowEncodedSlashes; 00156 00157 /** 00158 * Throttle the number of stat() calls on files like 00159 * restart.txt to the once per given number of seconds. 00160 */ 00161 unsigned long statThrottleRate; 00162 00163 /** Indicates whether the statThrottleRate option was 00164 * explicitly specified in the directory configuration. */ 00165 bool statThrottleRateSpecified; 00166 00167 /** The directory in which Passenger should look for 00168 * restart.txt. NULL means that the default directory 00169 * should be used. 00170 */ 00171 const char *restartDir; 00172 00173 /** 00174 * The directory in which Passenger should place upload buffer 00175 * files. NULL means that the default directory should be used. 00176 */ 00177 const char *uploadBufferDir; 00178 00179 /*************************************/ 00180 /*************************************/ 00181 00182 bool isEnabled() const { 00183 return enabled != DISABLED; 00184 } 00185 00186 string getAppRoot(const char *documentRoot) const { 00187 if (appRoot == NULL) { 00188 if (resolveSymlinksInDocRoot == DirConfig::ENABLED) { 00189 return extractDirName(resolveSymlink(documentRoot)); 00190 } else { 00191 return extractDirName(documentRoot); 00192 } 00193 } else { 00194 return appRoot; 00195 } 00196 } 00197 00198 string getAppRoot(const string &documentRoot) const { 00199 if (appRoot == NULL) { 00200 if (resolveSymlinksInDocRoot == DirConfig::ENABLED) { 00201 return extractDirName(resolveSymlink(documentRoot)); 00202 } else { 00203 return extractDirName(documentRoot); 00204 } 00205 } else { 00206 return appRoot; 00207 } 00208 } 00209 00210 const char *getRailsEnv() const { 00211 if (railsEnv != NULL) { 00212 return railsEnv; 00213 } else { 00214 return "production"; 00215 } 00216 } 00217 00218 const char *getRackEnv() const { 00219 if (rackEnv != NULL) { 00220 return rackEnv; 00221 } else { 00222 return "production"; 00223 } 00224 } 00225 00226 const char *getSpawnMethodString() { 00227 switch (spawnMethod) { 00228 case SM_SMART: 00229 return "smart"; 00230 case SM_SMART_LV2: 00231 return "smart-lv2"; 00232 case SM_CONSERVATIVE: 00233 return "conservative"; 00234 default: 00235 return "smart-lv2"; 00236 } 00237 } 00238 00239 unsigned long getMaxRequests() { 00240 if (maxRequestsSpecified) { 00241 return maxRequests; 00242 } else { 00243 return 0; 00244 } 00245 } 00246 00247 unsigned long getMemoryLimit() { 00248 if (memoryLimitSpecified) { 00249 return memoryLimit; 00250 } else { 00251 return 200; 00252 } 00253 } 00254 00255 bool highPerformanceMode() const { 00256 return highPerformance == ENABLED; 00257 } 00258 00259 bool usingGlobalQueue() const { 00260 return useGlobalQueue == ENABLED; 00261 } 00262 00263 bool allowsEncodedSlashes() const { 00264 return allowEncodedSlashes == ENABLED; 00265 } 00266 00267 unsigned long getStatThrottleRate() const { 00268 if (statThrottleRateSpecified) { 00269 return statThrottleRate; 00270 } else { 00271 return 0; 00272 } 00273 } 00274 00275 const char *getRestartDir() const { 00276 if (restartDir != NULL) { 00277 return restartDir; 00278 } else { 00279 return ""; 00280 } 00281 } 00282 00283 string getUploadBufferDir() const { 00284 if (uploadBufferDir != NULL) { 00285 return uploadBufferDir; 00286 } else { 00287 return getPassengerTempDir() + "/webserver_private"; 00288 } 00289 } 00290 00291 /*************************************/ 00292 }; 00293 00294 /** 00295 * Server-wide (global, not per-virtual host) configuration information. 00296 * 00297 * Use the getter methods to query information, because those will return 00298 * the default value if the value is not specified. 00299 */ 00300 struct ServerConfig { 00301 /** The filename of the Ruby interpreter to use. */ 00302 const char *ruby; 00303 00304 /** The Passenger root folder. */ 00305 const char *root; 00306 00307 /** The log verbosity. */ 00308 unsigned int logLevel; 00309 00310 /** The maximum number of simultaneously alive application 00311 * instances. */ 00312 unsigned int maxPoolSize; 00313 00314 /** Whether the maxPoolSize option was explicitly specified in 00315 * this server config. */ 00316 bool maxPoolSizeSpecified; 00317 00318 /** The maximum number of simultaneously alive Rails application 00319 * that a single Rails application may occupy. */ 00320 unsigned int maxInstancesPerApp; 00321 00322 /** Whether the maxInstancesPerApp option was explicitly specified in 00323 * this server config. */ 00324 bool maxInstancesPerAppSpecified; 00325 00326 /** The maximum number of seconds that an application may be 00327 * idle before it gets terminated. */ 00328 unsigned int poolIdleTime; 00329 00330 /** Whether the poolIdleTime option was explicitly specified in 00331 * this server config. */ 00332 bool poolIdleTimeSpecified; 00333 00334 /** Whether user switching support is enabled. */ 00335 bool userSwitching; 00336 00337 /** Whether the userSwitching option was explicitly specified in 00338 * this server config. */ 00339 bool userSwitchingSpecified; 00340 00341 /** The user that applications must run as if user switching 00342 * fails or is disabled. NULL means the option is not specified. 00343 */ 00344 const char *defaultUser; 00345 00346 /** The temp directory that Passenger should use. NULL 00347 * means unspecified. 00348 */ 00349 const char *tempDir; 00350 00351 const char *getRuby() const { 00352 if (ruby != NULL) { 00353 return ruby; 00354 } else { 00355 return "ruby"; 00356 } 00357 } 00358 00359 const char *getDefaultUser() const { 00360 if (defaultUser != NULL) { 00361 return defaultUser; 00362 } else { 00363 return "nobody"; 00364 } 00365 } 00366 00367 const char *getTempDir() const { 00368 if (tempDir != NULL) { 00369 return tempDir; 00370 } else { 00371 return getSystemTempDir(); 00372 } 00373 } 00374 }; 00375 } 00376 00377 extern "C" { 00378 #endif 00379 00380 /** Configuration hook for per-directory configuration structure creation. */ 00381 void *passenger_config_create_dir(apr_pool_t *p, char *dirspec); 00382 00383 /** Configuration hook for per-directory configuration structure merging. */ 00384 void *passenger_config_merge_dir(apr_pool_t *p, void *basev, void *addv); 00385 00386 /** Configuration hook for per-server configuration structure creation. */ 00387 void *passenger_config_create_server(apr_pool_t *p, server_rec *s); 00388 00389 /** Configuration hook for per-server configuration structure merging. */ 00390 void *passenger_config_merge_server(apr_pool_t *p, void *basev, void *overridesv); 00391 00392 void passenger_config_merge_all_servers(apr_pool_t *pool, server_rec *main_server); 00393 00394 /** Apache module commands array. */ 00395 extern const command_rec passenger_commands[]; 00396 00397 #ifdef __cplusplus 00398 } 00399 #endif 00400 00401 /** 00402 * @} 00403 */ 00404 00405 #endif /* _PASSENGER_CONFIGURATION_H_ */