在建置網站服務時,正確組態 Apache 伺服器至關重要。本文詳細說明設定虛擬主機、組態 DocumentRoot,以及啟用 PHP 模組的步驟,並以安裝 RainLoop Webmail 為例,展示如何在 Apache 上執行動態網頁應用。此外,文章也探討使用 Docker 容器化佈署 Apache、PHP 和 RainLoop 的方法,包含撰寫 Dockerfile、設定 Docker Compose,以及組態 Postfix 和 Dovecot 郵件伺服器,藉此建立更具彈性且易於維護的郵件服務系統。透過容器化技術,各服務元件得以獨立運作和更新,有效提升系統的穩定性和可擴充套件性。

組態Apache正確提供網站服務

在完成Apache的基本組態後,下一步是設定伺服器引數(網站名稱和檔案位置),以便當Web伺服器接收到特定網域名稱的請求時,Apache能夠識別並提供位於DocumentRoot目錄下的檔案。

編輯Apache組態檔案

首先,儲存你的apache2.conf檔案。然後,找到位於/etc/apache2/sites-available資料夾中的預設網站組態檔案000-default.conf,並將其編輯成如下範例所示:

<VirtualHost *:80>
    ServerName web.devops.lab
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

這個檔案設定了主要網站的ServerName(web.devops.lab)、DocumentRoot(/var/www/html)、日誌路徑等引數。這些引數定義了網站的各項規則。

內容解密:

  1. <VirtualHost *:80>:定義了一個虛擬主機,監聽所有網路介面的80埠。
  2. ServerName web.devops.lab:指定了這個虛擬主機對應的網域名稱。
  3. DocumentRoot /var/www/html:設定了網站檔案的根目錄。
  4. ErrorLogCustomLog:定義了錯誤日誌和存取日誌的位置。

建立和啟用第二個網站

要建立第二個網站,需要在/etc/apache2/sites-available目錄下建立一個新的組態檔案,例如myserver.conf。可以透過複製000-default.conf來建立:

$ sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/myserver.conf

然後編輯myserver.conf

<VirtualHost *:80>
    ServerName myserver.devops.lab
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/myserver
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

內容解密:

  1. ServerName myserver.devops.lab:指定了第二個網站的網域名稱。
  2. DocumentRoot /var/www/myserver:設定了第二個網站的根目錄。
  3. 使用預設的80埠,這樣Apache就能根據不同的網域名稱提供不同的網站內容。

測試網站

/var/www/myserver目錄下建立一個簡單的index.html檔案:

$ echo "This is myserver.devops.lab." | sudo tee /var/www/myserver/index.html
$ sudo chown www-data:www-data /var/www/myserver -R

然後啟用新的網站組態並重新載入Apache組態:

$ sudo a2ensite myserver
$ sudo systemctl reload apache2

現在,可以透過瀏覽器存取http://web.devops.labhttp://myserver.devops.lab來測試兩個網站。

網域名稱的重要性

網域名稱在區分不同的網站中扮演著關鍵角色。即使兩個網站都監聽同一個埠(例如80),Apache也可以根據不同的網域名稱請求提供不同的內容。

此圖示說明瞭Apache如何根據不同的網域名稱請求傳回不同的網站內容。

在Apache上組態PHP並安裝RainLoop Webmail

在前一章節中,我們成功地建立了一個基本的網頁伺服器,並對其進行了必要的組態。本章節將著重於在Apache上啟用PHP支援,並安裝RainLoop Webmail來展示動態網頁應用的能力。

測試PHP安裝

首先,我們需要確認PHP是否正確安裝並組態於我們的網頁伺服器上。為此,我們可以在 /var/www/html 目錄下建立一個名為 test.php 的檔案,並在其中加入 phpinfo() 函式:

$ sudo vi /var/www/html/test.php
<?php
phpinfo();
?>

內容解密:

  • sudo vi /var/www/html/test.php:使用vi編輯器以管理員許可權建立並編輯 test.php 檔案。
  • <?php phpinfo(); ?>:這是一個PHP程式碼段,phpinfo() 函式輸出了PHP的組態資訊和系統資訊。

接下來,在瀏覽器中存取 http://web.devops.lab/test.php,如果一切正常,你將看到由 phpinfo() 產生的資訊頁面,顯示伺服器和PHP模組的詳細組態。

啟用PHP模組

如果 test.php 無法正常載入,你需要確保PHP模組已在Apache中啟用。使用 a2enmod 命令可以啟用指定的Apache模組:

$ sudo a2enmod php8.1
$ sudo systemctl restart apache2

內容解密:

  • sudo a2enmod php8.1:啟用PHP 8.1模組。
  • sudo systemctl restart apache2:重新啟動Apache服務,以使新的組態生效。

安裝RainLoop Webmail

現在,我們準備安裝RainLoop Webmail,一個根據網頁的電子郵件客戶端。首先,需要安裝 unzip 工具來解壓縮下載的RainLoop檔案:

$ sudo apt install unzip
$ wget https://www.rainloop.net/repository/webmail/rainloop-community-latest.zip
$ sudo unzip rainloop-community-latest.zip -d /var/www/html/

內容解密:

  • sudo apt install unzip:安裝unzip工具,用於解壓縮檔案。
  • wget https://www.rainloop.net/repository/webmail/rainloop-community-latest.zip:下載RainLoop的最新社群版。
  • sudo unzip rainloop-community-latest.zip -d /var/www/html/:將下載的RainLoop壓縮檔解壓到 /var/www/html/ 目錄下。

完成上述步驟後,RainLoop Webmail就安裝完成了。你可以透過瀏覽器存取相關頁面來使用它。

RainLoop Webmail 安裝流程

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Apache設定PHP與RainLoop郵件服務佈署

package "Docker 架構" {
    actor "開發者" as dev

    package "Docker Engine" {
        component [Docker Daemon] as daemon
        component [Docker CLI] as cli
        component [REST API] as api
    }

    package "容器運行時" {
        component [containerd] as containerd
        component [runc] as runc
    }

    package "儲存" {
        database [Images] as images
        database [Volumes] as volumes
        database [Networks] as networks
    }

    cloud "Registry" as registry
}

dev --> cli : 命令操作
cli --> api : API 呼叫
api --> daemon : 處理請求
daemon --> containerd : 容器管理
containerd --> runc : 執行容器
daemon --> images : 映像檔管理
daemon --> registry : 拉取/推送
daemon --> volumes : 資料持久化
daemon --> networks : 網路配置

@enduml

此圖示展示了安裝RainLoop Webmail的主要步驟,從下載安裝包到最終完成安裝的流程。

使用Docker容器佈署Apache、PHP和RainLoop

在上一章中,我們完成了虛擬機器環境下的LAMP堆積疊搭建,包括Apache、PHP和RainLoop的安裝與設定。本章將進一步介紹如何使用Docker容器技術來佈署相同的服務,實作更加靈活和可擴充套件的微服務架構。

容器之間的互動

在Docker環境下,每個服務將被封裝在獨立的容器中,分別為httpd(包含Apache和PHP)、rainloop、postfix和dovecot。這些容器執行在相同的物理主機上,可以透過Docker網路進行通訊,並分享儲存卷。這種設計使得每個服務可以獨立更新和維護,而不影響其他服務的運作。

準備Docker主機

首先,確保你的DNS MX記錄指向你的Docker主機(docker.devops.lab),並且之前為郵件伺服器佈署的容器已經停止。可以使用以下命令停止所有正在執行的容器:

$ docker container stop $(docker ps -aq)

接著,使用以下命令刪除這些容器,以便稍後重用容器名稱:

$ docker container prune

內容解密:

  • docker container stop $(docker ps -aq):此命令會停止所有正在執行的Docker容器。docker ps -aq會列出所有容器的ID,而docker container stop則會根據這些ID停止相應的容器。
  • docker container prune:此命令會刪除所有停止的容器,釋放系統資源。

為RainLoop建立Docker Context

在Chapter 4中,我們為郵件伺服器建立了一個名為myserver的目錄,用於存放Dockerfile。為了保持專案分離,我們將為RainLoop建立一個新的目錄。

$ mkdir -p rainloop/{httpd,rainloop,postfix,dovecot}

內容解密:

  • mkdir -p rainloop/{httpd,rainloop,postfix,dovecot}:此命令會建立一個名為rainloop的目錄,並在其下建立四個子目錄,分別對應httpd、rainloop、postfix和dovecot四個服務。這種結構有助於組織和管理不同的服務。

設定RainLoop及其相關服務

在虛擬機器環境中,我們已經完成了RainLoop的安裝和基本設定,包括設定管理員密碼、組態郵件伺服器(Postfix和Dovecot)等。在Docker環境下,這些步驟將被轉化為對應的Dockerfile指令和容器組態。

設定Apache和PHP

首先,需要建立一個Dockerfile來安裝和組態Apache及PHP。以下是一個基本的範例:

FROM php:7.4-apache

# 安裝必要的擴充套件
RUN docker-php-ext-install mysqli pdo pdo_mysql

# 設定Apache
COPY apache-config.conf /etc/apache2/sites-available/000-default.conf

# 複製RainLoop檔案到指定目錄
COPY rainloop /var/www/html/

內容解密:

  • FROM php:7.4-apache:使用官方的PHP 7.4 Apache映像作為基礎映像。
  • RUN docker-php-ext-install mysqli pdo pdo_mysql:安裝MySQL相關的PHP擴充套件。
  • COPY apache-config.conf /etc/apache2/sites-available/000-default.conf:複製自定義的Apache組態檔案到容器中。
  • COPY rainloop /var/www/html/:將RainLoop的檔案複製到Apache的預設網頁目錄。

執行與測試

完成上述組態後,可以透過Docker Compose或其他工具來啟動和管理這些容器。確保所有服務都正確啟動後,透過瀏覽器存取RainLoop的網址,進行最終的測試和驗證。

透過Docker建置RainLoop郵件服務系統

在現代化的郵件服務架構中,RainLoop作為一個根據Web的郵件客戶端,提供了一個簡潔而功能豐富的介面供使用者存取郵件。本章節將探討如何利用Docker容器技術建置一個完整的RainLoop郵件服務系統,包括Apache、PHP、Postfix和Dovecot等關鍵服務元件。

容器化RainLoop郵件服務系統的架構

首先,我們需要在rainloop目錄下建立一個docker-compose.yml檔案,以定義整個郵件服務系統的多個容器服務。該檔案的內容如下:

version: '2.1'
services:
  httpd:
    build: ./httpd
    restart: always
    ports:
      - "80:80"
    container_name: httpd
    volumes:
      - 'rainloop:/var/www/html/rainloop'
  rainloop:
    build: ./rainloop
    restart: always
    container_name: rainloop
    volumes:
      - 'rainloop:/var/www/html/rainloop'
  postfix:
    restart: always
    hostname: docker.devops.lab
    build: ./postfix
    container_name: postfix
    ports:
      - "25:25"
    volumes:
      - 'mail:/var/mail'
      - 'home:/home'
      - 'postfix-certs:/etc/ssl'
  dovecot:
    restart: always
    hostname: docker.devops.lab
    depends_on:
      - postfix
    build: ./dovecot
    container_name: dovecot
    ports:
      - "143:143"
    volumes:
      - "mail:/var/mail"
      - "home:/home"
      - "dovecot-certs:/etc/dovecot/private"
volumes:
  mail:
  home:
  postfix-certs:
  dovecot-certs:
  rainloop:

內容解密:

docker-compose.yml檔案定義了四個主要服務:httpdrainlooppostfixdovecot。其中,httpd服務負責提供Web伺服器功能,而rainloop服務則是RainLoop郵件客戶端的容器化實作。postfixdovecot分別提供SMTP和IMAP郵件處理功能。這些服務之間透過共用卷(volumes)來實作資料的持久化和共用。

建置Apache與PHP的Dockerfile

為了支援RainLoop的運作,我們需要建置一個包含Apache和PHP的Docker映像。在rainloop/httpd目錄下建立一個Dockerfile,內容如下:

FROM ubuntu:22.04
ENV DOCKER_HOST 10.128.1.6
ENV MAIL_HOST docker.devops.lab
ENV DEBIAN_FRONTEND noninteractive
RUN apt update && apt install -y apache2 \
    php8.1 \
    libapache2-mod-php8.1 \
    php8.1-common \
    php8.1-curl \
    php8.1-xml \
    php8.1-mysql \
    php-date \
    php8.1-fpm \
    php8.1-json \
    php8.1-cli
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_RUN_DIR /var/www/html
WORKDIR /usr/src/app
COPY entry.sh .
CMD ["bash", "entry.sh"]

內容解密:

此Dockerfile首先根據Ubuntu 22.04映像,接著安裝Apache和PHP 8.1及其相關模組。然後設定Apache的執行使用者和群組,以及日誌和執行目錄。最後,將entry.sh指令碼複製到容器中,並設定為啟動命令。

設定Apache啟動指令碼

在相同的目錄下,建立一個名為entry.sh的檔案,內容如下:

#!/bin/bash
echo "${DOCKER_HOST} ${MAIL_HOST}" >> /etc/hosts
echo "${MAIL_HOST}" > /etc/hostname
exec /usr/sbin/apache2 -D FOREGROUND

內容解密:

此指令碼首先將Docker主機的IP和郵件主機名稱寫入/etc/hosts檔案,接著設定主機名稱。最後,以前景模式啟動Apache服務,以確保容器持續執行。

RainLoop服務的Dockerfile

rainloop/rainloop目錄下,建立一個Dockerfile來定義RainLoop服務,內容如下:

FROM ubuntu:22.04
RUN apt update && apt install -y wget unzip
RUN wget https://www.rainloop.net/repository/webmail/rainloop-community-latest.zip

內容解密:

此Dockerfile根據Ubuntu 22.04映像,並安裝了必要的工具如wgetunzip。接著,從RainLoop的官方網站下載最新的社群版RainLoop Webmail。