Linode 上用 Nginx + Django 快速架站小記

為了省錢,也為了收拾當初「快快做完」留下的技術債,本人決定把 Django 網站從 AWS 搬到 Linode,展開一場血淚交織的搬家大作戰。從精打細算挑主機、系統安裝、權限設置,到 Nginx + Gunicorn 部署,每一步都充滿工程師的無奈與小插曲。這不只是省錢筆記,更是技術債清償現場實錄!

Web Develop Linode

Linode 上用 Nginx + Django 快速架站小記:從 AWS 省錢大作戰到 Ubuntu 24.04 部署全記錄

為什麼會寫這篇?

身為一個工程師,最怕的不是寫 code,而是寫 code 時間不夠。之前幫忙寫的那個網站,硬是在不到一個月內趕出來,架構自然是「能跑就好」的等級。最近想說要來個大改版,順便把網站從 AWS 搬到 Linode,畢竟 Linode 一個月 5 美金的方案,對於小站來說實在太香,省錢又不失格調。這篇就來記錄一下我在 Linode 上用 Nginx + Django 快速架站的過程,順便吐槽一下踩過的坑。


主要流程與細節

1. Linode 建立新雲端空間

  • 選擇 Ubuntu 24.04 LTS,Shared CPU Nanode 1 GB,月費 5 美金,省錢首選。
  • 直接 SSH 進去,第一步當然是先更新系統:
apt update && apt upgrade -y

2. 建立 Django 專用用戶

adduser django_user
usermod -aG sudo django_user

這樣 Django 跑起來比較安心,權限也比較好控。

3. 安裝必要套件

apt install python3 python3-pip python3-venv nginx -y
apt-get install python3-dev default-libmysqlclient-dev build-essential pkg-config -y

因為專案用 MySQL,記得把相關 dev 套件也裝一裝。

4. 設定防火牆(UFW)

ufw allow OpenSSH
ufw allow 'Nginx Full'
ufw enable

這裡有個小插曲:如果還沒裝 nginx 就先下 ufw allow 'Nginx Full',會跳錯誤!記得順序要對,先裝 nginx 再開防火牆規則。

5. 拉下專案、建立虛擬環境

  • 切到 /var/www/django_project,用 git 拉下 code。
  • 切換到 django_user:
su - django_user
  • 建立虛擬環境並啟用:
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
  • 設定 .env(用 django-environ)。

6. 處理靜態檔案

python manage.py collectstatic --noinput

Nginx + Gunicorn 設定

7. Gunicorn 服務檔案

建立 /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

8. Nginx 設定

建立 /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

反轉小插曲:那些年遇到的坑

  • Gunicorn 服務啟動失敗?
    • 路徑錯誤:用 which gunicorn 確認路徑。
    • 權限問題:確認 django_user 對專案資料夾有權限。
    • 看 log:sudo systemctl status gunicornjournalctl -u gunicorn,錯誤訊息都藏在這。
  • UFW 防火牆順序問題
    • 沒有先開 OpenSSH 就啟用 UFW,恭喜你直接鎖自己在門外。
    • ufw allow 'Nginx Full' 要在 nginx 裝好後再下,不然會找不到 profile。

結論

Linode 5 美金方案真的佛,對小型 Django 專案來說完全夠用。整體流程其實不難,就是每個步驟都要小心,尤其是權限跟防火牆順序。這次搬家順便重構,感覺網站呼吸都順暢了不少。最後,還是那句老話——能跑不代表能長久,該重構就別拖,省錢又省心!


「工程師的日常,就是在各種小坑裡練就一身絕技。」