02c. AWS環境構築(CentOS7+Django)

Amazon EC2インスタンス作成

以下の内容でEC2インスタンスを作成しました。
途中でKey Pair作成画面が表示されるので、作成して秘密鍵をダウンロードしておきます。

AMI(Amazonマシンイメージ)Amazon Linux 2 AMI (HVM), SSD Volume Type(CentOS7ベース)
インスタンスタイプt2.micro(1vCPU:2.5GHz Intel Xeon, 1GiBメモリ, 8GiBディスク)

 

固定IPアドレスの設定&ドメインの割り当て

EC2ダッシュボードのメニューからElastic IPをクリックし、新しいIPアドレスを発行します。そのIPアドレスと上記で作成したEC2インスタンスを紐付けます。EC2ダッシュボードのメニューからセキュリティグループをクリックし、SSHに加えて、HTTP/HTTPSとmysql(サーバのIPアドレスのみ)も許可します。
※ Djangoのテスト用で使用するポート8000も一時的に許可しておきます。

Route 53のダッシュボードのメニューからドメインを購入し、上記EC2インスタンスに紐付けます。

参考

 

SSH接続

Teratermを起動して、IPアドレスとユーザ名(ec2-user)を入力、「RSA/DSA鍵を使う」の「秘密鍵」で先ほど作成した「keyPair.pem」を選択してSSH接続

$ sudo yum -y update						# インストール済みのパッケージを最新にアップデートする(セキュリティ的に重要)
$ sudo amazon-linux-extras install epel		# epelリポジトリのインストール
$ yum repolist -q 							# 確認
repo id                       repo name                                         status
amzn2-core/2/x86_64           Amazon Linux 2 core repository                        16,940
amzn2extra-docker/2/x86_64    Amazon Extras repo for docker                             15
amzn2extra-epel/2/x86_64      Amazon Extras repo for epel                                1
epel/x86_64                   Extra Packages for Enterprise Linux 7 - x86_64    13,193+191
$ sudo yum install -y git 					# gitのインストール
$ sudo yum install -y tree 					# ディレクトリ構成確認用

ApacheとMariadbのインストール

$ sudo yum install httpd mariadb mariadb-server
$ httpd -v
Server version: Apache/2.4.39 ()
Server built:   Apr  4 2019 18:09:28
$ mysql --version
mysql  Ver 15.1 Distrib 5.5.62-MariaDB, for Linux (x86_64) using readline 5.1

# httpdとmariadbの起動
$ sudo systemctl start httpd
$ sudo systemctl start mariadb

# 確認
$ sudo systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Sat 2019-09-07 07:45:24 CAT; 15s ago
  :
$ sudo systemctl status mariadb
● mariadb.service - MariaDB database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
   Active: active (running) since Sat 2019-09-07 07:45:34 CAT; 12s ago
  :

# 自動起動の設定
$ sudo systemctl enable httpd
$ sudo systemctl enable mariadb
$ sudo systemctl list-unit-files --type=service | egrep "httpd|mariadb"
httpd.service                                 enabled
mariadb.service                               enabled

http://IPアドレス/でApacheのテストページが表示されることを確認

Djangoインストール

# pyenvのインストール
$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv

# 環境設定ファイルを更新
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
 
# pyenvのアップデート
$ git clone git://github.com/yyuu/pyenv-update.git ~/.pyenv/plugins/pyenv-update
$ pyenv update
 
# 必要なライブラリをインストール
$ sudo yum install gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel

# ※Ubuntuの時にインストールした下記もインストールしましたが、おそらく不要
$ sudo yum install make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
 
# pyenvでpython3.6.8をインストール
$ python --version 				# 初期状態では2.7がインストールされている
Python 2.7.16
$ pyenv install --list

# mod_wsgiライブラリのインストール時に、pythonを共有ライブラリとしてインストールしておく必要がある為、以下のようにインストールしておく(※1)
$ env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.6.8

# python3.6.8をデフォルト設定に
$ pyenv global 3.6.8
$ pyenv versions
  system
* 3.6.8 (set by /home/user01/.pyenv/version)
$ pyenv rehash
$ python --version
Python 3.6.8

# Pythonパッケージ管理ツールpipのインストール
$ sudo yum install python-pip
$ which pip
~/.pyenv/shims/pip

# pipアップデート
$ pip install --upgrade pip
$ pip --version
pip 19.2.3 from /home/ec2-user/.pyenv/versions/3.6.8/lib/python3.6/site-packages/pip (python 3.6)

# Djangoインストール
$ pip install django

# mysqlclientインストール(MySQLdbパッケージがインポート可能になる)
$ sudo yum install mysql-devel
$ pip install mysqlclient

DBとユーザの作成

$ sudo mysql_secure_installation		# 初期設定(rootパスワード設定等)

$ mysql -u root -p
Enter password:
MariaDB> create database testdb;
MariaDB> grant all on testdb.* to test@localhost identified by 'test';
MariaDB> select user from mysql.user;					/* testユーザ登録確認 */
MariaDB> exit

testprjのデプロイ

$ cd /var/www
$ sudo git clone https://github.com/(username)/testprj.git 	# testprjをgit clone
$ sudo chown -R apache:apache testprj
$ cd testprj
$ python manage.py makemigrations testapp			# マイグレーションファイルの作成
$ python manage.py migrate							# マイグレーションを実行

ライブラリのインストール

$ pip install django-bootstrap4
$ pip install Pillow			# 画像処理ライブラリ
$ pip install django-stdimage	# 画像リサイズ用ライブラリ
$ pip install stripe			# 決済用ライブラリ
$ pip list
Package           Version
----------------- ---------
beautifulsoup4    4.8.0
certifi           2019.6.16
chardet           3.0.4
Django            2.2.5			★
django-bootstrap4 1.0.1			★
django-stdimage   5.0.1			★
idna              2.8
mysqlclient       1.4.4			★
Pillow            6.1.0			★
pip               19.2.3		★
pytz              2019.2
requests          2.22.0
setuptools        40.6.2
soupsieve         1.9.3
sqlparse          0.3.0
stripe            2.35.1		★
urllib3           1.25.3

Django起動

$ vi settings.py
ALLOWED_HOSTS = ['*']						# この個所をサーバのホスト名に変更(XXXX.com)

# 管理ユーザを登録
$ cd test
$ python manage.py createsuperuser
Username: admin
Email address: XXXX@gmail.com
Password: **********
Password (again): *********
Superuser created successfully.

$ python manage.py runserver 0.0.0.0:8000	# Djangoアプリ起動

以下にアクセスして起動を確認
http://サーバのIPアドレス:8000
http://サーバのIPアドレス:8000/admin

Apache-Django連携

$ sudo yum install httpd-devel		# apxsコマンドを含むパッケージのインストール(mod_wsgiのインストールに必要)
$ pip install mod_wsgi 				# mod_wsgiインストール
$ chmod 755 /home/XXXX				# wsgiモジュールへのアクセスの為

# 下記wsgi.pyファイルが作成されていることを確認(別の場所に作成された場合、移動する)
$ ls /var/www/testprj/testprj
wsgi.py

備考:mod_wsgiインストール時のエラー内容
Python共有ライブラリとしてインストールしてくださいとのことです。。(※1参照)

$ pip install mod_wsgi
Collecting mod_wsgi
  Using cached https://files.pythonhosted.org/packages/26/03/a3ed5abc2e66c82c40b0735c2f819c898d136879b00be4f5537126b6a4a4/mod_wsgi-4.6.7.tar.gz
Installing collected packages: mod-wsgi
  Running setup.py install for mod-wsgi ... error
    ERROR: Command errored out with exit status 1:
     command: /home/ec2-user/.pyenv/versions/3.6.8/bin/python3.6 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-91ndhz30/mod-wsgi/setup.py'"'"'; __file__='"'"'/tmp/pip-install-91ndhz30/mod-wsgi/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-q1wddphg/install-record.txt --single-version-externally-managed --compile
         cwd: /tmp/pip-install-91ndhz30/mod-wsgi/
    Complete output (178 lines):

    WARNING: The Python installation you are using does not appear to have
    been installed with a shared library, or in the case of MacOS X, as a
    framework. Where these are not present, the compilation of mod_wsgi may
    fail, or if it does succeed, will result in extra memory being used by
    all processes at run time as a result of the static library needing to
    be loaded in its entirety to every process. It is highly recommended
    that you reinstall the Python installation being used from source code,
    supplying the '--enable-shared' option to the 'configure' script when
    configuring the source code prior to building and installing it.

Apacheの設定

$ cd /etc/httpd/conf
$ vi httpd.conf 				# 以下のように変更
$ diff -y --suppress-common-lines httpd.conf.org httpd.conf
ServerAdmin root@localhost                     | ServerAdmin root@testprj-mp.com 		# サイト管理者のメールアドレス
#ServerName www.example.com:80                 | ServerName testprj-mp.com:80			# ドメイン名
DocumentRoot "/var/www/html"                   | DocumentRoot "/var/www/testprj"		# testprjに変更
                                               >
                                               > #Alias /robots.txt /var/www/testprj/robots.txt
                                               > #Alias /favicon.ico /var/www/testprj/favicon.ico
                                               > Alias /static/ /var/www/testprj/skill/static/	# Djangoが静的ファイルを探す場所を指定
                                               > Alias /media/ /var/www/testprj/media/			# Djangoがメディアファイルを探す場所を指定
<directory "/var/www/html">                    | </directory><directory "/var/www/testprj">
    Options Indexes FollowSymLinks             |     Options FollowSymLinks				# ディレクトリのファイル一覧を表示しない
                                               > # Apache-Django連携
                                               > LoadModule wsgi_module /home/ec2-user/.pyenv/versions/3.6.8/l…
                                               > WSGIScriptAlias / /var/www/testprj/testprj/wsgi.py
                                               > WSGIPythonHome /home/XXXX/.pyenv/versions/3.6.8/
                                               > WSGIPythonPath /var/www/testprj
                                               >
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"  |     #ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"		# CGIは利用しないのでコメントアウト
</directory><directory "/var/www/cgi-bin">                 | #</directory><directory "/var/www/cgi-bin">
    AllowOverride None                         | #    AllowOverride None
    Options None                               | #    Options None
    Require all granted                        | #    Require all granted
</directory>                                   | #

$ sudo systemctl restart httpd 		# httpd再起動

以下にアクセスして起動を確認
http://サーバのIPアドレス

※ EC2ダッシュボードのメニューからセキュリティグループをクリックし、Djangoのテスト用で使用したポート8000は、拒否に戻しておきます。

ER図の自動作成(開発環境)

$ sudo apt updateextensionsを有効化

# django-extensionsのインストール
$ sudo apt install graphviz
$ sudo apt install libgraphviz-dev
$ pip install pygraphviz
$ pip install django-extensions

# extensionsを有効化
$ vi settings.py
INSTALLED_APPS += (
    'django_extensions',		# この行を追記
)

# ER図を作成
$ python manage.py graph_models -a -o er.png

WebProgramming入門

タイトルとURLをコピーしました