A tribute to Apache 1.3, who served all Web applications in OpenPKG for nearly 6(!) years now: the OpenPKG apache package was born with Apache 1.3 on 2001-09-18 and after 406(!) version-controlled revisions Apache 1.3.37 was finally replaced by Apache 2.2.4 on 2007-06-22 with CVS checkin 35737.
A few questions certainly should be answered:
- Why is the apache package of OpenPKG such interesting?
Well, the apache package is one of the most mature, widespread, beloved and best maintained applications from the OpenPKG software distribution and at the same time its packaging at the same time had the ultimate complexity (over 60 build-time options and over 1700 lines of RPM specification).
- Why evolved the apache package into such a central “beast” in OpenPKG?
OpenPKG was invented in an ISP datacenter and managed-hosting environment where Web services are a central technology. Hence the OpenPKG apache package was an “all-in-one” solution to the Apache packaging. It even contained PHP, mod_perl and many more major Apache extension modules — and all of them for maximum portability reasons were statically linked into Apache. For instance in 2001 with Apache 1.3 it was impossible to load both a mod_ssl+OpenSSL Dynamic Shared Object (DSO) and a PHP+gd DSO into Apache under Solaris. It immediately segfaulted because Apache 1.3 (for strange historical reasons) loaded its DSOs twice and Solaris on each dlopen(3) loaded a DSO to a different memory location. But third-party libraries didn’t re-initialize correctly. So OpenPKG for many years stick
with full static linking of Apache and hence the apache package became more and more complex.
- Why were Apache 2′s new features not interesting for OpenPKG?
The two major new features of Apache 2 are the introduction of an OS abstraction layer named Apache Portable Runtime (APR) and the introdution of a process-model abstraction named Multi-Processing-Modules (MPM) which allows Apache 2 to run in both Pre-Forking and Multi-Threading ways. Unfortunately, Apache 1.3′s use of the POSIX APIs for Unix platforms were fully portable enough and the Multi-Threading support opens a can of
“stability” worms because third-party libraries (especially in the PHP field) are not thread-safe. Finally, despite popular rumor, Multi-Threading is not really about ultimate
resource saving, because even for pre-fork(2)‘ed processes the copy-on-write virtual memory management of modern Unix platforms is smart enough to keep the effective physical memory consumption of the multiple processes about as small as
under multiple threads. So, for non-Unix platforms Apache 2 is a major improvement, for Unix platfors IMHO it is just a minor improvement. Hence, technically Apache 1.3 for OpenPKG was fully sufficient.
- Why has OpenPKG finally switched to Apache 2 however?
For extension module support reasons. Most of the newer Apache extension modules or module versions are just for Apache 2. By still sticking to Apache 1.3 OpenPKG could have not leveraged from them. Also, Apache 2.2 today is finally really as stable as Apache 1.3 and hence if we run it in Pre-Forked MPM it is a fair replacement for Apache 1.3 while at the same time allow us to use the newer extension modules.