為了省錢,也為了收拾當初「快快做完」留下的技術債,本人決定把 Django 網站從 AWS 搬到 Linode,展開一場血淚交織的搬家大作戰。從精打細算挑主機、系統安裝、權限設置,到 Nginx + Gunicorn 部署,每一步都充滿工程師的無奈與小插曲。這不只是省錢筆記,更是技術債清償現場實錄!
身為一個工程師,最怕的不是寫 code,而是寫 code 時間不夠。之前幫忙寫的那個網站,硬是在不到一個月內趕出來,架構自然是「能跑就好」的等級。最近想說要來個大改版,順便把網站從 AWS 搬到 Linode,畢竟 Linode 一個月 5 美金的方案,對於小站來說實在太香,省錢又不失格調。這篇就來記錄一下我在 Linode 上用 Nginx + Django 快速架站的過程,順便吐槽一下踩過的坑。
apt update && apt upgrade -y
adduser django_user
usermod -aG sudo django_user
這樣 Django 跑起來比較安心,權限也比較好控。
apt install python3 python3-pip python3-venv nginx -y
apt-get install python3-dev default-libmysqlclient-dev build-essential pkg-config -y
因為專案用 MySQL,記得把相關 dev 套件也裝一裝。
ufw allow OpenSSH
ufw allow 'Nginx Full'
ufw enable
這裡有個小插曲:如果還沒裝 nginx 就先下 ufw allow 'Nginx Full'
,會跳錯誤!記得順序要對,先裝 nginx 再開防火牆規則。
/var/www/django_project
,用 git 拉下 code。su - django_user
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
.env
(用 django-environ)。python manage.py collectstatic --noinput
建立 /etc/systemd/system/gunicorn.service
,內容大致如下(記得改成自己的專案路徑與名稱):
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=django_user
Group=www-data
WorkingDirectory=/var/www/django_project
ExecStart=/var/www/django_project/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/var/www/django_project/django_project.sock project_name.wsgi:application
[Install]
WantedBy=multi-user.target
啟動並設為開機自動啟動:
systemctl start gunicorn
systemctl enable gunicorn
如果有改內容,記得:
systemctl daemon-reload
systemctl restart gunicorn
建立 /etc/nginx/sites-available/django_project
,內容如下:
server {
listen 80;
server_name your_domain.com www.your_domain.com;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /var/www/django_project;
}
location /media/ {
root /var/www/django_project;
}
location / {
include proxy_params;
proxy_pass http://unix:/var/www/django_project/django_project.sock;
}
}
啟用設定並重啟 nginx:
ln -s /etc/nginx/sites-available/django_project /etc/nginx/sites-enabled/
nginx -t
systemctl restart nginx
which gunicorn
確認路徑。django_user
對專案資料夾有權限。sudo systemctl status gunicorn
或 journalctl -u gunicorn
,錯誤訊息都藏在這。OpenSSH
就啟用 UFW,恭喜你直接鎖自己在門外。ufw allow 'Nginx Full'
要在 nginx 裝好後再下,不然會找不到 profile。Linode 5 美金方案真的佛,對小型 Django 專案來說完全夠用。整體流程其實不難,就是每個步驟都要小心,尤其是權限跟防火牆順序。這次搬家順便重構,感覺網站呼吸都順暢了不少。最後,還是那句老話——能跑不代表能長久,該重構就別拖,省錢又省心!
「工程師的日常,就是在各種小坑裡練就一身絕技。」