Nick Kew wrote: > Jeff Trawick wrote: >> Here are some rough notes from thinking about better configs for a >> future OpenSolaris release. The exact content isn't so important in >> the short term as how to package it, but by all means comment on any >> aspect of interest. Please ;) > > No prepackaged config is going to suit a real user. > > The nearest we can come is to boil it down to "wizard" level, > where the user just defines things like virtual hosts. But we're > not really even near that. Nor, I think, should we be: > the server admin task should not be dumbed down to the point > where admins are likely to shoot themselves in the foot through > following recipes. > > My point: how much effort should we really devote to it? > > Alternative proposal: more educational material. This is inspired > in part by chats I had with some Sun folks at FOSDEM. The suggestion > is that I might put together some webcast tutorials on apache topics > we can offer as added value to our users. I'm quite keen on that > idea, starting with Apache but perhaps moving on to other webstack > components in due course. > > ++++ > > Having said that, it's good that you're giving the issue some thought. > Someone remind me: have we contemplated something along the lines > of Debian's a2ensite for generating virtualhost templates, for instance? > >> Getting a production-ready Apache configuration in OpenSolaris 2008.11 >> >> The default configuration for Apache and unbundled modules like >> mod_dtrace and >> mod_php enables as many features as practical at the cost of >> performance. >> >> Several changes are necessary for production configurations to limit >> the memory >> and CPU use. >> >> A. loaded modules >> >> For production, modules shouldn't be loaded if they aren't used, as they >> consume memory and sometimes CPU even if they aren't configured. > > Here's a thought inspired by your post: a script to scan an httpd.conf, > and highlight any modules loaded but not used. This is not trivial, > but shouldn't be too hard with a known set of modules, such as those > bundled as standard from apache.org. > >> Also, the set of loaded modules in a production config shouldn't be >> based >> directly on which packages are installed. >> >> httpd.conf loads all Apache-provided modules by virtue of these lines >> in the >> configuration: >> >> <IfDefine 64bit> >> Include /etc/apache2/2.2/conf.d/modules-64.load >> </IfDefine> >> <IfDefine !64bit> >> Include /etc/apache2/2.2/conf.d/modules-32.load >> </IfDefine> >> >> Use alternate files production-modules-64.load* and >> production-modules-32.load, >> which load only the following basic set of modules: >> >> mod_authz_host >> mod_log_config >> mod_env >> mod_expires >> mod_headers >> mod_unique_id >> mod_setenvif >> mod_mime >> mod_autoindex >> mod_cgi (prefork MPM) or mod_cgid (worker MPM) >> mod_dir >> mod_actions >> mod_alias >> mod_rewrite > > Hmmm. There's very little in there that's really core. > I'd say drop mod_unique_id, and consider carefully whether > the bigger modules (cgi[d] and maybe rewrite) should > default to on. But that just illustrates the difficulty > in selecting a "core" set. > >> (*These files aren't provided but are easy to create.) >> >> Any additional modules which are required must be added manually. >> Adding >> further modules should be performed in conjunction with configuring the >> related feature. > > +1, with provisos as above. But that conjunction could apply to most > of the above modules too: both env modules, mod_expires, mod_headers, > mod_actions, and even mod_alias). > >> httpd.conf also loads several other add-on modules whose packages >> install >> configuration snippets in /etc/apache2/2.2/conf.d, because of the >> following >> lines in the configuration: >> >> Include /etc/apache2/2.2/conf.d/*.conf >> This was done to provide better user experience. The assumption here is that when the user installs a specific package he/she intends to make use of its functionality. >> Reading a directory of .conf files is desireable, but a production >> config >> shouldn't read that directly since its content depends on which >> packages are installed. >> >> Replace that include with >> >> Include /etc/apache2/2.2/production-conf.d/*.conf >> >> (This directory isn't created when the product is installed.) >> >> Adding LoadModule directives for any additional modules will be done >> only as necessary for features required in the production server. > > This looks like it's heading towards something like Debian's a2enmod, > which makes a similar mods-available vs mods-enabled distinction. > I think that has some merit, but also causes a lot of confusion[1]. > > If we do go down this road, we should align what we do with what > Debian (and thus Ubuntu/etc) do rather than create yet another > variant to confuse the world. > I agree with Nick. >> B. Very basic MPM configuration >> >> The choice of MPM may be based on the exact workload. At a minimum, we >> need to fix the default configuration so that it doesn't allow the web >> server to use too many system resources (processes, memory, swap space). >> >> This section of httpd.conf needs to be removed: >> >> <IfModule prefork.c> >> ListenBacklog 8192 >> ServerLimit 2048 >> MaxClients 2048 >> </IfModule> >> >> Copy samples-conf.d/mpm.conf to production-conf.d; that sample file >> has reasonable, initial defaults for both worker and prefork MPMs. It >> can be modified during later testing as necessary. >> Agree. >> C. If you need to enable SSL >> >> load mod_ssl from within production-modules-{32|64}.load >> >> copy samples.d/ssl.conf to production-conf.d and modify for >> your configuration >> >> Is the cipher selection in ssl.conf reasonable? (good combination >> of security + performance?) >> >> MPM implications: Does SSL use heap library extensively, and thus >> perform worse >> with more threads per process? (guess: worker is fine with <= 100 >> threads per child) >> >> D. If you need to enable name-based (non-SSL) virtual hosts >> >> <VirtualHost www.example.com> >> ServerName www.example.com:80 >> >> ... >> </VirtualHost> >> >> define any configuration specific to this vhost, such as log files, >> document root, etc. > > Presumably something like samples.d/www.example.com > >> If mod_rewrite configuration at global scope should apply to this >> vhost, add "RewriteOptions inherit" within the vhost. >> >> If global scope (outside of any VirtualHost) is not intended for >> use, you can deny access. >> >> MPM implications: none >> >> E. If you need to enable web server authentication and authorization >> >> (from definitions in LDAP, files, databases, etc.) >> >> Note that some applications handle this internally and don't rely on >> the web server. >> >> MPM implications: which auth methods cache, and which are >> cross-process? >> (mod_ldap has a shared-memory cache, which should help prefork; but >> pooled server connections are specific to a child process so prefork >> could perform worse) >> >> F. If you need to host PHP applications >> >> if prefork, copy conf.d/php5.2.conf to production-conf.d >> >> if worker, copy samples.d/fcgid.conf to >> production-conf.d/php-fcgid.conf >> and fix the AddHandler or Location container >> >> MPM implications: >> OpenSolaris mod_php refuses to work in worker MPM, right? >> your PHP applications may use support libraries which aren't >> thread-safe >> >> if a small amount of your load is PHP, memory use can be reduced >> by using >> FastCGI to communicate with a small number of PHP processes, >> instead of >> hosting the PHP application in every Apache process >> >> G. If you need to reverse proxy some requests to another server >> >> MPM implications: pooled connections better utilized with worker >> >> H. If you need to route requests to GlassFish or Tomcat >> >> when to use mod_proxy_ajp vs. mod_proxy_http vs. mod_jk (and how) >> >> MPM implications: pooled connections better utilized with worker >> >> I. If you need to host mod_perl applications >> >> do we have a sample for this? >> >> MPM implications: prefork must be used >> >> J. If you need to enable mod_disk_cache >> >> we need a sample configuration for this to place the cache in an >> appropriate >> place >> >> (not going to cover the 20 million Apache features; just those which are >> commonly needed for production and require more than a few lines in the >> config) > > A lot of these sound like good material for tutorials, whether > webcast or written. Or ideally, give users the choice. > >> Z. real MPM tuning >> >> among other things: make sure you drive Apache to MaxClients during >> testing >> and survive; otherwise, MaxClients may be too high >> >> don't let MinSpareXXX and MaxSpareXXX be too close to each other, >> or Apache >> will continually create and terminate child processes; the >> difference should be >> a meaningful percentage of normal load (at least 20%?) >> >> use mod_status to monitor utilization of processes/threads to >> determine if >> MaxClients is appropriate >> >> and so on > > Talking of which, did you see Vincent Deffontaines' recent post on > httpd-docs concerning updating the performance tuning discussion > at httpd.apache.org? > >> --/-- >> >> new files that could be installed with Apache as part of these >> instructions: >> >> /etc/apache2/2.2/httpd-production.conf: >> like httpd.conf but has the changes mentioned above >> >> /etc/apache2/2.2/production-conf.d/: >> new directory where admin places conf snippets to activate features >> within production config > > Won't those risk confusing more than they enlighten? I'd prefer > to keep httpd.conf as production, and use different names for > non-production samples. Again, see [1]. > >> /etc/apache2/2.2/production-conf.d/production-modules-{32|64}.load: >> like conf.d/modules-{32|64}.load, but has just the core which are >> required in just about every production config >> >> Something like this would switch from the default enable-everything >> config to this alternate config: >> >> svccfg -s apache22 setprop httpd/startup_options = astring: >> -f/etc/apache2/2.2/httpd-production.conf > > [1] > http://www.theregister.co.uk/2006/11/04/apache_packages_support_vacuum/ > Instead of a new layout for the production environment, can't we make the existing configuration layout suitable for both developer and production environment ? e.g., Have 2 sets of files - one to load the core / commonly used modules and another one to load the non-core/uncommonly used modules. By default, include both these files in either modules-*.load or in httpd.conf. Since making the configuration production-ready involves many manual steps, we can as well ask the user to comment or rename the loading of non-core file. Similarly, for config files in conf.d, unwanted ones can be moved to samples-conf.d or renamed to something else (say *.unused).
Regards, Seema.