Python Django 入門トップページ


本番環境へのデプロイ

目次

  1. 概要
  2. 環境の確認
  3. pyenv のインストール
  4. Anaconda のインストール
  5. Django のインストール
  6. Django プロジェクトの作成
  7. Django プロジェクトを Apache にデプロイする
  8. VirtualHost で通常ページと共存させる

目次に戻る

概要

これまでは python manage.py runserver コマンドを使って開発用の Web サーバを起動して Web システムの動作確認を行ってきた.しかしながら,開発用の Web サーバを使って本番環境を構築することは決してお勧めできない.ここでは,Apache Web サーバに Django で開発したシステムをデプロイ(導入)して外部の Web ブラウザからアクセスできるようにする方法について説明する.(ただし,すでに Apache 上で Laravel のアプリケーションがインストールされている環境ではエラーが発生します.)

なお,ここでは Vagrant で構築した CentOS 7 の仮想OS上に,Ansible によって Web サーバがインストール済みであることを前提にしています.このとき,run.sh の先頭4行だけ残して,残りは削除するかコメントアウトした状態で ./run.sh を実行した状態です.

run.sh
test -z $(which ansible-playbook) && sudo yum install -y epel-release && sudo yum install -y ansible
sudo yum update -y ansible
ansible-playbook main.yml --connection=local
ansible-playbook 01-apache.yml --connection=local

目次に戻る

環境の確認

まず,仮想マシンの IP アドレスを調べておく.調べるには,ip a コマンドを使うと良い.あるいは,Vagrant 環境であれば,ホストマシンの Vagrantfile を参照しても良い.IP アドレスが 192.168.33.120 であるとして作業を続ける.

[vagrant@localhost ~]$ ip a ⏎
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:8a:fe:e6 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0
       valid_lft 86350sec preferred_lft 86350sec
    inet6 fe80::5054:ff:fe8a:fee6/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:59:45:40 brd ff:ff:ff:ff:ff:ff
    inet 192.168.33.120/24 brd 192.168.33.255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe59:4540/64 scope link
       valid_lft forever preferred_lft forever
[vagrant@localhost ~]$

次に,Apache (httpd) のインストールを確認する.

[root@localhost vagrant]# yum list installed | grep httpd ⏎
httpd.x86_64                       2.4.6-90.el7.centos        @base
httpd-devel.x86_64                 2.4.6-90.el7.centos        @base
httpd-tools.x86_64                 2.4.6-90.el7.centos        @base
[root@localhost vagrant]#

OSの起動時に Apache (httpd) が自動起動するかどうかの設定確認と,すでに Apache が起動しているかを確認する.

[vagrant@localhost ~]$ sudo systemctl is-enabled httpd ⏎
enabled
[vagrant@localhost ~]$ sudo systemctl status httpd ⏎
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since 月 2020-03-30 01:05:28 JST; 10min ago
     Docs: man:httpd(8)

なお,自動起動の設定を切り替えるには次のように行います(自動機能を一旦 off にしたあと,また on に戻しています).

[vagrant@localhost ~]$ sudo systemctl is-enabled httpd ⏎
enabled
[vagrant@localhost ~]$ sudo systemctl disable httpd ⏎
Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.
[vagrant@localhost ~]$ sudo systemctl is-enabled httpd ⏎
disabled
[vagrant@localhost ~]$ sudo systemctl enable httpd ⏎
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
[vagrant@localhost ~]$ sudo systemctl is-enabled httpd ⏎
enabled
[vagrant@localhost ~]$

また,Web サーバを停止,起動,再起動するには次のようなコマンドを入力します.

[vagrant@localhost ~]$ sudo systemctl stop httpd ⏎
[vagrant@localhost ~]$ sudo systemctl status httpd ⏎
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since 月 2020-03-30 01:21:41 JST; 4s ago

   ...(中略)...

[vagrant@localhost ~]$ sudo systemctl start httpd ⏎
[vagrant@localhost ~]$ sudo systemctl status httpd ⏎
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since 月 2020-03-30 01:21:58 JST; 3s ago

   ...(中略)...

[vagrant@localhost ~]$ sudo systemctl restart httpd ⏎
[vagrant@localhost ~]$

IP アドレス 192.168.33.120 のマシンで Web サーバが起動しているので,Web ブラウザで http://192.168.33.120/ にアクセスしてみる.次のような画面が表示されれば問題ない.

apache-01

目次に戻る

pyenv のインストール

Python のバージョンを切り替えるための仮想実行環境である pyenv をインストールする.なお,以降の作業は特に断らない限り sudo su コマンドを実行した後,管理者権限で行うことにする.現状では CentOS 7 の標準である Python 2.7系 が利用できるはずである.

[vagrant@localhost ~]$ sudo su ⏎
[root@localhost vagrant]# yum -y groupinstall "Development Tools" ⏎
[root@localhost vagrant]# yum -y install zlib-devel bzip2 bzip2-devel readline-devel openssl-devel ⏎
[root@localhost vagrant]# cd /usr/local/bin ⏎
[root@localhost bin]# git clone https://github.com/pyenv/pyenv.git ./pyenv ⏎
[root@localhost bin]# echo 'export PYENV_ROOT="/usr/local/bin/pyenv"' >> ~/.bashrc ⏎
[root@localhost bin]# echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc ⏎
[root@localhost bin]# echo 'eval "$(pyenv init -)"' >> ~/.bashrc ⏎
[root@localhost bin]# source ~/.bashrc ⏎
[root@localhost bin]# pyenv --version ⏎
pyenv 1.2.17-2-ga8ca63f
[root@localhost bin]# cd ⏎
[root@localhost ~]# python --version ⏎
Python 2.7.5

目次に戻る

Anaconda のインストール

Anaconda のイントールを行うが,まずは利用可能な Anaconda のバージョンを一覧で確認する.2020年3月時点では anaconda3-2019.10 (バージョン3系の2019年10月版)が最新であることがわかる.

[root@localhost ~]# pyenv install --list | grep anaconda  ⏎
  anaconda-1.4.0

  ...(中略)...

  anaconda2-2019.07
  anaconda3-2.0.0

  ...(中略)...

  anaconda3-5.3.1
  anaconda3-2018.12
  anaconda3-2019.03
  anaconda3-2019.07
  anaconda3-2019.10
[root@localhost ~]#

最新版の anaconda3-2019.10 をインストールする.

[root@localhost ~]# pyenv install anaconda3-2019.10 ⏎

インストールが終われば,Python のバージョンを切り替える.

[root@localhost ~]# which python ⏎
/usr/local/bin/pyenv/shims/python
[root@localhost ~]# python --version ⏎
Python 2.7.5
[root@localhost ~]# pyenv version ⏎
system (set by /usr/local/bin/pyenv/version)
[root@localhost bin]# pyenv versions ⏎
* system (set by /usr/local/bin/pyenv/version)
  anaconda3-2019.10
[root@localhost ~]# pyenv global anaconda3-2019.10 ⏎
[root@localhost ~]# pyenv version ⏎
anaconda3-2019.10 (set by /usr/local/bin/pyenv/version)
[root@localhost bin]# pyenv versions ⏎
  system
* anaconda3-2019.10 (set by /usr/local/bin/pyenv/version)
[root@localhost ~]# pyenv rehash ⏎
[root@localhost ~]# python --version ⏎
Python 3.7.4
[root@localhost ~]#

パスを通す.異なるバージョンの Anaconda をインストールした場合はコマンドが異なるので注意が必要である.

[root@localhost ~]# echo 'export PATH="$PYENV_ROOT/versions/anaconda3-2019.10/bin/:$PATH"' >> ~/.bashrc
[root@localhost ~]# source ~/.bashrc
[root@localhost ~]#

イントールができたので,バージョンやインストール済みのパッケージなども確認しておく.後で利用する numpy, pandas, scipy はインストール済みであるが,Django はまだインストールされていないことがわかる.

[root@localhost ~]# which python ⏎
/usr/local/bin/pyenv/versions/anaconda3-2019.10/bin/python
[root@localhost ~]# python --version ⏎
Python 3.7.7
[root@localhost ~]# conda --version ⏎
conda 4.8.3
[root@localhost ~]# pip --version ⏎
pip 20.0.2 from /usr/local/bin/pyenv/versions/anaconda3-2019.10/lib/python3.7/site-packages/pip (python 3.7)
[root@localhost ~]# pip list ⏎
Package                            Version
---------------------------------- ---------
alabaster                          0.7.12
anaconda-client                    1.7.2
anaconda-navigator                 1.9.12
anaconda-project                   0.8.3

...(中略)...

numpy                              1.18.1

...(中略)...

pandas                             1.0.3

...(中略)...

scipy                              1.4.1

...(中略)...

zipp                               2.2.0
[root@localhost ~]#

目次に戻る

Django のインストール

Django をインストールする.

[root@localhost ~]# pip install django ⏎
Collecting django
Downloading Django-3.0.4-py3-none-any.whl (7.5 MB)
|████████████████████████████████| 7.5 MB 13.3 MB/s
Collecting sqlparse>=0.2.2
Downloading sqlparse-0.3.1-py2.py3-none-any.whl (40 kB)
|████████████████████████████████| 40 kB 8.9 MB/s
Requirement already satisfied: pytz in /usr/local/bin/pyenv/versions/anaconda3-2019.10/lib/python3.7/site-packages (from
django) (2019.3)
Collecting asgiref~=3.2
Downloading asgiref-3.2.7-py2.py3-none-any.whl (19 kB)
Installing collected packages: sqlparse, asgiref, django
Successfully installed asgiref-3.2.7 django-3.0.4 sqlparse-0.3.1
[root@localhost ~]# pip list | grep -i django⏎
Django 3.0.4
[root@localhost ~]#

目次に戻る

Django プロジェクトの作成

クローンの作成

Django プロジェクトを新規に作成るか,Github からクローンを作成する.ここでは,林坂が開発したソフトウェア信頼性評価ツールのクローンを Github から作成する.なお,引き続き root 権限で作業することにする.

[vagrant@localhost ~]$ sudo su ⏎
[root@localhost vagrant]# cd ⏎
[root@localhost ~]# mkdir django ⏎
[root@localhost ~]# cd django/ ⏎
[root@localhost django]# pwd ⏎
/root/django
[root@localhost django]# git clone git@github.com:rinsaka/PythonDjangoSRATool.git ⏎
[root@localhost django]# mv PythonDjangoSRATool django_sra ⏎

追加パッケージ (ulid-py) のインストール

Github からクローンを作成した django-sra は ID が連番にならないようにするために ulid-py というパッケージを使っているので,そのパッケージをダウンロードする.
[root@localhost django_sra]# pip install ulid-py ⏎

settings.py の編集

settings.py を編集して,外部のホストからアクセスできるようにするとともに,デバッグモードを False にして本番環境で利用できるようにする(デバッグモードでは,エラー発生時にエラーの詳細な情報がクライアントのブラウザに表示されてしまう).

/root/django/django-sra/django-sra/settings.py(抜粋)
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False

ALLOWED_HOSTS = ['*']

データベースのテーブル作成(マイグレーション)

データベースのテーブルを作成する.

[root@localhost django_sra]# pwd ⏎
/root/django/django_sra
[root@localhost django_sra]# python manage.py migrate ⏎
[root@localhost django_sra]# python manage.py showmigrations ⏎

開発用サーバで動作確認

まずは,開発用サーバを起動して正しく動作する事を確認しよう.まずは web サーバを起動する.

[root@localhost django_sra]# python manage.py runserver ⏎

別の端末を起動して(あるいは,web サーバをバックグラウンドに変更して)curl コマンドでアクセスしてみる.

[vagrant@localhost ~]$ curl 127.0.0.1:8000 | head -n 10 ⏎
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1803  100  1803    0     0   391k      0 --:--:-- --:--:-- --:--:--  440k
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <link rel="stylesheet" type="text/css" href="/static/css/style.css">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <!-- Bootstrap CSS -->
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
  <title>
Software Reliability Assessment
[vagrant@localhost ~]$

一旦 Ctrl+C で Web サーバを停止し,今度はホスト (Windows / Mac) の web ブラウザからもアクセスできるように指定して Web サーバを起動する.

[root@localhost django_sra]# python manage.py runserver 0.0.0.0:8000 ⏎

上では IP アドレスに 0.0.0.0 を指定したが,実際の IP アドレス 192.168.33.120 を与えても良い.

[root@localhost django_sra]# python manage.py runserver 192.168.33.120:8000 ⏎
Performing system checks...

System check identified no issues (0 silenced).
March 30, 2020 - 13:05:41
Django version 3.0.4, using settings 'django_sra.settings'
Starting development server at http://192.168.33.120:8000/
Quit the server with CONTROL-C.

トップページは正しく表示され,CSV ファイルのアップロード機能も動作する.

apache-02

詳細ページも正しく表示されている.

apache-03

目次に戻る

Django プロジェクトを Apache にデプロイする

Django プロジェクトの準備ができたので,これを Apache にデプロイしよう.まずは /var/www/ 以下にプロジェクトのファイルを移動する.

[vagrant@localhost ~]$ sudo su ⏎
[root@localhost vagrant]# cd ⏎
[root@localhost ~]# cd django/ ⏎
[root@localhost django]# pwd ⏎
/root/django
[root@localhost django]# ls ⏎
django_sra
[root@localhost django]# mv django_sra /var/www/ ⏎
[root@localhost django]#

apache グループがデータベースを更新できるようにアクセス権を設定する.

[root@localhost ~]# cd /var/www/ ⏎
[root@localhost www]# ls -l ⏎
合計 0
drwxr-xr-x   6 root    root     62  3月 29 18:20 .
drwxr-xr-x. 20 root    root   4096  3月 29 16:35 ..
drwxr-xr-x   2 root    root      6  8月  8  2019 cgi-bin
drwxr-xr-x   6 root    root    123  3月 29 18:15 django_sra
drwxr-xr-x   2 vagrant root     23  3月 29 17:30 html
[root@localhost www]# chown -R root:apache django_sra ⏎
[root@localhost www]# ls -l ⏎
合計 0
drwxr-xr-x 2 root    root     6  8月  8  2019 cgi-bin
drwxr-xr-x 6 root    apache 123  3月 29 18:15 django_sra
drwxr-xr-x 2 vagrant root    23  3月 29 17:30 html
[root@localhost www]# chmod 775 django_sra ⏎
[root@localhost www]# ls -l ⏎
合計 0
drwxr-xr-x 2 root    root     6  8月  8  2019 cgi-bin
drwxrwxr-x 6 root    apache 123  3月 29 18:15 django_sra
drwxr-xr-x 2 vagrant root    23  3月 29 17:30 html
[root@localhost www]# cd django_sra/ ⏎
[root@localhost django_sra]# ls -la ⏎
合計 152
drwxr-xr-x 6 root apache    123  3月 29 18:15 .
drwxr-xr-x 6 root root       62  3月 29 18:20 ..
drwxr-xr-x 8 root apache    152  3月 29 18:11 .git
-rw-r--r-- 1 root apache     53  3月 29 18:11 .gitignore
-rw-r--r-- 1 root apache    642  3月 29 18:11 Readme.md
-rw-r--r-- 1 root apache 139264  3月 29 18:15 db.sqlite3
drwxr-xr-x 3 root apache    102  3月 29 18:13 django_sra
-rwxr-xr-x 1 root apache    630  3月 29 18:11 manage.py
drwxr-xr-x 2 root apache     92  3月 29 18:15 media
drwxr-xr-x 7 root apache   4096  3月 29 18:13 sras
[root@localhost django_sra]# chmod 664 db.sqlite3 ⏎
[root@localhost django_sra]# ls -la ⏎
合計 152
drwxr-xr-x 6 root apache    123  3月 29 18:15 .
drwxr-xr-x 6 root root       62  3月 29 18:20 ..
drwxr-xr-x 8 root apache    152  3月 29 18:11 .git
-rw-r--r-- 1 root apache     53  3月 29 18:11 .gitignore
-rw-r--r-- 1 root apache    642  3月 29 18:11 Readme.md
-rw-rw-r-- 1 root apache 139264  3月 29 18:15 db.sqlite3
drwxr-xr-x 3 root apache    102  3月 29 18:13 django_sra
-rwxr-xr-x 1 root apache    630  3月 29 18:11 manage.py
drwxr-xr-x 2 root apache     92  3月 29 18:15 media
drwxr-xr-x 7 root apache   4096  3月 29 18:13 sras
[root@localhost django_sra]#

さらに,アップロードした CSV ファイルは media ディレクトリに保存するので,apache が書き込めるように media にも権限を設定する.

[root@localhost django_sra]# chmod 775 media/ ⏎
[root@localhost django_sra]# ls -la ⏎
合計 148
drwxr-xr-x. 6 root apache    131  3月 28 19:12 .
drwxr-xr-x. 5 root root       51  3月 28 19:35 ..
drwxr-xr-x. 8 root apache    163  3月 28 19:54 .git
-rw-r--r--. 1 root apache     53  3月 28 19:03 .gitignore
-rw-r--r--. 1 root apache    642  3月 28 19:03 Readme.md
-rw-r--r--. 1 root apache 139264  3月 28 19:12 db.sqlite3
drwxr-xr-x. 3 root apache    108  3月 28 19:08 django_sra
-rwxr-xr-x. 1 root apache    630  3月 28 19:03 manage.py
drwxrwxr-x. 2 root apache     94  3月 28 19:12 media
drwxr-xr-x. 7 root apache    219  3月 28 19:59 sras
[root@localhost django_sra]#

Apache の設定と mod_wsgi モジュールの追加

Apache の設定を行うが,まずは httpd-devel がインスールされていることを確認する.

[root@localhost vagrant]# yum list installed | grep httpd ⏎
httpd.x86_64                       2.4.6-90.el7.centos        @base
httpd-devel.x86_64                 2.4.6-90.el7.centos        @base
httpd-tools.x86_64                 2.4.6-90.el7.centos        @base
[root@localhost vagrant]#

次に,mod_wsgi モジュールのソースコードをダウンロードして,コンパイル,インストールする.このとき4つ目の ./configure コマンドでは Anaconda のバージョンを指定しているので注意が必要.

[root@localhost ~]# cd /usr/local/src/ ⏎
[root@localhost src]# git clone https://github.com/GrahamDumpleton/mod_wsgi.git ./mod_wsgi ⏎
Cloning into './mod_wsgi'...
remote: Enumerating objects: 133, done.
remote: Counting objects: 100% (133/133), done.
remote: Compressing objects: 100% (95/95), done.
remote: Total 6826 (delta 60), reused 82 (delta 38), pack-reused 6693
Receiving objects: 100% (6826/6826), 4.43 MiB | 1.74 MiB/s, done.
Resolving deltas: 100% (4469/4469), done.
[root@localhost src]# cd mod_wsgi/ ⏎
[root@localhost mod_wsgi]# ./configure --with-python=/usr/local/bin/pyenv/versions/anaconda3-2019.10/bin/python ⏎
[root@localhost mod_wsgi]# make ⏎
[root@localhost mod_wsgi]# make install ⏎
/bin/apxs -i -S LIBEXECDIR=/usr/lib64/httpd/modules -n 'mod_wsgi' src/server/mod_wsgi.la
/usr/lib64/httpd/build/instdso.sh SH_LIBTOOL='/usr/lib64/apr-1/build/libtool' src/server/mod_wsgi.la /usr/lib64/httpd/modules
/usr/lib64/apr-1/build/libtool --mode=install install src/server/mod_wsgi.la /usr/lib64/httpd/modules/
libtool: install: install src/server/.libs/mod_wsgi.so /usr/lib64/httpd/modules/mod_wsgi.so
libtool: install: install src/server/.libs/mod_wsgi.lai /usr/lib64/httpd/modules/mod_wsgi.la
libtool: install: install src/server/.libs/mod_wsgi.a /usr/lib64/httpd/modules/mod_wsgi.a
libtool: install: chmod 644 /usr/lib64/httpd/modules/mod_wsgi.a
libtool: install: ranlib /usr/lib64/httpd/modules/mod_wsgi.a
libtool: finish: PATH="/usr/local/bin/pyenv/versions/anaconda3-2019.10/bin/:/usr/local/bin/pyenv/shims:/usr/local/bin/pyenv/bin:/sbin:/bin:/usr/sbin:/usr/bin:/sbin" ldconfig -n /usr/lib64/httpd/modules
----------------------------------------------------------------------
Libraries have been installed in:
   /usr/lib64/httpd/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,-rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
chmod 755 /usr/lib64/httpd/modules/mod_wsgi.so

mod_wsgi モジュールの共有ライブラリへの依存関係を ldd コマンドで確認すると,libpython3.7m.so.1.0 が見つからないとのこと.

[root@localhost ~]# ldd /etc/httpd/modules/mod_wsgi.so ⏎
	linux-vdso.so.1 =>  (0x00007ffdfb7e0000)
	libpython3.7m.so.1.0 => not found
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f29925e5000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007f29923e1000)
	libutil.so.1 => /lib64/libutil.so.1 (0x00007f29921de000)
	librt.so.1 => /lib64/librt.so.1 (0x00007f2991fd6000)
	libm.so.6 => /lib64/libm.so.6 (0x00007f2991cd4000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f2991906000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f2992a3d000)
[root@localhost ~]#

よって,共有ライブラリへのシンボリックリンクを設定して再度確認する.

[root@localhost ~]# ln -s /usr/local/bin/pyenv/versions/anaconda3-2019.10/lib/libpython3.7m.so.1.0 /lib64/ ⏎
[root@localhost ~]# ldd /etc/httpd/modules/mod_wsgi.so ⏎
	linux-vdso.so.1 =>  (0x00007ffe11199000)
	libpython3.7m.so.1.0 => /lib64/libpython3.7m.so.1.0 (0x00007f6e26bd3000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f6e269b7000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007f6e267b3000)
	libutil.so.1 => /lib64/libutil.so.1 (0x00007f6e265b0000)
	librt.so.1 => /lib64/librt.so.1 (0x00007f6e263a8000)
	libm.so.6 => /lib64/libm.so.6 (0x00007f6e260a6000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f6e25cd8000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f6e27177000)
[root@localhost ~]#

Django アプリを Apache に登録するために /etc/httpd/conf.d/wsgi.conf ファイルを作成する.このとき, /static/ と /media/ も登録する必要があるので注意する.

/etc/httpd/conf.d/wsgi.conf
LoadModule wsgi_module modules/mod_wsgi.so
WSGIPythonHome /usr/local/bin/pyenv/versions/anaconda3-2019.10/
WSGIPythonPath /var/www/django_sra
WSGIScriptAlias / /var/www/django_sra/django_sra/wsgi.py

<Directory /var/www/django_sra/django_sra>
  <Files wsgi.py>
    Require all granted
  </Files>
</Directory>

Alias /static/ /var/www/django_sra/sras/static/
<Directory /var/www/django_sra/sras/static>
  Require all granted
</Directory>

Alias /media/ /var/www/django_sra/media/
<Directory /var/www/django_sra/media>
  Require all granted
</Directory>

Apache を再起動する.

[root@localhost conf.d]# apachectl configtest ⏎
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
Syntax OK
[root@localhost conf.d]# systemctl restart httpd ⏎
[root@localhost conf.d]#

Web ブラウザから http://192.168.33.120/ にアクセスし,動作を確認して完了である.特に,上で読み込めていなかったスタイルファイルの読み込みや,CSV ファイルのダウンロードなども問題なくできることを確認すると良い.

apache-05

このような方法で Django アプリケーションを Apache で公開することができた.しかしながら,この方法では通常の /var/www/html/ 以下に保存された Web ページとDjango アプリケーションを共存させることができない.これらを共存させるための 一つの方法として,http://192.168.33.120/sra/ 以下を Django アプリケーションとして起動させる方法がある.このためには wsgi.conf の WSGIScriptAlias を次のように変更すればよいが,この変更だけでは Django アプリケーションのトップページ以外が表示できないという問題がある.他の箇所も適切に変更すればうまく共存できるはずである.将来的に問題が解決すればこのページに追記する.

/etc/httpd/conf.d/wsgi.conf(抜粋)
WSGIScriptAlias /sra/ /var/www/django_sra/django_sra/wsgi.py

目次に戻る

VirtualHost で通常ページと共存させる

これまでの設定で http://192.168.33.120/ で Django アプリケーションを動作させる事ができた.しかしながら,Django アプリ以外のページも公開したいような場合を考える.ここでは,http://192.168.33.120/ は通常の Web ページ (/var/www/html/index.html など) を表示し,http://192.168.33.120:8080/ で Django アプリケーションを実行できるように VirtualHost を設定する.つまり,HTTP 標準の TCP 80 番ポートでは,通常 Web ページを表示し,TCP 8080 番ポートで Django アプリケーションを表示するような設定にする.

次のように,/etc/httpd/conf/httpd.conf を修正する.まず,80 番ポートだけでなく,8080 番ポートも使えるように Listen 8080 を追加する.

/etc/httpd/conf/httpd.conf(抜粋)
#
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 80
Listen 8080

httpd.conf の中から次の箇所を探す.

/etc/httpd/conf/httpd.conf(抜粋)
#
# Deny access to the entirety of your server's filesystem. You must
# explicitly permit access to web content directories in other
# <Directory> blocks below.
#
<Directory />
    AllowOverride none
    Require all denied
</Directory>

#
# Note that from this point forward you must specifically allow
# particular features to be enabled - so if something's not working as
# you might expect, make sure that you have specifically enabled it
# below.
#

#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/var/www/html"

#
# Relax access to content within /var/www.
#
<Directory "/var/www">
    AllowOverride None
    # Allow open access:
    Require all granted
</Directory>

# Further relax access to the default document root:
<Directory "/var/www/html">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important.  Please see
    # http://httpd.apache.org/docs/2.4/mod/core.html#options
    # for more information.
    #
    Options Indexes FollowSymLinks

    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   Options FileInfo AuthConfig Limit
    #
    AllowOverride None

    #
    # Controls who can get stuff from this server.
    #
    Require all granted
</Directory>

上の箇所全体を <VirtualHost> タグで囲い,その中に ServerName を追加して次のように編集する.

/etc/httpd/conf/httpd.conf(抜粋)
<VirtualHost *:80>

ServerName 192.168.33.120

#
# Deny access to the entirety of your server's filesystem. You must
# explicitly permit access to web content directories in other
# <Directory> blocks below.
#
<Directory />
    AllowOverride none
    Require all denied
</Directory>

#
# Note that from this point forward you must specifically allow
# particular features to be enabled - so if something's not working as
# you might expect, make sure that you have specifically enabled it
# below.
#

#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/var/www/html"

#
# Relax access to content within /var/www.
#
<Directory "/var/www">
    AllowOverride None
    # Allow open access:
    Require all granted
</Directory>

# Further relax access to the default document root:
<Directory "/var/www/html">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important.  Please see
    # http://httpd.apache.org/docs/2.4/mod/core.html#options
    # for more information.
    #
    Options Indexes FollowSymLinks

    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   Options FileInfo AuthConfig Limit
    #
    AllowOverride None

    #
    # Controls who can get stuff from this server.
    #
    Require all granted
</Directory>

</VirtualHost>

wsgi.py を次のように編集する.(これまでのファイルの4行目以降を <VirtualHost> で囲い,ServerName を追加する)

/etc/httpd/conf.d/wsgi.conf
LoadModule wsgi_module modules/mod_wsgi.so
WSGIPythonHome /usr/local/bin/pyenv/versions/anaconda3-2019.10/
WSGIPythonPath /var/www/django_sra


<VirtualHost *:8080>
  ServerName 192.168.33.120

  WSGIScriptAlias / /var/www/django_sra/django_sra/wsgi.py

  <Directory /var/www/django_sra/django_sra>
    <Files wsgi.py>
      Require all granted
    </Files>
  </Directory>

  Alias /static/ /var/www/django_sra/sras/static/
  <Directory /var/www/django_sra/sras/static>
   Require all granted
  </Directory>

  Alias /media/ /var/www/django_sra/media/
  <Directory /var/www/django_sra/media>
    Require all granted
  </Directory>

</VirtualHost>

Apache の設定を確認してから再起動する.

[root@localhost ~]# apachectl configtest ⏎
AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/httpd/conf/httpd.conf:98
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
Syntax OK
[root@localhost ~]# systemctl restart httpd ⏎
[root@localhost ~]#

Django で管理しない Web ページのコンテンツを /var/www/html/ 以下に配置する.例えば,次のような index.html を作成する.

/var/www/html/index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>テストページ</title>
</head>
<body>
<p>テストページ</p>
</body>
</html>

Web ブラウザから http://192.168.33.120/ または http://192.168.33.120:80/ にアクセスすると標準の(/var/www/html/index.html)が表示され,http://192.168.33.120:8080/ にアクセスすると Django アプリケーション表示された.つまり,通常の Web ページと Django アプリケーションの共存ができた.

apache-06

apache-07

Anaconda を更新しておく.

[root@localhost ~]# conda update conda -y ⏎
[root@localhost ~]# conda update --all -y ⏎
[root@localhost ~]# pip install --upgrade pip ⏎

目次に戻る