firewall

基本的 Armbian 系統和 WordPress 架設完畢後,下一步要架設 nginx 處理對外的 https 連線。

因為我們的目標是零元架設,所以採用免費的 ssl 簽證,效期只有三個月,需要額外使用 cronjob trigger script 來自動更換簽證。

此外,防火牆也是很重要的設定,我們使用 ufw 來設定連入規則,避免 ssh 被不肖人士暴力嘗試。那就讓我們開始吧!

安裝 nginx

使用此指令安裝

sudo apt install nginx

直接在瀏覽器輸入 banana pi 的 ip,如果安裝成功,會出現預設的 nginx 畫面。

0元用 Raspberry pi 架設自己的 WordPress 網站 #2 nginx ssl ufw

在 /etc/nginx/site-enabled 下移除掉檔案 default ,另外建立以下的 nginx config 來測試連線到 wordpress container。

upstream bananapi_server {
    server 127.0.0.1:9100;
}

server {
    listen 80;
    # 修改這裡
    server_name <your domain name>

    client_max_body_size 4G;
	
    # add this line to make nginx pass undersocres headers
    underscores_in_headers on;

    server_tokens off;
	
    access_log off;
    error_log off;
    
    # gzip setting
    gzip on;
    gzip_disable "msie6";
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_min_length 256;
    gzip_types text/plain text/css application/json   application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon;
    
    # expires header
    expires	7d;

    # redirect wp
    # 修改這裡
    location /wp-content/ {
        alias  <your wp-content folder path>;
    }
    
    # 修改這裡
    location /wp-includes/ {
        alias  <your wp-includes folder path>;;
    }

	
    location / {
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_redirect off;
        proxy_pass http://bananapi_server;
    }
    
}

重起 nginx 看看能不能用 80 port 連入 wordpress

sudo service nginx restart

確認沒問題後,就可以到 godaddy 把網域的 A record 指向 banana pi。

網域輸入到瀏覽器,發現被自動轉址,仔細觀察會是第一次啟用 wordpress 的網址(比如說 192.168.1.100:9100)。因為 wordpress 自動把第一次連入的網域儲存起來並設定為預設,如果連入的網域不一樣,就會自動轉址。所以我們先用 192.168.1.100:9100 連入,到 dashboard > setting > general 中修改 WordPress Address 和 Site Address 為 http://<your_domain_name>。此時就可以正常使用剛綁定好的網域連入。

wordpress 設定畫面
這邊以 koding.work 的網域為例

設定自動 renew ssl script

使用以下指令安裝

sudo apt-get install -y python3-openssl python3-crypto python3-setuptools
sudo pip3 install acme-nginx

安裝完畢,執行並建立第一份 ssl 簽證

sudo acme-nginx \
       -d <your_domain> \
       -d <your_sub_domain> \
       --private-key <private_key_file_output_path> \
       --domain-private-key <domain_private_key_file_output_path> \
       --output <crt_file_output_path>

稍等一下就會在給定的路徑看到三個檔案,再修改剛剛的 nginx conifig,讓它可以啟動 https。

...

server {
    # listen 80;    不聽 80 了
    listen 443 ssl;
    listen [::]:443 ssl;
	
    # 給定 ssl key file path
    ssl_certificate <your_crt_file_path>;
    ssl_certificate_key <your_key_file_path>;
    
    # 加這一行強轉 https
    if ($ssl_protocol = "") {
        rewrite ^/(.*) https://$server_name$request_uri redirect;
    }

...

# 另外增加聽 80 並讓它 301 轉 443
server {
    listen 80;
    server_name <your_domain_name>;
    return 301 https://<your_domain_name>$request_uri;
}

下指令讓 nginx reload configure

sudo service nginx reload

再用瀏覽器試試看,設定正確就會自動轉 https 了!記得再到 wordpress 的設定頁面,把 WordPress Address 和 Site Address 的開頭改為 https。

wordpress 設定畫面
這邊以 koding.work 的網域為例

最後我們建立一個 bash script,並設定 cronjob 定期呼叫。

nano renew-ssl.sh
#!/bin/bash

# 其實和第一次輸入的指令一模一樣
sudo acme-nginx \
       -d <your_domain> \
       -d <your_sub_domain>  \
       --private-key <private_key_file_output_path> \
       --domain-private-key <domain_private_key_file_output_path> \
       --output <crt_file_output_path>

增加執行權限

chmod +x renew-ssl.sh

然後執行看看

./renew-ssl.sh

它會自動再產生一次新的 ssl 簽證並覆蓋舊的,以及 reload nginx 載入最新的簽證檔!

我們將它加入 cronjob

crontab -e

在最後補上這一行

// 0 0 1 * * <renew-ssl.sh 的絕對路徑>
0 0 1 * * /home/user/renew-ssl.sh

記得帳號要能免密碼 sudo,不然 cronjob 會無法正常執行!這樣就完成自動化更換 ssl 簽證!

安裝 ufw 防火牆

sudo apt install ufw

一一自行加入所需要的規則。這邊從基本的 80, 443, 22 下去做示範

sudo ufw allow 80
sudo ufw allow 443

sudo ufw allow from xxx.xxx.xxx.xxx/32 to any port 22       # 讓外網特定 ip 可以連 ssh
sudo ufw allow from 192.168.xxx.xxx/24 to any port 22      # 讓內網可以連 ssh

sudo ufw default deny incoming   # 預設阻擋所有連入 (前面設定的規則會優先)
sudo ufw default allow outgoing   # 預設開放所有連出

最後啟動 ufw 即可!

sudo ufw enable

總算搞定基礎設施!不過實測發現因為 banana pi m1 的 SoC 實在太弱,網站反應速度非常慢,開一篇文章竟然要等三秒多!實在無法忍受!下一篇我們就來討論如何優化加速它!

延伸閱讀:
0元用 Raspberry pi 架設自己的 WordPress 網站 #1 Armbian Docker
0元用 Raspberry pi 架設自己的 WordPress 網站 #3 速度優化

封面圖片備註:一定要建立好防火牆,避免伺服器被駭客入侵,變成殭屍

Written by J
雖然大學唸的是生物,但持著興趣與熱情自學,畢業後轉戰硬體工程師,與宅宅工程師們一起過著沒日沒夜的生活,做著台灣最薄的 intel 筆電,要與 macbook air 比拼。 離開後,憑著一股傻勁與朋友創業,再度轉戰軟體工程師,一手扛起前後端、雙平台 app 開發,過程中雖跌跌撞撞,卻也累計不少經驗。 可惜不是那 1% 的成功人士,於是加入其他成功人士的新創公司,專職開發後端。沒想到卻在採前人坑的過程中,拓寬了眼界,得到了深層的領悟。