# Mac Server

# Apache2(httpd)

Mac 內建就有 Apache2 ，因此不用使用 brew 再裝一次

可以先用檢查所有設定檔的位置

```
sudo apachectl -V
```

```bash
Server version: Apache/2.4.58 (Unix)
Server built:   Apr 13 2024 11:53:17
Server's Module Magic Number: 20120211:129
Server loaded:  APR 1.5.2, APR-UTIL 1.5.4, PCRE 8.44 2020-02-12
Compiled using: APR 1.5.2, APR-UTIL 1.5.4, PCRE 8.44 2020-02-12
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_FLOCK_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/usr"
 -D SUEXEC_BIN="/usr/bin/suexec"
 -D DEFAULT_PIDLOG="/private/var/run/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="/private/etc/apache2/mime.types"
 -D SERVER_CONFIG_FILE="/private/etc/apache2/httpd.conf"
```

接著要編輯

```
/private/etc/apache2/httpd.conf
```

由於我是要用 proxy 及 ssl 相關的module，至少要打開下列這幾個

```
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
LoadModule ssl_module libexec/apache2/mod_ssl.so
LoadModule proxy_module libexec/apache2/mod_proxy.so
LoadModule proxy_http_module libexec/apache2/mod_proxy_http.so
```

啟用 vhosts

```
sudo vi /private/etc/apache2/extra/httpd-vhosts.conf
```

<p class="callout info">原本預設值可刪掉 VirtualHost ，不然會跑失敗</p>

由於我用docker架了一個WordPress使用8080 port，因此就這樣寫

```
<VirtualHost *:80>
    ServerName mac.mysite.com

    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/

    ErrorLog "/opt/homebrew/var/log/mac.mysite.com-error_log"
    CustomLog "/opt/homebrew/var/log/mac.mysite.com-access_log" common

</VirtualHost>
```

接著再使用 certbot 裝 ssl

```
brew install certbot
brew install python@3.11  
pip install certbot-apache
sudo certbot --apache -d mac.mysite.com
```

成功的話就會看到 httpd-vhosts.conf 支援 ssl了

```
<VirtualHost *:80>
    ServerName mac.mysite.com

    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/

    ErrorLog "/opt/homebrew/var/log/mac.mysite.com-error_log"
    CustomLog "/opt/homebrew/var/log/mac.mysite.com-access_log" common
RewriteEngine on
RewriteCond %{SERVER_NAME} =mac.mysite.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
```

使用 **https**://mac.mysite.com 即可進入網站

Docker 在建置時可以使用設定 port 再搭配 proxy 及設定 dns ，即可架設多個站玩多種服務

檢查設定檔

```
sudo apachectl configtest
```

重新啟動

```
sudo apachectl restart
```

<p class="callout info"><span class="s1">我在設定時由於用brew裝了nginx及apache，導致80 port有問題  
</span><span class="s1">sudo lsof -i :80   
檢查 80 port 有什麼佔住再陸續刪掉  
</span></p>