これまでは 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/ にアクセスしてみる.次のような画面が表示されれば問題ない.
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 のバージョンを一覧で確認する.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 をインストールする.
[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 プロジェクトを新規に作成るか,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 ⏎
[root@localhost django_sra]# pip install ulid-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 ファイルのアップロード機能も動作する.
詳細ページも正しく表示されている.
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 の設定を行うが,まずは 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 ファイルのダウンロードなども問題なくできることを確認すると良い.
このような方法で 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
これまでの設定で 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 アプリケーションの共存ができた.
Anaconda を更新しておく.
[root@localhost ~]# conda update conda -y ⏎ [root@localhost ~]# conda update --all -y ⏎ [root@localhost ~]# pip install --upgrade pip ⏎