{"id":946,"date":"2016-10-11T09:20:13","date_gmt":"2016-10-11T07:20:13","guid":{"rendered":"http:\/\/www.netnea.com\/cms\/?page_id=946"},"modified":"2026-01-16T16:06:48","modified_gmt":"2026-01-16T15:06:48","slug":"apache-tutorial-3_application-server-setup","status":"publish","type":"page","link":"https:\/\/www.netnea.com\/cms\/apache-tutorial-3_application-server-setup\/","title":{"rendered":"Configuring an Apache\/PHP Application Server"},"content":{"rendered":"\n<h2 id=\"setting-up-an-apachephp-application-server\">Setting up an Apache\/PHP application server<\/h2>\n<h3 id=\"what-are-we-doing\">What are we doing?<\/h3>\n<p>We are setting up an Apache\/PHP application server using the minimal number of modules necessary.<\/p>\n<h3 id=\"why-are-we-doing-this\">Why are we doing this?<\/h3>\n<p>A bare bones Apache server is suitable for delivering static files. More complex applications rely on dynamic content. This requires an extension of the server. A very fast and secure application server can be implemented using <em>suEXEC<\/em>, an external <em>FastCGI daemon<\/em> and <em>PHP<\/em>. This is by far not the only option and also likely not the most widespread one in a corporate environment. But is a very simple architecture perfectly suited for a test system.<\/p>\n<h3 id=\"requirements\">Requirements<\/h3>\n<ul>\n<li>An Apache web server, ideally one created using the file structure shown in <a href=\"https:\/\/www.netnea.com\/cms\/apache-tutorial-1_compiling-apache\/\">Tutorial 1 (Compiling an Apache web server)<\/a>.<\/li>\n<li>Understanding of the minimal configuration in <a href=\"http:\/\/www.netnea.com\/cms\/apache-tutorial-2_minimal-apache-configuration\">Tutorial 2 (Configuring a minimal Apache server)<\/a>.<\/li>\n<\/ul>\n<h3 id=\"step-1-configuring-apache\">Step 1: Configuring Apache<\/h3>\n<p>We\u2019ll configure the web server to start off with, aware of the fact that it is not yet capable of running in this configuration. Based on the minimal web server described in Tutorial 2, we\u2019ll configure a very simple application server in the <em>conf\/httpd.conf_fastcgid<\/em> file.<\/p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb1-1\"><a href=\"#cb1-1\" aria-hidden=\"true\"><\/a><span class=\"ex\">ServerName<\/span>              localhost<\/span>\n<span id=\"cb1-2\"><a href=\"#cb1-2\" aria-hidden=\"true\"><\/a><span class=\"ex\">ServerAdmin<\/span>             root@localhost<\/span>\n<span id=\"cb1-3\"><a href=\"#cb1-3\" aria-hidden=\"true\"><\/a><span class=\"ex\">ServerRoot<\/span>              \/apache<\/span>\n<span id=\"cb1-4\"><a href=\"#cb1-4\" aria-hidden=\"true\"><\/a><span class=\"ex\">User<\/span>                    www-data<\/span>\n<span id=\"cb1-5\"><a href=\"#cb1-5\" aria-hidden=\"true\"><\/a><span class=\"ex\">Group<\/span>                   www-data<\/span>\n<span id=\"cb1-6\"><a href=\"#cb1-6\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb1-7\"><a href=\"#cb1-7\" aria-hidden=\"true\"><\/a><span class=\"ex\">ServerTokens<\/span>            Prod<\/span>\n<span id=\"cb1-8\"><a href=\"#cb1-8\" aria-hidden=\"true\"><\/a><span class=\"ex\">UseCanonicalName<\/span>        On<\/span>\n<span id=\"cb1-9\"><a href=\"#cb1-9\" aria-hidden=\"true\"><\/a><span class=\"ex\">TraceEnable<\/span>             Off<\/span>\n<span id=\"cb1-10\"><a href=\"#cb1-10\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb1-11\"><a href=\"#cb1-11\" aria-hidden=\"true\"><\/a><span class=\"ex\">Timeout<\/span>                 10<\/span>\n<span id=\"cb1-12\"><a href=\"#cb1-12\" aria-hidden=\"true\"><\/a><span class=\"ex\">MaxRequestWorkers<\/span>       100<\/span>\n<span id=\"cb1-13\"><a href=\"#cb1-13\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb1-14\"><a href=\"#cb1-14\" aria-hidden=\"true\"><\/a><span class=\"ex\">Listen<\/span>                  127.0.0.1:80<\/span>\n<span id=\"cb1-15\"><a href=\"#cb1-15\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb1-16\"><a href=\"#cb1-16\" aria-hidden=\"true\"><\/a><span class=\"ex\">LoadModule<\/span>              mpm_event_module        modules\/mod_mpm_event.so<\/span>\n<span id=\"cb1-17\"><a href=\"#cb1-17\" aria-hidden=\"true\"><\/a><span class=\"ex\">LoadModule<\/span>              unixd_module            modules\/mod_unixd.so<\/span>\n<span id=\"cb1-18\"><a href=\"#cb1-18\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb1-19\"><a href=\"#cb1-19\" aria-hidden=\"true\"><\/a><span class=\"ex\">LoadModule<\/span>              log_config_module       modules\/mod_log_config.so<\/span>\n<span id=\"cb1-20\"><a href=\"#cb1-20\" aria-hidden=\"true\"><\/a><span class=\"ex\">LoadModule<\/span>              mime_module             modules\/mod_mime.so<\/span>\n<span id=\"cb1-21\"><a href=\"#cb1-21\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb1-22\"><a href=\"#cb1-22\" aria-hidden=\"true\"><\/a><span class=\"ex\">LoadModule<\/span>              authn_core_module       modules\/mod_authn_core.so<\/span>\n<span id=\"cb1-23\"><a href=\"#cb1-23\" aria-hidden=\"true\"><\/a><span class=\"ex\">LoadModule<\/span>              authz_core_module       modules\/mod_authz_core.so<\/span>\n<span id=\"cb1-24\"><a href=\"#cb1-24\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb1-25\"><a href=\"#cb1-25\" aria-hidden=\"true\"><\/a><span class=\"ex\">LoadModule<\/span>              suexec_module           modules\/mod_suexec.so<\/span>\n<span id=\"cb1-26\"><a href=\"#cb1-26\" aria-hidden=\"true\"><\/a><span class=\"ex\">LoadModule<\/span>              fcgid_module            modules\/mod_fcgid.so<\/span>\n<span id=\"cb1-27\"><a href=\"#cb1-27\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb1-28\"><a href=\"#cb1-28\" aria-hidden=\"true\"><\/a><span class=\"ex\">ErrorLogFormat<\/span>          <span class=\"st\">&quot;[%{cu}t] [%-m:%-l] %-a %-L %M&quot;<\/span><\/span>\n<span id=\"cb1-29\"><a href=\"#cb1-29\" aria-hidden=\"true\"><\/a><span class=\"ex\">LogFormat<\/span>               <span class=\"st\">&quot;%h %l %u [%{%Y-%m-%d %H:%M:%S}t.%{usec_frac}t] <\/span><span class=\"dt\">\\&quot;<\/span><span class=\"st\">%r<\/span><span class=\"dt\">\\&quot;<\/span><span class=\"st\"> %&gt;s %b \\<\/span><\/span>\n<span id=\"cb1-30\"><a href=\"#cb1-30\" aria-hidden=\"true\"><\/a><span class=\"dt\">\\&quot;<\/span><span class=\"st\">%{Referer}i<\/span><span class=\"dt\">\\&quot;<\/span><span class=\"st\"> <\/span><span class=\"dt\">\\&quot;<\/span><span class=\"st\">%{User-Agent}i<\/span><span class=\"dt\">\\&quot;<\/span><span class=\"st\">&quot;<\/span> combined<\/span>\n<span id=\"cb1-31\"><a href=\"#cb1-31\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb1-32\"><a href=\"#cb1-32\" aria-hidden=\"true\"><\/a><span class=\"ex\">LogLevel<\/span>                debug<\/span>\n<span id=\"cb1-33\"><a href=\"#cb1-33\" aria-hidden=\"true\"><\/a><span class=\"ex\">ErrorLog<\/span>                logs\/error.log<\/span>\n<span id=\"cb1-34\"><a href=\"#cb1-34\" aria-hidden=\"true\"><\/a><span class=\"ex\">CustomLog<\/span>               logs\/access.log combined<\/span>\n<span id=\"cb1-35\"><a href=\"#cb1-35\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb1-36\"><a href=\"#cb1-36\" aria-hidden=\"true\"><\/a><span class=\"ex\">AddHandler<\/span>              fcgid-script .php<\/span>\n<span id=\"cb1-37\"><a href=\"#cb1-37\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb1-38\"><a href=\"#cb1-38\" aria-hidden=\"true\"><\/a><span class=\"ex\">DocumentRoot<\/span>            \/apache\/htdocs<\/span>\n<span id=\"cb1-39\"><a href=\"#cb1-39\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb1-40\"><a href=\"#cb1-40\" aria-hidden=\"true\"><\/a><span class=\"op\">&lt;<\/span><span class=\"ex\">Directory<\/span> \/<span class=\"op\">&gt;<\/span><\/span>\n<span id=\"cb1-41\"><a href=\"#cb1-41\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb1-42\"><a href=\"#cb1-42\" aria-hidden=\"true\"><\/a>        <span class=\"ex\">Require<\/span> all denied<\/span>\n<span id=\"cb1-43\"><a href=\"#cb1-43\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb1-44\"><a href=\"#cb1-44\" aria-hidden=\"true\"><\/a>        <span class=\"ex\">Options<\/span>         SymLinksIfOwnerMatch<\/span>\n<span id=\"cb1-45\"><a href=\"#cb1-45\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb1-46\"><a href=\"#cb1-46\" aria-hidden=\"true\"><\/a><span class=\"op\">&lt;<\/span>\/<span class=\"ex\">Directory<\/span><span class=\"op\">&gt;<\/span><\/span>\n<span id=\"cb1-47\"><a href=\"#cb1-47\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb1-48\"><a href=\"#cb1-48\" aria-hidden=\"true\"><\/a><span class=\"op\">&lt;<\/span><span class=\"ex\">VirtualHost<\/span> 127.0.0.1:<span class=\"op\">80&gt;<\/span><\/span>\n<span id=\"cb1-49\"><a href=\"#cb1-49\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb1-50\"><a href=\"#cb1-50\" aria-hidden=\"true\"><\/a>      <span class=\"op\">&lt;<\/span><span class=\"ex\">Directory<\/span> \/apache\/htdocs<span class=\"op\">&gt;<\/span><\/span>\n<span id=\"cb1-51\"><a href=\"#cb1-51\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb1-52\"><a href=\"#cb1-52\" aria-hidden=\"true\"><\/a>        <span class=\"ex\">Require<\/span> all granted<\/span>\n<span id=\"cb1-53\"><a href=\"#cb1-53\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb1-54\"><a href=\"#cb1-54\" aria-hidden=\"true\"><\/a>        <span class=\"ex\">Options<\/span>          ExecCGI<\/span>\n<span id=\"cb1-55\"><a href=\"#cb1-55\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb1-56\"><a href=\"#cb1-56\" aria-hidden=\"true\"><\/a>        <span class=\"ex\">FCGIWrapper<\/span>      \/apache\/bin\/php-fcgi-starter\/php-fcgi-starter<\/span>\n<span id=\"cb1-57\"><a href=\"#cb1-57\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb1-58\"><a href=\"#cb1-58\" aria-hidden=\"true\"><\/a>      <span class=\"op\">&lt;<\/span>\/<span class=\"ex\">Directory<\/span><span class=\"op\">&gt;<\/span><\/span>\n<span id=\"cb1-59\"><a href=\"#cb1-59\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb1-60\"><a href=\"#cb1-60\" aria-hidden=\"true\"><\/a><span class=\"op\">&lt;<\/span>\/<span class=\"ex\">VirtualHost<\/span><span class=\"op\">&gt;<\/span><\/span><\/code><\/pre><\/div>\n<p>I will no longer be discussing the overall configuration, but will instead only be focusing on the differences from Tutorial 2. There are three new modules: Added to the <em>suEXEC<\/em> and <em>FCGI<\/em> modules is the <em>Mime module<\/em>, which enables us to assign the <em>.php<\/em> file suffix to the <em>FCGI daemon<\/em>. It is assigned using the <em>AddHandler directive<\/em>.<\/p>\n<p>The <em>\/apache\/htdocs<\/em> directory now needs the additional <em>ExecCGI<\/em> option. And finally, the <em>FCGIWrapper<\/em>. This is the connection between the web server and the <em>FCGI daemon<\/em> yet to be configured. Once the first request using the <em>.php<\/em> suffix is received by the web server, the server calls a <em>wrapper script<\/em>, starting the <em>FCGI daemon<\/em>, which from this time on handles the <em>PHP requests<\/em>.<\/p>\n<p><em>FastCGI<\/em> is a method for executing dynamic program code from a web server. It is a very fast method which for the most part leaves the server untouched and runs the application on a separate daemon. To increase the speed, <em>FastCGI<\/em> provides multiple instances of this daemon, allowing requests to be processed without having to wait. In practice, this is a promising gain in performance and, more importantly, an architecture that saves memory, as will be discussed in more detail below.<\/p>\n<h3 id=\"step-2-compiling-apache-with-suexec-support\">Step 2: Compiling Apache with suEXEC support<\/h3>\n<p>We now have to compile two missing modules and deploy other components for the <em>FCGI daemon<\/em>. Let\u2019s start with the <em>suEXEC module<\/em>.<\/p>\n<p>An Apache web server was compiled in Tutorial 1. However, although the <em>\u2013enable-mods-shared=all<\/em> option was used, <em>suexec<\/em> has not been compiled yet. It seems, the module is so special that it can\u2019t be compiled as a default module, although it is present in the source code.<\/p>\n<p>The web server configured in Tutorial 2 runs as user <em>www-data<\/em> or, depending on configuration, as any other dedicated user. We would like to further restrict our dynamic application to have the separate daemon run as an additional, separate user that is introduced in one of the next steps. The <em>suEXEC<\/em> module makes this possible for us. It is not absolutely required. But it adds a bit more security with little extra effort.<\/p>\n<p>Let\u2019s enter the directory with the Apache source code and compile the server once more.<\/p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb2-1\"><a href=\"#cb2-1\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"bu\">cd<\/span> \/usr\/src\/apache\/httpd-2.4.66<\/span>\n<span id=\"cb2-2\"><a href=\"#cb2-2\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"ex\">.\/configure<\/span> --prefix=\/opt\/apache-2.4.66 --enable-mods-shared=all <span class=\"kw\">\\<\/span><\/span>\n<span id=\"cb2-3\"><a href=\"#cb2-3\" aria-hidden=\"true\"><\/a>   <span class=\"ex\">--with-apr<\/span>=\/usr\/local\/apr\/bin\/apr-1-config <span class=\"kw\">\\<\/span><\/span>\n<span id=\"cb2-4\"><a href=\"#cb2-4\" aria-hidden=\"true\"><\/a>   <span class=\"ex\">--with-apr-util<\/span>=\/usr\/local\/apr\/bin\/apu-1-config --enable-mpms-shared=<span class=\"st\">&quot;event&quot;<\/span> <span class=\"kw\">\\<\/span><\/span>\n<span id=\"cb2-5\"><a href=\"#cb2-5\" aria-hidden=\"true\"><\/a>   <span class=\"ex\">--enable-nonportable-atomics<\/span>=yes --enable-suexec --with-suexec-caller=www-data <span class=\"kw\">\\<\/span><\/span>\n<span id=\"cb2-6\"><a href=\"#cb2-6\" aria-hidden=\"true\"><\/a>   <span class=\"ex\">--with-suexec-docroot<\/span>=\/opt\/apache-2.4.66\/bin <span class=\"kw\">&amp;&amp;<\/span> <span class=\"fu\">make<\/span> <span class=\"kw\">&amp;&amp;<\/span> <span class=\"fu\">sudo<\/span> make install<\/span><\/code><\/pre><\/div>\n<p>Besides <em>configure<\/em>, which we are familiar with, three options have been added for handling <em>suexec<\/em>. <em>Enable-suexec<\/em> is self-explanatory, <em>with-suexec-caller<\/em> we tell the conscientious module that only the user <em>www-data<\/em> is to be given permission to access the program behind the module. We are after all telling the module where scripts being called are located. For simplicity\u2019s sake let\u2019s use the existing <em>bin directory<\/em>. <em>suexec<\/em> is however a bit fussy and we are unable to use the symlink. So it will have to be the fully qualified path.<\/p>\n<p>If successfully configured, the command line above will start the compiler and after being successfully concluded will install the newly compiled server.<\/p>\n<p>By the way, if you make a mistake in the configuration above and want to assign <em>suexec<\/em> different compiler constants, you\u2019ll first have to clean out the compiler environment before compiling again. The new options will otherwise be ignored. We can do this via the <em>make clean<\/em> command in front of <em>configure<\/em> or by manually deleting the files <em>support\/suexec<\/em>, <em>support\/suexec.lo<\/em> and <em>support\/suexec.o<\/em>, which is faster, because the whole web server no longer has to be built from scratch.<\/p>\n<h3 id=\"step-3-downloading-and-compiling-the-fastcgi-module\">Step 3: Downloading and compiling the FastCGI module<\/h3>\n<p>The <em>FastCGI module<\/em> is managed by Apache. But it is not part of the normal source code for the web server. So, let\u2019s download the source code for the additional module and verify the loaded checksum over an encrypted connection.<\/p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb3-1\"><a href=\"#cb3-1\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"bu\">cd<\/span> \/usr\/src\/apache<\/span>\n<span id=\"cb3-2\"><a href=\"#cb3-2\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"fu\">wget<\/span> http:\/\/www.apache.org\/dist\/httpd\/mod_fcgid\/mod_fcgid-2.3.9.tar.gz<\/span>\n<span id=\"cb3-3\"><a href=\"#cb3-3\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"fu\">wget<\/span> https:\/\/www.apache.org\/dist\/httpd\/mod_fcgid\/mod_fcgid-2.3.9.tar.gz.sha1<\/span>\n<span id=\"cb3-4\"><a href=\"#cb3-4\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"ex\">sha1sum<\/span> --check mod_fcgid-2.3.9.tar.gz.sha1<\/span><\/code><\/pre><\/div>\n<p>We again expect an <em>OK<\/em>. When it is correctly returned, it\u2019s time for unpacking, compiling and installing.<\/p>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb4-1\"><a href=\"#cb4-1\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"fu\">tar<\/span> -xvzf mod_fcgid-2.3.9.tar.gz<\/span>\n<span id=\"cb4-2\"><a href=\"#cb4-2\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"bu\">cd<\/span> mod_fcgid-2.3.9<\/span>\n<span id=\"cb4-3\"><a href=\"#cb4-3\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"va\">APXS=<\/span>\/apache\/bin\/apxs <span class=\"ex\">.\/configure.apxs<\/span><\/span>\n<span id=\"cb4-4\"><a href=\"#cb4-4\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"fu\">make<\/span><\/span>\n<span id=\"cb4-5\"><a href=\"#cb4-5\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"fu\">sudo<\/span> make install<\/span><\/code><\/pre><\/div>\n<p>The <em>configure<\/em> command has a slightly different format here, because the <em>FCGI module<\/em> is a module dependent on Apache. That\u2019s why we are using <em>APXS<\/em>, the <em>Apache Expansion Tool<\/em>, part of the server compiled in Tutorial 1. Unfortunately, <em>make install<\/em> will partly destroy some of the ownerships we have set. They will have to be adjusted afterwards.<\/p>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb5-1\"><a href=\"#cb5-1\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"fu\">sudo<\/span> chown <span class=\"kw\">`<\/span><span class=\"fu\">whoami<\/span><span class=\"kw\">`<\/span> \/apache\/conf\/httpd.conf<\/span><\/code><\/pre><\/div>\n<p>The Apache user also needs access to a directory for him to create sockets, enabling communication with the FCGI daemon. We\u2019ll create the directory and transfer ownership to it directly.<\/p>\n<div class=\"sourceCode\" id=\"cb6\"><pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb6-1\"><a href=\"#cb6-1\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"fu\">sudo<\/span> mkdir \/apache\/logs\/fcgidsock<\/span>\n<span id=\"cb6-2\"><a href=\"#cb6-2\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"fu\">sudo<\/span> chown www-data:www-data \/apache\/logs\/fcgidsock<\/span><\/code><\/pre><\/div>\n<h3 id=\"step-4-installing-and-preconfiguring-php\">Step 4: Installing and preconfiguring PHP<\/h3>\n<p>Up till now we have been compiling all of the software piece by piece. But for the entire PHP stack a limit has been reached. No one should be prevented from compiling PHP on his own, but we are concentrating on the web server here and for this reason will be using this piece of software from the Linux distribution. In Debian\/Ubuntu the package we need is <em>php7.0-cgi<\/em>, which comes along with <em>php7.0-common<\/em>.<\/p>\n<p>Properly configuring <em>PHP<\/em> is a broad topic and I recommend consulting the relevant pages, because an improperly configured installation of <em>PHP<\/em> may pose a serious security problem. I don\u2019t wish to give you any more information at this point, because it takes us away from our actual topic, which is a simple application server. For operation on the internet, i.e.\u00a0no longer in a lab-like setup, it is highly recommended to become familiar with the relevant PHP security settings.<\/p>\n<h3 id=\"step-5-creating-the-cgi-user\">Step 5: Creating the CGI user<\/h3>\n<p>Above it has already been discussed that we are planning to start a separate daemon to process <em>PHP requests<\/em>. This daemon should be started via <em>suexec<\/em> and run as separate user. We create the user as follows:<\/p>\n<div class=\"sourceCode\" id=\"cb7\"><pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb7-1\"><a href=\"#cb7-1\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"fu\">sudo<\/span> groupadd fcgi-php<\/span>\n<span id=\"cb7-2\"><a href=\"#cb7-2\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"fu\">sudo<\/span> useradd -s \/bin\/false -d \/apache\/htdocs -m -g fcgi-php fcgi-php<\/span><\/code><\/pre><\/div>\n<p>It can be expected for a warning to appear concerning the presence of the <em>\/apache\/htdocs<\/em> directory. We can ignore it.<\/p>\n<h3 id=\"step-6-creating-a-php-wrapper-script\">Step 6: Creating a PHP wrapper script<\/h3>\n<p>It is normal to use a wrapper script for <em>PHP<\/em> and <em>FCGI<\/em> to work together. We already set this up in the Apache configuration above. The web server will invoke only the script, while the script takes care of everything else. We place the script as intended in <em>\/apache\/bin\/php-fcgi-starter\/php-fcgi-starter<\/em>. The subdirectory isn\u2019t needed, because <em>suexec<\/em> requires the directory to be owned by the preconfigured user and we don\u2019t want to assign <em>.\/bin<\/em> completely to the new user. So, let\u2019s create the subdirectory:<\/p>\n<div class=\"sourceCode\" id=\"cb8\"><pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb8-1\"><a href=\"#cb8-1\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"bu\">cd<\/span> \/apache\/bin<\/span>\n<span id=\"cb8-2\"><a href=\"#cb8-2\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"fu\">sudo<\/span> mkdir php-fcgi-starter<\/span>\n<span id=\"cb8-3\"><a href=\"#cb8-3\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"fu\">sudo<\/span> chown fcgi-php:fcgi-php php-fcgi-starter<\/span><\/code><\/pre><\/div>\n<p>We now have to put a starter script in this directory. Since we have already assigned <em>fcgi-php<\/em> to the user, the root user will have to create the script. Or be copied by him to this location. Creating a script in a directory that we no longer own is challenging. We\u2019ll solve this with a trick using <em>cat<\/em> and a <em>subshell<\/em>. Here\u2019s the trick, followed by the script. (Input in <em>cat<\/em> is ended via CTRL-D).<\/p>\n<div class=\"sourceCode\" id=\"cb9\"><pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb9-1\"><a href=\"#cb9-1\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"fu\">sudo<\/span> sh -c <span class=\"st\">&quot;cat &gt; php-fcgi-starter\/php-fcgi-starter&quot;<\/span><\/span>\n<span id=\"cb9-2\"><a href=\"#cb9-2\" aria-hidden=\"true\"><\/a><span class=\"co\">#!\/bin\/sh<\/span><\/span>\n<span id=\"cb9-3\"><a href=\"#cb9-3\" aria-hidden=\"true\"><\/a><span class=\"bu\">export<\/span> <span class=\"va\">PHPRC=<\/span>\/etc\/php\/7.0\/cgi\/<\/span>\n<span id=\"cb9-4\"><a href=\"#cb9-4\" aria-hidden=\"true\"><\/a><span class=\"bu\">export<\/span> <span class=\"va\">PHP_FCGI_MAX_REQUESTS=<\/span>5000<\/span>\n<span id=\"cb9-5\"><a href=\"#cb9-5\" aria-hidden=\"true\"><\/a><span class=\"bu\">export<\/span> <span class=\"va\">PHP_FCGI_CHILDREN=<\/span>5<\/span>\n<span id=\"cb9-6\"><a href=\"#cb9-6\" aria-hidden=\"true\"><\/a><span class=\"bu\">exec<\/span> \/usr\/lib\/cgi-bin\/php<\/span><\/code><\/pre><\/div>\n<p>What are we defining here? We are telling <em>PHP<\/em> where to find its configuration, setting the maximum number of requests for an <em>FCGI<\/em> to 5,000 (after which it is replaced by a fresh process), defining the number of process children to 5 and executing PHP at the end.<\/p>\n<p>Now don\u2019t forget to assign the script to the <em>FCGI user<\/em> and make it executable:<\/p>\n<div class=\"sourceCode\" id=\"cb10\"><pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb10-1\"><a href=\"#cb10-1\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"fu\">sudo<\/span> chown fcgi-php:fcgi-php php-fcgi-starter\/php-fcgi-starter<\/span>\n<span id=\"cb10-2\"><a href=\"#cb10-2\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"fu\">sudo<\/span> chmod +x php-fcgi-starter\/php-fcgi-starter<\/span><\/code><\/pre><\/div>\n<h3 id=\"step-7-creating-a-php-test-page\">Step 7: Creating a PHP test page<\/h3>\n<p>To finish things off, we should now create a simple <em>PHP-based<\/em> test page: <em>\/apache\/htdocs\/info.php<\/em>.<\/p>\n<div class=\"sourceCode\" id=\"cb11\"><pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb11-1\"><a href=\"#cb11-1\" aria-hidden=\"true\"><\/a><span class=\"op\">&lt;<\/span><span class=\"ex\">?php<\/span><\/span>\n<span id=\"cb11-2\"><a href=\"#cb11-2\" aria-hidden=\"true\"><\/a><span class=\"fu\">phpinfo()<\/span>;<\/span>\n<span id=\"cb11-3\"><a href=\"#cb11-3\" aria-hidden=\"true\"><\/a><span class=\"ex\">?<\/span><span class=\"op\">&gt;<\/span><\/span><\/code><\/pre><\/div>\n<h3 id=\"step-8-trying-it-out\">Step 8: Trying it out<\/h3>\n<p>That was everything. We can now start our web server and try it out.<\/p>\n<div class=\"sourceCode\" id=\"cb12\"><pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb12-1\"><a href=\"#cb12-1\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"bu\">cd<\/span> \/apache<\/span>\n<span id=\"cb12-2\"><a href=\"#cb12-2\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"fu\">sudo<\/span> .\/bin\/httpd -X -f conf\/httpd.conf_fastcgid<\/span><\/code><\/pre><\/div>\n<p>Our test script is available at <a href=\"http:\/\/localhost\/info.php\">http:\/\/localhost\/info.php<\/a>.<\/p>\n<figure>\n<img decoding=\"async\" src=\"https:\/\/www.netnea.com\/files\/apache-tutorial-3-screenshot-phpi.png\" alt=\"\" \/><figcaption>Screenshot: phpinfo()<\/figcaption>\n<\/figure>\n<p>phpinfo gives you a comprehensive status report in your browser.<\/p>\n<p>If an error message results from starting the server or invoking the URL, the server\u2019s <em>error log<\/em> or the separate <em>suexec log<\/em> in <em>logs\/suexec_log<\/em> may prove helpful. Errors are typically related to ownership of and permission to access directories and files.<\/p>\n<p>Here again is a summary of the relevant files and their owners:<\/p>\n<div class=\"sourceCode\" id=\"cb13\"><pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb13-1\"><a href=\"#cb13-1\" aria-hidden=\"true\"><\/a><span class=\"ex\">2107985<\/span>    4 drwxr-xr-x   2 fcgi-php fcgi-php     4096 Jul  2 11:15 bin\/php-fcgi-starter\/<\/span>\n<span id=\"cb13-2\"><a href=\"#cb13-2\" aria-hidden=\"true\"><\/a><span class=\"ex\">2107987<\/span>    4 -rwxr-xr-x   1 fcgi-php fcgi-php      125 Jul  2 11:15 bin\/php-fcgi-starter\/php-fcgi-starter<\/span>\n<span id=\"cb13-3\"><a href=\"#cb13-3\" aria-hidden=\"true\"><\/a><span class=\"ex\">2107977<\/span>   32 -rwsr-xr-x   1 root     root        32146 Jul  2 10:44 bin\/suexec<\/span>\n<span id=\"cb13-4\"><a href=\"#cb13-4\" aria-hidden=\"true\"><\/a><span class=\"ex\">2633547<\/span>    4 drwxr-xr-x   2 myuser   root         4096 Jul  2 11:16 htdocs\/<\/span>\n<span id=\"cb13-5\"><a href=\"#cb13-5\" aria-hidden=\"true\"><\/a><span class=\"ex\">2633758<\/span>    4 -rw-r--r--   1 myuser   myuser         20 Jul  2 11:15 htdocs\/info.php<\/span>\n<span id=\"cb13-6\"><a href=\"#cb13-6\" aria-hidden=\"true\"><\/a><span class=\"ex\">2762281<\/span>    4 drwxr-xr-x   2 www-data www-data     4096 Jul  2 10:46 \/apache\/logs\/fcgidsock\/<\/span><\/code><\/pre><\/div>\n<p>Of note is the <em>suid bit<\/em> on the <em>suexec binary<\/em>.<\/p>\n<h3 id=\"step-9-goodie-a-little-performance-test\">Step 9 (Goodie): A little performance test<\/h3>\n<p>Compared to Apache with integrated <em>PHP<\/em>, the application server built here is very high performance. A little performance test can illustrate this. We start our web server in <em>daemon mode<\/em> and use ApacheBench to put it to the test it with 5 users. The <em>-l<\/em> option is new. It instructs the tool to ignore deviations in the length of the responses. This is because the page is generated dynamically and the content, as well as its length, will of course be a bit different now and then. We again quit the server following the performance test.<\/p>\n<div class=\"sourceCode\" id=\"cb14\"><pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb14-1\"><a href=\"#cb14-1\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"fu\">sudo<\/span> .\/bin\/httpd -k start -f conf\/httpd.conf_fastcgid<\/span>\n<span id=\"cb14-2\"><a href=\"#cb14-2\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"ex\">.\/bin\/ab<\/span> -c 5 -n 1000 -l http:\/\/localhost\/info.php<\/span>\n<span id=\"cb14-3\"><a href=\"#cb14-3\" aria-hidden=\"true\"><\/a><span class=\"ex\">...<\/span><\/span>\n<span id=\"cb14-4\"><a href=\"#cb14-4\" aria-hidden=\"true\"><\/a>$<span class=\"op\">&gt;<\/span> <span class=\"fu\">sudo<\/span> .\/bin\/httpd -k stop -f conf\/httpd.conf_fastcgid<\/span><\/code><\/pre><\/div>\n<p>In most cases <em>ab<\/em> has the following output:<\/p>\n<div class=\"sourceCode\" id=\"cb15\"><pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb15-1\"><a href=\"#cb15-1\" aria-hidden=\"true\"><\/a><span class=\"ex\">This<\/span> is ApacheBench, Version 2.3 <span class=\"op\">&lt;<\/span><span class=\"va\">$Revision<\/span>: 1663405 $<span class=\"op\">&gt;<\/span><\/span>\n<span id=\"cb15-2\"><a href=\"#cb15-2\" aria-hidden=\"true\"><\/a><span class=\"ex\">Copyright<\/span> 1996 Adam Twiss, Zeus Technology Ltd, http:\/\/www.zeustech.net\/<\/span>\n<span id=\"cb15-3\"><a href=\"#cb15-3\" aria-hidden=\"true\"><\/a><span class=\"ex\">Licensed<\/span> to The Apache Software Foundation, http:\/\/www.apache.org\/<\/span>\n<span id=\"cb15-4\"><a href=\"#cb15-4\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb15-5\"><a href=\"#cb15-5\" aria-hidden=\"true\"><\/a><span class=\"ex\">Benchmarking<\/span> localhost (be patient)<\/span>\n<span id=\"cb15-6\"><a href=\"#cb15-6\" aria-hidden=\"true\"><\/a><span class=\"ex\">Completed<\/span> 100 requests<\/span>\n<span id=\"cb15-7\"><a href=\"#cb15-7\" aria-hidden=\"true\"><\/a><span class=\"ex\">Completed<\/span> 200 requests<\/span>\n<span id=\"cb15-8\"><a href=\"#cb15-8\" aria-hidden=\"true\"><\/a><span class=\"ex\">Completed<\/span> 300 requests<\/span>\n<span id=\"cb15-9\"><a href=\"#cb15-9\" aria-hidden=\"true\"><\/a><span class=\"ex\">Completed<\/span> 400 requests<\/span>\n<span id=\"cb15-10\"><a href=\"#cb15-10\" aria-hidden=\"true\"><\/a><span class=\"ex\">Completed<\/span> 500 requests<\/span>\n<span id=\"cb15-11\"><a href=\"#cb15-11\" aria-hidden=\"true\"><\/a><span class=\"ex\">Completed<\/span> 600 requests<\/span>\n<span id=\"cb15-12\"><a href=\"#cb15-12\" aria-hidden=\"true\"><\/a><span class=\"ex\">Completed<\/span> 700 requests<\/span>\n<span id=\"cb15-13\"><a href=\"#cb15-13\" aria-hidden=\"true\"><\/a><span class=\"ex\">Completed<\/span> 800 requests<\/span>\n<span id=\"cb15-14\"><a href=\"#cb15-14\" aria-hidden=\"true\"><\/a><span class=\"ex\">Completed<\/span> 900 requests<\/span>\n<span id=\"cb15-15\"><a href=\"#cb15-15\" aria-hidden=\"true\"><\/a><span class=\"ex\">Completed<\/span> 1000 requests<\/span>\n<span id=\"cb15-16\"><a href=\"#cb15-16\" aria-hidden=\"true\"><\/a><span class=\"ex\">Finished<\/span> 1000 requests<\/span>\n<span id=\"cb15-17\"><a href=\"#cb15-17\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb15-18\"><a href=\"#cb15-18\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb15-19\"><a href=\"#cb15-19\" aria-hidden=\"true\"><\/a><span class=\"ex\">Server<\/span> Software:        Apache<\/span>\n<span id=\"cb15-20\"><a href=\"#cb15-20\" aria-hidden=\"true\"><\/a><span class=\"ex\">Server<\/span> Hostname:        localhost<\/span>\n<span id=\"cb15-21\"><a href=\"#cb15-21\" aria-hidden=\"true\"><\/a><span class=\"ex\">Server<\/span> Port:            80<\/span>\n<span id=\"cb15-22\"><a href=\"#cb15-22\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb15-23\"><a href=\"#cb15-23\" aria-hidden=\"true\"><\/a><span class=\"ex\">Document<\/span> Path:          \/info.php<\/span>\n<span id=\"cb15-24\"><a href=\"#cb15-24\" aria-hidden=\"true\"><\/a><span class=\"ex\">Document<\/span> Length:        Variable<\/span>\n<span id=\"cb15-25\"><a href=\"#cb15-25\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb15-26\"><a href=\"#cb15-26\" aria-hidden=\"true\"><\/a><span class=\"ex\">Concurrency<\/span> Level:      5<\/span>\n<span id=\"cb15-27\"><a href=\"#cb15-27\" aria-hidden=\"true\"><\/a><span class=\"ex\">Time<\/span> taken for tests:   2.567 seconds<\/span>\n<span id=\"cb15-28\"><a href=\"#cb15-28\" aria-hidden=\"true\"><\/a><span class=\"ex\">Complete<\/span> requests:      1000<\/span>\n<span id=\"cb15-29\"><a href=\"#cb15-29\" aria-hidden=\"true\"><\/a><span class=\"ex\">Failed<\/span> requests:        0<\/span>\n<span id=\"cb15-30\"><a href=\"#cb15-30\" aria-hidden=\"true\"><\/a><span class=\"ex\">Total<\/span> transferred:      66892443 bytes<\/span>\n<span id=\"cb15-31\"><a href=\"#cb15-31\" aria-hidden=\"true\"><\/a><span class=\"ex\">HTML<\/span> transferred:       66739443 bytes<\/span>\n<span id=\"cb15-32\"><a href=\"#cb15-32\" aria-hidden=\"true\"><\/a><span class=\"ex\">Requests<\/span> per second:    389.63 [#\/sec] (mean)<\/span>\n<span id=\"cb15-33\"><a href=\"#cb15-33\" aria-hidden=\"true\"><\/a><span class=\"ex\">Time<\/span> per request:       12.833 [ms] (mean)<\/span>\n<span id=\"cb15-34\"><a href=\"#cb15-34\" aria-hidden=\"true\"><\/a><span class=\"ex\">Time<\/span> per request:       2.567 [ms] (mean, across all concurrent requests)<\/span>\n<span id=\"cb15-35\"><a href=\"#cb15-35\" aria-hidden=\"true\"><\/a><span class=\"ex\">Transfer<\/span> rate:          25452.57 [Kbytes\/sec] received<\/span>\n<span id=\"cb15-36\"><a href=\"#cb15-36\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb15-37\"><a href=\"#cb15-37\" aria-hidden=\"true\"><\/a><span class=\"ex\">Connection<\/span> Times (ms)<\/span>\n<span id=\"cb15-38\"><a href=\"#cb15-38\" aria-hidden=\"true\"><\/a>              <span class=\"ex\">min<\/span> mean[+\/-sd] median  max<\/span>\n<span id=\"cb15-39\"><a href=\"#cb15-39\" aria-hidden=\"true\"><\/a><span class=\"ex\">Connect<\/span>:        0    0   0.1      0       1<\/span>\n<span id=\"cb15-40\"><a href=\"#cb15-40\" aria-hidden=\"true\"><\/a><span class=\"ex\">Processing<\/span>:     4   13  70.9      7    1147<\/span>\n<span id=\"cb15-41\"><a href=\"#cb15-41\" aria-hidden=\"true\"><\/a><span class=\"ex\">Waiting<\/span>:        2   12  70.8      6    1143<\/span>\n<span id=\"cb15-42\"><a href=\"#cb15-42\" aria-hidden=\"true\"><\/a><span class=\"ex\">Total<\/span>:          4   13  70.9      7    1147<\/span>\n<span id=\"cb15-43\"><a href=\"#cb15-43\" aria-hidden=\"true\"><\/a><\/span>\n<span id=\"cb15-44\"><a href=\"#cb15-44\" aria-hidden=\"true\"><\/a><span class=\"ex\">Percentage<\/span> of the requests served within a certain time (ms)<\/span>\n<span id=\"cb15-45\"><a href=\"#cb15-45\" aria-hidden=\"true\"><\/a>  <span class=\"ex\">50%<\/span>      7<\/span>\n<span id=\"cb15-46\"><a href=\"#cb15-46\" aria-hidden=\"true\"><\/a>  <span class=\"ex\">66%<\/span>      9<\/span>\n<span id=\"cb15-47\"><a href=\"#cb15-47\" aria-hidden=\"true\"><\/a>  <span class=\"ex\">75%<\/span>     10<\/span>\n<span id=\"cb15-48\"><a href=\"#cb15-48\" aria-hidden=\"true\"><\/a>  <span class=\"ex\">80%<\/span>     11<\/span>\n<span id=\"cb15-49\"><a href=\"#cb15-49\" aria-hidden=\"true\"><\/a>  <span class=\"ex\">90%<\/span>     14<\/span>\n<span id=\"cb15-50\"><a href=\"#cb15-50\" aria-hidden=\"true\"><\/a>  <span class=\"ex\">95%<\/span>     17<\/span>\n<span id=\"cb15-51\"><a href=\"#cb15-51\" aria-hidden=\"true\"><\/a>  <span class=\"ex\">98%<\/span>     24<\/span>\n<span id=\"cb15-52\"><a href=\"#cb15-52\" aria-hidden=\"true\"><\/a>  <span class=\"ex\">99%<\/span>     28<\/span>\n<span id=\"cb15-53\"><a href=\"#cb15-53\" aria-hidden=\"true\"><\/a> <span class=\"ex\">100%<\/span>   1147 (longest request)<\/span><\/code><\/pre><\/div>\n<p>That\u2018s 389 dynamic requests per second. Which is a lot. Especially considering that the result is from a small test computer. On a modern production-size server performance many times this can be achieved.<\/p>\n<p>What\u2019s remarkable isn\u2019t the speed of the system, it\u2019s memory usage. Unlike an application server with integrated <em>PHP module<\/em>, we have separated the <em>PHP stack<\/em> here. This gives us an Apache web server able to use <em>Event MPM<\/em>. In an integrated setup we would have to use the <em>Prefork MPM<\/em>, which works with memory-intensive server processes and not server threads. And each of these processes would then have to load the <em>PHP module<\/em>, regardless of the fact that most requests are normally attributed to static application components such as images, <em>CSS<\/em>, <em>JavaScripts<\/em>, etc. On my test system each <em>Prefork Apache process<\/em>, including <em>PHP<\/em>, brings a <em>resident size<\/em> of 6 MB. An event process with only <em>4 MB<\/em> means a substantial difference. And outside of this, the number of external <em>FCGI processes<\/em> will remain significantly smaller.<\/p>\n<h3 id=\"references\">References<\/h3>\n<ul>\n<li>Apache: http:\/\/httpd.apache.org<\/li>\n<li>Apache FCGI: http:\/\/httpd.apache.org\/mod_fcgid<\/li>\n<li>How2Forge PHP\/FCGI: http:\/\/www.howtoforge.com\/how-to-set-up-apache2-with-mod_fcgid-and-php5-on-ubuntu-10.04<\/li>\n<\/ul>\n<h3 id=\"license-copying-further-use\">License \/ Copying \/ Further use<\/h3>\n<p><a rel=\"license\" href=\"http:\/\/creativecommons.org\/licenses\/by-nc-sa\/4.0\/\"><img decoding=\"async\" alt=\"Creative Commons License\" style=\"border-width:0\" src=\"https:\/\/i.creativecommons.org\/l\/by-nc-sa\/4.0\/80x15.png\" \/><\/a><br \/>This work is licensed under a <a rel=\"license\" href=\"http:\/\/creativecommons.org\/licenses\/by-nc-sa\/4.0\/\">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License<\/a>.<\/p>\n<h5 id=\"changelog\">Changelog<\/h5>\n<ul>\n<li>2026-01-12: Updated Apache (2.4.66)<\/li>\n<li>2022-08-27: Updated Apache (2.4.54)<\/li>\n<li>2021-11-05: Updated Apache (2.4.51)<\/li>\n<li>2021-06-02: Updated Apache (2.4.48)<\/li>\n<li>2020-10-09: Updated Apache (2.4.46)<\/li>\n<li>2020-06-28: Updated Apache (2.4.43)<\/li>\n<li>2020-02-04: Updated Apache (2.4.41)<\/li>\n<li>2019-05-16: Updated Apache (2.4.39)<\/li>\n<li>2019-03-05: Updated Apache (2.4.38)<\/li>\n<li>2018-04-13: Fixed config with FCGIWrapper; update to php7; update title format (markdown); rewordings (Simon Studer)<\/li>\n<li>2017-12-17: Update apache to 2.4.29, fixed a link<\/li>\n<li>2017-09-25: Update apr (1.6.2), apr-util (1.6.0) and Apache (2.4.27)<\/li>\n<li>2017-02-25: Getting rid of AllowOverride completely<\/li>\n<li>2016-10-28: Adjusted Timeout and MaxRequestWorkers, added prefix \u201c-\u201d to tar options, Apache 2.4.23 -&gt; 2.4.25<\/li>\n<li>2016-10-09: Fixing small issues<\/li>\n<li>2016-07-15: Apache 2.4.20 -&gt; 2.4.23<\/li>\n<li>2016-04-18: Fixing small issues<\/li>\n<li>2016-03-15: Translated to English<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Setting up an Apache\/PHP application server What are we doing? We are setting up an Apache\/PHP application server using the minimal number of modules necessary. Why are we doing this? A bare bones Apache server is suitable for delivering static files. More complex applications rely on dynamic content. This requires an extension of the server. [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-946","page","type-page","status-publish","czr-hentry"],"_links":{"self":[{"href":"https:\/\/www.netnea.com\/cms\/wp-json\/wp\/v2\/pages\/946","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.netnea.com\/cms\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.netnea.com\/cms\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.netnea.com\/cms\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.netnea.com\/cms\/wp-json\/wp\/v2\/comments?post=946"}],"version-history":[{"count":3,"href":"https:\/\/www.netnea.com\/cms\/wp-json\/wp\/v2\/pages\/946\/revisions"}],"predecessor-version":[{"id":2139,"href":"https:\/\/www.netnea.com\/cms\/wp-json\/wp\/v2\/pages\/946\/revisions\/2139"}],"wp:attachment":[{"href":"https:\/\/www.netnea.com\/cms\/wp-json\/wp\/v2\/media?parent=946"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}