{"id":259,"date":"2026-10-13T04:21:06","date_gmt":"2026-10-13T04:21:06","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2010\/06\/17\/apche-interview-questions\/"},"modified":"2026-10-13T04:21:06","modified_gmt":"2026-10-13T04:21:06","slug":"apche-interview-questions","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/apche-interview-questions\/","title":{"rendered":"Apache Interview Questions (Updated): Practical DevOps Answers with Modern Config and Operations"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full aligncenter\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2010\/06\/apche-interview-questions.png\" alt=\"Apache interview questions and answers\" width=\"600\" height=\"400\" \/><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Originally published on 2010-06-17; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide modernizes a classic Apache interview Q&amp;A into a practical DevOps reference. It helps candidates and operators understand <strong>what interview answers mean in real systems<\/strong>\u2014from process model and config validation to virtual hosts, reloads, and access control. Original post: <a href=\"https:\/\/www.devopsschool.com\/blog\/apche-interview-questions\/\">Apache Interview Questions and Answer \u2013 Job Interview Kit<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Quick command reference for Apache operations<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Interview questions often ask for one-liner commands. In production, the safer answer is usually to use Apache\u2019s control wrapper (or your OS service manager) before falling back to process-kill commands.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Command<\/th><th>Best for<\/th><th>What it does<\/th><th>Notes<\/th><\/tr><\/thead><tbody><tr><td>apachectl configtest<\/td><td>Pre-deploy validation<\/td><td>Checks Apache configuration syntax<\/td><td>Run this before any reload\/restart<\/td><\/tr><tr><td>apachectl graceful<\/td><td>Low-disruption config apply<\/td><td>Sends a graceful restart signal and keeps serving requests while workers rotate<\/td><td>Common interview question and common production need<\/td><\/tr><tr><td>apachectl stop<\/td><td>Controlled shutdown<\/td><td>Stops the server cleanly<\/td><td>Prefer over manual process kill when available<\/td><\/tr><tr><td>systemctl reload apache2 \/ httpd<\/td><td>Service-managed hosts<\/td><td>Reloads Apache via init system<\/td><td>Service name varies by distribution<\/td><\/tr><tr><td>killall httpd (or similar)<\/td><td>Last-resort recovery<\/td><td>Terminates processes by name<\/td><td>Use with care; can interrupt traffic<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># Validate syntax first<\/span>\nsudo apachectl configtest\n\n<span class=\"hljs-comment\"># Apply config with minimal disruption<\/span>\nsudo apachectl graceful\n\n<span class=\"hljs-comment\"># Full stop (controlled)<\/span>\nsudo apachectl stop<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Safe Apache configuration change workflow<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This is the workflow interviewers expect senior candidates to describe: validate, reload safely, then verify runtime behavior.<\/p>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Edit Apache configuration] --> B[Run apachectl configtest]\n    B --> C{Syntax valid}\n    C -- no --> D[Fix configuration and retest]\n    C -- yes --> E[Run apachectl graceful]\n    E --> F[Check logs and service health]\n    F --> G{Issue detected}\n    G -- yes --> H[Rollback change]\n    G -- no --> I[Change complete]\n<\/pre>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># Example verification commands after reload<\/span>\nsudo tail -n <span class=\"hljs-number\">100<\/span> \/<span class=\"hljs-keyword\">var<\/span>\/log\/apache2\/error.log\nsudo tail -n <span class=\"hljs-number\">100<\/span> \/<span class=\"hljs-keyword\">var<\/span>\/log\/httpd\/error_log\nps aux | grep -E <span class=\"hljs-string\">'httpd|apache2'<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Why older Apache installs referenced srm.conf, access.conf, and httpd.conf<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original answer is historical: <strong>srm.conf<\/strong> and <strong>access.conf<\/strong> were legacy split files from older Apache\/NCSA-era layouts. In modern Apache deployments, configuration is typically centralized in a main file with include directories.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Historical interview answer: those files were often considered legacy remnants.<\/li><li>Modern operational reality: many environments use one main config plus included fragments.<\/li><li>Practical recommendation: follow your distro\/package layout, but keep configuration organized by concern (vhosts, security, modules).<\/li><\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css language-apache\"># <span class=\"hljs-selector-tag\">Common<\/span> <span class=\"hljs-selector-tag\">pattern<\/span> <span class=\"hljs-selector-tag\">in<\/span> <span class=\"hljs-selector-tag\">modern<\/span> <span class=\"hljs-selector-tag\">Apache<\/span> <span class=\"hljs-selector-tag\">configs<\/span>\n<span class=\"hljs-selector-tag\">IncludeOptional<\/span> <span class=\"hljs-selector-tag\">conf<\/span><span class=\"hljs-selector-class\">.d<\/span><span class=\"hljs-comment\">\/*.conf\nIncludeOptional sites-enabled\/*.conf<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Why one root Apache process and many unprivileged worker processes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A common interview question is why process listings show one root-owned parent and multiple child worker processes under a less-privileged account. The parent process can bind privileged ports (such as 80), while request handling is done by less-privileged workers for better security isolation.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Troubleshooting: &#8220;no listening sockets available, shutting down&#8221;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original post points to a missing <strong>Listen<\/strong> directive. That is one possible cause. In practice, this error can also happen if another process already occupies the target port.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-apache\"><span class=\"hljs-comment\"># Ensure a Listen directive exists<\/span>\nListen <span class=\"hljs-number\">80<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># Check whether port 80 is already in use<\/span>\nsudo ss -ltnp | grep <span class=\"hljs-string\">':80'<\/span>\n\n<span class=\"hljs-comment\"># Re-check config after edits<\/span>\nsudo apachectl configtest<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Virtual host setup: practical example<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original snippet used a hostname directly in the VirtualHost line. A widely used modern pattern is to bind by address\/port and route by <strong>ServerName<\/strong>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-apache\">&lt;VirtualHost *:<span class=\"hljs-number\">80<\/span>&gt;\n    ServerAdmin admin@example.com\n    ServerName www.example.com\n    DocumentRoot \/<span class=\"hljs-keyword\">var<\/span>\/www\/example\/<span class=\"hljs-keyword\">public<\/span>\n\n    ErrorLog \/<span class=\"hljs-keyword\">var<\/span>\/log\/apache2\/example-error.log\n    CustomLog \/<span class=\"hljs-keyword\">var<\/span>\/log\/apache2\/example-access.log combined\n&lt;\/VirtualHost&gt;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">What mod_vhost_alias is used for<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>mod_vhost_alias<\/strong> supports dynamic (mass) virtual hosting so many hostnames can map to filesystem paths without a separate static vhost block for each site.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-apache\">UseCanonicalName Off\nVirtualDocumentRoot \/<span class=\"hljs-keyword\">var<\/span>\/www\/vhosts\/%<span class=\"hljs-number\">0<\/span>\/public_html<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">htpasswd and access control: legacy answers vs modern Apache<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original post says <strong>htpasswd<\/strong> creates a user in a group. More precisely, it creates or updates entries in a password file used by Basic authentication.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># Create password file and add first user<\/span>\nsudo htpasswd -c \/etc\/apache2\/.htpasswd deployuser\n\n<span class=\"hljs-comment\"># Add another user later (without -c)<\/span>\nsudo htpasswd \/etc\/apache2\/.htpasswd opsuser<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-apache\">&lt;Directory \/<span class=\"hljs-keyword\">var<\/span>\/www\/example\/<span class=\"hljs-keyword\">private<\/span>&gt;\n    AuthType Basic\n    AuthName <span class=\"hljs-string\">\"Restricted\"<\/span>\n    AuthUserFile \/etc\/apache2\/.htpasswd\n    <span class=\"hljs-keyword\">Require<\/span> valid-user\n&lt;\/Directory&gt;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Topic<\/th><th>Legacy interview phrasing<\/th><th>Modern Apache view<\/th><\/tr><\/thead><tbody><tr><td>Access control precedence<\/td><td>&#8220;Deny from all&#8221; vs &#8220;Allow from all&#8221; with deny precedence<\/td><td>In Apache 2.4+, use <code>Require<\/code> rules (legacy Order\/Allow\/Deny behavior is not the preferred model)<\/td><\/tr><tr><td>ServerType directive<\/td><td>standalone vs inetd<\/td><td>Historical\/deprecated in modern deployments<\/td><\/tr><tr><td>Config file split<\/td><td>srm.conf, access.conf, httpd.conf<\/td><td>Typically consolidated with include-based config trees<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Best practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Always run <code>apachectl configtest<\/code> before reload\/restart.<\/li><li>Prefer graceful reloads for routine config updates.<\/li><li>Treat legacy interview answers as historical context, then explain the modern equivalent.<\/li><li>Use least privilege for worker processes and avoid unnecessary root runtime exposure.<\/li><li>Document distro-specific paths and service names in your team runbooks.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>A revised Apache interview kit that explains not just what to answer, but how to operate Apache safely in production. Covers commands, process model, config validation, virtual hosts, and access control.<\/p>\n","protected":false},"author":1,"featured_media":4287,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[52],"tags":[767,420,3916,3920,3919,3918,3917,3921,3923,766,3922,507,1553,482,1830,3910,637],"class_list":["post-259","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-interview-questions-answers","tag-answer","tag-apache","tag-apache-interview","tag-apache-interview-guide","tag-apache-interview-qa","tag-apache-interview-questions-answers","tag-apache-job-interview","tag-apache-job-interview-kit","tag-apache-server","tag-interview","tag-interview-questions-answer-for-apache","tag-list","tag-most-asked","tag-questions","tag-selected","tag-sets","tag-top"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/259","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=259"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/259\/revisions"}],"predecessor-version":[{"id":79087,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/259\/revisions\/79087"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4287"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=259"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=259"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=259"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}