因為我們在同一台 EC2 上同時運行 Web 與 Mail 服務,這章的重點在於讓兩者和平共處。
1. DNS 設定 (A 與 MX)
請確保您的 DNS 紀錄包含以下兩者,並指向同一個 EC2 IP:
| 類型 | 名稱 | 值 | 用途 |
| A | @ (mydomain.com) | YourIP | 給網站用 (Web) |
| A | Your IP | 給郵件主機用 (Hostname) | |
| MX | @ | mail.mydomain.com | 指定郵件由 mail 子網域負責 |
2. 設定系統 Hostname
我們將系統名稱設為 mail,以利 Postfix 識別。
sudo hostnamectl set-hostname mail.mydomain.com
編輯 /etc/hosts,在 127.0.0.1 localhost 下一行加入:
127.0.0.1 mail.mydomain.com mail
系統的hostname對於Mail server很重要,這會在後面設定Postfix的時候解釋,現在請直接照著設定。這個設定並不會影響任何其他正在運作的服務(如Nginx/Apache、DNS 等等),請安心修改。
3. 透過免費的Let’s Encrypt申請 SSL 憑證 (Webroot 模式)
因為您的 Nginx/Apache 正在佔用 Port 80,我們使用 Webroot 模式。這會請求 Web Server 幫忙驗證,而不需要暫停網站服務。
假設您的 Web Server 根目錄在 /var/www/html (請根據實際情況調整):
# 安裝 certbot
sudo apt update
sudo apt install certbot -y
# 申請憑證 (注意:這裡是申請 mail 子網域的證書)
sudo certbot certonly --webroot -w /var/www/html -d mail.mydomain.com
注意:如果您的網站已經有 SSL 了(例如
www.mydomain.com),這次申請是為了給 Mail Server 用的,所以我們特地申請mail.mydomain.com。這兩個證書是分開的,互不影響。
如果申請成功,你會看到 Congratulations! 的訊息,並且憑證會存放在:
- 公鑰 (Certificate):
/etc/letsencrypt/live/mail.mydomain.com/fullchain.pem - 私鑰 (Private Key):
/etc/letsencrypt/live/mail.mydomain.com/privkey.pem
記下這兩個路徑,我們在設定 Postfix 和 Dovecot 時會頻繁用到它們。
4. 安裝與初始化 MariaDB
最後,我們來建立儲存帳號密碼的資料庫。
安裝 MariaDB:
sudo apt install mariadb-server -y
sudo systemctl start mariadb
sudo systemctl enable mariadb
執行安全設定(設定 root 密碼):
sudo mysql_secure_installation
5. 建立郵件資料庫結構
我們不使用 Linux 系統帳號,而是用資料庫來管理「虛擬使用者」。 登入 SQL:
sudo mysql -u root -p
請依序輸入以下 SQL 指令(記得將 password 換成你自訂的強密碼):
-- 1. 建立資料庫
CREATE DATABASE mailserver;
-- 2. 建立郵件系統專用使用者 (mailuser)
CREATE USER 'mailserver'@'127.0.0.1' IDENTIFIED BY 'passwordyouchoose';
-- 3. 賦予查詢權限 (只給 SELECT,安全性更高)
GRANT SELECT ON mailserver.* TO 'mailserver'@'localhost';
FLUSH PRIVILEGES;
-- 4. 進入資料庫
USE servermail;
-- 5. 建立網域表 (Virtual Domains)
CREATE TABLE `virtual_domains` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 6. 建立使用者表 (Virtual Users)
CREATE TABLE `virtual_users` (
`id` int(11) NOT NULL auto_increment,
`domain_id` int(11) NOT NULL,
`password` varchar(150) NOT NULL,
`email` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 7. 建立別名表 (Virtual Aliases)
CREATE TABLE `virtual_aliases` (
`id` int(11) NOT NULL auto_increment,
`domain_id` int(11) NOT NULL,
`source` varchar(100) NOT NULL,
`destination` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
為了方便之後測試,我們先寫入一筆假資料(請換成你的網域):
-- 假設你的網域是 mydomain.com,密碼暫時用明碼 '123456'
INSERT INTO virtual_domains (id, name) VALUES (1, 'mydomain.com');
INSERT INTO virtual_users (id, domain_id, password, email) VALUES (1, 1,'123456','user@example.com');
輸入 exit 離開。
這樣一來,我們的基礎建設 (Infrastructure) 就全部完成了! 我們現在有了:
- 正確的地址 (DNS & Hostname)
- 安全的加密憑證 (SSL)
- 儲存使用者的倉庫 (MariaDB)