前言
目前這個部落格是放在東京 Linode 主機上,最近遇到的問題是 nginx 每天都會自動死掉,每天都得要 ssh 進去 restart nginx service,實在有夠麻煩。再加上我有用 Let’s Encrypt,每 90 天都要更新憑證。乾脆一不做二不休的把 web server 換成會自動更新憑證的 caddy,以下這篇記錄轉換的過程。
安裝 caddy
以下參考這份文件
安裝 caddy 很簡單,直接在 shell 下執行:
curl -s https://getcaddy.com | bash -s personal
使用 personal license 來安裝 caddy
然後建立必要的目錄
sudo mkdir /etc/caddy && sudo chown -R root:www-data /etc/caddy
建立空白的 caddy 設定檔
sudo touch /etc/caddy/Caddyfile
建立給 caddy 使用的 ssl 目錄
sudo mkdir /etc/ssl/caddy
sudo chown -R www-data:root /etc/ssl/caddy
sudo chmod 0770 /etc/ssl/caddy
安裝 Caddy 系統服務
從官方 repository 下載 caddy.service
sudo curl -s https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-systemd/caddy.service -o /etc/systemd/system/caddy.service
讓 systemd 發現新下載的 caddy.service
sudo systemctl daemon-reload
Enable caddy.service
sudo systemctl enable caddy.service
(Optional) 檢查 Caddy 是否有正確運作
建立 /var/www/index.html
echo '<h1>Hello World!</h1>' | sudo tee /var/www/index.html
編輯 /etc/caddy/Caddyfile 設定檔
http:// {
root /var/www
gzip
}
然後啟動 Caddy server
sudo systemctl start caddy
設定 gunicorn
之前用 nginx 當作 web server 的時候,是搭配 uwsgi 來把 request 傳到 django 內。而 Caddy 雖然有 plugin 可以支援 uwsgi,但是需要自己編 Caddy,所以在這裡我改用 gunicorn。
安裝 gunicorn 和 runit
sudo apt install -y runit
sudo -H pip install gunicorn
sudo service runit start
設定 runit,${project_name} 為您的專案名稱
mkdir /etc/sv/${product_name}/
touch /etc/sv/${project_name}/run
chmod u+x /etc/sv/${project_name}/run
vim /etc/sv/${project_name}/run
編輯 /etc/sv/${project_name}/run
#!/bin/sh
# gunicorn 執行檔位置
GUNICORN=/usr/local/bin/gunicorn
# Django 專案位置
ROOT=/var/www/my_django_project
# 執行時的 pid 位置
PID=/tmp/my_django_project.pid
# Django 專案的 wsgi.py 位置
APP=my_django_project.wsgi
if [ -f $PID ]; then rm $PID; fi
cd $ROOT
exec $GUNICORN -c $ROOT/gunicorn.conf.py --pid=$PID $APP --group www-data
再來設定 django 專案,在專案根目錄中新增 gunicorn.conf.py,內容如下
# 用本機的 8000 port
bind = "127.0.0.1:8000"
# gunicorn 的 pid file,和前面 runit 設定檔內相同
pidfile = "/tmp/my_django_project.pid"
# 設定要用幾個 worker 來執行
workers = 1
timeout = 90
再來讓 runit 把 gunicorn 跑起來
ln -s /etc/sv/${project_name} /etc/service/${project_name}
如果到這邊都有做對,當你建立好 symbolic link 後執行 ps -aux | grep gunicorn,就會看到 gunicorn 的 process 跑起來了
設定 Caddy
最後設定 Caddy 把 request 丟給 gunicorn 處理,編輯 /etc/caddy/Caddyfile,加上
my_django_project.fykuan.tw {
root /var/www/my_django_project
proxy / 127.0.0.1:8000 {
transparent
except /static
}
tls ${your_email_address}
}
然後重新啟動 Caddy
sudo service caddy restart
就可以用瀏覽器打開 https://my_django_project.fykuan.tw 試試看了