Python3 + mod_wsgi + Apacheの本番化 (CentOS7)
開発環境構築から本番環境構築まで
前回、開発環境の構築までをメモしましたが、今回、本番環境までをメモしたいと思います。今回のメモはコピーできる様にしました。前回分も含めて、繰り返しメモしています。また、pythonの仮想環境場所をopt以下に変更しています。前回同様、とりあえず動作することを目的としているので、セキュリティ対策は全くできていません。この点は今後の課題になります。
実行したコード
powershellで仮想環境作成(Vagrant + Virtualbox)
1 2 3 4 5 6 7 |
cd C:\dev\CentOS7 #仮想設定ファイルの作成 vagrant init centos/7 #Vagrantfileファイルの修正(コメントの解除とipの設定) config.vm.network "private_network", ip: "192.168.33.10" #仮想作成 vagrant up |
Tera Termでのログイン
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 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
#最新化 yum -y update #リポジトリ追加 yum -y install epel-release yum -y install https://repo.ius.io/ius-release-el7.rpm #apacheインストール yum -y install httpd systemctl start httpd systemctl enable httpd cd /var/www chown apache:vagrant html chmod 775 html #postgresqlインストール yum -y install postgresql-server postgresql-setup initdb systemctl enable postgresql.service systemctl start postgresql.service sudo -u postgres psql #postgresqlのDB設定 CREATE DATABASE myapp; CREATE USER myapp_u WITH PASSWORD 'myapp_p'; ALTER ROLE myapp_u SET client_encoding TO 'utf8'; ALTER ROLE myapp_u SET default_transaction_isolation TO 'read committed'; ALTER ROLE myapp_u SET timezone TO 'Asia/Tokyo'; GRANT ALL PRIVILEGES ON DATABASE myapp TO myapp_u; #postgresqlログイン方法の変更 cp /var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/data/pg_hba.conf.org vi /var/lib/pgsql/data/pg_hba.conf //////////// pg_hba.conf(md5への変更)//////////// #TYPE DATABASE USER ADDRESS METHOD #"local" is for Unix domain socket connections only local all all md5 #IPv4 local connections: host all all 127.0.0.1/32 md5 #IPv6 local connections: host all all ::1/128 md5 #Allow replication connections from localhost, by a user with the #replication privilege. #local replication postgres peer #host replication postgres 127.0.0.1/32 ident #host replication postgres ::1/128 ident //////////// pg_hba.conf //////////// #postgresqlログインの確認 systemctl restart postgresql.service sudo -u postgres psql -d myapp -U myapp_u myapp_p #python3インストール yum -y install python36u yum -y install python36u-pip python36u-devel python3.6 -V #python3仮想実行 終了時 deactivate python3.6 -m venv /opt/env/python3 source /opt/env/python3/bin/activate chmod 775 /opt/env/python3 mkdir /var/www/html/web_app cd /var/www/html/web_app #pip自体の最新化 pip install --upgrade pip #djangoのインストール pip install django python import django print(django.get_version()) #postgresql接続モジュールのインストール pip install psycopg2-binary #djangoプロジェクトの作成 django-admin startproject mysite #djangoプロジェクトの設定変更 cd mysite/ vi mysite/settings.py //////////////// settings.py(DB設定他) /////////////// ALLOWED_HOSTS = ["*"] 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'myapp', 'USER': 'myapp_u', 'PASSWORD': 'myapp_p', 'HOST': 'localhost', 'PORT': '', //////////////// settings.py /////////////// #djangoのDB設定 python manage.py makemigrations python manage.py migrate #簡易サーバ実行 python manage.py runserver 192.168.33.10:8000 |
本番環境構築(mod_wsgi)
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 |
#Apache python連携 mod_wsgiインストール yum install -y httpd-devel yum install -y gcc pip install mod_wsgi cp /opt/env/python3/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so /etc/httpd/modules #mod_wsgi の設定 cd /etc/httpd/conf.d/ vi django.conf //////////////// django.conf(DB設定他) /////////////// LoadModule wsgi_module modules/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so WSGIScriptAlias / /var/www/html/web_app/ipg7/ipg7/wsgi.py WSGIPythonPath /var/www/html/web_app/ipg7/ #mod_wsgiを使用する時はstaticを別途指定する必要あり Alias /static/ /var/www/html/web_app/ipg7/trunc/static/ #virutalenvを使用している場合 WSGIPythonHome /opt/env/python3 <Directory /var/www/html/web_app/ipg7/ipg7> <Files wsgi.py> Require all granted </Files> </Directory> //////////////// django.conf /////////////// #ソースのアップロード /var/www/html/web_app cd /var/www/html chmod 777 web_app ここではipg7のアプリ #アプリ用DBの設定 cd /var/www/html/web_app/ipg7 python manage.py makemigrations python manage.py migrate #apache再起動 setenforce 0 systemctl restart httpd |
まとめ
本番環境も簡単でないことを認識しました。pythonの仮想環境を使用することが複雑にしてると思います。ただし、これを使わず、python2をpython3にバージョンアップすれば、python2で動く機能が動作しなくなり、余計に面倒かと。。。 しばらく仮想環境を使う必要があると思います。次はこの知識を持ってAWSかな
参考にしたサイト
★本番化 mod_wsgi
https://qiita.com/dekosuke-menti/items/e416f198980c0fd6e75b
★エラー対応 _psycopg.cpython-36m-x86_64-linux-gnu.so: failed to map segment from shared object: Permission denied
https://serverfault.com/questions/659174/virtualenv-failed-to-map-segment-from-shared-object-permission-denied
★staticが読めない
https://torina.top/detail/287/
★気づいた点
/home/vagrant の権限を777にした場合、sshの接続(RSA/DSA鍵を使う)に影響し接続できなくなる