我最近在研究網路上有哪些免費雲端資源可以學習、使用。意外發現 Oracle Cloud 有提供永久免費的虛擬主機!😄之前一直不太願意開虛擬主機,就是擔心會造成每月一筆不小的金額負擔。現在有免費的,真是讓我手癢想來架什麼 servers。
所謂永久免費是指每個月會有一定的免費雲端資源使用額度,如果超過額度還是要被收費。所以思考後,我認為能架的 server 首先不能”太吸引人”😆,再來還要對自己頗具意義。很反直覺,為什麼不能”太吸引人”?因為要吸引人其實很容易達成,例如我只要架一台 VPN server 免費給大家作跳板,就能吸引一堆人來使用,但接著而來的問題是我的虛擬主機可能資源過載或被別人拿來作非法用途,這我就麻煩了。後來我想到可以架設部落格,這對我很有意義,也滿多人這麼作的。一方面也是展現自己架站的技術能力,另一方面可以用來記錄自己的學習歷程、以後還能回來查詢。
要架站除了虛擬主機,再來就是最好有一個好記的網址/網域。我查到 eu.org 可以免費申請網域!像我申請了 mrmyh.eu.org。但後來覺得不夠滿意,想要一更短又有代表性的網域,所以我在 http://tw 找到申請網域的方法,透過域名註冊商 (domain name registrar) – 中華電信取得 myh.tw 的付費網域。我目前只租了一年台幣800元,因為抱持著試著營運這個站的心態。如果一年下來覺得還不錯,就再續約。
取得網域後,再來就要設定 DNS servers 來管理它。幸好也有免費的 DNS servers – cloudflare.com 或 dnspod.com. 設定方法先是在 DNS server provider 的管理網頁登錄網域 (domain, 如 myh.tw),會顯示應設定的 DNS servers,把它們記下,並且新增一組 A record 將 hostname (如 www.myh.tw 或 myh.tw) 指向虛擬主機的 public IP。再到 domain name registrar 的管理網頁,填入前一步指定的 DNS servers。接著就是等個最多約72小時,應該就能在全球的 DNS servers 查到你的 hostname,例如可以下這指令:
nslookup myh.tw 8.8.8.8
另外提醒一點上述部驟若使用 cloudflare 一開始會無法登錄網域。請先用 dnspod 完成設定,並使用 nslookup 查詢一次,接著 cloudflare 就能登錄了。至於原因我不清楚😆
nslookup myh.tw a.dnspod.com
使用 Cloudflare 有個好處,它支援 CDN 與 DNS proxy。CDN + DNS proxy 可以隱藏你的虛擬主機 IP,避免被 DDoS 攻擊。Cloudflare DNS proxy 還提供 Cloudflare 與使用者之間的 SSL 連線,即使你的 web server 沒有使用 SSL。如果 web server 也要使用 SSL,也有免費的 Let’s Encrypt 可申請,官方建議使用 certbot 設定。
最後是一些架此站的設定:此站使用 Orcale Cloud 的虛擬主機,格規 Ampere ARM 4-OCPU, 24-GB RAM, 150 GB block storage。OS 是 Ubuntu Linux 20 arm64. 部落格使用 Docker Compose 啟動,使用以下設定檔案 wordpress.yml:
version: '3.1'
services:
nginx:
image: nginx
volumes:
- /etc/letsencrypt:/etc/letsencrypt
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./wordpress:/wordpress
ports:
- 80:80
- 443:443
wordpress:
image: arm64v8/wordpress
restart: always
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: user
WORDPRESS_DB_PASSWORD: password
WORDPRESS_DB_NAME: db
volumes:
- ./wordpress:/var/www/html
db:
image: mysql:8-oracle
restart: always
environment:
MYSQL_DATABASE: db
MYSQL_USER: user
MYSQL_PASSWORD: password
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- ./db:/var/lib/mysql
volumes:
wordpress:
db:
nginx.conf
events {
worker_connections 4096; ## Default: 1024
}
http {
server {
listen 443 ssl;
server_name myh.tw;
ssl_certificate /etc/letsencrypt/live/myh.tw/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/myh.tw/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://wordpress;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
location /.well-known {
root /wordpress/;
}
}
server {
listen 80;
listen [::]:80;
server_name myh.tw;
return 302 https://$server_name$request_uri;
}
}