Solution for Low Memory on Small Servers: Configuring Swap Space on AWS EC2

As a self-hosting enthusiast, I enjoy deploying various web services for personal use. On a single AWS EC2 instance, I’ve hosted multiple services including Nextcloud, WordPress, Postfix, Dovecot, MariaDB, and Nginx.

However, with only 1GB of RAM, I frequently encountered MariaDB database crashes due to “Out of Memory” (OOM) errors. To address this, setting up Swap Space is an effective solution to significantly reduce service interruptions. While using a hard drive for Swap may slightly decrease caching performance, the trade-off is well worth it for personal use—exchanging a bit of speed for continuous service availability.


Step 1: Prepare the Disk Volume in AWS Console

Before configuring the OS, you need to provide the physical storage:

  1. Go to the AWS EC2 Console.
  2. Create a new EBS Volume. I recommend setting the size to twice your RAM (e.g., 2GB for a 1GB instance).
  3. Attach this volume to your instance.

Step 2: Identify the New Partition

Connect to your server via SSH and use the following command to identify your new block device:

lsblk

In my case, nvme0n1 is the new partition designated for SWAP. You should see your newly added storage partition listed in the output.

Step 3: Format and Enable Swap

Once you have identified the device name, execute the following commands to format it as swap space and activate it:

# Format the partition as swap
sudo mkswap /dev/nvme0n1

# Enable the swap space
sudo swapon /dev/nvme0n1

Verification

To confirm it is working, run lsblk again. If you see [SWAP] under the MOUNTPOINTS column, it means the partition is successfully attached.

You can also use the top command to monitor the swap usage in real-time:

top

Step 4: Configure Persistent Mount (Auto-mount on Boot)

To ensure the swap remains active after a reboot, you must add it to the file system table (/etc/fstab). It is best practice to use the UUID for stability.

  1. Find the UUID of your swap partition:
    sudo blkid
    Locate your partition (e.g., /dev/nvme0n1) and copy the UUID string.

  2. Edit the fstab file:
    sudo nano /etc/fstab
  3. Add the following line at the end of the file:
    UUID="YOUR-UUID-HERE" none swap sw 0 0

    Note: Replace YOUR-UUID-HERE with your actual UUID. Be careful with this step, as errors in this file can cause boot issues.

  4. Press Ctrl + X, then Y, and Enter to save and exit.

Conclusion

By adding a simple 2GB swap partition, your small AWS instance can handle memory spikes much more gracefully. No more worrying about MariaDB crashing in the middle of the night!

小型伺器記憶體不足解決方案 –AWS EC2 伺服器設定swap交換空間

我自己喜歡架設各種網路服務供自己自娛自樂,在一台AWS EC2虛擬機上上架設了 Nextcloud, WordPress, Postfix, Dovecot, MariaDB, Nginx, 等等的服務。由於我的機器只有1GB的ram, 常常會碰到記憶體不足MariaDB資料庫崩潰的情況。這時如果設定好swap交換空間,就能大大降低服務中斷的情況。雖然使用硬碟當成swap會降低快取的效能,不過因為是自用,這點效能降低換取服務不中斷,還是很划算的!

首先,你要在EC2 頁面上新增個磁盤空間,大小就設定為記憶體的兩倍就好。像我就是設成2GB。 接下來請把這個新建好的空間掛載(attach)到你的伺服器上。這些設定都在EC2 的界面上就能操作完成,我就不多展示了。

這時用SSH連線進入你的純文字後台,輸入

lsblk

你就會看見你新增的磁區

NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS

nvme0n1     259:0    0    2G  0 disk
nvme1n1     259:1    0   15G  0 disk
└─nvme1n1p1 259:2    0   15G  0 part /

這是我的例子,其中nvme0n1就是我新增要用作SWAP的磁區。這時請輸入

sudo mkswap /dev/nvme0n1

其中nvme0n1請代換成你新增磁區的代號

然後再輸入

sudo swapon /dev/nvme0n1

如果這時你用 lsblk 看到

NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS

nvme0n1     259:0    0    2G  0 disk [SWAP]

在MOUNTPOINTS 有看到[SWAP] 就表示你已經將新增的磁區掛載上了。

此時你可以用 top 指令來看看是否swap有在運作

top

如果你看到下面這一行就代表成功了

MiB Swap:   2048.0 total,   2030.5 free,     17.5 used.    235.1 avail Mem

其中total 前面要顯示你新掛載磁區的大小才是正確的,掛載失敗total會顯示0

最後你要將開機就掛載設定好。

這時最好使用UUID 來掛載磁區,請用以下指令來查你剛掛上的磁區的UUID

sudo blkid

找到你剛掛上的磁區的UUID

接著請輸入

sudo nano /etc/fstab

並新增下面這一行

UUID=”YOURUUIDHERE” none swap sw 0 0

Ctrl + X 存檔。

這裡記得把雙引號中間的字串改成你自己的UUID,不然每次重開機都會出問題。

純IPv6伺服器如何與純IPv4伺服器建立連線

今年(2024)早些時候,Amazon AWS開始對所有的固定IP (IPv4)收費,一個月一個IP 要收$6,比我用的Amazon  Elastic Compute Cloud (EC2)都貴了。由於我只是架設私人使用的一些雲端服務,這筆費用能省就省。為了能完全擺脫IPv4,著實花了不少時間修改設定,包含DNS、強制EC2不獲取 public IPv4 (是的,就算是系統指派給你的外部IP,只要是public IPv4,都是要收費的…)等等,

但是其中最頭痛的當屬如何讓我的伺服器能與純IPv4的伺服器溝通。例如,wordpress的官網(wordpress.org)就只有IPv4,所以我的這個個人網站就無法連上wordpress官網進行更新了。在查了無數的資料後,我找到了一個解決方案:Public NAT64 service。這是一個由個人提供的DNS64 + NAT64服務。他的網站是

https://nat64.net

目前有一些大公司有提供DNS64服務,例如google,這服務能讓IPv6的伺服器能夠”找到/看到”純IPv4的伺服器。但是如果一個純IPv6的伺服器想與純IPv4的伺服器提供的服務建立連結,那就會需要NAT64。上面的網站提供了多個DNS64+NAT64 的服務位址,還是免費的!我試用了之後,發現不但Wordpress的更新正常了,這些DNS64+NAT64的名稱伺服器 (name server)也能用在一些對純IPv6伺服器不支援的服務上。例如Amazon Web Services (AWS) 提供的Amazon Simple Email Service (SES)。純IPv6的伺服器是無法與Amazon SES建立連結進而使用這項服務的。

以我自己的理解,DNS64服務可以幫助純IPv6伺服器查詢到純IPv4的位址 (一般DNS無法做到),NAT64則是能在得知這個IPv4位址後,與其建立連結,交換資訊。所以如果需要與只提供IPv4的伺服器建立連結 (例如瀏覽網頁),那這兩者缺一不可。如果想要了解更多信息,可以參考 https://docs.aws.amazon.com/zh_tw/vpc/latest/userguide/nat-gateway-nat64-dns64.html

下面我把我的操作流程分享給大家,我用的是AWS的Ubuntu,所以會以這個舉例,如果你用的是其他服務,可能會有差異,不過重點就是指定你的伺服器使用上面這網站提供的DNS64+NAT64的名稱伺服器。

為了取代ubuntu原本的DNS設定,你要先到 /etc/netplan裡

cd /etc/netplan

我沒有任何檔案在這資料夾中,所以我要新增一個檔案

sudo vi 99-custom-dns.yaml

在檔案中寫入下面的內容:

network:
    version: 2
    ethernets:
        eth0:
            nameservers:
              addresses: [2a01:4f8:c2c:123f::1, 2a00:1098:2c::1]
            dhcp4-overrides:
                    use-dns: false

這裡的eth0是你的網卡代號,如果你只有一張網卡,大概也是eth0,不過請照你的實際情況修改。我這裡只放了兩個名稱伺服器,你想要多放也是可以的。

接下來請執行下面的指令來把這些設定寫入並覆蓋原本的DNS設定。

sudo netplan generate

這時請重啟你的服務器來讓設定生效

sudo reboot

這時可以用下面指令來查看設定是否生效,一樣記得把eth0改成你的網卡的代號

sudo resolvectl status eth0

如果你能找到像下面這樣的描述,就是成功了

Current DNS Server: 2a01:4f8:c2c:123f::1

最後要感謝一下網路上這些願意免費提供服務的好心人!

參考資料:

https://nat64.net

https://docs.aws.amazon.com/zh_tw/vpc/latest/userguide/nat-gateway-nat64-dns64.html

https://repost.aws/knowledge-center/ec2-static-dns-ubuntu-debian

利用免費的Google Cloud來建立私有雲(三)

更新:今天google 寄了一封信給用戶,從明年一月起,固定ip 要開始收費了。每個小時是0.004,這樣算起來就完全不划算了。我晚點會寫一篇教學文,教如何用 no-ip的服務來避免使用固定ip。

這是本系列的最後一篇文章,前面兩篇文章我整理了如何申請免費的Google Cloud伺服器,並用SSH連線進去。還有如何使用Snap來安裝Nextcloud。這篇文章要說的是如何讓自己的Nextcloud利用HTTPS安全連線來保護自己的服務和備份系統。用Snap安裝的Nexcloud要用HTTPS連線設定上非常簡單,只要先輸入下面這行指令確定Nextcloud服務是開啟的:

sudo snap start nextcloud

然後再輸入下面這行:

sudo nextcloud.enable-https lets-encrypt

系統會要求你輸入你的信箱做為日後出問題時的連絡方式,還有你想要設定HTTPS連線的網址。然後,就沒有然後了!這樣就設定完畢!現在你可以試試用https://開頭來連到你自己專屬的雲端硬碟了!

除了連線時的安全,你的資料的安全也很重要,誰都難保每一次系統更新都是順利的,也難保你哪天新血來潮想安裝什麼新軟體或服務,結果把電腦搞掛了。所以定期備份你的系統和資料也是很重要的。這點Google Cloud 也有很好的解決方案。在Computer Engine服務下,有一個快照的選項,裡面你可以建立快照排程,地區請選你的伺服器所在的地區,我建議快照位置選區域就夠了,如果你希望你的伺服器所在地區突然整個掛點的情況,你可以在其他區域馬上恢復你的服務,才選擇多地區,我想以自用來說,區域備份已經夠了。排程頻率要看你對還原的要求有多高,我自己是每天備份,並只留三天的備份。由於Google Cloud 的快照是差異備份,所以如果你的資料變動不大,每次備份的大小其實不會太大。另外要提醒的是,快照只有頭5 GB 是免費的,所以這部份是(幾乎)一定會被收取一些費用的,超過免費額度後每GB是美金0.026。所以如果你追求完全免費,大可以不做任何備份。

希望這系列的文章可以幫到一些人,如果有任何問題也歡迎跟我交流!

利用免費的Google Cloud來建立私有雲(二)

雖然不是必備,不過如果希望自己架設的私有雲可以比較安全,且透過一個網址被訪問,那一個網域名稱就很重要了!我自己是每年花$10美金買了一個網址,因為我有架設eMail server,這個需要許多進階的DNS服務,如果只是要架私有雲,那先找一個免費的網域名稱就可以了!我在電腦王阿達的網站上找到一個免費的選擇,大家可以參考一下,這種免費的通常限制都很多,可是如果只是私有雲的話,應該不會碰到什麼問題。有了網址,就可以將這個網址設定指向之前申請的固定IP,之後Nextcloud 的設定都可以使用你申請的網址。

有了網址以後,接下來就是要安裝Nextcloud了。這裡我建議直接用Nextcloud官方的snap 一鍵安裝。簡單到你的下巴會掉下來。

這個教學是按照這個網頁安裝的,請先修改下面兩個檔案,把電腦的hostname 設定好:

vim /etc/hosts

在這個檔案最前面加一行

123.123.123.123 your.domain.name  

請把數字的部份改成你自己的固定ip,your.domain. name改成你申請的domain name。接下來修改hostname這個檔案:

vim /etc/hostname

在最上面加上你的domain name。

執行下面這個指令來刷新hostname

hostname -F /etc/hostname

做完上面的動作,然後輸入下面三行指令:

sudo apt-get update
sudo apt install snapd
sudo snap install nextcloud

大功告成!現在你可以用你申請的網域名稱從瀏覽器進到你剛架好的Nextcloud 了。到這你可以開始設定你的root帳號,並且開始使用你的個人雲,Nextcloud幾乎在所有平台都有同步軟體,你可以像使用Dropbox一樣的使用它!用snap 安裝Nextcloud還有一個好處,每個服務都是由snap 直接控制,所以如果你要暫停或重新開始Nextcloud的服務,只需要用下面的命令:

sudo snap stop nextcloud #暫停
sudo snap start nextcloud # 開始

如果你想要更新Nextcloud到新的版本,也推薦使用snap 指令

sudo snap refresh nextcloud

但是!目前你架好的這個Nexcloud是用不安全的http連線,我建議要裝上certbot這個免費的https 加密服務來保護你的帳號密碼, 另外你還應該要讓系統每天自動幫你備份整個硬碟,以防你不小心把系統玩壞了,或是主硬碟無預警掛點。我會在下一篇文章教學這個部 份。

利用免費的Google Cloud來建立私有雲(一)

Google Cloud Platform 是與Amazon AWS相似的雲端虛擬伺服器的服務,相較於Amazon AWS是給予第一年免費運行一個小型伺服器(t2.micro: 0.5 vCPU, 1 GiB RAM)與30GB SSD硬碟的試用,Google cloud Platform則提供了一個微型伺服器(0.2 vCPU, 0.6 GiB RAM)與30GB 傳統硬碟永久免費。Google 還額外提供了第一年300美金的試用額度。相比之下Google的免費服務是比Amazon大方的。如果以建立個人私有雲的角度來說,Google的免費服務已經可以滿足大部份人的需要。有鑑於Dropbox限縮了免費使用者只能同步兩台裝置,我想是時候考慮自己弄一個個人雲了!

我最近將我的Nextcloud個人雲從Amazon AWS 轉到了Google Cloud Platform,參考了很多資料,下面我就整理一下,照著做可以少走些岔路。

由於Google Cloud Platform 在很多區域都有服務,所以第一件事情要注意的就是免費的服務只在下面幾個區域有:

  • 奧勒岡州:us-west1
  • 愛荷華州:us-central1
  • 南卡羅來納州:us-east1

你可能會發現所有的免費服務都在美國,所以如果你人在台灣的話,會有比較高的延遲。對於私有雲來說,延遲影響很小,所以關係不大。不過還是選比較靠近亞洲的奧勒岡州吧!詳細的永久免費方案請參考官網,中文的!

架設個人雲的第一步就是開一個新的 f1-micro VM 執行個體 ,並且將如何安全的透過SSH登入這個服務設定完成。請參考下面這些網頁,我照著做沒有碰到問題,記得用滿免費的30GB 空間!:

  1. 如何建立google cloud 服務
  2. 如何建立及登入執行個體

這裡我要提醒一下,由於第一年有免費300美金的試用額度,所以如果真的產生什麼費用,會先從這邊扣,在這一年內你可以觀察一下有沒有什麼服務持續向你收費的(這時只會扣你的免費額度)。我最常見到的狀況是Google Cloud Platform 幫你建立了一個系統的映像檔 ,而這個映像檔通常跟你建立的執行個體用到的硬碟空間一樣大(30GB),所以就一直收費了。建議到 Computer Engine –> 映像檔 找一下有沒有建立者是你自己的映像檔,刪掉就不會再產生費用了。另一個就是建議申請一個固定的IP 位址,這樣每次重開機就不會被強迫換IP了!申請的方法是點一下執行個體的名稱進入執行個體詳細資料頁面,點選你的網路介面的超連結,裡面就可以指定永久固定IP了。另外就是在使用個人雲的時候,流量產生的費用也可能會超過免費額度,不過除非你一天到晚從你的服務器下載東西,不然這個部份產生的費用幾乎可以不計。這篇文章的目的是取代免費的Dropbox,如果你是重度使用者(需要超過25GB使用空間),那我建議你選擇如Google Drive、Dropbox等產品。如果你充份的利用到所有你購買的空間,那這些網路硬碟產品比你自架服務器還便宜!

有了自己的伺服器,可以自己弄很多不同的服務,我自己就架設了eMail、Nextcloud、Wordpress、Full-Text RSS、Kindle-reader 等等。這些服務其實都可以找到免費或付費的替代品,可是有自己專屬的服務感覺還是滿好。這些服務中,eMail是最難搞的,除非你對郵件被Google看光光很不爽,不然不建議自己弄。Nextcloud個人雲是我覺得最值得自己架設的。當然如果你有Google 提供給學校的超大Google Cloud空間,那你就不會像我有動力自架個人雲了!

用Google Cloud搭建免費30GB Nexcloud個人雲

現在google cloud 開放北美(維吉尼亞州除外)最低階VM (f1-micro) 執行個體永久免費,加上30GB傳統硬碟也是永久免費,所以可以使用這個服務來搭建自己的個人雲
頭一年使用還有三百美金的額度供你使用,可以多多測試一下進階的服務。
要注意的是流量(流出才收費)只有頭1GB是免費的,另外如果CPU 負載過高,系統會自動幫你提速,提速的部份也不是免費的。
由於頭一年有300美金,所以可以用第一年來評估這些額外費用是否划算!

具體搭建方法網路上有很多
Google cloud申請很簡單 可以參考下面的網頁http://kuanzi9487.blogspot.com/2017/09/gcpgoogle-cloud-platformserverserver.html

Nextcloud的安裝可以參考下面這個
Install NextCloud On Ubuntu 16.04 LTS With Nginx, MariaDB, PHP 7.1 And Let’s Encrypt SSL/TLS

推廣 letsencrypt

最近在找免費ssl 憑證的時候,發現了下面這篇文章:

NGINX 使用 Let’s Encrypt 免費 SSL 憑證設定 HTTPS 安全加密網頁教學

試用後決定來推廣一下。這個免費憑證是由 Electronic Frontier Foundation這個機構發出的。如果英文還可以的,EFF 的官方網站推薦使用certbot這個程式來自動更新憑證,也可以去這個網站看看,裡面有不同Linux發行版的教學。

而nginx 1.9.5以上版本,有針對http/2(通過SSL)加速,就更顯出ssl 安全連結的優勢了。

如果你的linux發行版還沒有把nginx套件升級到1.9.5以上,可以按照這個教學來升級nginx。