2019-12-14

[CentOS 8] Django アプリのデプロイ 〜 Apache (httpd) 編 〜

Django /ˈdʒæŋɡoʊ/ は、Python で実装された Web アプリケーションフレームワークで、model-view-controller デザインパターンに緩やかに従っています。また、ファイルやデータのモデルにいたるまで、Python が一貫して用いられています。

Wikipedia より引用・編集

Apache (httpd) Web サーバーに Django アプリをデプロイする際の設定について備忘録としてまとめました。

OS
CentOS Linux release 8.0.1905 (Core) x86_64

使用するサンプル

Python は venv の仮想環境 myenv で使用しています。python, django のバージョンは下記の通りです。

[bitwalk@centos-pc ~]$ source $HOME/myenv/bin/activate
(myenv) [bitwalk@centos-pc ~]$ python -V
Python 3.6.8
(myenv) [bitwalk@centos-pc ~]$ python -m django --version
3.0
(myenv) [bitwalk@centos-pc ~]$ 

Django プロジェクト django_app を作成し、アプリケーション hello を作成しました。

(myenv) [bitwalk@centos-pc ~]$ django-admin startproject django_app
(myenv) [bitwalk@centos-pc ~]$ cd django_app
(myenv) [bitwalk@centos-pc django_app]$ ls
django_app  manage.py
(myenv) [bitwalk@centos-pc django_app]$ python manage.py startapp hello
(myenv) [bitwalk@centos-pc django_app]$ ls
django_app  hello  manage.py
(myenv) [bitwalk@centos-pc django_app]$ 

単純なサンプルなので、コーディングの内容について詳しくは説明しませんが、その代わり下記からダウンロードできるようにしておきました。

django_app.zip

※ サンプルに含まれている fabicon.ico は、ICONFINDER から Emoticon, good, thumbup icon をダウンロードして ico 形式に変換したものです。配布ライセンスは元の画像に合わせて Creative Commons (Attribution-Noncommercial 3.0 Unported) に従っています(商用利用不可)。

開発用サーバーによる確認

サンプルが準備できたところで、開発サーバー上で動作確認します。

(myenv) [bitwalk@centos-pc django_app]$ python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

December 13, 2019 - 13:08:06
Django version 3.0, using settings 'sample.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

このサンプルは文字列を表示するだけで、データベースにアクセスする機能はありません。

CentOS 上の開発サーバー上での確認 (Firefox)

動作確認したところで、アプリ毎に定義されている static フォルダーを下記のように collectstatic コマンドで一箇所にまとめます。これは本番環境の Web サーバーにデプロイする際に必要な処理になります。

(myenv) [bitwalk@centos-pc django_app]$ python manage.py collectstatic

You have requested to collect static files at the destination
location as specified in your settings:

    /home/bitwalk/django_app/static

This will overwrite existing files!
Are you sure you want to do this?

Type 'yes' to continue, or 'no' to cancel: yes

2 static files copied to '/home/bitwalk/django_app/static', 130 unmodified.
(myenv) [bitwalk@centos-pc django_app]$ ls static
admin  hello
(myenv) [bitwalk@centos-pc django_app]$ 

tree コマンドで、django_app ディレクトリの構造を確認すると下記のようになります。

[bitwalk@centos-pc ~]$ tree django_app
django_app
├── db.sqlite3
├── django_app
│   ├── __init__.py
│   ├── __pycache__
...
(省略)
...
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── hello
│   ├── __init__.py
│   ├── __pycache__
...
(省略)
...
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
...
(省略)
...
│   ├── models.py
│   ├── static
│   │   └── hello
│   │       ├── css
│   │       │   └── style.css
│   │       └── favicon.ico
│   ├── templates
│   │   └── hello
│   │       └── index.html
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── manage.py
└── static
    ├── admin
...
(省略)
...
    └── hello
        ├── css
        │   └── style.css
        └── favicon.ico

28 directories, 160 files
[bitwalk@centos-pc ~]$ 

Apache (httpd) にデプロイ

Apache (httpd) は参考サイト [1] に従って、既に CentOS 8 のサーバーにインストールされて稼働しているものとします。

mod_wsgi のインストール

Apache で Django のアプリケーションを実行するには WSGI モジュールをインストールする必要があります。CentOS 8 では Python 3 用のモジュール python3-mod_wsgi が利用できますので、これをインストールします。

[bitwalk@centos-pc ~]$ sudo dnf install python3-mod_wsgi
...
(省略)
...
依存関係が解決しました。
================================================================================
 パッケージ             アーキテクチャー
                                     バージョン           リポジトリ      サイズ
================================================================================
Installing:
 python3-mod_wsgi       x86_64       4.6.4-3.el8          AppStream       2.5 M

トランザクションの概要
================================================================================
インストール  1 パッケージ

ダウンロードサイズの合計: 2.5 M
インストール済みのサイズ: 9.5 M
これでよろしいですか? [y/N]: y
パッケージのダウンロード中です:
...
(省略)
...

インストール済み:
  python3-mod_wsgi-4.6.4-3.el8.x86_64                                           

完了しました!
[bitwalk@centos-pc ~]$ 

/etc/httpd/conf.modules.d/ に Apache の設定ファイルが保存されています。

[bitwalk@centos-pc ~]$ cat /etc/httpd/conf.modules.d/10-wsgi-python3.conf
# NOTE: mod_wsgi_python3 can not coexist in the same apache process as
# mod_wsgi (python2).  Only load if mod_wsgi is not already loaded.

<IfModule !wsgi_module>
    LoadModule wsgi_module modules/mod_wsgi_python3.so
</IfModule>
[bitwalk@centos-pc ~]$ 

django.conf の作成

下記の内容のファイルを作成して、ルート権限で /etc/httpd/conf.d 以下に(例えば)django.conf というファイル名で保存します。

/etc/httpd/conf.d/django.conf
WSGIPythonHome /home/bitwalk/myenv
WSGIPythonPath /home/bitwalk/django_app

<VirtualHost *:8080>
  #ServerName django.example.com
  DocumentRoot /home/bitwalk/django_app/

  WSGIScriptAlias / /home/bitwalk/django_app/django_app/wsgi.py
  <Directory /home/bitwalk/django_app/django_app>
    <Files wsgi.py>
      Require all granted
    </Files>
  </Directory>

  Alias /static /home/bitwalk/django_app/static
  <Directory /home/bitwalk/django_app/static>
    Require all granted
  </Directory>
</VirtualHost>

httpd.conf の編集

作成した django.conf では、VirtualHost を利用してポート 8080 で Django のアプリケーションを稼働させようとしています。そのため /etc/httpd/conf/httpd.conf をルート権限で編集し、ポート 8080 も Listen するようにします。

/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 
# 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
...
(省略)
...

ファイアウォールの設定

LAN 内の他の PC からアクセスできるように、ポート 8080 をファイアウォールの「public」ゾーンに追加します。

[bitwalk@centos-pc ~]$ sudo firewall-cmd --permanent --zone=public --add-port=8080/tcp
success
[bitwalk@centos-pc ~]$ sudo firewall-cmd --reload
success
[bitwalk@centos-pc ~]$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp2s0
  sources: 
  services: cockpit dhcpv6-client http https postgresql samba ssh
  ports: 3389/tcp 8787/tcp 3838/tcp 5432/tcp 8080/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
 
[bitwalk@centos-pc ~]$ 

SELinux の設定

[bitwalk@centos-pc ~]$ sudo setsebool -P httpd_read_user_content 1
[sudo] bitwalk のパスワード:
[bitwalk@centos-pc ~]$ 

SELinux の設定は、実用的な Django アプリの場合、これだけでは十分でないかもしれません。SELinux のアラームを監視して対処します。なお 8080 以外のポート番号を使う場合には「sudo semanage port -a -t http_port_t -p tcp ポート番号」を実行する必要があると思います。

httpd サービスの再起動

httpd のサービスを再起動します。

[bitwalk@centos-pc ~]$ sudo systemctl restart httpd
[sudo] bitwalk のパスワード:
[bitwalk@centos-pc ~]$ 

Windows PC からアクセス

LAN 内の Winodws 上、Microsoft Edge で http://192.168.0.25:8080/hello/ へアクセスしたところ、下図の通り、無事アクセスすることができました。

Apache (httpd) にデプロイ後、Winodws 上の Microsoft Edge で確認

参考サイト

  1. bitWalk's: [CentOS 8] httpd の設定
  2. バーチャルホストの例 - Apache HTTP サーバ バージョン 2.4
  3. TCPやUDPにおけるポート番号の一覧 - Wikipedia

 

 

ブログランキング・にほんブログ村へにほんブログ村

0 件のコメント: