CentOS8 Stream に Pytone3.8+Diango+Apache をインストールしてSSL接続するまでの流れ。

インストールの手順をメモしています。

SSL証明書は無料のLet’s Encryptをcertbotコマンドで取得します。

Apacheのインストール

dnfコマンドでhttpdをインストールします。

$ dnf -y install httpd

SSLでhttps接続を使用するために、mod_sslをインストールします。

$ dnf -y install mod_ssl

ファイアウォールにhttp、httpsサービスを追加します。

$ firewall-cmd --permanent --add-service=http
$ firewall-cmd --permanent --add-service=https

apacheの起動(start)、終了(stop)、再起動(restart)は下記の通りになります。

$ systemctl start httpd
$ systemctl stop httpd
$ systemctl restart httpd

pythonのインストールと環境設定

dnfコマンドでインストールします。

$ dnf install python38 python38-devel -y

python38 を pythonとpython3で実行できるように変更。

$ alternatives --config python

There are 3 programs which provide 'python'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/libexec/no-python
   2           
   3           /usr/bin/python3.8

Enter to keep the current selection[+], or type selection number: 3



$ alternatives --config python3

There are 3 programs which provide 'python3'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/libexec/no-python
   2           
   3           /usr/bin/python3.8

Enter to keep the current selection[+], or type selection number: 3

pip3.8 を pip で実行できるように変更。

$ update-alternatives --install /usr/bin/pip pip /usr/bin/pip3.8 1

仮想環境の構築

Python3 の標準ライブラリである venv で仮想環境を作成する方法を紹介します。

$ dnf -y install python3-virtualenv

$ mkdir /example
$ cd /example
$ virtualenv venv

/example/venv に Python3.8 用の仮想環境が作成されました。

仮想環境の有効化

作成した仮想環境のディレクトリに移動して「source 仮想環境の名前/bin/activate」を実行します。

$ cd /example
$ source venv/bin/activate

仮想環境の終了

仮想環境から抜け出すには、deactivate コマンドを実行します。

(venv)$ deactivate

Django のインストール

Djangoのインストールは仮想環境を有効化した状態で進めます。

(venv)$ python -m pip install Django
(venv)$ cd /example
(venv)$ django-admin startproject mysite
(venv)$ cd mysite
(venv)$ python manage.py startapp myapp

仮想環境にpipで必要なモジュールをインストール

mod_wsgiとは、WSGI (Web Server Gateway Interface) インターフェースに準拠した PythonのプログラムをApache HTTP Serverで動作させるためのモジュールです。こちらも仮想環境を有効にした状態でインストールします。

(venv)$ pip install httpd-devel
(venv)$ pip install mod_wsgi

EPELライブラリを有効化して、Certbotをインストール

certbotコマンドは、公的な認証局Let’s Encryptが発行する無料のTLSサーバ証明書を、簡単なコマンド操作で取得・更新することができるので、こちらをインストールして証明書のインストールと設定を行います。

$ yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
$ dnf install certbot python3-certbot-apache

apacehのバーチャルホスト(/etc/httpd/conf.d/example.conf)を事前に作成しておきます。

# example.conf
<VirtualHost *:80>
  ServerName example-mysite.com
  DocumentRoot /example/mysite
</VirtualHost>

certbotコマンドでssl用のバーチャルホストを自動生成します。

$ certbot --apache
Saving debug log to /var/log/letsencrypt/letsencrypt.log

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: example-mysite.com
....
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1

実行すると、example-le-ssl.confファイルが作成されます。ファイルの中身は下記になります。

<IfModule mod_ssl.c>
<VirtualHost *:443>
  ServerName example-mysite.com
  DocumentRoot /example/mysite
SSLCertificateFile /etc/letsencrypt/live/service.three-villages.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/service.three-villages.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

wsgiの設定

SSLの設定が完了したので、次はバーチャルホストにwsgiの設定を行います。

DocumentRootは使用しないのでコメントに変更して、下記のような設定を追加します。

<IfModule mod_ssl.c>
LoadModule wsgi_module /example/venv/lib64/python3.8/site-packages/mod_wsgi/server/mod_wsgi-py38.cpython-38-x86_64-linux-gnu.so
WSGISocketPrefix /var/run/wsgi

<VirtualHost *:443>
  ServerName example-mysite.com
#  DocumentRoot /example/mysite

 WSGIDaemonProcess wsgi_app user=apache group=apache python-home=/example/venv  python-path=/example/mysite
  WSGIProcessGroup wsgi_app
  WSGIScriptAlias / /example/mysite/mysite/wsgi.py

  <directory /example/mysite/mysite>
    <Files wsgi.py>
      Require all granted
    </Files>
  </directory>

  Alias /static/ /example/mysite/static/
  <Directory /example/mysite/static>
    Require all granted
  </Directory>

  SSLCertificateFile /etc/letsencrypt/live/service.three-villages.com/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/service.three-villages.com/privkey.pem
  Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

バーチャルホストの設定が完了したら、apacheを再起動することで設定が反映されます。