CentOS + Nginx + SSL + gunicorn で Django のアプリケーションを公開する環境を構築してみました。
『Centos7 nginx(with ssl let’s Encrypt) + php + mysql 環境構築』でワイルドカードを用いたSSL証明書でサイトをSSL化してあります。ここではそのワイルドカードを使った証明書を利用しサイトをSSL化します。
サーバーはLet’sEncryptでワイルドカードの環境を作成したさくらインターネットのVPSサーバーを利用します。
環境を作成するユーザーとして user:django を作成し「sudo」の実行権限を付与しています。
また、gunicornを使って、DjangoでできたWebアプリケーションを起動する準備をします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
#python のバージョン確認 [root@myserver ~]$ python -V Python 2.7.5 # python3 インストール [django@myserver ~]$ sudo yum install python3 #python3 バージョン確認 [root@myserver ~]# python3 -V Python 3.6.8 # python3.6 仮想環境作成 [django@myserver ~]$ python3.6 -m venv py36 # 仮想環境 activate [django@myserver ~]$ source py36/bin/activate (py36) [django@myserver ~]$ # pythonのバージョン確認 (py36) [django@myserver ~]$ python -V Python 3.6.8 # pip のバージョンアップ (py36) [django@myserver ~]$ pip install --upgrade pip Collecting pip Downloading https://files.pythonhosted.org/packages/30/db/9e38760b32e3e7f40cce46dd5fb107b8c73840df38f0046d8e6514e675a1/pip-19.2.3-py2.py3-none-any.whl (1.4MB) 100% |████████████████████████████████| 1.4MB 666kB/s Installing collected packages: pip Found existing installation: pip 9.0.3 Uninstalling pip-9.0.3: Successfully uninstalled pip-9.0.3 Successfully installed pip-19.2.3 # Djangoのインストール (py36) [django@myserver ~]$ echo "Django~=2.0.6" > requirements.txt (py36) [django@myserver ~]$ pip install -r requirements.txt Collecting Django~=2.0.6 (from -r requirements.txt (line 1)) Downloading https://files.pythonhosted.org/packages/67/b0/64645bd6c5cdabb07d361e568eecfa9e64027ae4cb4778bb00be8c4bde00/Django-2.0.13-py3-none-any.whl (7.1MB) |████████████████████████████████| 7.1MB 1.2MB/s Collecting pytz (from Django~=2.0.6->-r requirements.txt (line 1)) Downloading https://files.pythonhosted.org/packages/87/76/46d697698a143e05f77bec5a526bf4e56a0be61d63425b68f4ba553b51f2/pytz-2019.2-py2.py3-none-any.whl (508kB) |████████████████████████████████| 512kB 489kB/s Installing collected packages: pytz, Django Successfully installed Django-2.0.13 pytz-2019.2 # gunicornをインストールする # Djangoのアプリケイションを外部に公開するために gunicorn を pip からインストールする。 # もともと django は localサーバーで起動させ gnicorn を通してグローバルアドレスに解放させている。 (py36) [django@localhost learning]$ pip install gunicorn Collecting gunicorn Downloading https://files.pythonhosted.org/packages/8c/da/b8dd8deb741bff556db53902d4706774c8e1e67265f69528c14c003644e6/gunicorn-19.9.0-py2.py3-none-any.whl (112kB) |████████████████████████████████| 122kB 892kB/s Installing collected packages: gunicorn Successfully installed gunicorn-19.9.0 #Djangoのバージョン確認 (py36) [django@myserver ~]$ python 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 >>> print(django.get_version()) 2.0.13 >>> (py36) [django@myserver ~]$ pip list Package Version ---------- ------- Django 2.0.13 gunicorn 19.9.0 pip 19.2.3 pytz 2019.2 setuptools 39.2.0 # |
プロジェクトを作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# user djangのホームディレクトリーに環境を設定する。 # 現在の位置を確認 ( user djangのホームディレクトリーに環境を設定する。 [django@myserver learning]$ cd ~ [django@myserver learning]$ pwd /home/django # プロジェクトの作成 名前を learningとする [django@myserver learning]$ django-admin startproject learning 作成状況を確認 [django@localhost learning]$ tree . ├── learning │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py └── manage.py |
プロジェクト learning の設定ファイルを編集
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# ホスト ALLOWED_HOSTS = ['learning.fal.jp.net'] # 公開する Webサーバー名に変更 # タイムゾーン TIME_ZONE = 'Asia/Tokyo' # 言語 LANGUAGE_CODE = 'ja STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'static') MEDIA_URL = '/media/' MEDIA_ROOT = '/usr/share/nginx/html/media' |
データベース等々に必要なマイグレーションを行う
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
migrate の実行 (py36) [django@localhost learning]$ python manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying sessions.0001_initial... OK |
Nginxのインストール
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# Nginx インストール # Epel レポジトリーインストール [django@myserver ~]$sudo yum -y install epel-release #epelからNginxインストール [django@myserver ~]$sudo yum --enablerepo=epel -y install nginx #nginx バージョン確認 [django@myserver ~]$nginx -v nginx version: nginx/1.12.2 # nginx 起動、自動起動設置 [django@myserver ~]$sudo systemctl start nginx [django@myserver ~]$sudo systemctl enable nginx |
Nginxの設定
以前の投稿『Centos7 nginx(with ssl let’s Encrypt) + php + mysql 環境構築』でワイルドカードを用いたSSL証明書を設置していました。その取得した証明書を利用してDjangoで作成するアプリケーションをシリーズで投稿していこうと思います。そこでその環境構築の一段として環境を構築したいと思います。
ここに、NginxのDjango公開のためのSSLのコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
server { listen 80; listen [::]:80; server_name learning.fal.jp.net; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name learning.fal.jp.net; root /usr/share/nginx/html; ssl on; ssl_certificate "/etc/letsencrypt/live/fal.jp.net/fullchain.pem"; ssl_certificate_key "/etc/letsencrypt/live/fal.jp.net/privkey.pem"; location /static/ { alias /xxxx/yyyy/study/static/; access_log off; gzip on; gzip_min_length 1000; gzip_types application/x-javascript text/css; if ($request_filename ~* \.(ico|css|js|gif|jpe?g|png)$) { expires 72h; } } location / { proxy_pass http://127.0.0.1:8000; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X-Forwarded-Proto $scheme; } } |
参考:Let’sEncryptで証明書の取得
1 2 3 4 5 6 7 |
# Let's Encrypt で 証明書を取得する # Nginxの場合証明書を取得したらマニュアルで Nginxの設定をする。 # 証明証は /etc/letsencrypt/ 内に作成される [root@myserver ~]# certbot certonly --standalone -d [証明書を取得したいサイト] # 最近certbot でエラーが出て証明証の発行ができない場合がある様子です。 # Nginx を停止してから実行するとうまくいくようです。 |
Djangoアプリケーションを# gunicornで実行する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# GunicornでDjango # プロジェクトを作成したルートフォルダーに移動 (py36) [django@myserver ~]$ cd ~/learning # 動作確認として「gnuicorn」 で起動してみる。 (py36) [django@myserver learning]$ gunicorn --bind 127.0.0.1:8000 learning.wsgi:application [2019-10-01 07:58:15 +0900] [21714] [INFO] Starting gunicorn 19.9.0 [2019-10-01 07:58:15 +0900] [21714] [INFO] Listening at: http://127.0.0.1:8000 (21714) [2019-10-01 07:58:15 +0900] [21714] [INFO] Using worker: sync [2019-10-01 07:58:15 +0900] [21717] [INFO] Booting worker with pid: 21717 # nginxの設定が完了指定れば https://[バーチャルサーバー]/ でDjangoのサンプルページが表示される # 今回起動した状況を DEAMON (常駐プログラム)で起動する (py36) [django@myserver learning]$ gunicorn --daemon --bind 127.0.0.1:8000 learning.wsgi:application(py36) (py36) [django@myserver learning]$ #これで起動したターミナルを閉じても DjangoのアプリケーションはNginxで表示できる。 # デーモンの確認 (py36) [django@myserver learning]$ sudo ps ax | grep 'gunicorn' 22031 ? S 0:00 /usr/local/bin/python3.7 /****/****/bin/py36/bin/gunicorn --daemon --bind 127.0.0.1:8000 learning.wsgi:application 22034 ? S 0:00 /usr/local/bin/python3.7 /****/****/bin/bin/gunicorn --daemon --bind 127.0.0.1:8000 learning.wsgi:application # 終了するには kill コマンドで対応するデーモンを終了させる。 |