0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AmazonLinux2 Django、nginx、uwsgi、mysqlの環境作成手順

Last updated at Posted at 2024-06-18

本記事の概要

AmazonLinux2でDjango、nignx、uwsgi、mysqlの環境作成手順化したため、メモも兼ねてこちらに記載します。
最後にSSL化の手順も記載しているので、よければ見てください。

事前準備

EC2のインバウンドルールで443、8000、8001番を追加で設定をお願いします。
IPとドメインの紐付けを行う場合は、ElasticIP適応後、Route53で設定をお願いします。
ElasticIPの設定方法は下記のサイトが非常にわかりやすかったです。
https://qiita.com/Jerid/items/d5dd3a29ed9a0e374493

手順

nginxインストール~起動・確認

sudo amazon-linux-extras install nginx1
nginx -V
sudo systemctl start nginx
sudo systemctl status nginx

mysqlの環境作成

必要なパッケージをインストールします。

sudo yum remove -y mariadb-*
sudo yum localinstall -y https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm
sudo yum install -y --enablerepo=mysql80-community mysql-community-server
sudo yum install -y --enablerepo=mysql80-community mysql-community-devel
sudo systemctl start mysqld 
systemctl status mysqld.service

mysqlのパスワード変更

下記でパスワードを確認する

sudo cat /var/log/mysqld.log

下記のコマンドでログインし、先ほどのパスワードを入力しログイン

mysql -u root -p

パスワードを再設定

set password for root@localhost = 'パスワード';

Djangoで使うDBもついでに作成
今回はmysiteというDB名で作成

create database mysite;

DjangoとDBの連携設定

pip3アップデートおよびバージョン確認を行います(デフォルトで存在するはず)。

python3 -V
pip3 install --upgrade pip
pip3 -V

djangoとDB接続に必要なパッケージをインストールします。

sudo yum install gcc
sudo yum install python3-devel
pip3 install mysqlclient

Djangoの環境を作成します。

#Djangoインストール
pip3 install django
#Djangoのプロジェクト作成
django-admin startproject mysite

vimなどでプロジェクトの設定ファイルを編集します。
※/home/ec2-userでプロジェクト作成した場合は、/home/ec2-user/mysite/mysite/settings.pyのpathに存在します。

setting.py
#編集箇所
ALLOWED_HOSTS = ['*']

#省略

#編集箇所
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':  "mysite",
        'USER':  "root",
        'PASSWORD': "パスワード",
        'HOST': "localhost",
        'PORT': "3306",
    }
}

動作確認

下記のコマンド実行後、http://EC2のIP:8000 へアクセス
Djangoの画面が出ていれば問題ないです。
※DBの連携が行えていない場合は、起動時にエラーが発生するはずです。

python3 manage.py runserver 0.0.0.0:8000

uwsgi起動~nginx連携まで

uwsgiインストール後に起動

pip3 install uwsgi

プロジェクト直下のmanage.pyがあるディレクトリで下記のコマンドを実施

#mysite部分はプロジェクト名が入ります
uwsgi --http :8001 --module mysite.wsgi

uwsgiとnginxを連携

必要なファイルの移動および編集

cd /etc/nginx/
#プロジェクト直下のmanage.pyがあるディレクトリへコピー
sudo cp uwsgi_params /home/ec2-user/mysite
#この後編集を行うため、バックアップ
sudo cp nginx.conf nginx.conf.org

vimなどで/etc/nginx/nginx.confを下記のように編集

nginx.conf
upstream django {
        server 0.0.0.0:8001;
    }

server {
    listen       8000;
    server_name  自分のパブリックアドレス;
    root         /usr/share/nginx/html;
    charset      utf-8;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;
    client_max_body_size 100M;

    location /static {
    alias /home/ec2-user/mysite/static;
    }
    location / {
    uwsgi_pass django;
    include /home/ec2-user/mysite/uwsgi_params;
    }

    error_page 404 /404.html;
    location = /404.html {
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    }
}

再起動を行い変更を反映

sudo systemctl restart nginx

nginxが参照する静的ファイルのディレクトリを作成し、Djangoで設定

setting.pyを編集

setting.py
#追記
import os
STATIC_ROOT = os.path.join(BASE_DIR, "static/")

下記のコマンドを実行し、staticディレクトリへ静的ファイルを格納する

python3 manage.py collectstatic

これでdjango、uwsgi、nginx、mysqlの接続は完了です。

最後に動作確認
http://IP:8000でDjangoの画面が見えれば成功です。

uwsgi --socket :8001 --module mysite.wsgi

SSL化

vimなどで/etc/nginx/nginx.confを下記のように編集して、再起動で反映

nginx.conf
listen       80;
server_name  使用するドメイン名;
sudo systemctl restart nginx

必要なパッケージをインストール

sudo amazon-linux-extras install -y epel
sudo yum install -y certbot
sudo yum install python-certbot-nginx

証明書の発行を行うボットを起動

sudo certbot --nginx

下記の順番で聞かれるので、回答します。

  1. メールアドレス入力
  2. 利用規約に同意 Y
  3. メアドの共有の許可 N
  4. ドメインの入力
  5. httpsをアクティブ化するサーバ名 数字で選択

回答終了後、自動でssl化が割り当てられているはずです。
※自動の割り当てが失敗していれば、下記のようにnginxのconfigを下記のように編集してください。

nginx.conf
listen       443 ssl;
server_name ドメイン名;
ssl_certificate /etc/letsencrypt/live/ドメイン名.change-cloud.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ドメイン名/privkey.pem;

SSLの自動更新

cronでroot権限はあまり使いたくないですが、root権限以外で実行するとエラーになるため、このように記載しています。その他適切な方法があればコメントなどでご教示ください。
※時間は適当に設定してください。

sudo crontab -e
49 4 * * * sudo certbot renew --no-self-upgrade && sudo systemctl restart nginx
sudo systemctl restart crond

以上が作業となります。

感想

最近はdockerなどのイメージファイルで簡単に環境設定ができますが、既存システム等を扱うにあたり、このような知識はまだまだ必要だなと感じました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?