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については以下を参考。
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インスタンスの開始、停止ができます。