django+ubntu+apacheでwebサーバー作成

スポンサーリンク

ubuntu上でapacheを利用してdjangoで作成したwebを公開できるようにしていく。

スポンサーリンク

開発環境

  • 機器 : raspberry pi 4 model b 8G RAM
  • OS : Ubuntu Sever 22.04.5 LTS (64-bit)

各ソフトをインストール

必要なものをインストールしていく。

インストールする前にapt updateをしておきましょう。

初期設定については以下を過去記事を参考

apache

この後mod_wsgiをインストールする際にapache-devも必要になるためインストールしておく。

sudo apt install apache2 apache2-dev

apacheの主なコマンド

# バージョンの確認(詳細込)
apache2ctl -V
 
# apacheの起動
systemctl start apache2

# aoacheの再起動
systemctl restart apache2

# apacheの終了
systemctl stop apache2

# apacheのステータス
systemctl status apache2

Python

ubuntuには基本初めからPythonが入っているがそれを利用するのは推奨されていない。(参考

pythonはソースコードからインストールしていきます。

ソースコードからインストールするのに必要なツール類をインストール。

sudo apt install build-essential libbz2-dev libdb-dev \
  libreadline-dev libffi-dev libgdbm-dev liblzma-dev \
  libncursesw5-dev libsqlite3-dev libssl-dev \
  zlib1g-dev uuid-dev

Pythonソースコードのダウンロード(2022年8月時点での最新版)、解凍

wget https://www.python.org/ftp/python/3.11.0/Python-3.11.0.tar.xz
tar xJf Python-3.11.0.tar.xz

次のコマンドでビルド、インストールしていきます。

cd Python-3.11.0
./configure --enable-shared
make
sudo make install

“./configure”をする際にオプションで”–enable-shared”をする必要があります。これをしないと、mod_wsgiがインストールできないか、できたとしてもうまく動作しません。

自分の環境ではシンボリックリンクは作成されずにpython3.11で呼び出さないといけないので、新しく作成します。pipも同様となります。

cd /usr/local/bin

ln -s python3.11 python
ln -s pip3.11 pip

この時点ではまだPythonはエラーを起こします。

$ python -V
python3: error while loading shared libraries: libpython3.10.so.1.0: cannot open shared object file: No such file or directory

“/usr/local/lib/libpython3.10.so.1.0″が見つからないというエラーです。

以下のコマンドで共有ライブラリを認識させます。

sudo ldconfig

ldconfigについては以下を参考。

ldconfig【コマンド】とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
「ldconfig【コマンド】」の意味を何となく説明しています。

mod_wsgi

mod_wsgiはpipからインストールすることができます。

pip install mod_wsgi

WARNING: The script mod_wsgi-express is installed in '/home/webserver/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.

“/home/webserver/.local/bin”をPATHに追加したほうがいいよと警告されたので追加しておく。
これをしておかないと後に”Django-admin”コマンドが機能してくれない。

#パスを加えるファイルを編集
sudo nano ~/.profile

#以下の内容を一番下に追記(自分の環境はすでにこれが書かれていた)
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi

#Pathの反映
source ~/.profile

#確認

/home/webserver/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

ここで”apxs”が見つからないというようなエラーが起きた場合、apache2-devがインストールされていない可能性があります。apache2-devをインストールしてwhich apxsなどでapxsを確認してみてください。

django

djangoはpipでインストールできます。

pip install django

djangoのプロジェクトを作成しておきます。

django-admin startproject testsite

設定

必要なものをインストールできたので、apach2でmod_wsgiを使えるように設定をしていきます。

mod_wsgiの起動確認

djangoのアプリケーションに繋げる前にmod_wsgiがうまく動いているかを確認しておきます。

以下のコマンドでサーバーを起動させます。

mod_wsgi-express start-server

以下のアドレスで確認できます。

[ipアドレス]:8000/

djangoのデプロイ

apacheにdjangoをデプロイし、apacheを起動したときにdjangoのサイトを読み込めるようにします。今回は”mod_wsgi-express”を利用して行います。

まず作成したdjangoプロジェクトのディレクトリを確認しておきます。

/home/webserver/testsite/
                    ├─ manage.py
                    └─ testsite/
                            ├─ __init__.py
                            ├─ asgi.py 
                            ├─ settings.py
                            ├─ urls.py
                            └─ wsgi.py

mod_wsgiパッケージをdjangoのインストールアプリに追加するためdjango設定ファイルを書き換えます。また、この後のコマンドに必要になるため”STATIC_ROOT”も追記しておきます。

import os
ALLOWED_HOSTS = ['192.168.1.11']
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'mod_wsgi.server',
]

STATIC_ROOT = os.path.join(BASE_DIR, 'static')

Django設定ファイルで指定されたディレクトリにDjango静的ファイルアセットを収集します。

python manage.py collectstatic

以下のコマンドでDjango アプリケーションをホストする mod_wsgi で Apache サーバーを実行します。

python manage.py runmodwsgi

>Successfully ran command.
>Server URL         : http://localhost:8000/
>Server Root        : /tmp/mod_wsgi-localhost:8000:1001
>Server Conf        : /tmp/mod_wsgi-localhost:8000:1001/httpd.conf
>Error Log File     : /tmp/mod_wsgi-localhost:8000:1001/error_log (warn)
>Operating Mode     : daemon
>Request Capacity   : 5 (1 process * 5 threads)
>Request Timeout    : 60 (seconds)
>Startup Timeout    : 15 (seconds)
>Queue Backlog      : 100 (connections)
>Queue Timeout      : 45 (seconds)
>Server Capacity    : 20 (event/worker), 20 (prefork)
>Server Backlog     : 500 (connections)
>Locale Setting     : en_US.UTF-8

これでサイトへアクセスできます。

このままだとmod_wsgiでapacheサーバを実行しているのでapacheをルートとして起動するため以下のコマンドを実行します。

python manage.py runmodwsgi --setup-only --port=80 --user www-data --group www-data --server-root=/tmp/mod_wsgi-localhost:80:1001

これでapachectlを利用してApacheインスタンスの開始、停止ができます。

コメント

タイトルとURLをコピーしました