<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Django - 株式会社yep</title>
	<atom:link href="https://www.ye-p.co.jp/blog_tag/django/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.ye-p.co.jp</link>
	<description>株式会社yepのコーポレートサイト</description>
	<lastBuildDate>Wed, 16 Sep 2026 05:51:59 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</generator>

<image>
	<url>https://www.ye-p.co.jp/wp-content/uploads/2026/06/cropped-アセット-1-32x32.png</url>
	<title>Django - 株式会社yep</title>
	<link>https://www.ye-p.co.jp</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>EC2でNginx+Gunicorn+Django+MySQLを構築</title>
		<link>https://www.ye-p.co.jp/blog/344-2</link>
		
		<dc:creator><![CDATA[kumaki]]></dc:creator>
		<pubDate>Mon, 25 Nov 2024 01:59:49 +0000</pubDate>
				<guid isPermaLink="false">https://www.ye-p.co.jp/blog/344-2</guid>

					<description><![CDATA[<p>【Amazon Linux 2023対応】AWS EC2でNginx+Gunicorn+Django+MySQL環境を構築する方法を初心者向けに解説。 1. はじめに この記事では、AWS EC2インスタンスにNginx [&#8230;]</p>
<p>The post <a href="https://www.ye-p.co.jp/blog/344-2">EC2でNginx+Gunicorn+Django+MySQLを構築</a> first appeared on <a href="https://www.ye-p.co.jp">株式会社yep</a>.</p>]]></description>
										<content:encoded><![CDATA[<div property="schema:text" class="field field--name-body field--type-text-with-summary field--label-hidden field-item">
<p>【Amazon Linux 2023対応】AWS EC2でNginx+Gunicorn+Django+MySQL環境を構築する方法を初心者向けに解説。</p>
<h2 data-id="62c05b7c-52df-4711-9cca-7dbc6e399dea" data-pm-slice="1 1 []" data-toc-id="62c05b7c-52df-4711-9cca-7dbc6e399dea" id="62c05b7c-52df-4711-9cca-7dbc6e399dea">1. はじめに</h2>
<p data-id="4dbe39b1-74d2-47a8-8e69-9a2c2c7a1a29">この記事では、AWS EC2インスタンスにNginx、Gunicorn、Django、MySQLを使ったWebアプリケーション環境を構築する方法を初心者の方にも分かりやすく解説します。これからDjangoで開発したWebアプリケーションを公開したいと考えている方にとって、必須となる知識を網羅的にご紹介します。</p>
<p data-id="9ceb3b51-3226-4ca5-9ca0-2d941a7eac2a">近年、Webアプリケーション開発においてPythonのフレームワークであるDjangoは高い人気を誇っています。Djangoは、データベースとの連携が容易で、セキュリティにも優れており、大規模なWebアプリケーション開発にも対応できる柔軟性を備えています。そして、Djangoで開発したWebアプリケーションを公開するためには、Webサーバーとアプリケーションサーバーが必要です。</p>
<p data-id="276435de-a6a1-41b4-a235-ac7772d4acd8">本記事では、WebサーバーとしてNginx、アプリケーションサーバーとしてGunicornを採用し、データベースにはMySQLを使用します。これらの組み合わせは、高いパフォーマンスと安定性を実現できるため、本番環境での運用にも最適です。</p>
<p data-id="3ee5815b-8cee-4630-b110-1076721f77ea">このチュートリアルでは、Amazon Linux 2023 AMI を使用したEC2インスタンスを前提に、各ソフトウェアのインストールから設定、そしてDjangoアプリケーションのデプロイまで、順を追って丁寧に説明していきます。</p>
<p data-id="81d614b1-f249-488a-be83-12aabac304fe">具体的な手順は以下の通りです。</p>
<ul data-id="c19b94de-4e0e-470b-a5da-3f8d16325059">
<li>
<p data-id="98c5b0b8-9f51-4c8e-81f4-9923f4d791e2">AWSアカウントの作成、EC2インスタンスの起動</p>
</li>
<li>
<p data-id="cd16d78d-d0b6-4b22-bfe0-2d577e90a01f">必要なソフトウェアのインストール</p>
</li>
<li>
<p data-id="d6936bf0-ea43-4577-aa52-8045b8829e93">MySQLデータベースのセットアップ</p>
</li>
<li>
<p data-id="aedbe4ad-f1a7-4b73-835c-ac8167d2fac5">仮想環境の構築、Djangoプロジェクトの作成</p>
</li>
<li>
<p data-id="a48c8d19-5afb-4d1a-86c2-93fc08959f38">Gunicorn、Nginxのインストールと設定</p>
</li>
<li>
<p data-id="ba829186-04f7-43e7-b23b-fd142df3aa13">Djangoアプリケーションのデプロイ</p>
</li>
</ul>
<h3 data-id="96dca11d-0bdf-45bd-a080-78b397fd43d7" data-toc-id="96dca11d-0bdf-45bd-a080-78b397fd43d7" id="96dca11d-0bdf-45bd-a080-78b397fd43d7">本記事の目的と対象読者</h3>
<p data-id="de850d38-93bd-478d-a36e-8cb50dfc212d">本記事は、以下のような方を対象としています。</p>
<ul data-id="1b49cf36-e424-4935-a47c-73f81ed6dc7f">
<li>
<p data-id="9e5629f1-2623-401b-a0db-236d97a94bdd">Djangoで開発したWebアプリケーションをAWS EC2にデプロイしたい方</p>
</li>
<li>
<p data-id="c64782c3-de4b-4a35-bc7f-197b630ecd25">AWSの基礎知識はあるが、EC2での環境構築に慣れていない方</p>
</li>
<li>
<p data-id="5f69101e-eb70-413f-aeed-319141e11775">Webサーバー構築の経験が少ない、または全くない方</p>
</li>
<li>
<p data-id="492f8abe-57e7-4abb-847f-2363af30b817">ポートフォリオとしてAWSで動作するWebアプリケーションを作成したい方</p>
</li>
</ul>
<p data-id="9063bc52-d734-494a-a40e-9472bc132a39">記事全体を通して、コマンド操作や設定ファイルの記述方法などを具体的に示すことで、読者の皆様が実際に手を動かしながら学習を進められるように配慮しています。また、環境構築に必要なソフトウェアのバージョンなども明記することで、環境の違いによるトラブルを最小限に抑えるよう努めています。</p>
<h3 data-id="65b8aeb3-8419-4058-8c02-ba91ca1c42a4" data-toc-id="65b8aeb3-8419-4058-8c02-ba91ca1c42a4" id="65b8aeb3-8419-4058-8c02-ba91ca1c42a4">環境構築の概要</h3>
<p data-id="a2d81bde-4ab1-4588-bd45-e02772abfe0d">この章では、これから構築するWebアプリケーション環境の概要を説明します。この環境は、主に以下の4つの主要コンポーネントで構成され、それぞれが重要な役割を担っています。初心者の方にも理解しやすいように、各コンポーネントの役割と連携について解説します。</p>
<table data-id="d0e6e341-dba7-4e6a-a343-82db506787c8">
<colgroup>
<col>
<col>
	</colgroup>
<tbody>
<tr bgcolor="#d3d3d3">
<td colspan="1" rowspan="1">
<p data-id="445d6df6-51e4-41c6-8631-7f8dc1adfc9d">コンポーネント</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="e1a57a2b-f958-4134-be0f-5d784545be62">役割</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="dbde07a2-4df1-4c9c-a303-21bd4d2ad0bc">Nginx</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="6f62ec34-291c-47a0-9bb3-19146cb5f971"><strong>Webサーバー：静的ファイルの配信、リバースプロキシ</strong><br />
高速で安定したWebサーバーとして、ユーザーからのリクエストを受け付け、静的ファイル（HTML、CSS、JavaScript、画像など）を直接提供します。また、動的なリクエストはGunicornに転送する役割も担います。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="cd57fc17-62d4-47bc-90b7-b5baec41a4ad">Gunicorn</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="c848ad6a-984f-4808-8ddf-b564ca4ae64f"><strong>アプリケーションサーバー：Djangoアプリケーションの実行</strong><br />
PythonのWSGI HTTPサーバーです。Nginxから受け取った動的なリクエストを処理し、Djangoアプリケーションと通信します。複数のDjangoアプリケーションプロセスを管理し、負荷分散やパフォーマンス向上に貢献します。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="3f58a87c-9aa8-4f76-8dc7-081ea7bdb0c9">Django</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="15ac8d8f-a724-4860-a6d8-c63b2886f8e1"><strong>Webアプリケーションフレームワーク</strong><br />
Python製のWebアプリケーションフレームワークです。データベースとの連携、URLルーティング、テンプレートエンジンなど、Webアプリケーション開発に必要な機能を提供します。ビジネスロジックの実装はこのDjangoで行います。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="82b740f9-0926-411e-aebf-395211d9de01">MySQL</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="e17b7ea6-fb05-40c0-b760-8a7725506775"><strong>データベース：アプリケーションデータの保存</strong><br />
データベース管理システム（RDBMS）です。アプリケーションデータの保存、検索、更新、削除などを管理します。堅牢性、信頼性、パフォーマンスに優れており、Webアプリケーション開発で広く利用されています。</p>
</td>
</tr>
</tbody>
</table>
<p data-id="e9cc6295-edee-4c1d-8390-897be4ddc3f1">これらのコンポーネントが連携することで、ユーザーはブラウザからWebアプリケーションにアクセスし、様々な機能を利用することができます。</p>
<ul data-id="a636662c-0f12-4730-a8ef-7790a1daf67b">
<li>
<p data-id="d5c795a2-0bdd-41f8-bb4f-a55b63e0a816">ユーザーがWebアプリケーションにアクセスします。</p>
</li>
<li>
<p data-id="d5d31347-4a1d-4ce2-9b83-e932c72562ed">リクエストはまずNginxに届きます。</p>
</li>
<li>
<p data-id="b64430da-2f17-4697-859f-32351823eb3d">Nginxは静的ファイル（HTML、CSS、JavaScript、画像など）を直接ユーザーに返します。</p>
</li>
<li>
<p data-id="c0aa806d-ab4d-40ad-8f4f-8aca767c7d3c">動的なリクエスト（データベースアクセスが必要なものなど）はGunicornに転送されます。</p>
</li>
<li>
<p data-id="1b8e8716-6bc0-4785-8e93-b9b15c9d9f56">GunicornはDjangoアプリケーションを起動し、リクエストを処理します。</p>
</li>
<li>
<p data-id="ddbbfd44-4285-426b-a646-63544c639996">Djangoは必要に応じてMySQLデータベースと通信し、データを取得または更新します。</p>
</li>
<li>
<p data-id="fa18dc50-38fb-4eb3-94f0-c54f441c9a05">処理結果がGunicorn、Nginxを介してユーザーに返されます。</p>
</li>
</ul>
<p data-id="bb62cdc7-a732-4a52-823a-923aefd15433">この構成により、高速なレスポンス、安定した動作、効率的な開発を実現します。本記事では、これらのコンポーネントをAWS EC2インスタンス上に構築する方法をステップバイステップで解説します。</p>
<h2 data-id="31fcb0ed-d4b3-4857-8dff-ebe5759ab0f4" data-toc-id="31fcb0ed-d4b3-4857-8dff-ebe5759ab0f4" id="31fcb0ed-d4b3-4857-8dff-ebe5759ab0f4">2. AWS EC2インスタンスの作成</h2>
<p data-id="8eb7e74e-aa2a-4baa-8f58-136d6cd66f46">この章では、AWS EC2インスタンスの作成手順を解説します。EC2インスタンスとは、AWSクラウド上で利用できる仮想サーバーのことです。このインスタンス上にDjangoアプリケーションをデプロイしていきます。</p>
<p data-id="77ffd254-f6d7-49bc-b36a-c22456776b74">まず、AWSのアカウントを持っていない場合は、AWS公式サイト（<a href="https://aws.amazon.com/jp/" rel="noopener noreferrer nofollow" target="_blank">aws.amazon.com</a>）からアカウントを作成してください。アカウント作成の手順については、AWS公式ドキュメントを参照することをお勧めします。<br />
<a href="https://aws.amazon.com/jp/register-flow/" rel="noopener noreferrer nofollow" target="_blank">https://aws.amazon.com/jp/register-flow/</a></p>
<p data-id="5497b66e-eca6-453c-93a6-195b3f9fd07a">アカウント作成後、AWSマネジメントコンソールにログインし、EC2サービスを選択します。「インスタンスを起動」をクリックして、インスタンスの作成を開始します。</p>
<h3 data-id="c361af3d-4c57-42df-b0ae-d92b41f8ffde" data-toc-id="c361af3d-4c57-42df-b0ae-d92b41f8ffde" id="c361af3d-4c57-42df-b0ae-d92b41f8ffde">&#8211; <strong>名前とタグ(任意)</strong></h3>
<ul data-id="612ac069-aac4-4cc5-ac73-6f54488797cf">
<li>
<p data-id="8a62991c-9022-4836-a2fd-e2be6206951a">インスタンスに識別用のタグを付けることができます（例：「Name」タグに「MyInstance」などを指定）。ご自身で判別しやすいものを付けましょう。</p>
</li>
</ul>
<h3 data-id="a205b9c8-5776-4e3a-bb41-1cf49cb7bf05" data-toc-id="4c453d19-f3e1-47f9-87d3-14bb6604e8d0" id="a205b9c8-5776-4e3a-bb41-1cf49cb7bf05">&#8211; Amazon マシンイメージ (AMI) の選択</h3>
<p data-id="704945d9-e47f-4462-941b-177c0f3a8698">本記事ではAmazon Linux 2023を利用するため、「クイックスタート」タブで 「Amazon Linux 2023 AMI」を探し、選択します。AMIは仮想サーバーのOSとなるもので、Amazon Linux 2023はAWSが提供する安定したLinuxディストリビューションです。</p>
<h3 data-id="6bea3b54-7a32-444c-8266-afab65dd42db" data-toc-id="6bea3b54-7a32-444c-8266-afab65dd42db" id="6bea3b54-7a32-444c-8266-afab65dd42db">&#8211; インスタンスタイプの選択</h3>
<p data-id="65fb3fb4-eb46-43aa-a8e3-b5545762f746">t2.micro を選択します。t2.micro は無料利用枠の対象となるインスタンスタイプで、学習や小規模なアプリケーションに適しています。必要に応じて、より高性能なインスタンスタイプを選択することも可能です。</p>
<h3 data-id="1046d441-e30b-4a70-a33e-b9dcf6b15143" data-toc-id="1046d441-e30b-4a70-a33e-b9dcf6b15143" id="1046d441-e30b-4a70-a33e-b9dcf6b15143">&#8211; キーペアの選択・作成</h3>
<p data-id="e26455a7-7009-4162-9ec7-acc2a2480d2e">インスタンスにSSH接続するために使用します。既存のキーペアを使用することも、新規に作成することもできます。<br />
EC2インスタンスに安全に接続するために、キーペアの作成は必須の手順です。キーペアは公開鍵と秘密鍵のペアで構成されます。公開鍵はEC2インスタンスに保存され、秘密鍵は手元で厳重に管理する必要があります。秘密鍵がないとインスタンスに接続できないため、大切に保管しましょう。</p>
<p data-id="e6015042-4480-4580-9762-c9ff6a86cb07">キーペアの作成手順は以下のとおりです。</p>
<ol data-id="7d3acaf4-1158-4826-9bcd-278505afcaaf">
<li>
<p data-id="284adef9-cb92-4ee1-af1d-e0fe7da45211">「新しいキーペアの作成」をクリック</p>
</li>
<li>
<p data-id="353a3277-f81d-41b4-a332-e203e50d06ad">キーペアの名前を入力します。（例：my-keypair）</p>
</li>
<li>
<p data-id="90a0f7f1-d53c-418d-bd94-006025959cf6">キーペアのタイプを選択します。RSAが推奨されています。</p>
</li>
<li>
<p data-id="a44037e5-723c-47d5-9ca5-96d33ac5d144">「キーペアを作成」ボタンをクリックします。</p>
</li>
<li>
<p data-id="7402f8a5-6273-414e-9598-bd56f7357e3d">秘密鍵ファイル（.pem）が自動的にダウンロードされます。このファイルは非常に重要で、紛失するとインスタンスにアクセスできなくなります。安全な場所に保管してください。ダウンロード後は、この画面でもう一度ダウンロードすることはできません。</p>
</li>
</ol>
<p data-id="ce025d7b-62ff-4be6-8ceb-0e7579b968e9">各項目の詳細については下記に記載します。</p>
<table data-id="f5564815-1e72-4856-95c0-48cf2ccfbb83">
<colgroup>
<col>
<col>
	</colgroup>
<tbody>
<tr bgcolor="#d3d3d3">
<td colspan="1" rowspan="1">
<p data-id="f930c285-1c73-4018-a917-441babd812d0">項目</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="22e48714-390e-452a-a0a0-4aa73f0808c9">説明</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="742734ba-46f9-4198-befb-21dc61aa7912">キーペア名</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="91037d18-fa33-40f1-b68a-e695d73650be">任意の名前を付けます。後から識別しやすい名前が良いでしょう。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="1af8b5d7-eb81-4bee-b38c-5b10d36c849f">キーペアタイプ</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="7203d8a7-dd1a-41c0-b6c1-5809a8fa9382">RSAが推奨されています。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="eac6a7e6-6131-4a4f-88e0-51090ebf187f">秘密鍵ファイル</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="08d453db-f7c1-4d69-818b-ad67f94b0c93">インスタンスへのアクセスキーとなります。<strong>絶対に無くさないように！</strong></p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="e9644d8e-b106-438f-b2af-d61a474cb055">プライベートキーファイル形式</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="73e4d534-500c-4fed-bf4b-bec96fb25fc3"><strong>PEM形式（.pem）</strong></p>
<p data-id="a6b0085b-65da-4ad7-bebf-bb9560b54feb">デフォルトの形式で、OpenSSHやLinux、macOSのsshコマンドでそのまま利用可能です。<br />
LinuxやmacOSで利用する際は権限設定に注意してください。</p>
<p data-id="fd181a92-406a-4540-b0a0-6906b4f3e9d7"><strong>PPK形式（.ppk）</strong></p>
<p data-id="fadfcc99-e153-42b5-b941-8532256d66aa">PuTTY（Windows向けのSSHクライアント）で使用する形式です。</p>
</td>
</tr>
</tbody>
</table>
<p data-id="d0418d4e-65d0-4e8a-8a62-04582d247a69">秘密鍵ファイルは、他の人と共有したり、公開リポジトリにアップロードしたりしないでください。もし秘密鍵が漏洩した場合、誰でもあなたのインスタンスにアクセスできてしまうため、セキュリティ上のリスクとなります。</p>
<h3 data-id="46b76dbf-8266-4c0d-af2f-c29f1fc8b500" data-toc-id="df90a740-50dc-4db0-afe4-8fe425385ae2" id="46b76dbf-8266-4c0d-af2f-c29f1fc8b500">&#8211; ネットワーク設定(セキュリティグループの設定)</h3>
<p data-id="aea4b822-cdb8-4204-82a1-d095bb277e13">ここではセキュリティグループを設定のみ記載します。その他の設定については必要に応じて行ってください。セキュリティグループは、インスタンスへのアクセスを制御する仮想ファイアウォールです。最低限、SSH(ポート22)、HTTP(ポート80)、HTTPS(ポート443)へのアクセスを許可するルールを設定します。以下の表に設定例を示します。</p>
<table data-id="4ec3bee5-daa8-471d-a4f0-dfe8244244ad">
<colgroup>
<col>
<col>
<col>
<col>
<col>
	</colgroup>
<tbody>
<tr bgcolor="#d3d3d3">
<td colspan="1" rowspan="1">
<p data-id="5984654b-94c8-47f2-85e7-64af3bad4957">タイプ</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="dcf224c8-c845-450c-bf1c-daa7ca9d8f23">プロトコル</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="00852787-b478-490e-89f1-dde5800c8b92">ポート範囲</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="ab935b61-377d-4171-ac36-e80863806aa1">ソース</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="5db3e580-4da3-4222-80a4-ede96e492194">説明</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="e480976f-4a71-4657-a83d-1d78b00ae041">SSH</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="36e4a3aa-9e4c-47a0-9155-af733fb628ce">TCP</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="bfffe04f-30fa-4bcb-ad77-9a96418bdf48">22</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="1f9fbc9a-356a-4a39-96f7-c82c18bed811">自分のIP</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="af4fdff1-870a-45b6-9d64-78a83d819380">SSH接続用</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="b7c8f42f-f85d-493d-b689-3c7b73cd3aef">HTTP</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="c5d581b8-b870-470a-b912-71164961bcf1">TCP</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="790f3863-89e7-4b79-8186-a2780583b80d">80</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="9368d220-46cb-4431-9fa7-6c7a83b708da">0.0.0.0/0</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="dfcd74d6-d40d-41d9-8351-baa4e57b33b6">HTTPアクセス用</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="8a634554-17c4-4749-9f0b-fbfa68279b31">HTTPS</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="a5caf996-3884-4109-b576-ea99ed8b3248">TCP</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="9c507aff-abc3-44d3-8d4b-8926b52083ce">443</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="43267a29-2cda-4c83-a7f6-0b22f072174f">0.0.0.0/0</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="072f347b-9b91-498e-a2c9-0003d31e95dc">HTTPSアクセス用</p>
</td>
</tr>
</tbody>
</table>
<p data-id="973a321e-775b-4cd8-8ced-78f9e3e29ec4">ソースの「自分のIP」は自分のパソコンのグローバルIPアドレスに置き換えてください。「0.0.0.0/0」は全てのIPアドレスからのアクセスを許可することを意味します。セキュリティを考慮すると、アクセス元を制限することが望ましいです。<br />
上記を設定することで、EC2インスタンスへのSSH接続を自分のIPからのみに制限することができます。</p>
<p data-id="22ab6bdc-93d6-4ee2-a1e9-2c105f1a2c14">各ルールの設定について詳しく説明します。</p>
<ul data-id="f666bc1e-323a-4f38-a8d9-c092b5e2e864">
<li>
<p data-id="6d7266f1-02ad-4adf-bd48-1110f45f5dd5">SSH：自身のIPアドレスからのみSSH接続を許可することで、不正アクセスを防ぎます。自身のIPアドレスがわからない場合は、Google検索等で「自分のIPアドレス」と検索することで確認できます。</p>
</li>
<li>
<p data-id="9aff02f6-71df-44a9-b5b5-901d5f60a6a4">HTTP：Webブラウザからのアクセスを許可します。「ソース」には、「0.0.0.0/0」を指定することで、どこからでもアクセスできるようにします。ただし、後ほどNginxを導入しHTTPS通信を設定するため、一時的な設定となります。</p>
</li>
<li>
<p data-id="e134c181-a95c-4b1a-9bde-8a6a4b9ca5cb">HTTPS：SSL/TLSで暗号化された通信を許可します。「ソース」には、「0.0.0.0/0」を指定し、どこからでもアクセスできるようにします。</p>
</li>
</ul>
<p data-id="857ba788-a09c-4882-a060-f85b593b46c8">これらの設定により、必要な通信のみを許可し、不要なアクセスを遮断することで、セキュリティを強化できます。</p>
<p data-id="e37c7452-7efc-466d-a684-4398383c1085">後ほど、Nginxの設定が完了したら、HTTP(80)へのアクセスを遮断し、HTTPS(443)のみを許可するようにセキュリティグループを編集することを推奨します。これにより、より安全な環境を構築できます。</p>
<h3 data-id="c0309a3e-1e5f-4def-ae54-556f145bab51" data-toc-id="c0309a3e-1e5f-4def-ae54-556f145bab51" id="c0309a3e-1e5f-4def-ae54-556f145bab51">&#8211; ストレージの設定</h3>
<p data-id="dc0e7c07-4768-466a-b831-d2e39b5afce1">ストレージの設定についてはデフォルト設定の8GiBのままで問題ありません。必要に応じて変更可能です。</p>
<h3 data-id="744af53e-d762-4faf-b1c6-beaf49f5b88c" data-toc-id="744af53e-d762-4faf-b1c6-beaf49f5b88c" id="744af53e-d762-4faf-b1c6-beaf49f5b88c">&#8211; インスタンスの起動</h3>
<p data-id="cd18c2b8-7f85-4aff-9752-852e9378c3f7">設定項目を確認し、「インスタンスの起動」をクリックすることでインスタンスが起動されます。</p>
<p data-id="a1fcc30a-4d8d-44ad-a350-f56e60fdd932">インスタンスが起動すると、EC2ダッシュボードのインスタンスリストに表示されます。起動が完了し「実行中」状態になるのを確認した後、SSHクライアントやAWSの「接続」機能を使って接続します。</p>
<h3 data-id="a24b36c8-052a-4f9b-b997-46d54ce6122c" data-toc-id="a24b36c8-052a-4f9b-b997-46d54ce6122c" id="a24b36c8-052a-4f9b-b997-46d54ce6122c">&#8211; インスタンスへの接続確認</h3>
<p data-id="3db39da6-ad77-4f1b-8b34-d7a22d224538">作成したEC2インスタンスにターミナルからSSH接続します。接続コマンドは、AWSコンソールから確認できます。(インスタンス → 作成したインスタンスを選択 → 「接続」をクリック)<br />
接続に失敗した場合、セキュリティグループの設定や、インスタンスの起動状態を確認しましょう。</p>
<p data-id="a4f9680e-59a8-4d00-84cf-f65c7d1f8e32">下記コマンドの一例</p>
<pre><code>ssh -i "your-keypair.pem" ec2-user@your-ec2-public-ip-address</code></pre>
<p data-id="9c836e8a-8781-46cb-9eb9-97fca96d34d3">以上で、EC2インスタンスの作成は完了です。</p>
<p data-id="777dfea4-4cdf-4172-aed4-d9b62666a90a">使い終わったらインスタンスを停止または終了(削除)させて、課金されないようにしましょう。無料利用枠の条件を超えた場合、課金対象になります。</p>
<h2 data-id="13b3dc30-ecf6-48a4-a7ca-02a9c4437beb" data-toc-id="13b3dc30-ecf6-48a4-a7ca-02a9c4437beb" id="13b3dc30-ecf6-48a4-a7ca-02a9c4437beb">3. 環境構築の準備</h2>
<p data-id="64eed024-77db-448c-9f9b-a197221b9987">接続できたら、まずはシステムの更新です。以下のコマンドを実行し、パッケージリストを最新の状態に更新し、インストール済みのパッケージをアップグレードします。</p>
<pre><code>sudo yum update -y
</code></pre>
<p data-id="890b2930-1f35-42b9-8ff9-4d49bbaae0b9">次に、Python3とpipをインストールします。Amazon Linux 2023では、Python3がデフォルトでインストールされている可能性があります。念のため、バージョンを確認し、インストールされていない場合はインストールします。</p>
<pre><code>python3 --version
sudo yum install python3 -y
</code></pre>
<p data-id="c6501fe3-78e8-46f2-b599-55d5a56efda2">pipも同様に、インストールされていない場合はインストールします。</p>
<pre><code>pip3 --version
sudo yum install python3-pip -y
</code></pre>
<p data-id="97347d2e-7eb4-45e6-bfa1-590492542ee4">データベースに接続するために、MySQLクライアントをインストールします。</p>
<pre><code>sudo yum install mysql -y
</code></pre>
<p data-id="449184ee-0c53-4abf-bed1-4bbdd155cde4">最後に、Gitをインストールします。Gitはバージョン管理システムであり、コードの変更履歴を管理するために使用されます。</p>
<pre><code>sudo yum install git -y
</code></pre>
<p data-id="3c0944d6-d084-47d4-9ced-a08d344930f7">これらのツールがインストールされたことで、Djangoアプリケーションのデプロイに必要な環境が整いました。次のステップでは、MySQLのセットアップに進みます。</p>
<h3 data-id="04c0e9b5-9cf5-4ff4-830a-5ebf2ff16a12" data-toc-id="04c0e9b5-9cf5-4ff4-830a-5ebf2ff16a12" id="04c0e9b5-9cf5-4ff4-830a-5ebf2ff16a12">SSH接続</h3>
<p data-id="3184b184-6b9b-4236-8557-a7e3585662fe">EC2インスタンスの作成が完了したら、次はインスタンスへのSSH接続です。SSH接続とは、暗号化された通信路を用いて安全にリモートサーバーにアクセスするための手段です。この接続を通じて、コマンドの実行やファイルの編集など、サーバーの操作を行うことができます。</p>
<p data-id="dec952cd-1bc8-476e-9115-64d18bdfe2cf">SSH接続には、主に以下の情報が必要です。</p>
<table data-id="8b10cf61-0134-458f-83d9-6405054e0867">
<colgroup>
<col>
<col>
	</colgroup>
<tbody>
<tr bgcolor="#d3d3d3">
<td colspan="1" rowspan="1">
<p data-id="857a096e-e73c-405f-8e48-fdec2d61ad49">項目</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="f7d6e42e-cd2b-40dd-bd36-f29cbc913bbc">説明</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="8df14ef4-5e7c-4659-988c-c9a31e779b41">パブリックIPアドレス/パブリックDNS</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="7532a349-a16b-4150-8f2c-c310eb01a684">EC2インスタンスが公開されているIPアドレスまたはDNS名。AWSマネジメントコンソールで確認できます。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="a6a66e9b-0fac-474a-8ec3-ad108268248f">ユーザー名</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="676ceca8-88c8-4446-85e9-77a26ebbfd63">接続に使用するユーザー名。Amazon Linux 2023では、デフォルトで<code>ec2-user</code>が使用されます。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="3fb74442-bbc5-4152-980a-a889d03e7cfb">キーペア(秘密鍵)</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="c76645b9-50e0-4419-9950-9859797be487">インスタンス作成時に指定したキーペア。<code>.pem</code>ファイルとしてローカルマシンに保存されています。</p>
</td>
</tr>
</tbody>
</table>
<p data-id="86c6f07a-ae45-4c9a-aa2b-f7480c3b2c6a">これらの情報を使用して、ターミナルまたはSSHクライアントから接続します。</p>
<p data-id="9b0bbf25-ba8b-4dea-b71c-cefe3cb03481">ターミナルからの接続例（Linux/macOS）：</p>
<pre><code>ssh -i "キーペア名.pem" ec2-user@パブリックIPアドレス または パブリックDNS
</code></pre>
<p data-id="29116eb2-dcf6-46c7-8272-f24e3fe3c168">Windowsを使用している場合は、Tera TermやPuTTYなどのSSHクライアントを使用する必要があります。クライアントの設定画面で、上記の情報を入力して接続します。</p>
<p data-id="9a92572c-0543-4681-bfbf-569aa1e82bda">秘密鍵の取り扱いには注意が必要です。<br />
他人に知られないように安全な場所に保管し、パーミッションを適切に設定することが重要です。<br />
具体的には、秘密鍵のパーミッションを<code>400</code>（所有者のみ読み取り可能）に設定することを推奨します。<br />
chmod 400 キーペア名.pem<br />
もし、秘密鍵を紛失した場合、EC2インスタンスへのアクセスができなくなる可能性があります。<br />
その場合は、新しいキーペアを作成し、インスタンスに紐づけるか、インスタンスを再作成する必要があります。</p>
<p data-id="004bc422-e57b-4263-8b52-0ad98e7db67f">SSH接続に成功すると、コマンドプロンプトが表示され、EC2インスタンス上でコマンドを実行できるようになります。<br />
これで、サーバー環境の構築を進める準備が整いました。</p>
<h3 data-id="dc9b10db-13eb-486f-b920-21a357652e42" data-toc-id="dc9b10db-13eb-486f-b920-21a357652e42" id="dc9b10db-13eb-486f-b920-21a357652e42">システム更新</h3>
<p data-id="139709e1-bf47-49e4-96c5-7b995d889fa4">EC2インスタンスにSSH接続後、最初に行うべき重要な作業は、システムの更新です。システムの更新を行うことで、既知の脆弱性を修正し、セキュリティを向上させるだけでなく、最新のパッケージや機能を利用できるようになります。これは安定した動作とセキュリティの確保に不可欠です。</p>
<p data-id="f4f4226d-ab68-4fbb-b4d7-82126fd83bb6">更新作業は大きく分けて2つのステップで行います。まず、パッケージデータベースを更新し、次にシステム全体をアップグレードします。</p>
<ol data-id="906ec492-9133-485a-acc2-03a4409b9114">
<li>
<p data-id="a7ba7a55-66ce-40eb-b591-624529fea8ca">パッケージデータベースの更新</p>
</li>
</ol>
<p data-id="61af4bb9-0dac-4181-a9f5-e0d9f0aef802">パッケージデータベースには、利用可能なパッケージの情報が保存されています。このデータベースを更新することで、システムは最新のソフトウェアバージョンを認識できるようになります。Amazon Linux 2023では、<code>yum</code>コマンドを使用してパッケージデータベースを更新します。以下のコマンドを実行してください。</p>
<pre><code>sudo yum update -y
</code></pre>
<p data-id="dfae1107-eebf-4c82-ac0f-bc65a6a0200c"><code>-y</code>オプションは、すべての質問に対して自動的に「はい」と回答することを意味します。これにより、更新作業をスムーズに進めることができます。</p>
<ol data-id="bd744066-73a1-4338-9d4f-c9fb3ac622e6" start="2">
<li>
<p data-id="37631471-2f3a-4c01-a068-7dbdcb4591bf">システム全体のアップグレード</p>
</li>
</ol>
<p data-id="d3ae6eaa-4b27-4400-a624-6f54ae4fdb2c">パッケージデータベースの更新が完了したら、システム全体をアップグレードします。これにより、古いバージョンのソフトウェアが最新バージョンに置き換えられます。以下のコマンドを実行してください。</p>
<pre><code>sudo yum upgrade -y
</code></pre>
<p data-id="f12e8505-017e-48fb-ab51-5e3f364dc277">こちらも<code>-y</code>オプションを使用して、すべての質問に自動的に「はい」と回答します。アップグレードには時間がかかる場合があるので、完了するまで待ちましょう。</p>
<table data-id="92787d70-52ea-4c38-9679-18354edb1a85">
<colgroup>
<col>
<col>
	</colgroup>
<tbody>
<tr bgcolor="#d3d3d3">
<td colspan="1" rowspan="1">
<p data-id="46cfc055-02f3-417b-bab4-e87edddcd691">コマンド</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="2e399aca-209f-4b2a-9b78-025aa7816541">説明</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="cfe17c21-ac45-4a68-a3f0-e2d58552ab8e"><code>sudo yum update -y</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="ad14b287-6733-4fe1-9ca2-4204b89fa9f7">パッケージデータベースの更新</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="7c6c2bca-7412-4f5d-a679-bb8b50ee7bbc"><code>sudo yum upgrade -y</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="3bb04e73-bf66-4933-9853-f1490ff18544">システム全体のアップグレード</p>
</td>
</tr>
</tbody>
</table>
<p data-id="e8817c36-33a5-4f8b-92bf-443caeb6f348">これらのコマンドを実行することで、システムが最新の状態に保たれ、セキュリティと安定性が向上します。システム更新は定期的に行うことが推奨されます。</p>
<h3 data-id="69d84faa-0706-4dd8-8393-c70c424068a1" data-toc-id="69d84faa-0706-4dd8-8393-c70c424068a1" id="69d84faa-0706-4dd8-8393-c70c424068a1">Python3とpipのインストール</h3>
<p data-id="f0e1d12f-1e5e-4b9b-9a10-e8530cbe49ca">この章では、Djangoアプリケーションを実行するために必要なPython3と、Pythonパッケージを管理するためのツールであるpipをインストールします。Amazon Linux 2023では、Python3はデフォルトでインストールされている場合がありますが、最新バージョンではない可能性があります。pipも同様に、インストールされていない、または古いバージョンである可能性があります。そのため、ここでは明示的にPython3とpipのインストール、またはアップデート手順を説明します。</p>
<p data-id="91d8600a-1ae4-4d25-8054-04a199b3c2b4">Python3のインストール確認とバージョンアップ</p>
<p data-id="ffa37bb2-cb05-406d-ae49-7e0b8f7c99f0">まず、Python3がインストールされているか、そしてバージョンを確認します。</p>
<pre><code>python3 --version
</code></pre>
<p data-id="9a28ad09-8f6c-4e43-a7eb-a9e10b5ba7d1">もしPython3がインストールされていなければ、以下のコマンドでインストールします。既にインストールされている場合は、この手順はスキップできます。</p>
<pre><code>sudo yum install python3
</code></pre>
<p data-id="56530d2b-3214-4ae0-909e-8fec304815b5">pipのインストール</p>
<p data-id="5c35f5ff-2556-4fa3-bb99-8c8f90d86f38">次に、pipをインストールします。pipはPythonパッケージを管理するためのツールで、Djangoやその他の必要なライブラリをインストールするために使用します。</p>
<pre><code>sudo yum install python3-pip
</code></pre>
<p data-id="6fd38604-cefe-4f3d-adb4-45eccaaae9a5">pipのバージョン確認とアップデート</p>
<p data-id="5eabd25b-df22-4d54-a6c5-a0ee4809affc">pipが正しくインストールされたか、バージョンを確認します。</p>
<pre><code>pip3 --version
</code></pre>
<p data-id="3fe22d3d-437f-49b8-9af1-7a9b8d31977e">古いバージョンである場合、または何らかの理由でpipが動作しない場合は、以下のコマンドでpipをアップグレードすることをお勧めします。</p>
<pre><code>pip3 install --upgrade pip
</code></pre>
<p data-id="38e27cc9-b6d5-4266-bd1c-dcbad0c2677b">これで、Python3とpipのインストールが完了しました。次の章では、MySQLクライアントのインストールについて説明します。</p>
<h3 data-id="26b19d34-a875-402e-a574-c9b6379b5f02" data-toc-id="26b19d34-a875-402e-a574-c9b6379b5f02" id="26b19d34-a875-402e-a574-c9b6379b5f02">MySQLクライアントのインストール</h3>
<p data-id="adf08297-25a2-47b3-a7d7-66aff9983c91">DjangoアプリケーションからMySQLデータベースにアクセスするには、MySQLクライアントが必要です。MySQLクライアントは、MySQLサーバーに接続し、クエリを実行するためのコマンドラインツールを提供します。Amazon Linux 2023では、<code>mysql</code>コマンドを使用してクライアントにアクセスできます。</p>
<p data-id="fee46f96-52e3-4a5b-94c0-f9082585316c">MySQLクライアントは、MySQLサーバーとは別のソフトウェアです。データベースサーバーに接続して操作を行うために必要です。Djangoアプリケーションがデータベースとやり取りするためにも、このクライアントがインストールされている必要があります。</p>
<p data-id="f740dbbe-34e1-489b-9a19-ec784462b097">Amazon Linux 2023では、<code>yum</code>パッケージマネージャーを使用してMySQLクライアントをインストールできます。以下のコマンドを実行することで、必要なパッケージがインストールされます。</p>
<pre><code>sudo yum install mysql
</code></pre>
<p data-id="5b05b202-532d-4e74-a8ee-9e17b329e0fc">このコマンドを実行すると、システムはMySQLクライアントの最新バージョンをダウンロードし、インストールします。インストールが完了したら、<code>mysql --version</code>コマンドを実行して、正しくインストールされているか確認できます。</p>
<p data-id="7b0c2b38-44d6-4c63-b1ba-f2f1354f7b31">もしMySQLサーバーも同時にインストールする場合は、MySQLサーバーのパッケージも一緒にインストールされますので、クライアントの個別インストールは不要です。</p>
<p data-id="56ad934d-90f7-4d85-bd9c-7928493cc995">MySQLクライアントがインストールされると、以下のコマンドでMySQLサーバーに接続を試すことができます。</p>
<pre><code>mysql -u &lt;ユーザー名&gt; -p &lt;データベース名&gt; -h &lt;ホスト名 or IPアドレス&gt; -P &lt;ポート番号&gt;
</code></pre>
<p data-id="c9c80aa3-218c-48c9-b3b0-4238de52ccb4"><code>&lt;ユーザー名&gt;</code>、<code>&lt;データベース名&gt;</code>、<code>&lt;ホスト名 or IPアドレス&gt;</code>、<code>&lt;ポート番号&gt;</code>は、接続先のMySQLサーバーの情報に合わせて適宜変更してください。パスワードが設定されている場合は、プロンプトで入力するように求められます。</p>
<p data-id="b5e89d57-86c0-404a-ae29-d10fab97c750">接続に成功すると、MySQLのシェルプロンプトが表示され、SQLクエリを実行できるようになります。</p>
<p data-id="339338f6-39a2-4b52-bf5d-c65e15fd8011">クライアントのインストールが完了したら、Djangoアプリケーションの設定ファイル(<code>settings.py</code>)でデータベース接続情報を設定し、アプリケーションを起動すれば、データベースとの接続が確立されます。</p>
<h3 data-id="75d89708-8532-4832-a2e5-fb8211162376" data-toc-id="75d89708-8532-4832-a2e5-fb8211162376" id="75d89708-8532-4832-a2e5-fb8211162376">Gitのインストール</h3>
<p data-id="5c79ae3e-cc66-4212-9629-1d3d4d90f009">DjangoのプロジェクトをGitHubからクローンしてくるために、まずはGitをインストールします。Gitはバージョン管理システムであり、ソースコードの変更履歴を記録・管理し、複数人での開発を容易にするためのツールです。Amazon Linux 2023では、以下のコマンドでGitをインストールできます。</p>
<pre><code>sudo yum install git
</code></pre>
<p data-id="bd96a8cd-9df0-4cf4-8a6a-984dac78759d">インストールが完了したら、以下のコマンドでGitのバージョンを確認し、正しくインストールされていることを確認しましょう。</p>
<pre><code>git --version
</code></pre>
<p data-id="387f161d-945c-479c-a55c-2e983c0e6e5d">Gitがインストールできたら、GitHubからプロジェクトをクローンするための準備として、SSHキーペアを作成します。SSHキーペアは公開鍵と秘密鍵のペアで、安全にGitHubと通信するための認証情報です。以下のコマンドでSSHキーペアを作成します。</p>
<pre><code>ssh-keygen -t rsa
</code></pre>
<p data-id="6e5ca4da-7e13-44b7-8bd7-09e6a425a92b">コマンドを実行すると、キーの保存場所とパスフレーズを聞かれます。保存場所はデフォルトのままで問題ありません。パスフレーズは設定することもできますが、今回は設定せずにエンターキーを押して先に進みます。</p>
<p data-id="7a37f3fc-54f0-480a-8c3f-643f3e27f7a1">公開鍵はGitHubに登録し、秘密鍵はEC2インスタンスに保存します。以下のコマンドで公開鍵の内容を表示し、コピーします。</p>
<pre><code>cat ~/.ssh/id_rsa.pub
</code></pre>
<p data-id="37d537ee-3f21-4d04-9501-10a584eb0658">コピーした公開鍵の内容を、GitHubのアカウント設定画面にある「SSH and GPG keys」セクションから新しいSSHキーとして登録します。</p>
<p data-id="b92d5849-8023-4cd7-9239-a573823eeb74">これでGitHubからプロジェクトをクローンする準備が整いました。</p>
<h2 data-id="3e69b009-3015-47dd-998a-8774575022f1" data-toc-id="3e69b009-3015-47dd-998a-8774575022f1" id="3e69b009-3015-47dd-998a-8774575022f1">4. MySQLのセットアップ</h2>
<p data-id="2ce56fbc-1ec6-4ebf-9507-f4db33d6b52f">この章では、データベースシステムであるMySQLをEC2インスタンスにインストールし、Djangoアプリケーションで使用するデータベースとユーザーを作成、必要な権限を付与する手順を説明します。データベースはアプリケーションのデータを保存するために必須の要素です。</p>
<p data-id="e1db7612-09db-4998-ba29-4997e9893e93">まず、MySQLをインストールします。以下のコマンドを実行することで、MySQL 8.0がインストールされます。</p>
<pre><code># MySQL yumリポジトリからMySQL8.0のRPMパッケージをダウンロード
sudo yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm 

# MySQLのGPGキーの有効期限切れの可能性があるため、新しいGPGキーをインポートする
sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

# MySQLのインストール
sudo yum install --enablerepo=mysql80-community mysql-community-server -y

# MySQLバージョン確認
mysql --version
</code></pre>
<p data-id="4c96eae9-6106-40b3-ac80-a584631d8fe4">インストールが完了したら、MySQLを起動し、起動時に自動的に起動するよう設定します。</p>
<pre><code># MySQLの起動
sudo systemctl start mysqld.service

# 起動確認
systemctl status mysqld.service

# サーバー起動時にMySQLを自動起動するよう設定
sudo systemctl enable mysqld.service
</code></pre>
<p data-id="2860f31d-3b87-415c-9d2b-58b2c7fc5827">次に、初期パスワードを確認しMySQLに接続します。初期パスワードは<code>/var/log/mysqld.log</code>に出力されています。セキュリティのため、接続後すぐにパスワードを変更します。</p>
<pre><code># 初期パスワードを確認する
sudo cat /var/log/mysqld.log

# MySQLへ接続する（上記で確認したパスワードを入力する）
mysql -u root -p

# パスワードを変更する（変更しないと他のエラーになる）
ALTER USER 'root'@'localhost' IDENTIFIED BY '新パスワード'; 
</code></pre>
<p data-id="53e78db0-31c0-479a-9301-8a4b332fed63">データベースとユーザーを作成し、権限を付与します。データベース名、ユーザー名、パスワードは適宜変更してください。</p>
<pre><code># DBを作成する
CREATE DATABASE db_name;

# ユーザーを作成する
CREATE USER 'myapp'@'%' IDENTIFIED BY 'password';

# 作成したユーザーにすべての操作権限を付与
GRANT ALL ON db_name.* TO 'myapp'@'%';

# 設定の反映
FLUSH PRIVILEGES;
</code></pre>
<p data-id="75bf534d-3725-45a6-b6f4-b4654ddded9e">これでMySQLのセットアップは完了です。Djangoアプリケーションからこのデータベースに接続できるようになります。</p>
<h3 data-id="9989313a-a436-4d6c-b05b-861ba891ebeb" data-toc-id="9989313a-a436-4d6c-b05b-861ba891ebeb" id="9989313a-a436-4d6c-b05b-861ba891ebeb">MySQLサーバーのインストール</h3>
<p data-id="9f8ea541-98e3-44eb-9ea8-172cba238652">この章では、永続的なデータ保存のために必要なMySQLサーバーをEC2インスタンスにインストールする方法を解説します。Amazon Linux 2023では、MySQL 8.0をyumコマンドで簡単にインストールできます。</p>
<p data-id="cc7a2e2b-06a5-410b-bfb0-4eb715e81320">まず、MySQLのyumリポジトリを追加します。以下のコマンドを実行することで、MySQL 8.0のRPMパッケージをダウンロードできます。</p>
<pre><code>sudo yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
</code></pre>
<p data-id="5749e81b-6a01-41f3-82e9-26b719562653">次に、MySQLのGPGキーをインポートします。GPGキーは、パッケージの信頼性を保証するために使用されます。</p>
<pre><code>sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
</code></pre>
<p data-id="ccbc0ac1-4a9c-4cb3-9e78-88141d8561e1">上記のコマンドで新しいGPGキーをインポートします。</p>
<p data-id="a4b515f8-5ac7-4462-be94-2247e45aef60">これで、MySQL 8.0をインストールする準備が整いました。以下のコマンドを実行して、MySQLサーバーをインストールします。</p>
<pre><code>sudo yum install --enablerepo=mysql80-community mysql-community-server -y
</code></pre>
<p data-id="7d08327b-cd2c-463e-a85e-aff3a8e84d70">インストールが完了したら、MySQLのバージョンを確認します。</p>
<pre><code>mysql --version
</code></pre>
<p data-id="43e460f4-ec9b-4b51-a5b3-c57c72ffb377">MySQLサーバーを起動します。</p>
<pre><code>sudo systemctl start mysqld.service
</code></pre>
<p data-id="72c1f185-4387-4989-8090-458d8da26988">起動を確認します。</p>
<pre><code>systemctl status mysqld.service
</code></pre>
<p data-id="c30779b8-2ea5-4e60-86e6-be7668fd9748">サーバー起動時にMySQLを自動起動するよう設定します。</p>
<pre><code>sudo systemctl enable mysqld.service
</code></pre>
<p data-id="28c5b259-b4eb-4125-889c-da5681feff0e">インストールが成功すると、MySQLサーバーが起動し、データベースを使用できるようになります。次の章では、データベースとユーザーを作成し、Djangoアプリケーションと連携するための設定を行います。</p>
<h3 data-id="16b5a011-8e8b-4241-bd5e-8a41f24a4cb6" data-toc-id="16b5a011-8e8b-4241-bd5e-8a41f24a4cb6" id="16b5a011-8e8b-4241-bd5e-8a41f24a4cb6">MySQLデータベースの作成</h3>
<p data-id="b3672e9f-1614-42ed-9a30-d10963d25729">この章では、Djangoアプリケーションと連携するためのMySQLデータベースの作成、ユーザーの作成、そして必要な権限の付与方法について解説します。データベースはアプリケーションデータの保存場所として必須となる重要な要素です。適切な設定を行うことで、データの整合性とセキュリティを確保できます。</p>
<p data-id="579e6f01-2050-4759-98db-1d81c7580537">まず、MySQLに接続します。MySQLサーバのインストール後、初期パスワードは<code>/var/log/mysqld.log</code>に記載されています。このパスワードを使用して、rootユーザーとしてMySQLに接続します。</p>
<pre><code>sudo cat /var/log/mysqld.log  # 初期パスワードの確認
mysql -u root -p  # MySQLへの接続 (パスワードを入力)
</code></pre>
<p data-id="dcd92b54-b3db-4663-b2bf-ce967b0c4aa6">接続後、セキュリティ強化のため、rootユーザーのパスワードを必ず変更してください。変更しないと、以降の操作でエラーが発生する可能性があります。</p>
<pre><code>ALTER USER 'root'@'localhost' IDENTIFIED BY '新パスワード';  # パスワードの変更
</code></pre>
<p data-id="37bea813-e4f4-4c2c-94ab-2049a40e2399">次に、Djangoアプリケーション用のデータベースを作成します。データベース名は任意の名前で構いませんが、ここでは<code>db_name</code>とします。</p>
<pre><code>CREATE DATABASE db_name;  # データベースの作成
</code></pre>
<p data-id="179ef229-7eee-4091-94e5-8111184d8004">データベースを作成したら、Djangoアプリケーションからデータベースにアクセスするための専用ユーザーを作成し、適切な権限を付与します。ユーザー名とパスワードは任意のものを設定できますが、ここではユーザー名を<code>myapp</code>、パスワードを<code>password</code>とします。</p>
<pre><code>CREATE USER 'myapp'@'%' IDENTIFIED BY 'password';  # ユーザーの作成
GRANT ALL ON db_name.* TO 'myapp'@'%';  # 権限の付与
FLUSH PRIVILEGES;  # 設定の反映
</code></pre>
<p data-id="2d378b92-a0c7-47a9-9679-0f3d4eab9312">上記のコマンドは、<code>myapp</code>というユーザーを作成し、<code>db_name</code>データベースのすべてのテーブルに対する全ての操作権限を与えています。<code>'%'</code>は、どのホストからも接続を許可することを意味します。セキュリティ上の観点から、必要に応じて接続元IPアドレスを制限することを検討してください。例えば、EC2インスタンスのIPアドレスに制限する場合は<code>'%'</code>をEC2インスタンスのパブリックIPアドレスに置き換えます。</p>
<p data-id="bc8fb27e-20dc-454d-b12a-7c0628bfb372">設定が完了したら、<code>exit</code>コマンドでMySQLから切断します。これで、Djangoアプリケーションに必要なデータベースとユーザーが作成され、権限が設定されました。</p>
<h3 data-id="608da2c3-bf1c-455b-b943-ccbde4cf8ff4" data-toc-id="608da2c3-bf1c-455b-b943-ccbde4cf8ff4" id="608da2c3-bf1c-455b-b943-ccbde4cf8ff4">ユーザーの作成と権限付与</h3>
<p data-id="b733f4e4-adc2-4301-bca4-2d2581cfe5bb">データベースにアクセスするためのユーザーを作成し、適切な権限を付与します。<br />
MySQLでは、rootユーザー以外にアプリケーション専用のユーザーを作成することを推奨しています。<br />
以下の手順でユーザーを作成し、必要な権限を付与します。<br />
まずMySQLにrootユーザーでログインします。</p>
<pre><code>mysql -u root -p
</code></pre>
<p data-id="414a69b9-89f0-4ad1-a169-3226404f637c">パスワードを聞かれるので、設定したパスワードを入力します。</p>
<p data-id="d58d743b-9a0a-4e9c-8ed7-630526bf93e3">次に、データベースを作成します。データベース名は任意ですが、ここでは<code>db_name</code>とします。</p>
<pre><code>CREATE DATABASE db_name;
</code></pre>
<p data-id="599bd54e-0c4e-4a42-97d1-6ff1d76a7ea5">そして、Djangoアプリケーションからデータベースにアクセスするためのユーザーを作成します。<br />
ユーザー名とパスワードは任意のものを設定できます。<br />
ここではユーザー名を<code>myapp</code>、パスワードを<code>password</code>とします。<br />
ワイルドカード<code>%</code>を使うことで、どのホストからでもアクセスできるようになります。<br />
開発環境ではこれで問題ありませんが、本番環境ではセキュリティ上のリスクがあるので、アクセスを許可するホストを指定するようにしましょう。</p>
<pre><code>CREATE USER 'myapp'@'%' IDENTIFIED BY 'password';
</code></pre>
<p data-id="b8457f5a-255f-49be-9275-abf979aee427">作成したユーザー<code>myapp</code>に、データベース<code>db_name</code>へのすべての権限を付与します。</p>
<pre><code>GRANT ALL ON db_name.* TO 'myapp'@'%';
</code></pre>
<p data-id="833e4865-3ae9-4c2c-9b59-a8b6188d63c2">最後に、権限設定を反映させます。</p>
<pre><code>FLUSH PRIVILEGES;
</code></pre>
<p data-id="e4891510-1120-4fa8-be88-441a16377c07">これで、Djangoアプリケーションからデータベースにアクセスするためのユーザーの作成と権限付与が完了しました。<br />
上記で設定したデータベース名、ユーザー名、パスワードは、Djangoプロジェクトの<code>settings.py</code>でデータベース接続設定を行う際に使用します。</p>
<h2 data-id="1d8dd7dc-a22c-4712-a632-40f4e87cd252" data-toc-id="1d8dd7dc-a22c-4712-a632-40f4e87cd252" id="1d8dd7dc-a22c-4712-a632-40f4e87cd252">5. 仮想環境の作成とDjangoのインストール</h2>
<p data-id="25e6e073-aa3d-426d-a965-72dfcac934cf">この章では、Pythonの仮想環境を作成し、Djangoをインストールする方法を説明します。仮想環境を作成することで、プロジェクトごとに必要なライブラリを隔離し、依存関係の競合を防ぐことができます。</p>
<ol data-id="ed013d39-39d5-4f67-9a59-224ea872c7f2">
<li>
<p data-id="2666fbb3-ce84-4a2e-a78f-43c90ef3347c">仮想環境の作成</p>
</li>
</ol>
<p data-id="0f5d0e49-47e0-4753-9653-7821ed06d816">仮想環境の作成には、<code>venv</code>を使用します。<code>venv</code>はPython標準ライブラリに含まれているため、追加のインストールは不要です。まず、ターミナルまたはコマンドプロンプトでプロジェクトのルートディレクトリに移動します。次に、以下のコマンドを実行して仮想環境を作成します。</p>
<pre><code>python3 -m venv .venv
</code></pre>
<p data-id="a1f68f6d-5204-43f9-adb5-0a44092c996d"><code>.venv</code>という名前のディレクトリが作成され、仮想環境が構築されます。この名前は任意ですが、<code>.venv</code>は一般的な慣習です。</p>
<ol data-id="19ad89b6-af6b-43a2-b388-e14f98edbae4" start="2">
<li>
<p data-id="24b93c7a-b40f-403c-acf8-5f249bb0a782">仮想環境のアクティベート</p>
</li>
</ol>
<p data-id="5adb0618-665c-4d1b-973a-a246a4a19982">仮想環境を使用するには、アクティベートする必要があります。アクティベートのコマンドはOSによって異なります。</p>
<table data-id="30cdfb67-6bc9-46dc-8999-15144f3123f2">
<colgroup>
<col>
<col>
	</colgroup>
<tbody>
<tr bgcolor="#d3d3d3">
<td colspan="1" rowspan="1">
<p data-id="86681c0c-27b0-4542-a0c1-f1b3b14a7fc6">OS</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="3c2ef14f-cf5b-4a3f-b117-ac012f65a67d">コマンド</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="474e66fb-5694-4a3a-ac48-fda985956d85">Linux/macOS</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="145758fd-7e31-45a8-ab73-415b0bca9b4d"><code>source .venv/bin/activate</code></p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="c89beeb3-0815-4cc3-b9ec-aa3c2fa11632">Windows</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="0a51026b-77e1-4b98-9c21-6277930ec147"><code>.venv\Scripts\activate</code></p>
</td>
</tr>
</tbody>
</table>
<p data-id="943d256b-d1cd-4dd7-90d1-449a5c6133ec">アクティベートが完了すると、プロンプトの先頭に<code>(venv)</code>が表示されます。</p>
<ol data-id="6d14f68f-4178-4821-a06d-cc222c23619b" start="3">
<li>
<p data-id="cf286708-b530-4dec-944b-b92cf20fc9f0">Djangoと関連パッケージのインストール</p>
</li>
</ol>
<p data-id="54a03df3-3ed2-48c5-a798-b27a4fe55533">仮想環境がアクティベートされた状態で、以下のコマンドを実行してDjangoと必要なパッケージをインストールします。</p>
<pre><code>pip install django django-environ dj-database-url
</code></pre>
<p data-id="f57f8b0f-038e-4110-b1c7-83f9034b5290"><code>django-environ</code>は環境変数を扱うためのパッケージ、<code>dj-database-url</code>はデータベースURLをパースするためのパッケージです。</p>
<ol data-id="982a37ec-8669-466f-993b-e4fcbbf7db90" start="4">
<li>
<p data-id="3ee860b0-3b9c-493d-90b5-afd492a2a11a">Djangoプロジェクトの作成</p>
</li>
</ol>
<p data-id="5dc19c44-e57f-4039-9bd5-d98daa4b6d12">Djangoプロジェクトを作成するには、以下のコマンドを実行します。</p>
<pre><code>django-admin startproject testapp .
</code></pre>
<p data-id="dae36868-b6c5-4218-ae49-ae9f8e29fe79"><code>.</code>を指定することで、現在のディレクトリにプロジェクトが作成されます。</p>
<ol data-id="4721e9e5-d72b-4f07-a11d-9e53313234aa" start="5">
<li>
<p data-id="c9cdd4ee-ee03-4696-a88e-a01258f82618">settings.pyの編集</p>
</li>
</ol>
<p data-id="469fbbd8-acce-4bec-85e3-0e3444b5f321">プロジェクトを作成したら、<code>settings.py</code>を編集します。データベースの設定や、インストールしたアプリの追加などを行います。データベースの設定は、MySQLを使用する場合は以下のようになります。</p>
<pre><code>DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'データベース名',
        'USER': 'ユーザー名',
        'PASSWORD': 'パスワード',
        'HOST': 'ホスト名',
        'PORT': 'ポート番号',
    }
}
</code></pre>
<ol data-id="58bf43c8-9429-4beb-aca6-7776183e9007" start="6">
<li>
<p data-id="8a905248-b3db-4450-8070-74da448f9122">データベースのマイグレーション</p>
</li>
</ol>
<p data-id="d4e06ef5-7786-4f9e-b266-e85e89dcf114">データベースの設定が完了したら、以下のコマンドを実行してデータベースをマイグレーションします。</p>
<pre><code>python manage.py migrate
</code></pre>
<ol data-id="6f4fdb56-9c59-46ba-b49f-5a7e0242a237" start="7">
<li>
<p data-id="b2ac26ae-2759-43a8-a02d-52c27f67d401">Django管理ユーザーの作成</p>
</li>
</ol>
<p data-id="14ec6eb1-6e63-4d4b-a430-154d06f7b99c">最後に、Djangoの管理ユーザーを作成します。以下のコマンドを実行し、指示に従ってユーザー名、メールアドレス、パスワードを入力します。</p>
<pre><code>python manage.py createsuperuser
</code></pre>
<p data-id="eb9ad7ff-dd89-44c9-82d1-bf417a17c400">これで、Djangoのインストールと初期設定が完了しました。</p>
<h3 data-id="3ea016f7-5616-42d3-95dc-d78a4466473e" data-toc-id="3ea016f7-5616-42d3-95dc-d78a4466473e" id="3ea016f7-5616-42d3-95dc-d78a4466473e">virtualenvのインストールと仮想環境の作成</h3>
<p data-id="5f3edc73-71b5-465d-a6d4-cfc27e898767">Djangoプロジェクトを開発する際には、仮想環境の構築が推奨されます。仮想環境は、プロジェクトごとに独立したPython環境を提供するため、ライブラリの依存関係やバージョン間の競合を回避できます。</p>
<p data-id="22635576-91e7-4df7-a1c4-26052e010373">今回は<code>virtualenv</code>を使って仮想環境を構築します。<code>virtualenv</code>は、Pythonで仮想環境を作成するためのツールです。</p>
<p data-id="6244fd22-b9b1-4b3d-8612-4182232e36c9">まず、<code>virtualenv</code>がインストールされていない場合は、pipを使ってインストールします。</p>
<pre><code>pip install virtualenv
</code></pre>
<p data-id="af7c92e5-e9c4-4912-b7db-f7ab55a8c415">次に、プロジェクトのルートディレクトリに移動し、以下のコマンドを実行して仮想環境を作成します。ここでは、仮想環境の名前を<code>.venv</code>としています。</p>
<pre><code>virtualenv .venv
</code></pre>
<p data-id="4336ce97-6ebb-44ac-8f81-05bccfb20563">このコマンドを実行すると、<code>.venv</code>という名前のディレクトリが作成され、その中に仮想環境に必要なファイルが配置されます。</p>
<p data-id="ecf29e74-547a-40be-b9fa-45273508eede">仮想環境をアクティベートするには、以下のコマンドを実行します。</p>
<table data-id="7a45cee0-f1c0-47ed-9ac2-5532c94e9473">
<colgroup>
<col>
<col>
	</colgroup>
<tbody>
<tr bgcolor="#d3d3d3">
<td colspan="1" rowspan="1">
<p data-id="2f53c764-c290-4b21-b505-0de7052175e4">OS</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="e432977c-cf9a-4d0f-a8d5-ff286e09516a">コマンド</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="c682c0c3-7d0a-44b0-b7c1-a7de3c6e1221">Linux/macOS</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="6fa7a212-f9b2-4062-aaa0-3c2680028183"><code>source .venv/bin/activate</code></p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="7cd79406-63cd-4c7d-8116-3ab2b4695b06">Windows</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="a42b5cb1-1aeb-4caa-9279-ea5f46825ffe"><code>.venv\Scripts\activate</code></p>
</td>
</tr>
</tbody>
</table>
<p data-id="cf85723e-b30d-4a6b-a318-245f4641b9a9">仮想環境がアクティベートされると、プロンプトの前に<code>(venv)</code>のように仮想環境名が表示されます。</p>
<p data-id="3d3e9fcf-6a84-46e0-ac64-244c9c25e076">仮想環境がアクティベートされた状態で<code>pip</code>コマンドを実行すると、仮想環境内にライブラリがインストールされます。</p>
<p data-id="a8877d8e-17f7-40f4-a66c-9b0ad002a27f">仮想環境をディアクティベートするには、<code>deactivate</code>コマンドを実行します。</p>
<pre><code>deactivate
</code></pre>
<p data-id="093f8fb0-80c9-4d8d-8027-5f92dedc8a4c">このように仮想環境を利用することで、プロジェクトごとに必要なライブラリをインストールし、他のプロジェクトへの影響を気にすることなく開発を進めることができます。</p>
<h3 data-id="828e03e1-770a-417c-b0b9-53507611bf66" data-toc-id="828e03e1-770a-417c-b0b9-53507611bf66" id="828e03e1-770a-417c-b0b9-53507611bf66">Djangoと関連パッケージのインストール</h3>
<p data-id="fb23330e-32e1-4181-b490-be7a65b86f70">この章では、Djangoのインストールと、プロジェクトの作成、初期設定、データベースのマイグレーションといった、Webアプリケーション開発の土台となる部分を解説します。</p>
<p data-id="f5d141ba-0e0a-4574-afac-abaf4fd1d0c0">まず、仮想環境を作成します。仮想環境とは、プロジェクトごとに独立したPython環境のことです。これにより、プロジェクト間の依存関係の競合を防ぎ、開発をスムーズに進めることができます。<code>virtualenv</code>コマンドで仮想環境を作成し、<code>source</code>コマンドで有効化します。</p>
<p data-id="2e45549c-f9d8-4399-9ef3-5c27005f5e29">次に、Djangoと必要なパッケージをインストールします。<code>pip install -r requirements.txt</code>コマンドを使用することで、プロジェクトに必要なパッケージを一括でインストールできます。requirements.txtファイルには、プロジェクトで使用するパッケージ名とバージョンが記載されています。もし、<code>mysqlclient</code>のインストールでエラーが発生する場合は、MySQLの開発用パッケージをインストールする必要があります。</p>
<table data-id="5b55d05a-84ca-4ccc-91e7-87f147ca7eb9">
<colgroup>
<col>
<col>
	</colgroup>
<tbody>
<tr bgcolor="#d3d3d3">
<td colspan="1" rowspan="1">
<p data-id="1bf383f1-4f24-43ea-ab57-4918578a6026">コマンド</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="66d9ce1f-b865-454e-b388-2b698e509790">説明</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="94aa43b4-aca8-41e0-b219-7819d7fe44e6"><code>sudo pip3 install mysql-devel</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="a212cbe8-e0f0-4b97-aee3-871468f82ee4">MySQLの開発用パッケージをインストールします。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="d6522f91-5d3e-4e49-b4b9-b09e3f0852ea"><code>sudo pip3 install --upgrade pip setuptools</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="4d5b152e-d77e-48ca-bbfc-2868b0562418">pipとsetuptoolsをアップグレードします。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="ba69a913-9c10-471f-ab08-7b5688d235a9"><code>sudo yum install python3-devel</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="f500df6a-3a34-4a1e-ab2d-d33155ca8f0d">Python3の開発用パッケージをインストールします。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="c07ef5f7-b87b-4727-995d-a1b2fd0929eb"><code>sudo yum install gcc</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="18e4c57d-8dba-4630-9bcb-52376dc21946">Cコンパイラgccをインストールします。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="5b056933-181b-44e6-b4cb-032fec0e27b8"><code>pip install -r requirements.txt</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="7ec6926c-49cd-4ce0-a566-2d9b62e54ce7">プロジェクトに必要なパッケージを一括インストールします。</p>
</td>
</tr>
</tbody>
</table>
<p data-id="5a2b4809-3d53-480b-af6e-6c593a2dd11d">続いて、Djangoプロジェクトを作成します。<code>django-admin startproject プロジェクト名</code>コマンドで新しいプロジェクトを作成できます。プロジェクトが作成されたら、<code>cd</code>コマンドでプロジェクトディレクトリに移動します。</p>
<p data-id="4db4a826-042b-4128-bcc1-c642640e5cac">次に、データベースの設定を行います。<code>settings.py</code>ファイルを開き、DATABASES設定をMySQL用に変更します。<code>NAME</code>にはデータベース名、<code>USER</code>にはユーザー名、<code>PASSWORD</code>にはパスワード、<code>HOST</code>にはデータベースサーバーのホスト名またはIPアドレス、<code>PORT</code>にはポート番号を指定します。</p>
<p data-id="54534d17-e32b-4f15-a040-3fadb3bed47d">最後に、データベースのマイグレーションを実行します。<code>python manage.py makemigrations</code>コマンドでマイグレーションファイルを作成し、<code>python manage.py migrate</code>コマンドでデータベースに適用します。</p>
<h3 data-id="46a75513-dac4-4e5e-870a-4b55180cab23" data-toc-id="46a75513-dac4-4e5e-870a-4b55180cab23" id="46a75513-dac4-4e5e-870a-4b55180cab23">Djangoプロジェクトの作成</h3>
<p data-id="20050952-2150-43cd-b078-d138d2298b4f">Djangoプロジェクトは、<code>django-admin</code>コマンドを使って作成します。このコマンドは、プロジェクトに必要なファイルやディレクトリを自動的に生成してくれます。</p>
<p data-id="9148704f-295f-4f2f-b60a-5daa23024a33">プロジェクトを作成する際には、プロジェクトの名前を指定する必要があります。プロジェクト名は、自由に決めることができますが、わかりやすい名前をつけるようにしましょう。</p>
<p data-id="4b572ebc-8eb0-4280-b23d-fb53f977994c">今回は<code>mysite</code>という名前でプロジェクトを作成します。以下のコマンドを実行してください。</p>
<pre><code>django-admin startproject mysite
</code></pre>
<p data-id="8667f7dd-96ff-41bc-b006-121c7a77d952">コマンドを実行すると、カレントディレクトリに<code>mysite</code>というディレクトリが作成されます。このディレクトリの中に、プロジェクトに必要なファイルやディレクトリが格納されています。</p>
<p data-id="439cd74a-2388-45c4-ae23-c9eaf8808a78">作成されたディレクトリ構成は以下のようになります。</p>
<table data-id="347b84e6-821f-49eb-aa83-0e349b588e18">
<colgroup>
<col>
<col>
	</colgroup>
<tbody>
<tr bgcolor="#d3d3d3">
<td colspan="1" rowspan="1">
<p data-id="35bcf195-0be8-4362-b938-a0d0fc1043de">ファイル/ディレクトリ</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="16049e44-3b40-4407-9627-e2c51771a49c">説明</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="790584ad-8c31-4e6b-8e02-1c055e9c36ca"><code>manage.py</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="ed7d908c-a6bc-44a9-ab15-9a9c5582ff83">プロジェクトを管理するためのコマンドラインユーティリティです。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="c141fecc-f42d-4f07-8c8f-7dabd4b2d055"><code>mysite/</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="b3e8a725-cad9-4514-956c-09f4bcd23e95">プロジェクトのメインディレクトリです。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="272446a4-ee8c-47f7-95ad-9bf4a31621da"><code>__init__.py</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="3c88ff4c-ea1f-4dec-9ab0-53a50d1fe34d">このディレクトリをPythonパッケージとして認識させるための空のファイルです。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="0b163d51-4332-44da-906f-55f32edb32b0"><code>asgi.py</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="6f91beec-86f4-4ee2-868d-5fe41b9e4650">ASGIアプリケーションのエントリーポイントです。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="ddbc417a-1287-4322-ac2f-5863a4a9c10b"><code>settings.py</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="3e988baf-2d94-4336-bf4f-21e32e684645">プロジェクトの設定ファイルです。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="3d5e5614-f99f-4481-a90d-4d0243d47902"><code>urls.py</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="de47d22b-9947-446a-b1ab-cead4e901bfe">URLルーティングの設定ファイルです。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="75db5f9b-84ff-4649-acb1-99fb44f905d4"><code>wsgi.py</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="6b6ac7ac-e695-48ec-a261-da89d9c1972a">WSGIアプリケーションのエントリーポイントです。</p>
</td>
</tr>
</tbody>
</table>
<p data-id="0ca9247b-2980-480b-a7b5-40ec9970d74e">この中で、<code>settings.py</code>はデータベースの設定やアプリケーションの設定など、プロジェクト全体の設定を管理する重要なファイルです。<code>urls.py</code>は、URLとビューの対応関係を定義するファイルです。これらのファイルは、プロジェクトの動作を制御するために重要な役割を果たしますので、必要に応じて編集します。</p>
<h3 data-id="416a3bd2-b372-43fc-9cd9-63b19cf37aee" data-toc-id="416a3bd2-b372-43fc-9cd9-63b19cf37aee" id="416a3bd2-b372-43fc-9cd9-63b19cf37aee">settings.pyの編集 (データベース設定など)</h3>
<p data-id="cb6b2567-6446-4f97-90a5-86c542a7ecb3">Djangoプロジェクトの設定ファイルである<code>settings.py</code>には、データベース接続情報やセキュリティキーなど、プロジェクトの重要な設定が記述されています。ここでは、安全なデータベース接続と外部からの攻撃を防ぐための設定変更について解説します。</p>
<p data-id="0dd23e11-1bb2-40f1-b5d5-1a4950c5bca8">まず、<code>.env</code>ファイルを利用して機密情報を<code>settings.py</code>から分離します。<code>.env</code>ファイルには、データベースの接続情報やシークレットキーなどの公開したくない情報を記述します。</p>
<p data-id="bc2d922e-712a-453f-b403-f8819e6d8d03"><code>.env</code>ファイルを作成し、以下の内容を記述します。</p>
<pre><code>SECRET_KEY=ご自身のSECRET_KEY
DEBUG=False # 本番環境では必ずFalseに設定
DATABASE_URL=mysql://ユーザー名:パスワード@ホスト名/データベース名
ALLOWED_HOSTS='*' #一時的にすべて許可。適切に設定してください。
</code></pre>
<p data-id="ebda9998-532e-4efe-8fa2-aa762f977fd5"><code>SECRET_KEY</code> はランダムな文字列を設定してください。<code>DEBUG</code> は本番環境では必ず <code>False</code> に設定します。<code>ALLOWED_HOSTS</code> には、アクセスを許可するホスト名を指定します。開発中は一時的に &#8216;*&#8217; を設定できますが、本番環境では適切なホスト名を設定してください。</p>
<p>次に、<code>settings.py</code> を編集し、<code>.env</code> ファイルから値を読み込むように変更します。</p>
<pre><code>import environ
import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


env = environ.Env()
env.read_env(os.path.join(BASE_DIR, '.env')) # .envファイルの読み込み

SECRET_KEY = env('SECRET_KEY')
DEBUG = env('DEBUG')
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS')

DATABASES = {
    'default': env.db(),
}
</code></pre>
<p data-id="35ad213d-20e0-4755-ac6d-8e20c6f0d8e8"><code>environ</code> パッケージを使用して <code>.env</code> ファイルから環境変数を読み込みます。<code>SECRET_KEY</code>、<code>DEBUG</code>、<code>ALLOWED_HOSTS</code>、<code>DATABASES</code> の設定を <code>.env</code> ファイルから読み込んだ値で上書きします。<code>DATABASES</code> の設定は、<code>.env</code> ファイルの <code>DATABASE_URL</code> からデータベース接続情報を取得します。</p>
<p data-id="6611ad76-0c19-43c7-b15e-080ecc7ce57b">このように設定することで、<code>settings.py</code> に機密情報を直接記述する必要がなくなり、セキュリティを向上させることができます。</p>
<h3 data-id="10ee104d-0f0d-4598-8f16-7c24f2ef98b3" data-toc-id="10ee104d-0f0d-4598-8f16-7c24f2ef98b3" id="10ee104d-0f0d-4598-8f16-7c24f2ef98b3">データベースのマイグレーション</h3>
<p data-id="ca30645a-9df7-49ec-9f60-e1af90230caa">Djangoでデータベースを使用するためには、マイグレーションという作業が必要です。マイグレーションとは、models.pyで定義したモデルの構造をデータベースに反映させる操作のことです。この作業により、Djangoは定義したモデルに基づいてデータベースにテーブルを作成したり、変更したりすることができます。</p>
<p data-id="1fc54e07-9589-46fd-a635-f9b3f06044f6">マイグレーションを行うには、以下のコマンドをプロジェクトのルートディレクトリで実行します。</p>
<pre><code>python manage.py makemigrations
</code></pre>
<p data-id="190f75be-8808-494b-bd73-4e3a7e671278">このコマンドを実行すると、Djangoはmodels.pyの変更を検出し、マイグレーションファイルを作成します。マイグレーションファイルは、データベースに変更を加えるためのSQL文が記述されたファイルです。</p>
<p data-id="4e3bd26c-5d0b-458f-a20f-77fe68c02daf">次に、以下のコマンドを実行して、マイグレーションファイルをデータベースに適用します。</p>
<pre><code>python manage.py migrate
</code></pre>
<p data-id="4c6bbc3c-2100-4b67-bf32-bf35f5eb88e9">このコマンドを実行すると、Djangoはマイグレーションファイルに記述されたSQL文を実行し、データベースに変更を加えます。</p>
<p data-id="7f9dabea-4a14-4eb1-ae26-41c3da6615d9">マイグレーションが成功すると、データベースにモデルに対応するテーブルが作成されます。</p>
<table data-id="82e93738-7ed5-474b-96f6-5d3310a42abf">
<colgroup>
<col>
<col>
	</colgroup>
<tbody>
<tr bgcolor="#d3d3d3">
<td colspan="1" rowspan="1">
<p data-id="a5e6dbc0-edfc-4727-915a-374eab97b45c">コマンド</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="7cb1ea83-5a85-438d-9598-a9fbfc278f20">説明</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="173cc1dc-94c5-4b8c-a773-c94ea4aa2cc8"><code>python manage.py makemigrations</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="589b2caa-d4bb-404e-9720-8de8313a25c2">models.pyの変更を検出し、マイグレーションファイルを作成します。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="c3ae44d5-ee75-4999-83a0-ec4e6a56e08f"><code>python manage.py migrate</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="a4fb4f04-6768-4e85-b6dd-39bdd86d4f21">マイグレーションファイルをデータベースに適用します。</p>
</td>
</tr>
</tbody>
</table>
<p data-id="4973b1ca-beff-46e0-9fc1-5ee64136fd14">これらのコマンドは、プロジェクトのルートディレクトリで実行する必要があります。</p>
<p data-id="107ee626-118c-426e-985d-6223f45124ba">Djangoのマイグレーション機能は、データベースのスキーマ変更を簡単かつ安全に行うための強力なツールです。モデルに変更を加えた場合は、必ずマイグレーションを実行して、データベースを最新の状態に保つようにしてください。</p>
<h3 data-id="fb284076-7deb-41db-8e53-a4ddd973feac" data-toc-id="fb284076-7deb-41db-8e53-a4ddd973feac" id="fb284076-7deb-41db-8e53-a4ddd973feac">Django管理ユーザーの作成</h3>
<p data-id="8f1abb63-5775-4020-b882-cc67e8ca650d">Djangoには管理サイトという便利な機能が備わっています。管理サイトでは、データベースに登録されているデータの確認や編集、追加を行うことができます。この管理サイトを利用するには、Django管理ユーザーを作成する必要があります。</p>
<p data-id="a18fd373-3b04-441a-8563-9a9056c2e677">データベースにアクセスするために必要なライブラリがインストールされているか確認します。</p>
<table data-id="957f48b4-06fd-4ba6-a886-487089096adf">
<colgroup>
<col>
<col>
	</colgroup>
<tbody>
<tr bgcolor="#d3d3d3">
<td colspan="1" rowspan="1">
<p data-id="3221aff1-9374-45d3-a2bf-a540cfe4635a">ライブラリ名</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="0ebc6a6e-bdb8-467d-9805-4817a9bee16e">説明</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="bc3c4fa9-40bd-494b-b359-02746824b5d5"><code>mysqlclient</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="9dfad429-35cc-42fb-a77a-b8fe6333036e">MySQLデータベースにアクセスするためのライブラリ</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="4d29a967-396d-4af8-aa36-f163505b6838"><code>psycopg2</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="9cf024b5-f681-4e3c-acf0-001e23b6d857">PostgreSQLデータベースにアクセスするためのライブラリ</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="3366eb9f-394d-4662-9a91-7368949702e3"><code>sqlite3</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="966b4ed2-c5ae-435c-bbf5-3cedc88133db">SQLiteデータベースにアクセスするためのライブラリ。Pythonに標準で含まれています。</p>
</td>
</tr>
</tbody>
</table>
<p data-id="188a80d2-6718-4593-985b-abf9525d94a0">もし、mysqlclientをinstallしようとするとエラーが出ることがある場合は、以下のコマンドを打ってから、mysqlclientをinstallします。</p>
<pre><code>sudo pip3 install mysql-devel
sudo pip3 install --upgrade pip setuptools
sudo yum install python3-devel
sudo yum install gcc
</code></pre>
<p data-id="a0882890-a954-4f3e-b701-ae50e83a89e8">必要なライブラリがインストールされていれば、以下のコマンドを実行することで、Django管理ユーザーを作成できます。</p>
<pre><code>python3 manage.py createsuperuser
</code></pre>
<p data-id="a4f08966-c40d-4ccc-89c8-ba7e004521c9">コマンドを実行すると、ユーザー名、メールアドレス、パスワードの入力を求められます。それぞれの値を入力し、Enterキーを押すと、Django管理ユーザーが作成されます。</p>
<p data-id="6f29fb27-2229-4754-895c-e62cead0d0b8">もし、mysqlの認証方法の違いでエラーが出ることがある場合は、以下のように対応します。mysql8からは認証方法が変更されているので、今回使うDBにも変更をかけてあげてからマイグレーションとマイグレートをするとうまくいきます。</p>
<pre><code>alter user 'user_name'@'localhost' identified WITH mysql_native_password by 'password';
</code></pre>
<p data-id="c0e10db1-dc12-4bcd-a5c1-a95a0ae8a95a">Django管理ユーザーの作成は以上です。</p>
<h2 data-id="a7cc1827-d2ea-4abe-ac3b-2312ab458de4" data-toc-id="a7cc1827-d2ea-4abe-ac3b-2312ab458de4" id="a7cc1827-d2ea-4abe-ac3b-2312ab458de4">6. Gunicornのインストールと設定</h2>
<p data-id="7240acd3-b06d-4922-917a-cf8ee61cac8e">この章では、Gunicornのインストールと設定方法について解説します。Gunicornは、PythonのWSGI HTTPサーバーです。Djangoアプリケーションと連携させることで、Webサーバー（Nginx）からのリクエストを処理し、アプリケーションを安定して稼働させることができます。</p>
<p data-id="ae89c615-ba83-4171-9cff-aa835b375511">まず、Gunicornをインストールします。</p>
<pre><code>sudo pip3 install gunicorn
</code></pre>
<p data-id="c2a0ebf7-1705-4a69-b716-b6b9f3334f73">インストールが完了したら、Gunicornを起動して動作確認を行います。以下のコマンドを実行し、EC2インスタンスのパブリックIPアドレス:8000にアクセスして、Djangoのデフォルトページが表示されるか確認します。「リポジトリ名」は、ご自身のDjangoプロジェクト名に置き換えてください。</p>
<pre><code>sudo gunicorn リポジトリ名.wsgi --bind=0.0.0.0:8000
</code></pre>
<p data-id="d2577bea-1b45-41c1-98db-dae5ded991c7">もし、CSSが反映されていない場合でも、Djangoのデフォルトページが表示されていれば問題ありません。Nginxの設定を行うことで、CSSも正しく反映されるようになります。</p>
<p data-id="6853fc1a-837d-4ae7-a9d6-64c34245f6c5">Gunicornの設定ファイルを作成することで、起動時のオプションなどを設定ファイルに記述し、簡略化できます。設定ファイルは任意ですが、サービスとして登録する際に便利です。設定ファイルは<code>/etc/systemd/system/</code>ディレクトリに作成します。</p>
<p data-id="a1c2b333-697c-4541-9a2b-0c0cb6b10920">Gunicornの設定ファイルを記述する上で重要なポイントは下記の通りです。</p>
<table data-id="f5d88f6e-f88a-4354-9277-d8c916c65310">
<colgroup>
<col>
<col>
	</colgroup>
<tbody>
<tr bgcolor="#d3d3d3">
<td colspan="1" rowspan="1">
<p data-id="c029e76d-fc0f-4beb-b204-e0a3fbf9c0c5">設定項目</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="68244ef4-ec42-45f7-84dd-cdd3f4f0412a">説明</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="e6ddbe7b-9021-4546-ba9d-6e52c43003b1"><code>User</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="f9572fe7-8714-4007-a499-d27ab2f7dd0e">Gunicornを実行するユーザー名</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="d63ac831-d637-4d60-9bf2-501a5235edf2"><code>Group</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="e3a49843-0c39-492f-b5e8-d678f1273f35">Gunicornを実行するグループ名</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="9e0decdd-840a-420c-8204-825af26d5dc8"><code>WorkingDirectory</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="a5efcaac-18a5-448c-949c-f43a3886b804">Djangoプロジェクトのディレクトリへのパス</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="bdfe7a1a-3b93-4547-94e5-ef8b1b6b0894"><code>ExecStart</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="c9022da3-eb94-4cc2-a41c-0d0b29d4728f">Gunicornの起動コマンド</p>
</td>
</tr>
</tbody>
</table>
<p data-id="e7cd2371-6955-469b-b6f6-ddb724fe4051">Gunicornのサービス化は、次の章で行います。</p>
<h3 data-id="35f17cd5-5f38-4fc7-9cbb-005d9ab7e78c" data-toc-id="35f17cd5-5f38-4fc7-9cbb-005d9ab7e78c" id="35f17cd5-5f38-4fc7-9cbb-005d9ab7e78c">Gunicornのインストール</h3>
<p data-id="6477168f-ddbc-4203-a9bb-5036b391eb01">Gunicornは、Python製のWSGI HTTPサーバーです。DjangoアプリケーションとWebサーバー（Nginxなど）の間を取り持ち、リクエストを処理します。堅牢でシンプルに動作するのが特徴です。ここでは、Gunicornのインストールと簡単な動作確認までを行います。</p>
<p data-id="28d86d74-0677-4e13-af6a-9004c4475cf2">-インストール手順</p>
<p data-id="80243e38-b14d-4739-9dbc-8593792bccba">Gunicornはpipを使ってインストールできます。EC2インスタンスにSSH接続後、以下のコマンドを実行してください。</p>
<pre><code>sudo pip3 install gunicorn
</code></pre>
<p data-id="a68dbb30-d827-487a-ac8d-83532bab0f95">-起動確認</p>
<p data-id="82fd33da-7252-4c68-9125-f24321be8d40">Gunicornが正しくインストールされたかを確認するために、Djangoプロジェクトを起動してみましょう。プロジェクトのルートディレクトリに移動し、以下のコマンドを実行します。</p>
<pre><code>sudo gunicorn &lt;プロジェクト名&gt;.wsgi --bind=0.0.0.0:8000
</code></pre>
<p data-id="c0d32bfc-2a7b-4840-829c-c86e5f9b02a9"><code>&lt;プロジェクト名&gt;</code>の部分は、ご自身のプロジェクト名に置き換えてください。例えば、プロジェクト名が<code>myproject</code>の場合は、<code>myproject.wsgi</code>となります。<code>--bind=0.0.0.0:8000</code> は、全てのIPアドレスからのポート8000へのアクセスを許可するという意味です。</p>
<p data-id="e6476fe7-c819-4a9d-bf52-81bc14134ae7">起動後、Webブラウザで <code>http://&lt;EC2のパブリックIP&gt;:8000</code> にアクセスしてみてください。Djangoのデフォルトページが表示されれば、Gunicornは正しく動作しています。</p>
<table data-id="ad4088dc-4efa-4489-842d-6d72f1c146cf">
<colgroup>
<col>
<col>
	</colgroup>
<tbody>
<tr bgcolor="#d3d3d3">
<td colspan="1" rowspan="1">
<p data-id="7939ec2e-8822-42af-8545-81be52493a63">コマンド</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="9533c646-f1be-4124-9dc6-a75c9bcad6d3">説明</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="1b1db5e0-5f27-48ff-a01b-7c00e3d816a7"><code>sudo pip3 install gunicorn</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="bbcb9585-e7be-4178-877c-d9fdee28dd32">Gunicornのインストール</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="18039a79-c5fb-4426-8392-89d6152625d7"><code>sudo gunicorn &lt;プロジェクト名&gt;.wsgi --bind=0.0.0.0:8000</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="43de92a2-b4ff-4dcc-80b6-630616311c2e">Gunicornの起動。<code>&lt;プロジェクト名&gt;</code>はご自身のプロジェクト名に置き換えてください。</p>
</td>
</tr>
</tbody>
</table>
<p data-id="cf9546b3-c701-4f6f-8754-eaf6da259241">Gunicornを停止するには、ターミナルで<code>Ctrl + C</code>を押します。</p>
<p data-id="2d0d5ddf-ee06-4fe9-acb7-fc45e0ad41bb">現時点では、Gunicornはフォアグラウンドで実行されているため、ターミナルを閉じるとGunicornも停止します。本番環境では、Gunicornをバックグラウンドでデーモンとして実行するように設定します。これについては、後の章で説明します。</p>
<h3 data-id="8a6c5132-3553-4a61-b674-9b60c875cde1" data-toc-id="8a6c5132-3553-4a61-b674-9b60c875cde1" id="8a6c5132-3553-4a61-b674-9b60c875cde1">gunicornの起動確認</h3>
<p data-id="dde1c80d-d7ad-4301-ba70-4ab032c28a92">Gunicornが正しくインストールされ、Djangoアプリケーションを起動できるかを確認します。この段階ではNginxはまだ設定していないため、Gunicornが直接HTTPリクエストを処理します。確認のため一時的にGunicornを起動し、ブラウザからアクセスしてみましょう。</p>
<p data-id="9d5b6ebc-c39e-4b1e-bce5-4e44b7ad7184">Gunicornの起動コマンドの基本形は次のとおりです。</p>
<pre><code>gunicorn &lt;プロジェクト名&gt;.wsgi --bind &lt;IPアドレス&gt;:&lt;ポート番号&gt;
</code></pre>
<p data-id="785a4daf-27d1-4a26-80f1-2b69668970d6"><code>&lt;プロジェクト名&gt;.wsgi</code> は、Djangoプロジェクトのwsgi.pyファイルを指定します。<code>&lt;IPアドレス&gt;</code> は、EC2インスタンスのプライベートIPアドレスまたはパブリックIPアドレスを指定します。<code>&lt;ポート番号&gt;</code> は、GunicornがHTTPリクエストを待ち受けるポート番号を指定します。今回は8000番ポートを使用します。</p>
<p data-id="dde3ccfd-76a8-453b-8799-046b2362aede">例えば、プロジェクト名が <code>mysite</code> で、パブリックIPアドレスが <code>*.*.*.*</code> の場合、以下のコマンドでGunicornを起動します。</p>
<pre><code>sudo gunicorn mysite.wsgi --bind *.*.*.*:8000
</code></pre>
<p data-id="7fc52365-bb03-49fa-9097-befa4a666d47">起動後、Webブラウザで <code>http://*.*.*.*:8000</code> にアクセスします。Djangoのデフォルトページ、あるいはプロジェクトのトップページが表示されれば、Gunicornは正しく動作しています。</p>
<table data-id="533f5250-08a0-43a4-8f78-8f07b1abbfce">
<colgroup>
<col>
<col>
	</colgroup>
<tbody>
<tr bgcolor="#d3d3d3">
<td colspan="1" rowspan="1">
<p data-id="8a5eae7d-0eec-45f5-b67e-26c94e55f9f1">項目</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="3627f700-d5b8-467b-8ef3-a2ebdb4e07b9">説明</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="1721f9b1-3197-43bf-8fbb-e045cce2116a"><code>mysite.wsgi</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="eea8e6b4-769c-4118-bbee-41712838d757">DjangoプロジェクトのWSGIアプリケーションへのパス</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="fccca923-1752-4043-9cb4-3ec545afac35"><code>*.*.*.*</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="b7d6bc37-6ed0-49f7-b931-a60494dd4acc">EC2インスタンスのパブリックIPアドレス</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="40e35bd6-7725-436e-827b-713d632f02ee"><code>8000</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="5ca49edc-9d64-4c3e-b5ae-d8306404a44f">GunicornがListenするポート番号</p>
</td>
</tr>
</tbody>
</table>
<p data-id="f1b6f745-87eb-4a8e-a1f2-ac9c57316a28">この時点でCSSが適用されていなかったり、静的ファイルが表示されない場合がありますが、それはNginxの設定がまだ完了していないためです。GunicornがDjangoアプリケーションを起動できていることの確認が目的なので、気にしなくて大丈夫です。確認が完了したら、<code>Ctrl + C</code> でGunicornを停止します。</p>
<h2 data-id="09144214-4f0f-4b7f-8f7c-185897ab709e" data-toc-id="09144214-4f0f-4b7f-8f7c-185897ab709e" id="09144214-4f0f-4b7f-8f7c-185897ab709e">7. Nginxのインストールと設定</h2>
<p data-id="bd343c34-eff9-45cc-9142-edde8d3f38eb">この章では、Nginxのインストールと設定方法について解説します。Nginxは高性能なWebサーバーであり、リバースプロキシとしても機能します。Gunicornと連携させることで、Djangoアプリケーションへのアクセスを効率的に処理できます。</p>
<p data-id="7f053d03-522e-406b-a561-e7395dfe0df2">Nginxは既にインストール済みのため、設定ファイルの作成と編集から行います。設定ファイルは<code>/etc/nginx/nginx.conf</code>ですが、今回はconf.dディレクトリに新規ファイルを作成する方法で設定を進めます。</p>
<p data-id="d167c4e8-8abb-4f4d-9404-bd4f3ee70fec">まず、<code>sudo vi /etc/nginx/conf.d/mysite.conf</code>で設定ファイルを作成します。設定ファイルの中身は下記の通りです。</p>
<pre><code>server {
    listen 80;
    server_name サーバーのパブリックIPもしくはドメイン;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location /static/ {
        alias /home/ec2-user/mysite/static/;
    }
}
</code></pre>
<p data-id="0b7cc9ce-5327-41e6-9bac-c106b0af12ad"><code>server_name</code>にはEC2インスタンスのパブリックIPアドレス、もしくはドメインを指定します。<code>location /</code>では、ルートへのアクセスをGunicornが稼働している<code>http://127.0.0.1:8000</code>へ転送するよう設定しています。<code>proxy_set_header</code>の設定は、Gunicornがクライアントの正しいIPアドレスを取得するために必要です。<code>location /static/</code>では、静的ファイルの配信設定を行います。<code>alias</code>にはDjangoプロジェクトで<code>collectstatic</code>コマンドを実行した際に静的ファイルが収集されるディレクトリのパスを指定します。</p>
<p data-id="e496cddc-b137-48e8-85ca-56b9a67eaebe">設定ファイルが作成できたら、静的ファイルの収集を行います。Djangoプロジェクトのルートディレクトリに移動し、下記コマンドを実行します。</p>
<pre><code>python3 manage.py collectstatic
</code></pre>
<p data-id="06545497-61f5-4b4b-af5b-2d8992674299">最後にNginxの起動確認を行います。下記コマンドでNginxを再起動し、ブラウザでEC2インスタンスのパブリックIPアドレスにアクセスします。Djangoアプリケーションが正しく表示されれば設定は完了です。</p>
<pre><code>sudo systemctl restart nginx
</code></pre>
<h3 data-id="8627ea42-fd72-499a-8700-d9483e4602e3" data-toc-id="8627ea42-fd72-499a-8700-d9483e4602e3" id="8627ea42-fd72-499a-8700-d9483e4602e3">Nginxのインストール</h3>
<p data-id="3a9553a9-ba6f-486a-8a0f-516409b22e78">この章では、EC2インスタンスにNginxをインストールする方法を解説します。Nginxは高性能なWebサーバーであり、リバースプロキシとしても機能します。Gunicornと連携させることで、Djangoアプリケーションを安全かつ効率的に公開できます。</p>
<p data-id="2ef3a711-54f5-4d00-b1d5-69aa9334300a">Amazon Linux 2023の場合、<code>amazon-linux-extras</code>コマンドを利用してNginxをインストールできます。以下のコマンドを実行してください。</p>
<pre><code>sudo amazon-linux-extras install nginx1
</code></pre>
<p data-id="48dddcb7-a916-4b3d-9522-7ce9f4f9ea80">インストールが完了したら、Nginxのバージョンを確認します。以下のコマンドを実行し、バージョン情報が表示されればインストールは成功です。</p>
<pre><code>nginx -v
</code></pre>
<p data-id="7a4ca7fb-200e-4129-8f2e-b784ddf2c115">次に、Nginxの起動と動作確認を行います。以下のコマンドでNginxを起動します。</p>
<pre><code>sudo systemctl start nginx
</code></pre>
<p data-id="8d096a57-8b0a-4790-a4cb-05c2ec1cf4fc">起動後、EC2インスタンスのパブリックIPアドレスにブラウザでアクセスします。Nginxのデフォルトページが表示されれば、Nginxは正しく動作しています。</p>
<pre><code>http://&lt;EC2インスタンスのパブリックIPアドレス&gt;
</code></pre>
<p data-id="f75ec249-25e7-4417-8ae1-10ab995509ab">もしデフォルトページが表示されない場合は、セキュリティグループの設定を確認してください。ポート80(HTTP)へのアクセスが許可されている必要があります。</p>
<h3 data-id="58ef4bdd-6c8f-4de2-8ead-d3c77b244639" data-toc-id="58ef4bdd-6c8f-4de2-8ead-d3c77b244639" id="58ef4bdd-6c8f-4de2-8ead-d3c77b244639">Nginxの設定ファイルの作成と編集</h3>
<p data-id="083634e8-0e2c-4266-9120-7cb5b51a2e92">Nginxの設定ファイルを作成・編集し、Djangoアプリケーションへのアクセスを適切に処理できるようにします。設定ファイルは通常<code>/etc/nginx/nginx.conf</code>ですが、<code>/etc/nginx/conf.d/</code>ディレクトリに仮想ホストの設定ファイルを置くことも一般的です。今回は、仮想ホストの設定ファイルを作成する手順で説明します。</p>
<p data-id="62699070-7f66-48e5-accf-b5c1e8d3249a">まず、以下のコマンドで設定ファイルを作成します。</p>
<pre><code>sudo vi /etc/nginx/conf.d/mysite.conf
</code></pre>
<p data-id="6fdb0526-e839-4269-858f-72840e1aba58">設定ファイルの中身は以下のように記述します。</p>
<pre><code>server {
    listen 80;
    server_name example.com; # ドメイン名またはIPアドレス
    root /home/ec2-user/mysite; # Djangoプロジェクトのルートディレクトリ

    location /static/ {
        alias /home/ec2-user/mysite/static/; # 静的ファイルの場所
    }

    location / {
        proxy_pass http://127.0.0.1:8000; # Gunicornが待ち受けるアドレス
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
</code></pre>
<p data-id="36bc2de5-12dc-44a4-9f1b-85133826f3da">各項目の説明は以下の通りです。</p>
<table data-id="16b6fc72-9a04-4ebe-957f-bf88ba1f139a">
<colgroup>
<col>
<col>
	</colgroup>
<tbody>
<tr bgcolor="#d3d3d3">
<td colspan="1" rowspan="1">
<p data-id="5ec01e58-d0ae-42a8-9ab7-5d65d57052e0">項目</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="79babf3a-bae3-431b-8895-d6f8b10eaae7">説明</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="7be47d83-a0c0-43f3-ac68-a2f9b17b0bf4"><code>listen 80</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="f0fa748c-e37f-4602-83c9-ad46843a0c98">HTTPのポート番号を指定します。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="13e9748b-7052-41f9-aec9-12144008249f"><code>server_name</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="29686b5d-6905-491b-8b81-12aa8a937530">サーバーのドメイン名またはIPアドレスを指定します。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="83b126ff-72b3-4bb9-a16d-07a2b0d3c80e"><code>root</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="b1ec9705-e052-4055-86c4-795eb988ad7e">Djangoプロジェクトのルートディレクトリを指定します。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="0976ba74-fdeb-4ece-b866-a620e25d7bc5"><code>location /static/</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="e7383840-e877-4083-b3bc-de25649a20f6">静的ファイルへのアクセスを処理します。<code>alias</code>ディレクティブで静的ファイルの場所を指定します。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="8d74d967-2399-4b8f-8193-020fe45b1c69"><code>location /</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="30d98945-6848-443a-ac78-4a6c8949ec13">その他のリクエストをGunicornに転送します。<code>proxy_pass</code>ディレクティブでGunicornのアドレスを指定します。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="822dd898-5ce6-4913-bc05-51640b61054d"><code>proxy_set_header</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="3763a43f-6c86-4fd8-8750-94fa4701486a">リクエストヘッダーを設定します。Gunicornが正しくリクエストを処理するために必要です。</p>
</td>
</tr>
</tbody>
</table>
<p data-id="161a54b8-9b03-4684-8de4-6338b0d436e3">設定ファイルを作成・編集後、Nginxを再起動して設定を反映させます。</p>
<pre><code>sudo systemctl restart nginx
</code></pre>
<h3 data-id="30464399-56c8-44ac-bd1f-a55bde90a199" data-toc-id="30464399-56c8-44ac-bd1f-a55bde90a199" id="30464399-56c8-44ac-bd1f-a55bde90a199">静的ファイルの収集</h3>
<p data-id="f57c0753-d1c4-4f43-aca6-9acb0dc83da1">Djangoでは、CSS、JavaScript、画像ファイルなどの静的ファイルをプロジェクト全体で一元管理できます。これらのファイルを<code>collectstatic</code>コマンドを使って指定の場所に集めることで、Nginxがそれらのファイルを提供できるようになります。</p>
<p data-id="dbfb7f0d-af0d-4c0c-b751-5832c3c60505"><code>collectstatic</code>コマンドを実行する前に、<code>settings.py</code>ファイルで<code>STATIC_ROOT</code>の設定が必要です。<code>STATIC_ROOT</code>には、<code>collectstatic</code>コマンドが静的ファイルを収集するディレクトリの絶対パスを指定します。<br />
例えば、<code>/var/www/example.com/static/</code>のように指定します。</p>
<p data-id="7d79a8a0-4961-4594-aced-29da0b8d5fbe"><code>STATIC_ROOT</code>の設定例を以下に示します。</p>
<table data-id="a0c5f0d6-3dcd-4554-a03f-88fe54be3885">
<colgroup>
<col>
<col>
	</colgroup>
<tbody>
<tr bgcolor="#d3d3d3">
<td colspan="1" rowspan="1">
<p data-id="f1d4847f-073e-40d4-8667-0be1a01fca05">項目</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="9f080503-37ea-4821-9cc4-8468e35df7d3">説明</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="882aee56-934d-4632-b5b3-8c41973fa5ed"><code>STATIC_URL</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="24d5ad09-2605-4013-bf7c-0736dc1aa287">静的ファイルにアクセスするためのURL</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="c9a2e87a-4c4e-474b-a8d5-b97470e46e32"><code>STATIC_ROOT</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="a659f33b-9ca3-490d-ba27-e36aff7b8ab0"><code>collectstatic</code>コマンドが静的ファイルを収集するディレクトリ</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="be72f98b-126d-46da-9785-24370c26c644"><code>STATICFILES_DIRS</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="6fbc548b-c472-43c5-aaf6-06833ee3857c">アプリケーション固有の静的ファイルが配置されているディレクトリ</p>
</td>
</tr>
</tbody>
</table>
<pre><code># settings.py

STATIC_URL = '/static/'

STATIC_ROOT = os.path.join(BASE_DIR, 'static/') # 変更

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'staticfiles'),
]
</code></pre>
<p data-id="c5ddc88d-1616-40e0-8d0a-cc79d81cde72">設定が完了したら、以下のコマンドを実行して静的ファイルを収集します。</p>
<pre><code>python manage.py collectstatic
</code></pre>
<p data-id="2dee80e0-783c-4287-acb4-be9fcae0a132">このコマンドを実行すると、<code>STATICFILES_DIRS</code>で指定されたディレクトリと、Djangoのcontribアプリに含まれる静的ファイルが、<code>STATIC_ROOT</code>で指定されたディレクトリにコピーされます。</p>
<p data-id="14fbd299-69b3-4400-962e-6f459742fa27">参考情報が取得できない、または資料に適切な情報がありませんでした。以下、オリジナルの知識を基に出力します。</p>
<p data-id="34e6280d-25f5-40ab-b006-c121239c0b30"><code>collectstatic</code>コマンド実行時にエラーが発生する場合は下記を確認してください。</p>
<ol data-id="74cbb0cf-430f-4bbe-b0db-f3004bfbdba2">
<li>
<p data-id="78b52237-1a13-468a-8d16-5af5bab6aff1"><code>STATIC_ROOT</code>の設定が正しいか</p>
</li>
<li>
<p data-id="d03df2f3-0498-4e89-ab6f-12540d8f2a65">必要な静的ファイルが<code>STATICFILES_DIRS</code>で指定されたディレクトリに配置されているか</p>
</li>
<li>
<p data-id="4a8113db-2d59-4e79-8314-718c6dac8ed7">ファイルのパーミッション設定に問題がないか。<code>STATIC_ROOT</code>ディレクトリとその中身のファイルの所有者を、Nginxを実行するユーザーに変更する必要があるかもしれません。</p>
</li>
</ol>
<p data-id="7865c57e-c4e5-42b3-98a4-816273080207">静的ファイルの収集が完了したら、Nginxの設定ファイルで、これらのファイルを提供するように設定します。これにより、Webブラウザから静的ファイルにアクセスできるようになります。</p>
<h3 data-id="efc7c366-ed8b-4520-a5ca-04b66ea5613b" data-toc-id="efc7c366-ed8b-4520-a5ca-04b66ea5613b" id="efc7c366-ed8b-4520-a5ca-04b66ea5613b">Nginxの起動確認</h3>
<p data-id="5b66b445-9677-4eaf-be94-0f7f5113f684">Nginxが正しく設定されているかを確認するために、まずはNginxを起動してみましょう。以下のコマンドでNginxを起動できます。</p>
<pre><code>sudo systemctl start nginx
</code></pre>
<p data-id="6e432d6a-cd2d-405d-ac06-8e6bdc987557">起動後、Nginxが正常に動作しているかを確認するには、以下のコマンドを実行します。</p>
<pre><code>sudo systemctl status nginx
</code></pre>
<p data-id="5ce64254-1721-42f0-8ade-62b5f719d933">コマンドの実行結果に <code>Active: active (running)</code> と表示されていれば、Nginxは正常に起動しています。もしエラーが発生している場合は、設定ファイルに誤りがないか確認し、修正してから再度起動を試みてください。</p>
<p data-id="d1a29bdc-d97c-474f-aca9-1d2994de365f">設定ファイルに問題がないにも関わらず起動に失敗する場合は、ポートの競合が考えられます。既にポート80番を使用しているアプリケーションが存在する可能性があります。その場合は、競合しているアプリケーションを停止するか、Nginxの設定ファイルで使用するポートを変更する必要があります。</p>
<p data-id="1bbbfb3e-3b1c-4d8d-aff3-ef017bd88525">Nginxが正しく起動したら、ブラウザでEC2インスタンスのパブリックIPアドレス、もしくはドメイン名にアクセスしてみましょう。Djangoアプリケーションの初期画面が表示されれば、設定は成功です。もし画面が表示されない場合は、Nginxの設定ファイル、特に <code>server</code> ブロック内の <code>location /</code> の設定、<code>proxy_pass</code> で指定しているURL、<code>static</code>ディレクトリの設定などを再度確認してください。</p>
<p data-id="c674d518-a793-4544-84aa-553155469243">設定の確認項目を以下にまとめました。</p>
<table data-id="63cb8088-3017-448a-9ebb-3d4de003273c">
<colgroup>
<col>
<col>
	</colgroup>
<tbody>
<tr bgcolor="#d3d3d3">
<td colspan="1" rowspan="1">
<p data-id="4c8bcf7c-c99e-4697-85e4-5ce33935d460">項目</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="b25c1362-c2fb-4534-8864-cac2ff44a5f9">説明</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="d4015173-853d-4efc-9655-ec0b810eb354"><code>server</code> ブロック内の <code>listen</code> ディレクティブ</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="eed4a141-dd99-49d2-a6f2-ef5b1c7f18b6">80番ポートを指定しているか確認</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="fb04f29e-efca-4d0e-b793-fc168ba630e0"><code>server_name</code> ディレクティブ</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="c9889667-e561-4181-bf0f-39cfaa468649">EC2インスタンスのパブリックIPアドレス、またはドメイン名を指定しているか確認</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="578f04a6-a822-4f34-aefd-4ee55d3065d7"><code>location /</code> ブロック内の <code>proxy_pass</code> ディレクティブ</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="a2bf7f5d-e7fc-4214-98d4-68cf9a7edabb"><code>http://127.0.0.1:8000</code> など、Gunicornが待ち受けているアドレスとポートを指定しているか確認</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="620d7195-ef7f-46dd-885f-f8d01ea28b39"><code>location /static/</code> ブロック</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="b53258d7-6d4d-4c26-bcbf-040926e75d06">静的ファイルを提供するために、Djangoプロジェクトの <code>static</code> ディレクトリのパスを <code>alias</code> ディレクティブで指定しているか確認</p>
</td>
</tr>
</tbody>
</table>
<p data-id="cf98e06c-4a7e-49b0-a0ff-d2aaf8c1d451">これらの設定を正しく行うことで、NginxはWebサーバーとして適切に機能し、DjangoアプリケーションへのリクエストをGunicornに転送、そして静的ファイルを提供することができます。</p>
<h2 data-id="0f14eaee-5349-47a3-a3e7-68faff9a853a" data-toc-id="0f14eaee-5349-47a3-a3e7-68faff9a853a" id="0f14eaee-5349-47a3-a3e7-68faff9a853a">8. アプリケーションのデプロイと動作確認</h2>
<p data-id="7a927d70-8836-494e-bf6d-af70602669dd">この章では、DjangoプロジェクトをEC2インスタンスにデプロイし、GunicornとNginxを連携させてアプリケーションを公開、動作確認を行います。</p>
<p data-id="2b83a53d-0a0a-4a74-8c59-ef0be0176131">まず、DjangoプロジェクトをEC2インスタンスに配置します。ここでは、SCPやSFTPなどのツールを利用して、ローカル環境のプロジェクトファイルをEC2インスタンスに転送します。転送先は<code>/var/www/</code>のようなWebサーバーがアクセスしやすいディレクトリが良いでしょう。</p>
<p data-id="d5e5e2aa-9b23-479a-ad70-e8bf7c105e0d">次に、Gunicornをsystemdを使ってサービス化します。systemdはLinuxシステムのサービス管理ツールで、Gunicornをバックグラウンドで安定稼働させるために使用します。<br />
systemdの設定ファイルを作成し、起動・停止・再起動などのコマンドでGunicornを制御できるようにします。設定ファイルには、Gunicornが起動するユーザー、ワーカー数、バインドするポート番号などを記述します。<br />
Gunicornが正しく起動するか確認するために、一度手動で起動してみましょう。その後、systemdでサービスを有効化し、自動起動するように設定します。</p>
<pre><code>[Unit]
Description=Gunicorn server for Django project

[Service]
User=ec2-user  # 適宜変更
Group=ec2-user # 適宜変更
WorkingDirectory=/var/www/django-aws # プロジェクトのルートディレクトリを指定
ExecStart=/var/www/.virtualenvs/django-aws/bin/gunicorn --workers 3 --bind unix:/run/gunicorn.sock testapp.wsgi:application
# ExecStartには、仮想環境内のgunicorn実行ファイルへのパス、オプション、wsgi.pyへのパスを指定します。

[Install]
WantedBy=multi-user.target
</code></pre>
<p data-id="4f03112e-699d-4bc0-b814-5a749df9e6b7">最後に、NginxとGunicornの連携を確認し、ブラウザでアプリケーションが正しく動作するか確認します。Nginxの設定ファイルでは、Gunicornが待ち受けるソケットファイルへのプロキシパスを設定します。設定ファイルが正しければ、ブラウザからEC2インスタンスのパブリックIPアドレスまたはドメイン名にアクセスすることで、Djangoアプリケーションが表示されるはずです。もし表示されない場合は、NginxとGunicornのログを確認し、エラーの原因を特定しましょう。</p>
<h3 data-id="a1c08524-3500-4404-aac6-d48ee86c2474" data-toc-id="a1c08524-3500-4404-aac6-d48ee86c2474" id="a1c08524-3500-4404-aac6-d48ee86c2474">Djangoプロジェクトの配置</h3>
<p data-id="5dbdb95d-2f78-472a-a0d7-abbf5ca38c8f">DjangoプロジェクトをEC2インスタンスに配置する方法について解説します。ここでは、安全なファイル転送方法として<code>scp</code>コマンド、バージョン管理システムを使ったデプロイ方法を説明します。</p>
<p data-id="820668d0-6880-47f3-b0cf-2d9a6142fa1e">まず、<code>scp</code>コマンドを使って、ローカルマシンにあるDjangoプロジェクトをEC2インスタンスに転送します。</p>
<pre><code>scp -i &lt;秘密鍵ファイルへのパス&gt; -r &lt;ローカルのDjangoプロジェクトのディレクトリ&gt; &lt;EC2ユーザー名&gt;@&lt;EC2パブリックIPアドレスまたはDNS名&gt;:&lt;配置先のディレクトリパス&gt;
</code></pre>
<p data-id="710f9326-d696-4b96-815d-fa1c526d0b0d">例えば、秘密鍵ファイルが<code>MyEC2Key.pem</code>、ローカルのDjangoプロジェクトが<code>~/django-aws</code>、EC2ユーザー名が<code>ec2-user</code>、EC2パブリックIPアドレスが<code>192.0.2.0</code>、配置先ディレクトリが<code>/var/www/my_project</code> の場合、以下のコマンドを実行します。</p>
<pre><code>scp -i ~/MyEC2Key.pem -r ~/django-aws ec2-user@192.0.2.0:/var/www/my_project
</code></pre>
<p data-id="cfe78217-d08d-4ec5-a52e-2afb19e4b3c3">次に、Gitを使ったデプロイ方法を説明します。EC2インスタンスにGitをインストールし、リモートリポジトリからプロジェクトをクローンします。</p>
<pre><code>sudo yum install git
git clone &lt;リモートリポジトリのURL&gt;
</code></pre>
<p data-id="64a769e5-957e-4a18-8df6-8e574bbaf3f0">この方法では、バージョン管理システムの恩恵を受けることができ、複数人での開発や変更履歴の管理が容易になります。また、<code>requirements.txt</code>を利用して必要なライブラリをインストールします。</p>
<pre><code>pip install -r requirements.txt
</code></pre>
<p data-id="e7186a05-e47d-4f4e-b0f3-6b1f9b30cdee">最後に、データベースの設定ファイルを編集します。<code>settings.py</code> にデータベースの接続情報を入力します。データベースの種類やホスト名、ユーザー名、パスワード、データベース名を正しく設定してください。設定例を以下に示します。</p>
<table data-id="a34c2f1c-4e3f-421a-ab62-cc8ea9869765">
<colgroup>
<col>
<col>
	</colgroup>
<tbody>
<tr bgcolor="#d3d3d3">
<td colspan="1" rowspan="1">
<p data-id="f007be18-0fa1-4f40-8bbc-4bee997e1c02">設定項目</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="0f2cb6ef-dea8-4bbe-98a2-0fc64a0bcf4f">説明</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="d4f9ad5c-8697-4939-af44-8c876947a2a5"><code>ENGINE</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="a800ee75-3539-4b39-a65f-b8a867d19cb4">データベースの種類（例：<code>'django.db.backends.mysql'</code>）</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="af152ab5-582d-4791-8d68-2e7d2b2b40ff"><code>NAME</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="5915d6b4-1e62-4871-a420-f208b78e8925">データベース名</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="015cd0ef-a27b-4bc1-8ad2-a59c82cb12ec"><code>USER</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="2cd302ea-9c60-4f61-993f-ae7f5b8686f7">データベースユーザー名</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="729d6cdd-c3ca-43ae-9254-0a36d1ed5ac3"><code>PASSWORD</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="7e3f5c91-125c-4591-909b-0cdfce1f76dc">データベースパスワード</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="e2339bbb-17f7-44f2-967d-28867d5cb9df"><code>HOST</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="7ea577ad-edcc-4113-b258-90ccd7a4f882">データベースホスト名またはIPアドレス</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="373177f5-57f7-46d4-a379-ec4fb45c329f"><code>PORT</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="193896a5-a112-40a1-a409-88b461323e7b">データベースポート番号</p>
</td>
</tr>
</tbody>
</table>
<p data-id="84561d20-15ec-425c-8455-08613458c781">設定が完了したら、データベースのマイグレーションを実行して、データベースを最新の状態にします。</p>
<pre><code>python manage.py migrate
</code></pre>
<p data-id="44f9b319-324c-46fb-be2e-1597dff692e3">これでDjangoプロジェクトの配置は完了です。</p>
<h3 data-id="ba96dbe5-250a-4744-8a92-30d7d16b9a29" data-toc-id="ba96dbe5-250a-4744-8a92-30d7d16b9a29" id="ba96dbe5-250a-4744-8a92-30d7d16b9a29">Gunicornのサービス化 (systemd)</h3>
<p data-id="7d73d81e-0b8c-4db2-a9c5-aa38527ac229">Gunicornをsystemdで管理することで、EC2インスタンス起動時に自動的にGunicornが起動するようになります。<br />
また、万が一Gunicornが停止した場合でも自動的に再起動されるため、安定したWebアプリケーションの運用が可能になります。</p>
<p data-id="03007b6f-b601-4d01-9d03-3740ba89e399">Gunicornのサービス化は、systemdのユニットファイルを作成・設定することで実現できます。<br />
ユニットファイルは、サービスの起動方法、依存関係、実行ユーザーなどを定義する設定ファイルです。</p>
<p data-id="d1dd7fbc-29e3-4ca0-8d6f-030a038a70f3">設定ファイルは <code>/etc/systemd/system/</code> ディレクトリ配下に作成します。<br />
今回は <code>gunicorn.service</code> と <code>gunicorn.socket</code> の2つのファイルを作成します。</p>
<p data-id="8d3ce358-d3ea-469c-9299-6ac234e1e325">まず、<code>gunicorn.socket</code> ファイルを作成します。<br />
このファイルでは、Gunicornが待ち受けるソケットを定義します。</p>
<table data-id="12b064a9-0958-4cf5-b32a-d0af7a891172">
<colgroup>
<col>
<col>
	</colgroup>
<tbody>
<tr bgcolor="#d3d3d3">
<td colspan="1" rowspan="1">
<p data-id="85f7af27-7d26-4ad7-96fe-74dfde4c3348">項目</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="def526ad-2977-41bb-9e54-c0ad1e42d32a">説明</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="ac7aa63c-0036-4156-83ff-af3750e54a30"><code>[Unit]</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="d369e2ef-e3f6-4928-b5ca-930858087e25">ユニットの説明を記述します。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="575e58c5-b4fe-4291-b48d-083fc4777b06"><code>[Socket]</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="06520962-46e0-4b33-9eef-cdadc322a27c">ソケットの設定を記述します。<code>ListenStream</code>で待ち受けるポートを指定します。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="b3d596d9-b2d8-4082-a094-34f78be65f82"><code>[Install]</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="344e8ed6-c9e9-40fe-b7af-3818adebc022">ユニットのインストール設定を記述します。</p>
</td>
</tr>
</tbody>
</table>
<p data-id="87259372-9401-4cc2-bb34-f9071a267389">次に、<code>gunicorn.service</code> ファイルを作成します。<br />
このファイルでは、Gunicornサービスの設定を記述します。</p>
<table data-id="3cd8562c-aafb-4809-a6de-78a1c80ccc1c">
<colgroup>
<col>
<col>
	</colgroup>
<tbody>
<tr bgcolor="#d3d3d3">
<td colspan="1" rowspan="1">
<p data-id="c010e970-8414-41ab-ae76-4e0353222433">項目</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="dee4078d-4487-47d0-bf19-9d624a9d6928">説明</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="872859b6-fcd6-4c62-a1b5-853a083f2ed8"><code>[Unit]</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="5d92d13d-f074-4102-9796-b0995f6b7af5">ユニットの説明や依存関係を記述します。<code>Requires</code>で<code>gunicorn.socket</code>を指定します。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="278cf8b3-6ed8-43e6-8b54-a2e0626e262b"><code>[Service]</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="5fe579a3-f3f1-4835-b9ba-e7647c45cab4">サービスの設定を記述します。実行ユーザー、作業ディレクトリ、実行コマンドなどを指定します。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="69c8e16c-59bc-4603-b059-1a3aa08e2874"><code>[Install]</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="011f8667-2ea7-48a4-a52f-18864096378f">ユニットのインストール設定を記述します。</p>
</td>
</tr>
</tbody>
</table>
<p data-id="8e5d313e-3bf3-4fda-8832-92d2ddeb07e5">設定ファイルを作成後、以下のコマンドを実行してsystemdを再読み込みし、サービスを有効化・起動します。</p>
<pre><code>sudo systemctl daemon-reload
sudo systemctl enable gunicorn
sudo systemctl start gunicorn
</code></pre>
<p data-id="65bbdb64-cc8c-4f2a-be9e-8a993fedefe5"><code>systemctl status gunicorn</code> コマンドでサービスの状態を確認できます。</p>
<h3 data-id="902e57f9-f210-4bfb-bbda-e69e01356856" data-toc-id="902e57f9-f210-4bfb-bbda-e69e01356856" id="902e57f9-f210-4bfb-bbda-e69e01356856">NginxとGunicornの連携確認</h3>
<p data-id="ea07c1ca-32ba-4e25-a73f-1311759b89dd">NginxとGunicornが正しく連携されているかを確認します。設定ミスがあると、Webページが正常に表示されません。順を追って確認していきましょう。</p>
<p data-id="dd259296-7bde-4e0c-98b3-c7d8d694cc27">1.Gunicornの起動状態の確認<br />
systemctl status gunicorn でGunicornが起動しているか、エラーが出ていないかを確認します。もしGunicornが起動していない、またはエラーが出ている場合は、設定ファイル（/etc/systemd/system/gunicorn.service）を見直してください。</p>
<p data-id="2579c0bf-f626-4c91-ba6d-c720bd3e5fdd">2.Nginxの起動状態の確認<br />
systemctl status nginx でNginxが起動しているか、エラーが出ていないかを確認します。Nginxが起動していない、またはエラーが出ている場合は、設定ファイル（/etc/nginx/nginx.conf）を見直してください。特に、Gunicornへのプロキシ設定が正しいかを確認することが重要です。</p>
<p data-id="f8c0ccea-5408-442c-8137-6d0c26bbd488">3.ブラウザでの動作確認<br />
EC2インスタンスのパブリックIPアドレスまたはドメイン名にブラウザでアクセスし、Webページが正しく表示されるかを確認します。静的ファイル（CSS, JavaScript, 画像など）も正しく読み込まれているかを確認します。表示が崩れている場合は、Nginxの設定ファイル、特に静的ファイルの設定を見直してください。</p>
<p data-id="ecac9a5e-f0fe-4e2f-9b81-a25997bcc83d">4.curlコマンドでの確認<br />
ブラウザだけでなく、curlコマンドでも確認してみましょう。curlコマンドでEC2インスタンスのパブリックIPアドレスまたはドメイン名にアクセスし、HTTPステータスコードが200 OKであることを確認します。</p>
<p data-id="c48812fa-47eb-477b-b7b4-1734e4d3256e">5.ログの確認<br />
NginxとGunicornのログを確認することも重要です。/var/log/nginx/error.log と /var/log/gunicorn/error.log にエラーが出力されていないかを確認します。</p>
<table data-id="f81c27c4-ff9d-44ac-b280-3eb3c0641f6a">
<colgroup>
<col>
<col>
<col>
	</colgroup>
<tbody>
<tr bgcolor="#d3d3d3">
<td colspan="1" rowspan="1">
<p data-id="7c9b51be-06d5-4c2a-b588-0b870c640452">確認項目</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="a06bfa25-a6b7-4a54-9292-cb1f7d3a4e75">コマンド</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="45a89efe-11a2-406b-83ac-fb38063a12a3">期待される結果</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="99a8cf74-a6cf-4de0-9b48-5010f15ad183">Gunicornの起動状態</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="75ed2ae1-7444-4d1f-aedb-1f7f72db7867"><code>systemctl status gunicorn</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="2a2d968c-3d97-445e-a135-09b275551844"><code>active (running)</code></p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="d9d50c72-7e8a-4c82-b7e7-a34f1f9e3fda">Nginxの起動状態</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="70989dd1-964e-442e-bf14-e966ed1e6dc5"><code>systemctl status nginx</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="0cab682e-a9dc-4a9e-9704-5377bc657dd6"><code>active (running)</code></p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="1de69a36-399d-486f-88f8-52b1b942f518">ブラウザでの動作確認</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="bd5605f0-e471-4ec5-b565-6f2f4d65ae9e">EC2インスタンスのパブリックIPアドレスまたはドメイン名にアクセス</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="84f63f11-bca2-4f6c-abb7-f6f290e4b0bc">Webページが正しく表示される</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="75563ffb-2b17-49e0-92f5-9118d70912b6">curlコマンドでの確認</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="ec85bb54-c465-4447-bff5-f8ee6d8b7886"><code>curl -I &lt;EC2インスタンスのパブリックIPアドレスまたはドメイン名&gt;</code></p>
</td>
<td colspan="1" rowspan="1">
<p data-id="780c4a30-904d-4d69-9b12-6f21ef04d7ff"><code>HTTP/1.1 200 OK</code></p>
</td>
</tr>
</tbody>
</table>
<p data-id="e9496072-11ac-4937-ba1b-4384e3001e8e">これらの手順で問題なく確認できれば、NginxとGunicornの連携は成功です。</p>
<h3 data-id="5e646c2e-bf5e-44de-8d4a-b14e5c9dccac" data-toc-id="5e646c2e-bf5e-44de-8d4a-b14e5c9dccac" id="5e646c2e-bf5e-44de-8d4a-b14e5c9dccac">ブラウザでの動作確認</h3>
<p data-id="bb481d84-7b0f-4571-8fc1-65208a5178d0">いよいよブラウザでアプリケーションの動作を確認します。これまでの手順で、DjangoアプリケーションはGunicornによって起動され、Nginxによって外部からアクセスできるようになっています。</p>
<p data-id="a7c79276-5ae5-4c7f-a194-1384aa0519c3">1.EC2インスタンスのパブリックIPアドレスを確認</p>
<p data-id="6e3bda2b-5b88-47a1-ab3c-9998b1ce8cb1">AWSのEC2管理コンソールから、インスタンスの詳細画面を開き、パブリックIPアドレスもしくはパブリックIPv4 DNSを確認します。</p>
<p data-id="050a1d27-6729-41d8-9934-757d545ec361">2.ブラウザでアクセス</p>
<p data-id="108526a0-f248-44f7-b9f1-1aaa36cb1fca">Webブラウザのアドレスバーに、確認したパブリックIPアドレスをHTTPSで入力します。(HTTPSでアクセスする場合は事前にSSL証明書のインストールとNginxの設定が必要です。HTTPでアクセスする場合はポート番号を指定します。例えば、<code>http://&lt;パブリックIPアドレス&gt;:8000</code>)</p>
<p data-id="e9d6f0a1-b1a9-4992-b944-3a16bd2e0747">アクセスが成功すると、Djangoのデフォルトページ、もしくは作成したアプリケーションのトップページが表示されます。もしここでエラーが表示される場合は下記表を参考にトラブルシューティングを行ってください。</p>
<table data-id="d9e089c2-6eaf-408a-8fde-67b5760391a8">
<colgroup>
<col>
<col>
<col>
	</colgroup>
<tbody>
<tr bgcolor="#d3d3d3">
<td colspan="1" rowspan="1">
<p data-id="7d9b8fbe-63b5-4129-8578-2f7a26513aba">エラー</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="4f74e29a-6ece-4b9f-95cd-965124407958">原因</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="2fe6cf5c-693d-4446-881c-00cac5052b66">解決策</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="504b2a0d-2fb2-43a4-886a-7ba8dc0a8d83">ページが表示されない</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="46b588fb-9eb3-4704-9f96-5bdd4665b19f">Nginxが起動していない</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="9004a594-3cb5-486b-b3b5-e1555cc64ace">Nginxを再起動</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="fb2ed514-aec7-46c7-b703-66c949a3e8f0">502 Bad Gateway</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="bb5ebc56-e1ec-4bf6-9668-b39bb3fb44d6">Gunicornが起動していない、またはNginxとGunicornの接続設定に問題がある</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="b7532d0c-0bab-4ecd-b97d-0d2ab38c65f5">Gunicornを再起動、Nginxの設定ファイルを確認</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="3c0ad656-a45a-45b6-b5d9-bfedd454fe0b">Djangoのエラーページが表示される</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="ce26f4d8-e7c9-4ef5-a14b-0f285a26fb7e">Djangoアプリケーションにエラーがある</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="f04642a9-d52f-485d-96f2-3d33efed6fef">エラーログを確認し、アプリケーションのコードを修正</p>
</td>
</tr>
</tbody>
</table>
<p data-id="61128bf2-ba9b-4509-8046-2b80ddae8981">3.表示内容の確認</p>
<p data-id="f514f612-9339-43d9-8861-a4040d1ac4c4">表示されたページの内容が、ローカル環境での動作確認時と同じであることを確認します。データベースへの接続や静的ファイルの読み込みなど、正しく動作しているかを確認しましょう。</p>
<p data-id="ce7ef3d0-6a98-4979-827c-71f26c759989">4.HTTPからHTTPSへのリダイレクト設定(任意)</p>
<p data-id="39755045-265f-414b-b1af-f7d7d4b445f6">セキュリティを高めるために、HTTPでアクセスされた場合にHTTPSにリダイレクトするように設定できます。Nginxの設定ファイルにリダイレクトルールを追加することで実現できます。</p>
<p data-id="43e5c8be-dd0a-4efe-8bbc-10ce70d88cc1">ブラウザでの動作確認が完了したら、デプロイ作業は完了です。</p>
<h2 data-id="290b084b-f709-447a-bd09-1ebe00a52917" data-toc-id="290b084b-f709-447a-bd09-1ebe00a52917" id="290b084b-f709-447a-bd09-1ebe00a52917">9. まとめ</h2>
<p data-id="5bb4f58b-82eb-40ef-9d2b-04564b698b06">この記事では、AWS EC2インスタンスにNginx、Gunicorn、Django、そしてMySQLを用いたWebアプリケーション環境を構築する方法をステップバイステップで解説しました。初心者の方でもスムーズに構築を進められるように、OSやソフトウェアのインストールから設定、デプロイ、そして動作確認まで、詳細な手順を説明しました。</p>
<table data-id="635b62bb-79b4-489e-ba6f-8a0ce3d69649">
<colgroup>
<col>
<col>
	</colgroup>
<tbody>
<tr bgcolor="#d3d3d3">
<td colspan="1" rowspan="1">
<p data-id="fcd0ea0c-6827-4d19-b131-961e1d8070c3">ソフトウェア</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="69c2fa71-64b0-4005-945e-f013b65854f4">役割</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="8ba7e0cf-a693-44fc-9990-30928378de0d">AWS EC2</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="102f383a-a25f-422a-b742-b87f9ea9c46c">仮想サーバーを提供</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="364c1a8d-5af5-4d61-9af8-5a88a0d3a2ce">Amazon Linux 2023</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="4dbc8d2b-3401-4816-abef-8e4ceb2be292">EC2インスタンスのOS</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="fc9be4a5-6060-4444-af7c-36349aaf625f">Nginx</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="ed6a2d40-25df-439e-939c-9d6e68349e6a">高性能なWebサーバー/リバースプロキシ</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="4597c3c3-95c1-4bd6-89d6-13a1ecb5ad05">Gunicorn</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="e29e71aa-f53a-4d33-a8be-1c1cb5b42eac">Python WSGI HTTPサーバー</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="fcc2904b-d6a4-441c-b5d7-a43516a019fa">Django</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="e7053834-b745-46e2-b230-6896a66bc7c7">PythonのWebフレームワーク</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="aa44794b-43c8-4cdc-a62f-19b57dab517d">MySQL</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="89348dd8-88af-42bd-87b1-7fae55d7d535">RDB（リレーショナルデータベース）</p>
</td>
</tr>
</tbody>
</table>
<p data-id="d91c7a71-b808-493e-b369-e7a3dc662902">これらのソフトウェアが連携することで、堅牢でスケーラブルなWebアプリケーション環境を実現できます。</p>
<p data-id="18bedaee-d255-4301-8da4-6f39c43f8408">今回の構築を通して、AWSの基礎知識、Linuxコマンド、Webサーバーやデータベースの概念などを学ぶことができました。しかし、本番環境で運用するには、セキュリティ対策やパフォーマンスチューニングなど、更なる学習が必要です。</p>
<p data-id="c4186eb4-0bfa-416e-b3af-8d4d5014e59a">今後の学習ステップとしては、以下のような項目が挙げられます。</p>
<ul data-id="e0d65e78-6b74-4d7a-b311-49523aaebf29">
<li>
<p data-id="7d1210dc-b558-4f03-82c0-fdf5b5166a9b">セキュリティグループの適切な設定：不要なポートを閉じ、アクセス制限を設けることで、外部からの攻撃を防ぎます。</p>
</li>
<li>
<p data-id="cb22e01a-e712-42be-afd6-dfc88f7b252e">HTTPS化：SSL/TLS証明書を導入し、通信を暗号化することで、データの盗聴や改ざんを防ぎます。</p>
</li>
<li>
<p data-id="50843460-827a-4ab3-a12d-477727e45580">データベースのバックアップ：定期的なバックアップとリストア手順を確立することで、データ消失のリスクを軽減します。</p>
</li>
<li>
<p data-id="2e143571-b65f-415b-8b0a-39cede74b4aa">パフォーマンスチューニング：NginxやGunicornの設定を最適化することで、Webアプリケーションのレスポンス速度を向上させます。</p>
</li>
<li>
<p data-id="91e18e92-4873-4db3-8cd1-8a4a3c668077">冗長化構成：複数のEC2インスタンスを組み合わせ、負荷分散やフェイルオーバーを実現することで、システムの可用性を高めます。</p>
</li>
<li>
<p data-id="91634b0a-859d-4370-975c-7528dfe7571a">AWSの各種サービス活用：S3（オブジェクトストレージ）、CloudFront（CDN）、RDS（マネージドリレーショナルデータベース）など、AWSの各種サービスを活用することで、より高度なWebアプリケーション環境を構築できます。</p>
</li>
</ul>
<p data-id="cc5eaae6-8d28-4aba-b3aa-8645fa498ba0">これらの項目を学ぶことで、より安全で高性能なWebアプリケーションを運用できるようになります。継続的な学習を通して、スキルアップを目指しましょう。</p>
<h3 data-id="3bf0c18f-10e0-4629-8b66-487af0199073" data-toc-id="3bf0c18f-10e0-4629-8b66-487af0199073" id="3bf0c18f-10e0-4629-8b66-487af0199073">完成した環境のおさらい</h3>
<p data-id="a8c4bfa0-bf89-45da-8c67-8ff99c31378c">この章では、構築したNginx + Gunicorn + Django + MySQL環境の全体像を改めて確認します。各コンポーネントの役割と連携について理解を深めましょう。</p>
<table data-id="8f93f5f9-5a85-4334-ac34-6a957bf542e6">
<colgroup>
<col>
<col>
	</colgroup>
<tbody>
<tr bgcolor="#d3d3d3">
<td colspan="1" rowspan="1">
<p data-id="a2886a40-98e5-4bd7-bb9d-66621d1203fd">コンポーネント</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="98c09aba-bb8f-4ec2-bf0a-e685c1c3262b">役割</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="fb9f46d1-8f37-460f-823a-64b3b6c459ac">Nginx</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="aedf0def-df3a-473e-8885-fe77ebfbddc7">リバースプロキシサーバーとして機能し、静的ファイルの配信やSSL/TLSの終端、Gunicornへのリクエスト転送を行います。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="9a136356-ab79-418a-8256-6537f44f96ae">Gunicorn</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="607eafe7-3417-4353-a1fc-86c00e28a4c3">WSGI HTTPサーバーとして、DjangoアプリケーションとNginxを繋ぎます。複数プロセスを管理することで、Djangoアプリケーションへの同時アクセスを処理できます。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="0a00884f-676d-49af-89e9-b8d0978a8335">Django</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="be7a9ca6-1e07-46cf-a7aa-ed6cf827457c">PythonのWebフレームワークであり、Webアプリケーションのロジック部分を担います。データベースとのやり取りやテンプレートのレンダリングなどを行います。</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="0cd49c6c-9431-485e-a83c-2613e0127980">MySQL</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="84accfa4-dde2-46b8-9798-273b0349a096">データベースサーバーとして、Webアプリケーションのデータを保存します。</p>
</td>
</tr>
</tbody>
</table>
<p data-id="2997b9d1-7ae4-431b-9cc5-35bbc5b7fa26">これらのコンポーネントは連携して動作します。ユーザーからのリクエストはまずNginxに到達します。Nginxは静的ファイルのリクエストであれば直接ファイルを返し、動的なコンテンツのリクエストであればGunicornに転送します。GunicornはDjangoアプリケーションを起動し、リクエストを処理します。Djangoアプリケーションは必要に応じてMySQLからデータを取得したり、データを保存したりします。処理結果をGunicornに返し、GunicornはNginxに、Nginxは最終的にユーザーにレスポンスを返します。</p>
<p data-id="e5607a77-3570-4f19-9644-e4a2b033ba19">今回構築した環境は、Webアプリケーションを公開するための基本的な構成です。よりセキュアでパフォーマンスの高い環境を構築するためには、SSL/TLSの設定やロードバランシング、キャッシュの導入など、更なる設定が必要になります。今後の学習ステップとして、これらの技術についても学んでいくと良いでしょう。</p>
<h3 data-id="64941d27-6e0b-4317-a612-cfa4db671df5" data-toc-id="64941d27-6e0b-4317-a612-cfa4db671df5" id="64941d27-6e0b-4317-a612-cfa4db671df5">今後の学習ステップ (セキュリティ強化、パフォーマンスチューニングなど)</h3>
<p data-id="980958f0-8a9f-4569-9ddc-27164e706c23">DjangoアプリケーションをAWS EC2にデプロイし、Nginx、Gunicorn、MySQLを用いた環境構築を完了した後も、継続的な学習と改善が必要です。ここでは、セキュリティ強化とパフォーマンスチューニングを中心に、更なるレベルアップのためのステップをご紹介します。</p>
<p data-id="2bcc2d97-0af7-410e-8a50-2852301852a2">まずセキュリティ強化についてです。本記事では基本的な設定のみを取り扱いましたが、実際の運用ではより強固なセキュリティ対策が必要です。例えば、HTTPSの設定が必須です。HTTPS通信を有効化することで、データの盗聴や改ざんのリスクを軽減できます。証明書の取得と設定を行いましょう。また、ファイアウォールの設定も重要です。不要なポートを閉じ、アクセスを制限することで、外部からの攻撃を防ぎます。セキュリティグループの設定を見直し、最小限のアクセス許可に留めましょう。定期的なセキュリティアップデートの実施も忘れてはいけません。OSやミドルウェアの脆弱性を修正し、システムを最新の状態に保つことで、既知の攻撃を防ぐことができます。</p>
<p data-id="3cd5de90-c4e5-4e16-8186-c467095c625c">次にパフォーマンスチューニングです。Webアプリケーションのレスポンス速度は、ユーザー体験に大きな影響を与えます。パフォーマンスを向上させるためには、キャッシュの活用が効果的です。NginxやDjangoでキャッシュを設定することで、データベースへのアクセス回数を減らし、レスポンス速度を向上させることができます。データベースのパフォーマンスチューニングも重要です。インデックスの最適化やクエリの見直しを行い、データベースの処理速度を向上させましょう。また、Gunicornの設定を見直すことも有効です。ワーカー数やワーカーの種類を調整することで、アプリケーションのパフォーマンスを最適化できます。負荷テストを実施し、最適な設定値を見つけましょう。</p>
<p data-id="334b938c-83e5-437f-a744-5b298408adb7">最後に、継続的な学習の重要性を強調しておきます。AWS、Nginx、Gunicorn、Django、MySQLといった技術は常に進化しています。公式ドキュメントや技術ブログなどを参考に、最新の情報やベストプラクティスを学び続けることで、より安全で高性能なWebアプリケーションを構築することができます。</p>
<table data-id="21f6d09e-3ad8-465f-999e-5fc48f6bddfb">
<colgroup>
<col>
<col>
	</colgroup>
<tbody>
<tr bgcolor="#d3d3d3">
<td colspan="1" rowspan="1">
<p data-id="e1204083-a4f8-4ac5-8633-4f6cfebb3ace">学習ステップ</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="27f15d37-86b2-4e27-a7f5-af1619485b7d">詳細</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="567e17c8-df20-46d8-9daa-e10b7412accf">セキュリティ強化</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="9af73a67-e7dc-4282-95eb-265e4eedb6d5">HTTPS設定、ファイアウォール設定、セキュリティアップデート</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="1ce6b3bb-f92f-46b6-80c0-457c112c29a7">パフォーマンスチューニング</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="033dbe54-7bab-41cd-bbe2-7a21c1cefec2">キャッシュ活用、データベースチューニング、Gunicorn設定</p>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">
<p data-id="9ade58cf-d1ae-4930-81ff-3aa70525c688">継続的な学習</p>
</td>
<td colspan="1" rowspan="1">
<p data-id="1bbad1c1-8543-42ac-be5d-71eda64865bf">公式ドキュメント、技術ブログ、コミュニティ</p>
</td>
</tr>
</tbody>
</table>
<h4 data-id="d66b4f7b-bbfe-4e22-a5d1-fce11df8f795" data-toc-id="d66b4f7b-bbfe-4e22-a5d1-fce11df8f795" id="d66b4f7b-bbfe-4e22-a5d1-fce11df8f795">外注も承ります</h4>
<p data-id="e550cc80-ae96-42dc-922e-ea79376b268f">yepでは様々な言語、環境に対してご相談、構築を承っております。日々進化する環境構築について疑問点、ご相談、ご依頼ございましたらお問い合わせよりご連絡よろしくお願いいたします。</p>
</div><p>The post <a href="https://www.ye-p.co.jp/blog/344-2">EC2でNginx+Gunicorn+Django+MySQLを構築</a> first appeared on <a href="https://www.ye-p.co.jp">株式会社yep</a>.</p>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
