{"id":2870,"date":"2018-11-04T21:39:34","date_gmt":"2018-11-04T16:09:34","guid":{"rendered":"https:\/\/pheonixsolutions.com\/blog\/?p=2870"},"modified":"2026-09-30T20:04:28","modified_gmt":"2026-09-30T14:34:28","slug":"how-to-install-apache-on-macos-via-homebrew","status":"publish","type":"post","link":"https:\/\/pheonixsolutions.com\/blog\/how-to-install-apache-on-macos-via-homebrew\/","title":{"rendered":"How to Install Apache on macOS via Homebrew"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>Post Date:<\/strong> October 25, 2018<br><strong>Last Updated:<\/strong> September 30, 2026<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Apache HTTP Server, commonly called <strong>Apache<\/strong> or <strong>httpd<\/strong>, is a widely used open-source web server for hosting websites and web applications.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On macOS, Apache can be installed and managed using <strong>Homebrew<\/strong>, a package manager for macOS. Homebrew provides a maintained <code>httpd<\/code> formula and supports both Apple Silicon and Intel Mac systems.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Prerequisites<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Before starting, make sure you have:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A supported macOS system<\/li>\n\n\n\n<li>Terminal access<\/li>\n\n\n\n<li>Homebrew installed<\/li>\n\n\n\n<li>A user account with permission to install Homebrew packages<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">You can verify that Homebrew is installed:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">brew --version\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If Homebrew is not installed, follow the official Homebrew installation documentation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can also check the Homebrew installation prefix:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">brew --prefix\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Typical locations are:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/opt\/homebrew\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">for Apple Silicon Macs and:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/usr\/local\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">for Intel Macs.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Implementation<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">1. Check for an Existing Apache Installation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before installing another Apache instance, check whether an existing Apache process is running:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ps aux | grep '[h]ttpd'\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You can also check whether ports commonly used by Apache are already occupied:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">lsof -nP -iTCP:80 -sTCP:LISTEN\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">and:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">lsof -nP -iTCP:8080 -sTCP:LISTEN\n<\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Important:<\/strong> Do not automatically unload or remove macOS&#8217;s system Apache just because you are installing the Homebrew version. The Homebrew installation uses its own configuration, binaries, document root, and service management.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. Install Apache Using Homebrew<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Install the Apache HTTP Server package:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">brew install httpd\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Homebrew currently provides Apache through the <code>httpd<\/code> formula. The current formula is Apache HTTP Server 2.4.68 as of September 2026.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The Apache HTTP Server project also lists 2.4.68 as its current stable release.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">After installation, verify the package:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">brew info httpd\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Check the installed Apache version:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$(brew --prefix)\/opt\/httpd\/bin\/httpd -v\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You should see output similar to:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Server version: Apache\/2.4.x\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The exact version may change as Homebrew updates the formula.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. Identify the Homebrew Apache Paths<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Homebrew installs Apache separately from the macOS system installation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Find the Homebrew prefix:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">brew --prefix\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Find the Apache installation:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">brew --prefix httpd\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/opt\/homebrew\/opt\/httpd\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">on Apple Silicon.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The main configuration file is located at:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$(brew --prefix)\/etc\/httpd\/httpd.conf\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You can confirm the configuration path with:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$(brew --prefix)\/opt\/httpd\/bin\/httpd -V\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Look for the <code>SERVER_CONFIG_FILE<\/code> and <code>HTTPD_ROOT<\/code> values in the output.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4. Understand the Default Homebrew Apache Port<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Unlike many traditional Apache installations, Homebrew configures Apache to listen on <strong>port 8080<\/strong> by default.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The default Homebrew configuration uses:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">8080\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">for HTTP and:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">8443\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">for HTTPS. This allows Apache to run without requiring root privileges to bind to privileged ports such as 80 and 443.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check the configured HTTP port:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">grep -n \"^Listen\" \"$(brew --prefix)\/etc\/httpd\/httpd.conf\"\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You should see something similar to:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Listen 8080\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5. Start Apache Manually<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You can start Apache using the Homebrew-installed binary:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\"$(brew --prefix)\/opt\/httpd\/bin\/httpd\"\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Alternatively, use:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apachectl start\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Because multiple Apache installations can exist on macOS, it is safer to verify which executable is being used:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">which apachectl\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You can also check:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apachectl -V\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6. Start Apache Using Homebrew Services<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For development systems, Homebrew services provide a convenient way to manage Apache as a background service.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Start Apache:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">brew services start httpd\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Homebrew&#8217;s current <code>httpd<\/code> formula officially provides this service command.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check the service:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">brew services list\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You should see <code>httpd<\/code> listed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Homebrew uses macOS&#8217;s service-management mechanism through <code>launchctl<\/code> for services.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7. Verify That Apache Is Running<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Check the running Apache processes:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ps aux | grep '[h]ttpd'\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Check the listening port:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">lsof -nP -iTCP:8080 -sTCP:LISTEN\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You can also use:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo lsof -nP -iTCP:8080 -sTCP:LISTEN\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If Apache is running correctly, the output should show an Apache\/httpd process listening on port 8080.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">8. Test Apache in a Browser<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Because Homebrew configures Apache to listen on port 8080 by default, open:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">http:\/\/localhost:8080\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You can also test from Terminal:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">curl -I http:\/\/localhost:8080\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A successful response should return an HTTP status such as:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">HTTP\/1.1 200 OK\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The exact response headers may vary depending on the Apache configuration.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">9. Locate the Apache Document Root<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Homebrew <code>httpd<\/code> formula uses:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$HOMEBREW_PREFIX\/var\/www\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">as its default document root.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Find the Homebrew prefix:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">brew --prefix\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For example, on Apple Silicon:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/opt\/homebrew\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The document root would therefore be:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/opt\/homebrew\/var\/www\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Check it:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ls -la \"$(brew --prefix)\/var\/www\"\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">10. Create a Test Web Page<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create a simple HTML file:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">echo '&lt;h1>Apache is running on macOS&lt;\/h1>' > \"$(brew --prefix)\/var\/www\/index.html\"\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Restart Apache:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">brew services restart httpd\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Test it:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">curl http:\/\/localhost:8080\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Or open:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">http:\/\/localhost:8080\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">in your browser.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">11. Stop Apache<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To stop the Homebrew Apache service:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">brew services stop httpd\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You can verify the service status:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">brew services list\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You can also stop Apache using:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apachectl stop\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Use the Homebrew service commands when Apache was started through <code>brew services<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">12. Restart Apache<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">After changing Apache configuration, first validate the configuration:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apachectl -t\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A successful validation should return:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Syntax OK\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then restart Apache:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">brew services restart httpd\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Alternatively:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apachectl -k restart\n<\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Best practice:<\/strong> Always run <code>apachectl -t<\/code> before restarting Apache after configuration changes.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">13. Change Apache Configuration<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The primary Homebrew Apache configuration file is:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\"$(brew --prefix)\/etc\/httpd\/httpd.conf\"\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Open it with a text editor:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">nano \"$(brew --prefix)\/etc\/httpd\/httpd.conf\"\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Before making changes, create a backup:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">cp \"$(brew --prefix)\/etc\/httpd\/httpd.conf\" \\\n   \"$(brew --prefix)\/etc\/httpd\/httpd.conf.backup\"\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">After making changes:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apachectl -t\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If the output is:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Syntax OK\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">restart Apache:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">brew services restart httpd\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">14. Change Apache From Port 8080 to Port 80<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Homebrew intentionally uses port 8080 by default so Apache can run without privileged access.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you specifically need Apache to listen on port 80, edit:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">nano \"$(brew --prefix)\/etc\/httpd\/httpd.conf\"\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Find:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Listen 8080\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Change it to:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Listen 80\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then test the configuration:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apachectl -t\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If the configuration is valid, restart Apache:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">brew services restart httpd\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Check the port:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo lsof -nP -iTCP:80 -sTCP:LISTEN\n<\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Note:<\/strong> Port 80 is a privileged port on macOS. Running Apache on port 8080 is generally simpler for local development and does not require privileged port binding.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">15. Configure a Virtual Host<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For local development, you may want to host multiple projects.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">First make sure the virtual-host configuration is enabled in <code>httpd.conf<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Include \/opt\/homebrew\/etc\/httpd\/extra\/httpd-vhosts.conf\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">On Intel Macs, the Homebrew prefix may instead be:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Include \/usr\/local\/etc\/httpd\/extra\/httpd-vhosts.conf\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A more portable approach is to use the actual Homebrew prefix:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">brew --prefix\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Edit the virtual-host configuration:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">nano \"$(brew --prefix)\/etc\/httpd\/extra\/httpd-vhosts.conf\"\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;VirtualHost *:8080>\n    ServerName myproject.local\n    DocumentRoot \"\/path\/to\/myproject\"\n\n    &lt;Directory \"\/path\/to\/myproject\">\n        AllowOverride All\n        Require all granted\n    &lt;\/Directory>\n\n    ErrorLog \"\/path\/to\/myproject\/error.log\"\n    CustomLog \"\/path\/to\/myproject\/access.log\" common\n&lt;\/VirtualHost>\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Test the configuration:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apachectl -t\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then restart:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">brew services restart httpd\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">16. Configure a Local Domain<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you want to access the project using:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">http:\/\/myproject.local:8080\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">add an entry to <code>\/etc\/hosts<\/code>:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo nano \/etc\/hosts\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Add:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">127.0.0.1 myproject.local\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then test:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">curl -I http:\/\/myproject.local:8080\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This setup is useful for local web development when testing multiple websites or applications.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">17. Check Apache Logs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Apache logs are useful when troubleshooting configuration or application problems.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check the configured log paths:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">grep -n \"ErrorLog\\|CustomLog\" \"$(brew --prefix)\/etc\/httpd\/httpd.conf\"\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Depending on the Homebrew configuration, logs are stored under the Homebrew Apache directories.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can also locate Apache log files with:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">find \"$(brew --prefix)\/var\" -iname \"*.log\" | grep httpd\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For virtual hosts, define separate logs when appropriate:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ErrorLog \"\/path\/to\/project\/error.log\"\nCustomLog \"\/path\/to\/project\/access.log\" common\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">18. Troubleshooting<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">Apache fails to start<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">First test the configuration:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apachectl -t\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then check the service:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">brew services list\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Check whether another application is using port 8080:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">lsof -nP -iTCP:8080 -sTCP:LISTEN\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Port 8080 is already in use<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Find the process:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">lsof -nP -iTCP:8080 -sTCP:LISTEN\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If another application is using the port, either stop that application or change Apache&#8217;s listening port.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Apache returns &#8220;403 Forbidden&#8221;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Check the <code>&lt;Directory&gt;<\/code> configuration.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;Directory \"\/path\/to\/myproject\">\n    AllowOverride All\n    Require all granted\n&lt;\/Directory>\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then validate and restart:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apachectl -t\nbrew services restart httpd\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Also verify that the macOS user running Apache can access the document-root directory.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Apache returns &#8220;404 Not Found&#8221;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">grep -n \"DocumentRoot\" \"$(brew --prefix)\/etc\/httpd\/httpd.conf\"\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Verify that the requested file exists:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ls -la \"$(brew --prefix)\/var\/www\"\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For virtual hosts, also check the <code>DocumentRoot<\/code> specified in the virtual-host configuration.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Apache configuration changes do not take effect<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">First validate:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apachectl -t\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then restart:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">brew services restart httpd\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Confirm that the correct Apache process is running:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ps aux | grep '[h]ttpd'\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">19. Useful Apache and Homebrew Commands<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Purpose<\/th><th>Command<\/th><\/tr><\/thead><tbody><tr><td>Install Apache<\/td><td><code>brew install httpd<\/code><\/td><\/tr><tr><td>Show Apache package information<\/td><td><code>brew info httpd<\/code><\/td><\/tr><tr><td>Show Homebrew prefix<\/td><td><code>brew --prefix<\/code><\/td><\/tr><tr><td>Show Apache prefix<\/td><td><code>brew --prefix httpd<\/code><\/td><\/tr><tr><td>Start Apache service<\/td><td><code>brew services start httpd<\/code><\/td><\/tr><tr><td>Stop Apache service<\/td><td><code>brew services stop httpd<\/code><\/td><\/tr><tr><td>Restart Apache service<\/td><td><code>brew services restart httpd<\/code><\/td><\/tr><tr><td>Check Homebrew services<\/td><td><code>brew services list<\/code><\/td><\/tr><tr><td>Test Apache configuration<\/td><td><code>apachectl -t<\/code><\/td><\/tr><tr><td>Show Apache version<\/td><td><code>apachectl -v<\/code><\/td><\/tr><tr><td>Show Apache build\/configuration<\/td><td><code>apachectl -V<\/code><\/td><\/tr><tr><td>Check port 8080<\/td><td><code>lsof -nP -iTCP:8080 -sTCP:LISTEN<\/code><\/td><\/tr><tr><td>Test HTTP<\/td><td><code>curl -I http:\/\/localhost:8080<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">20. Security and Best Practices<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Although this guide focuses on local macOS development, basic security practices still apply.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Keep Apache updated<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Homebrew provides updates for the <code>httpd<\/code> formula. Regularly check:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">brew update\nbrew outdated\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then update when appropriate:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">brew upgrade httpd\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Do not expose development servers unnecessarily<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If Apache is being used only for local development, avoid exposing it to external networks unless there is a specific requirement.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Validate configuration before restarting<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Always run:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apachectl -t\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">before restarting Apache after configuration changes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Use separate virtual hosts<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For multiple local projects, use virtual hosts rather than placing unrelated applications into one document root.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Protect sensitive files<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Do not place:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>.env<\/code> files<\/li>\n\n\n\n<li>Database backups<\/li>\n\n\n\n<li>Private keys<\/li>\n\n\n\n<li>Application secrets<\/li>\n\n\n\n<li>Configuration backups<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">inside a publicly accessible document root.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Use HTTPS when required<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For applications that need HTTPS-specific testing, configure TLS using Apache&#8217;s SSL configuration rather than exposing sensitive applications over plain HTTP.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Installing Apache on macOS using Homebrew is straightforward and provides a convenient environment for local web development.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The basic workflow is:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">brew install httpd\nbrew services start httpd\napachectl -t\ncurl -I http:\/\/localhost:8080\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Homebrew&#8217;s Apache configuration uses <strong>port 8080 for HTTP<\/strong> and <strong>8443 for HTTPS<\/strong> by default, allowing the service to run without requiring privileged ports.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For development environments, you can further configure:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Custom document roots<\/li>\n\n\n\n<li>Virtual hosts<\/li>\n\n\n\n<li>Local domains<\/li>\n\n\n\n<li>Apache modules<\/li>\n\n\n\n<li>PHP integration<\/li>\n\n\n\n<li>HTTPS<\/li>\n\n\n\n<li>Application-specific logging<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Always validate Apache configuration changes before restarting the service and keep the Homebrew Apache package updated.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">FAQ<\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">Does macOS already include Apache?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Some macOS versions have included Apache components, but this guide installs Apache separately through Homebrew. You do not need to remove the system components simply to install the Homebrew version.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What command installs Apache using Homebrew?<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">brew install httpd\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">What port does Homebrew Apache use by default?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Homebrew&#8217;s current <code>httpd<\/code> formula configures Apache to use <strong>8080 for HTTP<\/strong> and <strong>8443 for HTTPS<\/strong> by default.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How do I start Apache automatically?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">brew services start httpd\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Homebrew services integrates with macOS&#8217;s service manager.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How do I test the Apache configuration?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apachectl -t\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A valid configuration returns:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Syntax OK\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Where is the Homebrew Apache configuration?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$(brew --prefix)\/etc\/httpd\/httpd.conf\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Where is the default document root?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Homebrew&#8217;s current <code>httpd<\/code> formula uses:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$HOMEBREW_PREFIX\/var\/www\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">as the default document root.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Can I change Apache to port 80?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes, but port 80 is privileged. For local development, keeping Apache on port 8080 is generally simpler.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Related Articles<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/pheonixsolutions.com\/blog\/how-to-deploy-wordpress-behind-a-reverse-proxy-on-cpanel-apache\/\">How to Deploy WordPress Behind a Reverse Proxy on cPanel\/Apache<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/pheonixsolutions.com\/blog\/installing-modsecurity-with-owasp-crs-on-apache-ubuntu\/\">Installing ModSecurity with OWASP CRS on Apache (Ubuntu)<\/a><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Looking for Apache Support<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Need assistance with Apache installation, configuration, troubleshooting, or server optimisation? Our team is happy to help with your web server and infrastructure requirements. Please reach out to our team <a href=\"https:\/\/pheonixsolutions.com\/contact\" data-type=\"link\" data-id=\"https:\/\/pheonixsolutions.com\/contact\">here<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Post Date: October 25, 2018Last Updated: September 30, 2026 Introduction Apache HTTP Server, commonly called Apache or httpd, is a [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[1021],"tags":[278,476,477],"class_list":["post-2870","post","type-post","status-publish","format-standard","hentry","category-mobile-flutter","tag-apache","tag-homebrew","tag-macos","psol-cat-mobile-flutter"],"jetpack_publicize_connections":[],"jetpack_shortlink":"https:\/\/wp.me\/phn2x7-Ki","jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts\/2870","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/comments?post=2870"}],"version-history":[{"count":2,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts\/2870\/revisions"}],"predecessor-version":[{"id":12049,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts\/2870\/revisions\/12049"}],"wp:attachment":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/media?parent=2870"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/categories?post=2870"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/tags?post=2870"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}