DjangoとApcheとmysqlで環境構築


Python3とDjangoとApacheとmysqlとCentOSで環境を構築します。
手順はいろいろあると思いますが、素直に一つずつ進めていきます。



OS

$ cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

Python3のインストール


Pythonは3系を使用します。
2はサポートが終わるそうですし。

sudo yum install -y python3 python3-devel


python3とpython-develをインストールします。
python-develは後ほどmysqlclientをインストールするために必要なパッケージです。

Djangoのインストール


Djangoはpipを使ってインストールします。
まずはpipをインストールしましょう。

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py


Djangoをインストールします。

sudo pip3 install django


本当にインストールされたか不安になった場合は確認してみましょう。

$ python3
Python 3.6.8 (default, Aug  7 2019, 17:28:10)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> django.get_version()
'3.0.3'

Apacheのインストール


特別なことはしません。
普通にインストールします。

sudo yum install -y httpd httpd-devel


httpd-develはwsgi_moduleをインストールするときに使います。

Mysqlのインストール


mysqlをyumでインストールする前にリポジトリを追加する必要があります。

https://dev.mysql.com/downloads/repo/yum/
から取得してきます。

wgetがない場合はインストールしておきます。

sudo yum install -y wget
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
sudo yum localinstall mysql80-community-release-el7-3.noarch.rpm
sudo yum install -y mysql-community-server


これでmysql8がインストールされます。
mysql5.6,7をインストールしたい場合は
/etc/yum.repos.d/mysql-community.repo
を好みのバージョンをインストールするよう修正します。


pythonからmysqlを操作できるように必要なモジュールをpip3でインストールします。

sudo yum install -y mysql-devel
pip3 install mysqlclient

WSGIのインストール


WSGIはapacheとpythonのやり取りを可能にするためのインターフェースです。
これがないと何もできません。

git clone https://github.com/GrahamDumpleton/mod_wsgi
cd mod_wsgi
./configure --with-apxs=/usr/bin/apxs --with-python=/usr/bin/python3
make
sudo make install


これでインストールは完了です。
sudo make installの完了後、最後の行に出力される以下の内容を控えます。

chmod 755 /usr/lib64/httpd/modules/mod_wsgi.so

プロジェクトを作成


apacheとwsgiの設定が必要ですがまずはプロジェクトを作る必要があります。

好きなパスへ移動します。
ここでは/var/wwwに移動します。

そして以下のコマンドでプロジェクトを作成します。
プロジェクト名はもちろん任意です。
ここでは dpro にしています。

django-admin startproject dpro

設定


必要なものはすべてそろったので、もろもろの設定に移りたいと思います。

mysql


データベースを作ります。

mysqlを起動します

sudo systemctl start mysqld


起動すると/var/log/mysqld.logが作成され、そこに初期パスワードが記載されています。

A temporary password is generated for root@localhost: wqP.uZFix7;u


ログインします。
今回はとりあえずrootをユーザーとして使いましょう。

$ mysql -u root -p
Enter password:wqP.uZFix7;u


mysql8では認証方式がcaching_sha2_passwordに変わったようです。
mysqlclientのアクセスが拒否されてしまうみたいです。
セキュリティ的にどうかと思いますが、ここではmysql_native_passwordにしておきます。

 alter user 'root'@'localhost' identified with mysql_native_password by {パスワード}


データベースを作成します。


名前はdappにしました。

ちなみにdjango applicationを略しました。

分散アプリケーションのdappとは関係ありません。

create database dapp;

Djangoの設定ファイル


Djangoプロジェクトを作成したことによってもろもろのファイルが作成されました。

いくつか修正します。

現在は例通りに操舵している場合、現在/var/wwwにいると思います。
配下にdproディレクトリが作成されていると思います。
そしてまたその下にもdproディレクトリが作成されています。

$ pwd
/var/www/dpro/dpro
$ ls
asgi.py  __init__.py  settings.py  urls.py  wsgi.py


その中のsettings.pyを修正します。
74行目あたりに(Django 3.0.3の場合)データベースに関する設定を定義している変数があります。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


これをこうします。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dapp',
        'USER': 'root',
        'PASSWORD': {PASSWORD},
        'host': 'localhost'
    }
}

httpd.conf


httpd.confにもいくつか設定を追加します。

LoadModule wsgi_module /usr/lib64/httpd/modules/mod_wsgi.so

WSGIScriptAlias / /var/www/dpro/dpro/wsgi.py
WSGIPythonPath /var/www/dpro
<Directory '/var/www/dpro/dpro'>
  <Files 'wsgi.py'>
    Require all granted
  </Files>
</Directory>

動作確認


アプリケーションを作成して動作確認を。

cd /var/www/dpro
python3 manage.py startapp dapp


https://docs.djangoproject.com/ja/3.0/intro/tutorial01/
のに書いてある内容を実装してみるのもいいかもしれません。

上に挙げた手順で構築すればプログラムのエラーがあったとしてもDjangoのデバック画面に行くはずです。