在建置網站服務時,正確組態 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)、日誌路徑等引數。這些引數定義了網站的各項規則。
內容解密:
<VirtualHost *:80>:定義了一個虛擬主機,監聽所有網路介面的80埠。ServerName web.devops.lab:指定了這個虛擬主機對應的網域名稱。DocumentRoot /var/www/html:設定了網站檔案的根目錄。ErrorLog和CustomLog:定義了錯誤日誌和存取日誌的位置。
建立和啟用第二個網站
要建立第二個網站,需要在/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>
內容解密:
ServerName myserver.devops.lab:指定了第二個網站的網域名稱。DocumentRoot /var/www/myserver:設定了第二個網站的根目錄。- 使用預設的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.lab和http://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檔案定義了四個主要服務:httpd、rainloop、postfix和dovecot。其中,httpd服務負責提供Web伺服器功能,而rainloop服務則是RainLoop郵件客戶端的容器化實作。postfix和dovecot分別提供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映像,並安裝了必要的工具如wget和unzip。接著,從RainLoop的官方網站下載最新的社群版RainLoop Webmail。