サーバの構築

サーバの構築手順

Djangoを利用したWebサーバの構築 (nginx)

プロジェクトの作成 (Windows用)

バッチファイル (.bat)
@echo off
if "%1" == "" (
    set /p projectName="プロジェクト名を入力 : "
) else (
    set projectName=%1
)
django-admin startproject %projectName%
echo 作成完了
pause > nul

アプリの設定

ターミナル
cd [Project Name]

バッチファイル (.bat)
@echo off

if "%1" == "" (
    goto help

) else if "%~1" == "/?" (
    goto help

) else if "%~1" == "-help" (
    goto help

) else if "%~1" == "-app" (
    if "%2" == "" (
        echo アプリ作成
        set /p appName="アプリ名 : "
    ) else (
        set appName=%2
    )
    setlocal enabledelayedexpansion
    python manage.py startapp !appName!
    echo 完了しました
    pause > nul
    exit /b

) else if "%~1" == "-mig" (
    if "%2" == "" (
        echo マイグレーション
        set /p appName="アプリ名 : "
    ) else (
        set appName=%2
    )
    setlocal enabledelayedexpansion
    python manage.py makemigrations !appName!
    python manage.py migrate
    echo 完了しました
    pause > nul
    exit /b

) else if "%~1" == "-run" (
    python manage.py runserver
    pause>nul
    exit /b

) else if "%~1" == "-col" (
    python manage.py collectstatic
    pause>nul
    exit /b

) else if "%~1" == "--create-admin" (
    python manage.py createsuperuser
    pause>nul
    exit /b

) else (
    echo 引数が違います
    goto help
)

:help
    echo %~0
    echo [/?]             : help
    echo [-app] [appName] : 指定したアプリを作成
    echo [-mig] [appName] : 指定したアプリのマイグレーションを実行
    echo [-run]           : ローカルサーバ立ち上げ
    echo [-col]           : staticファイルを集める
    echo [--create-admin] : 管理者登録
    cmd
    exit /b

必要なパッケージのインストール

ターミナル
sudo apt install nginx
pip install uwsgi # テスト環境用
sudo pip install django djangorestframework django-bootstrap5 uwsgi --break-system-packages # 実環境にインストール

設定ファイルの編集

ターミナル
nano [path]/[Project Name]/[Project Name]_uwsgi.ini

エディタ
[uwsgi]
socket = /tmp/[Project Name].sock
chmod-socket = 666

chdir = [path]/[Project Name]

module = [Project Name].wsgi

processes = 4
threads = 2

uid = www-data
gid = www-data

pidfile = /tmp/[Project Name].pid
logto = /var/log/uwsgi/[Project Name].log
daemonize = /var/log/uwsgi/[Project Name].log

ターミナル
uwsgi --ini [path]/[Project Name]/[Project Name]_uwsgi.ini # テスト

ターミナル
sudo nano /etc/nginx/sites-available/[Project Name]

エディタ
##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# https://www.nginx.com/resources/wiki/start/
# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
# https://wiki.debian.org/Nginx/DirectoryStructure
#
# In most cases, administrators will remove this file from sites-enabled/ and
# leave it as reference inside of sites-available where it will continue to be
# updated by the nginx packaging team.
#
# This file will automatically load configuration files provided by other
# applications, such as Drupal or Wordpress. These applications will be made
# available underneath a path with that package name, such as /drupal8.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##

# Default server configuration
#

server {
    listen 80 default_server;

    # ワイルドカード (ホスト名がマッチしないすべて)
    server_name _;

    # 接続を即時切断
    return 444;
}

server {
    listen 80;
    # root /var/www/html;

    server_name raspi5.lan;

    # 静的ファイル
    location /static/ {
        alias [path]/[Project Name]/static/;
    }

    # すべての動的リクエストをuWSGIに転送
    location / {
        include uwsgi_params;
        uwsgi_pass unix:///tmp/[Project Name].sock; # uWSGI設定ファイルで指定したソケットのパス
    }

    error_log /var/log/nginx/[Project Name]_error.log;
    access_log /var/log/nginx/[Project Name]_access.log;
}

設定の変更

ターミナル
sudo ln -s /etc/nginx/sites-available/[Project Name] /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t # テスト

起動

 親ディレクトリにも実行権限o+xを与えること
 子ディレクトリには-Rオプションで一括権限付与

ターミナル
sudo systemctl restart nginx

自動起動

ターミナル
sudo nano /etc/systemd/system/[Project Name].service

エディタ
[Unit]
Description=uWSGI instance to serve [Project Name]
After=network.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=[path]/[Project Name] 
ExecStart=uwsgi --ini [path]/[Project Name]/[Project Name]_uwsgi.ini
Restart=always

[Install]
WantedBy=multi-user.target

ターミナル
sudo systemctl daemon-reload
sudo systemctl restart [Project Name].service
sudo systemctl enable [Project Name].service