基本的 Armbian 系統和 WordPress 架設完畢後,下一步要架設 nginx 處理對外的 https 連線。
因為我們的目標是零元架設,所以採用免費的 ssl 簽證,效期只有三個月,需要額外使用 cronjob trigger script 來自動更換簽證。
此外,防火牆也是很重要的設定,我們使用 ufw 來設定連入規則,避免 ssh 被不肖人士暴力嘗試。那就讓我們開始吧!
安裝 nginx
使用此指令安裝
sudo apt install nginx
直接在瀏覽器輸入 banana pi 的 ip,如果安裝成功,會出現預設的 nginx 畫面。
在 /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>。此時就可以正常使用剛綁定好的網域連入。
設定自動 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。
最後我們建立一個 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 速度優化
封面圖片備註:一定要建立好防火牆,避免伺服器被駭客入侵,變成殭屍