对于想要使用AWS EC2和Django的初学者的提示

對於希望成為初級工程師的人來說,使用AWS EC2和Django技術可以是一個好的選擇。

我自己介绍一下

初次见面,我叫Pikumun。因为种种原因,我决定成为一名Web工程师。因此,我决定学习Django,并为了不忘记它而做下备忘录。如果能对某人有所帮助,我会很高兴。

本文将介绍如何使用Docker(Docker-Compose)来构建Python和Django的开发和生产环境,包括PostgreSQL,Gunicorn和Nginx的使用。具体请参考以下链接:https://tomato-develop.com/docker-dockercompose-python-django-postgresql-gunicorn-nginx-how-to-build-development-and-production-environment/

开始学习Django:第一部分——构建一个作品集应用程序
我打算按照https://realpython.com/get-started-with-django-1/上的教程,结合我自己的经验来解释。

我使用的是MacBook Air电脑,操作系统是Catalina,Docker版本为4.1.0。

读者预期

我是一个使用Django制作类似论坛的Web服务并在AWS EC2上进行部署的经验者。可能有来自不同背景的人来阅读我的文章,但我希望大家把它当作一个面向那些刚刚完成游戏教程并准备玩游戏的人的级别。我知道可能会有很多错误,所以请多多留下评论以帮助我改进文章。

首先

总之,我觉得有太多要记住的事情,让我感到接近呕吐,但我尝试用自己的话语总结起来。

Django是Python的Web框架,可以非常轻松地创建Web服务。其他著名的框架包括使用PHP的Laravel和使用Ruby的Ruby on Rails。在选择框架方面,许多公司等倾向于使用传统的PHP。另一方面,由于Ruby是由日本人开发的,因此有很多日语文本。Python在全球广泛使用,因此有丰富的库,特别是在与机器学习结合的Web服务方面表现出色。

虽然我提及了一下WordPress,但它是用PHP编写的,并专注于博客应用程序。也许因为它是用PHP编写的,所以可以按照自己的喜好自由修改网页,但这可能并不常见。

博客和网络服务是完全不同的东西。网络服务可以是能够输入Twitter视频链接并下载的网站,也可以是Twitter本身。

因此,如果想开始博客,从Django开始是不高效的,不推荐这样做。

Django通过在本地计算机上使用名为runserver的调试命令,可以启动开发服务器,但这仅仅是用于调试的,需要单独准备服务器。

服务器是指根据用户的请求提供服务的软件。注意:服务器也可用于提供数据的计算机。当用到“借用服务器”这个表述时,表示借用计算机的意思。需要注意的是,服务器有两种情况,一种是指软件服务器,一种是指物理计算机服务器,阅读时请留意。

尽管Django是一个功能强大的网络框架,

在开发应用程序时,框架是指作为其基础的使软件功能化的软件。

由于它仅仅是一个基础,所以在部署之前,并不意味着所有的工具都是完美的,所以在将其公开到网络上时,有必要根据需要自行准备服务器(软件)(与其他应用程序结合使用)。

可以通过运行服务器将其在全球范围内公开,但基于安全性和速度的观点,官方不推荐这样做。

在服务器上也有三种类型。
– Web服务器:为用户提供HTML、CSS和JavaScript的人。像Nginx这样的服务器
– 应用服务器:用于调解Web服务器和数据库服务器之间的关系。像Gunicorn这样的服务器
– 数据库服务器:用于访问数据库并拉取数据的人。像Django、Laravel和Ruby on Rails这样的框架。
需要巧妙地结合这些来构建服务器,但不幸的是,构建过程在很大程度上取决于个人电脑的环境。(在某人的电脑上工作良好,但在另一个人的电脑上无法正常运行。)
因此,我们使用虚拟环境的概念来驱动应用程序,以解决这个问题。

虚拟环境是将一个电脑在另一个电脑上启动的概念。

在开发Django时,通常使用Python的venv虚拟环境。当启动服务器时,使用名为Docker的应用程序来构建全新的虚拟环境,并将Docker的Python设置为与venv虚拟环境相同的配置,然后运行Nginx、Gunicorn和Django。

请注意:在开发时最好使用runserver进行调试,而不是使用Gunicorn和Nginx。我认为每次都启动Docker会大大降低开发速度。只有在生产环境中,才应该使用Gunicorn和Nginx来启动服务器。

如果能够熟练地使用Docker,通过Gnuicorn、Nginx和Django构建服务器,下一步就需要租用服务器。过去租用服务器并不像现在这样简单,所以我曾将自己的电脑用作服务器。采用这种方法的人需要好好学习网络基础设施,但现在可以非常容易地租用服务器(如AWS、Sakura服务器),因此省去了很多这方面的麻烦。

当租用了服务器(PC)后,当然服务器(PC)是空的,所以需要将自己编写的程序上传到服务器(PC)上。与将数据发送到朋友的电脑并插入USB存储设备完全不同。因此,可以通过在家中的PC上使用ssh进行远程访问,然后使用像github这样的服务将自己编写的程序放入服务器(PC)中。

后来,通过在该服务器(个人电脑)上启动虚拟环境,我可以在我自己开发的相同环境中构建服务器(应用程序)。

由于服务器(PC)会自动分配IP地址,所以可以从全球范围内访问。然而,仅有数字的URL显得不够友好,因此需要获取域名,并将IP地址与诸如○○.com,○○.jp等URL关联。

顺便提一句,域名是越早抢到越好,易懂的域名价格高昂。
只有完成这一系列的工作,才能将Web服务正式发布到全球。

我們將實際撰寫代碼。

未来的方向

・设置venv虚拟环境,并使用Django创建项目。使用Docker进行部署。
・学习Django教程。
・配置生产环境(添加Nginx和Gunicorn),将项目部署到AWSEC2。

我想用中文来逐步撰写。

到venv虛擬環境。

创建目录。

.
└── Docker-Django
    └── django_project
$ sudo -H pip3 install --upgrade pip
$ sudo -H pip3 install virtualenv

在Django项目上

virtualenv venv
source venv/bin/activate

在用户界面显示之前如果有”(venv)”字样,则说明激活成功。
如果想要禁用,

$ deactivate

在虚拟环境中安装Django,并确认初始界面。

(venv)$ pip3 install django
(venv)$ django-admin startproject project .

请确保不要忘记。请确认目录。

Docker-Django
└── django_project
    ├── manage.py
    ├── project
       ├── __init__.py
       ├── asgi.py
       ├── settings.py
       ├── urls.py
       └── wsgi.py
    └── venv

试着实际运行一下。

(venv)$ python manage.py runserver

请在浏览器中确认。

http://localhost:8000/
スクリーンショット 2021-12-09 14.34.41.png

使用Docker启动。

如果您尚未安装Docker,请从以下网站上进行安装。
在Mac上安装Docker桌面版
https://matsuand.github.io/docs.docker.jp.onthefly/desktop/mac/install/

我们从这里开始将会有一些较多的信息量,但是让我们努力吧。

首先,从整体上了解。创建文件时,请在查看此表的同时将以下内容复制并运行。

Docker-Django
├── django_project
│   ├── Dockerfile
│   ├──.env
│   ├── db.sqlite3
│   ├── manage.py
│   ├── project
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   ├── asgi.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   ├── requirements.txt
│   └── venv
└── docker-compose.yml

环境文件的设置

在Docker-Django上创建环境文件。由于根据开发环境可能需要进行更改,因此最好使用环境文件进行统一管理,以便在环境发生变化时更容易进行相应的调整。虽然可以不使用环境文件,但如果因为觉得麻烦而懒得使用,当环境发生变化时会感到悲伤(实际经历)。
通常情况下,这是一个隐藏文件,因此在使用Finder进行操作时,最好按下command+shift+.以显示隐藏文件夹模式进行操作。

DEBUG=True
SECRET_KEY='セキュリティの面で書きません。'
ALLOWED_HOSTS=localhost 127.0.0.1 [::1]

在环境文件(.env)中,写入Django中manage.py的配置。
特别是,ALLOWED_HOSTS涉及一些安全性问题,所以最好进行学习。

【Django】settings.py:ALLOWED_HOSTS的含义(开发和生产环境)
https://office54.net/python/django/settings-allowed-hosts

通常情况下,我们会将这个环境文件(.env)从Git管理中移除,并根据每个开发环境进行相应的修改。

import os
import environ

env = environ.Env()
env.read_env(os.path.join(BASE_DIR, '.env'))

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = os.environ.get("SECRET_KEY")

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = os.environ.get("DEBUG")

ALLOWED_HOSTS = os.environ.get("ALLOWED_HOSTS").split(" ")

由于这次把这三个东西移到了环境文件中,因此可以通过os库的os.environ.get函数来从外部文件中提取出来。

不要忘记导入os。

Docker Compose的配置。

通过使用docker-compose,可以将容器一次性进行封装。本次只是针对web,但在使用postgres作为数据库时,可以在此处添加。nginx也是一样。

version: '3.7'

services:
  web:
    build: ./django_project
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - ./django_project/:/usr/src/app/
    ports:
      - 8000:8000
    env_file:
      - ./django_project/.env

创建一个名为”web”的容器。
使用下一级目录的django_project的Dockerfile数据进行构建。
需要运行的附加命令是”python manage.py runserver 0.0.0.0:8000″。
要使用的附加卷是”./django_project/:/usr/src/app/”。
要暴露的附加端口是”8000:8000″。
要使用的附加env_file是”./.env”。
具体意思会在适当时间解释,等我学习后再给你讲解。

在docker上的应用程序中,如果通过localhost访问,则会出现ERR_EMPTY_RESPONSE错误。因此,需要在runserver中使用0.0.0.0:8000。

所以,那个Dockerfile是

FROM python:3.8.3-slim

WORKDIR /usr/src/app

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN pip install --upgrade pip
COPY ./requirements.txt .
RUN pip install -r requirements.txt

COPY . .

使用Python 3.8.3-slim版本,启动容器。(还有其他版本,但在这里我们使用slim。可能有些无法在其他版本上运行,可能是因为缺少库。)
设置环境变量,
安装pip,
获取requirements.txt文件,

Django
django-environ

安装Django和django-environ。

嗯?你可能会想要说刚才好像安装过了,但是这里是在Docker上进行安装。
大致来说,
初始的虚拟环境是在个人电脑上使用venv来创建的,安装了python的虚拟环境,并安装了Django。
而这次的情况是在个人电脑上使用Docker启动了一个容器,然后在容器中安装了python,并在这个python中安装了Django。这就是整个流程。

一位正在工作的工程师为初学者解释了使用Docker创建Python实施环境的方法。

容器是一种虚拟环境,所以无论是Python还是其他软件,它都可以执行。

如果是这样的话,那就不需要最初的步骤了。直接启动容器就可以了。
因为必须先执行 “django-admin startproject project .” 这个命令,所以这是必需的步骤。

Q. 但是啊,在PC上创建了venv的Python虚拟环境,然后不断安装模块进行开发。这个时候在Docker上运行Python并启动Django会有问题吧。
A. 是的会有问题。这种情况下,你需要在Dockerfile中添加”RUN apt-get -y install python3-numpy python3-scipy”之类的内容,以在Docker的Python环境中安装numpy、scipy等模块。其他模块只需要写在requirements.txt中就行了。
作为前人的建议,我要特别注意的是,如果你在开发过程中不断安装模块,后续使用Docker启动容器时会变得十分缓慢。在开发阶段可能没问题,但当你想要启动容器测试生产环境时,会感到非常沮丧(切身经历)。因此,如果开发环境混乱,应该先使用venv创建虚拟环境,安装必要的模块,然后通过runserver进行调试。当你顺利开发完成后,再根据Docker的要求,查询需要的模块并启动容器。否则,你可能会感到非常沮丧(切身经历)。

尝试使用docker-compose在容器中启动Django。

在Docker-Django上运行

(venv)$ docker-compose up -d --build

执行”。

在浏览器中进行确认。

http://localhost:8000/

如果火箭没有飞起来的话

(venv)$ docker-compose logs -f

看到错误消息时,请努力解决。

当你感到满意的时候

(venv)$ docker-compose down -v

请先停止容器。
总之,现在我们已经获得了开发环境和生产环境的基本框架。
接下来,只需要进行一定程度的开发,将nginx和Gunicorn组合到生产环境的基本框架中,即可完成部署。

从下一次开始,我们将进行一定程度的开发。

最后

感谢你的辛勤工作。从下次开始,我想继续学习Django的教程。
我知道有些地方可能有错误,所以如果你能通过评论告诉我,我会很感激。
因为我想写出尽可能准确的文章。非常感谢你的帮助。请多关照。

广告
将在 10 秒后关闭
bannerAds