在IBM Cloud VPC的虚拟实例上创建Python(Django)应用程序

首先

以下是在IBM Cloud的Virtual Private Cloud(VPC)的虚拟实例中启动Python应用程序框架Django的应用程序的步骤。虽然Django本身已经不是什么新鲜事物了,但当要评估一个应用程序时,我会重新测试并发布出能够立即使用该版本的结果。

在这次中,我们将在VPC的虚拟实例上创建Web服务器和数据库服务器,然后部署一个”简单的投票(poll)应用程序”,并进行Django的第一个应用程序创建,以确认其运行情况。

系统配置

システム構成図

角色

仮想インスタンス1(外部アクセスからのアクセス可能)

Webサーバ

OS: Ubuntu 20.04
Webサーバ : Djangoのrunserver
Python : 3.8.5
Django : 4.0.7

仮想インスタンス2(外部アクセスからのアクセス不可)

DBサーバ

OS: Ubuntu 20.04
PostgreSQL : 12

我们根据下面的Qiita文章参考,创建了虚拟私有云(VPC)和虚拟实例。

 

3. 创建应用程序的形象

アプリケーションのイメージ

4. 构建程序

Ubuntu的初始设置。

    Webサーバ・DBサーバ共通作業
    1. 远程服务器登录

 

    1. 首先要登录到远程服务器。

 

    1. ※在客户端进行操作

 

    1. ssh -i [私钥文件名] root@[WEB服务器的IP地址]

(注意)由于DB服务器未设置浮动IP,无法从外部通过SSH登录。
在Web服务器上放置用于连接DB服务器的私钥,并通过SSH登录DB服务器。
※在Web服务器上进行操作
$ ssh -i [私钥文件名] root@[DB服务器的IP地址]

创建用户
由于VPC虚拟实例的初始状态下没有一般用户,因此需要创建一个具有sudo权限的一般用户以进行操作。
$ adduser [用户名]
$ gpasswd -a [用户名] sudo

创建用户后,切换到创建的用户并进行操作。
$ su – [用户名]

更新软件包列表
执行软件包列表的更新。
$ sudo apt-get update

安装Python的PostgreSQL客户端库

    Webサーバーでの作業
    1. 在中文中,原文可以被简洁地表达为以下方式:

安装Python3、pip和PostgreSQL客户端
安装用于连接Python3、pip和PostgreSQL的客户端
$ sudo apt-get install python3-pip python3-dev libpq-dev postgresql-client-12

安装PostgreSQL

    DBサーバーでの作業
    1. 安装PostgreSQL。

 

    1. $ sudo apt-get install postgresql postgresql-contrib

确认PostgreSQL版本并检查是否正在运行。
在Ubuntu 20.04中,安装的PostgreSQL版本是12。
$ psql –version
psql (PostgreSQL) 12.12 (Ubuntu 12.12-0ubuntu0.20.04.1)

$ sudo systemctl status postgresql
● postgresql.service – PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Fri 2022-09-30 15:05:10 UTC; 2min 33s ago
Main PID: 3642 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 9508)
Memory: 0B
CGroup: /system.slice/postgresql.service

Sep 30 15:05:10 poll-db systemd[1]: Starting PostgreSQL RDBMS…
Sep 30 15:05:10 poll-db systemd[1]: Finished PostgreSQL RDBMS.

创建PostgreSQL数据库和连接用户。
登录到PostgreSQL数据库。
$ sudo su – postgres
$ psql
psql (12.12 (Ubuntu 12.12-0ubuntu0.20.04.1))
Type “help” for help.

创建数据库
postgres=# CREATE DATABASE polls;
CREATE DATABASE

创建用户(Django连接所需的用户和密码)
postgres=# CREATE USER poll_user WITH PASSWORD ‘poll_password’;
CREATE ROLE

授权给创建的用户
postgres=# GRANT ALL PRIVILEGES ON DATABASE polls TO poll_user;
GRANT

退出数据库
postgres=# \q

修改PostreSQL配置文件(postgresql.conf)。
默认情况下,设置的是只监听localhost,为了能够从外部连接到数据库服务器,将listen_addresses更改为“*”。
$ cd /etc/postgresql/12/main/
$ vi postgresql.conf

修改前(第60行)

#listen_addresses = ‘localhost’ # what IP address(es) to listen on;

修改后(第60行)

listen_addresses = ‘*’ # what IP address(es) to listen on;

修改PostgreSQL配置文件(pg_hba.conf)。
为了让Web服务器能够连接到PostgreSQL,需要在pg_hba.conf中添加让Web服务器子网(例如:10.10.0.0/24)以md5身份验证方式连接的配置。
$ vi pg_hba.conf

添加到末尾的内容

host all all 10.10.0.0/24 md5

切换回工作用户从postgresql用户。
$ exit
logout

重新启动PostgreSQL以应用更改(在工作用户下执行)。
$ sudo systemctl restart postgresql

检查PostgreSQL状态,如果没有设置错误,则应该处于运行状态。
$ sudo systemctl status postgresql
● postgresql.service – PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Sun 2022-10-02 02:44:42 UTC; 7s ago
Process: 16723 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 16723 (code=exited, status=0/SUCCESS)

Oct 02 02:44:42 poll-db systemd[1]: Starting PostgreSQL RDBMS…
Oct 02 02:44:42 poll-db systemd[1]: Finished PostgreSQL RDBMS.

确认连接(从Web服务器到PostgreSQL)

    • Webサーバーでの作業

 

    PostgreSQLサーバの設定が終わったので、WebサーバからPostgreSQLサーバへの接続を確認します。
    1. 请确认已安装PostgreSQL的psql客户端。

 

    1. 如果已经安装,则可以确认其版本为12。如果没有psql命令,请从Ubuntu的初始设置开始确认。

 

    1. $ psql –version

 

    1. psql (PostgreSQL) 12.12 (Ubuntu 12.12-0ubuntu0.20.04.1)

使用psql命令连接到PostgreSQL数据库。
$ psql -h [PostgreSQL服务器的IP地址] -U [PostgreSQL用户名] [数据库名]
用户poll_user的密码:[输入密码]

如果成功连接到数据库,将显示以下提示符。
psql (12.12 (Ubuntu 12.12-0ubuntu0.20.04.1))
SSL连接(协议:TLSv1.3,加密方式:TLS_AES_256_GCM_SHA384,位数:256,压缩:关闭)
输入”help”获取帮助。

要确认是否成功连接到数据库,请执行”¥l”命令以显示数据库列表。
请确认列表中显示了template0、template1、postgresql,以及创建的数据库(例如:polls)。
polls=> \l
数据库列表
名称 | 所有者 | 编码 | 校对顺序 | ctype | 访问权限
———–+———-+——-+———-+———–+————————
polls | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =Tc/postgres +
| | | | | postgres=CTc/postgres +
| | | | | poll_user=CTc/postgres
postgres | postgres | UTF8 | C.UTF-8 | C.UTF-8 |
template0 | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(4 行)

现在,从Web服务器到数据库服务器的连接已经建立完成。接下来,我们将创建Django环境。

创建Django开发环境

    Webサーバでの作業
    1. 使用pip命令,安装Django和Python连接到PostgreSQL的适配器”psycopg2″。

 

    1. $ sudo pip3 install Django==4.0.7 psycopg2

这次,我们安装了Django的版本4.0.7,但可安装的版本列表如下所示:输入一个不存在的版本号,例如:
$ sudo pip3 install Django==4.xxxx
ERROR: Could not find a version that satisfies the requirement Django==4.xxxx (from versions: 1.1.3, 1.1.4, 1.2, 1.2.1, 1.2.2, 1.2.3, 1.2.4, 1.2.5, 1.2.6, 1.2.7, 1.3, 1.3.1, 1.3.2, 1.3.3, 1.3.4, 1.3.5,
<<省略>>
3.2.14, 3.2.15, 4.0a1, 4.0b1, 4.0rc1, 4.0, 4.0.1, 4.0.2, 4.0.3, 4.0.4, 4.0.5, 4.0.6, 4.0.7, 4.1a1, 4.1b1, 4.1rc1, 4.1, 4.1.1)
ERROR: No matching distribution found for Django==4.xxxx

准备Django应用程序

本次我们将使用Django的“简单投票应用程序”来进行操作确认,这是第一次创建Django应用程序。

这是一段古老的源代码,但在 Github 的 DigitalOcean Community 中找到了一个名为“简单投票应用程序”的项目,所以我将使用这个源代码。

    1. 从GitHub的仓库中克隆下来一个简单的投票应用程序。

 

    1. $ git clone https://github.com/do-community/Django-polls.git

克隆完成后,将创建一个 Django-polls 文件夹。我们希望在/app文件夹中运行,所以将 Django-polls 更改为/app,并将文件夹的权限更改为工作用户(例如:dai.dai)。
$ sudo mv Django-polls /app
$ sudo chown -R dai.dai /app

配置完成后,/app文件夹的结构如下所示,由Django项目的文件组成。
$ ls -l /app
total 24
-rw-rw-r– 1 dai dai 1079 Oct 2 02:50 LICENSE
-rw-rw-r– 1 dai dai 1359 Oct 2 02:50 README.md
-rwxrwxr-x 1 dai dai 538 Oct 2 02:50 manage.py
drwxrwxr-x 2 dai dai 4096 Oct 2 02:50 mysite
drwxrwxr-x 5 dai dai 4096 Oct 2 02:50 polls
drwxrwxr-x 3 dai dai 4096 Oct 2 02:50 templates

Django的設定文件settings.py的設定。

编辑Django的设置文件settings.py。

修改部分包括以下3个参数。

- SECRET_KEY 
- ALLOWED_HOSTS
- DATABASE
    1. 重新生成secret_key

 

    1. 由于参数如下所示,SECRET_KEY将重新生成。

 

    1. SECRET_KEY = ‘your_secret_key_here’

 

    1. 使用Django管理脚本manage.py启动Shell。

 

    1. $ python3 manage.py shell

 

    1. Python 3.8.10 (default, Jun 22 2022, 20:18:18)

 

    1. [GCC 9.4.0] on linux

 

    1. 键入”help”, “copyright”, “credits”或”license”获取更多信息。

 

    1. (InteractiveConsole)

 

    1. >>>

启动Shell后,执行以下内容以重新生成secret_key。
from Django.core.management.utils import get_random_secret_key
secret_key = get_random_secret_key()
text = ‘SECRET_KEY = \'{0}\”.format(secret_key)
print(text)

将输出结果填入settings.py中的SECRET_KEY值。

更改前

SECRET_KEY = ‘your_secret_key_here’

更改后

SECRET_KEY = ‘xxxtx!u3j@ix8h59_xxxbjc8u1l_y+f&d%_l!rc_cus@ua9xxx’

ALLOWED_HOSTS(访问权限设置)
默认情况下,只允许localhost连接,因此需要设置为允许全部 *,或Web服务器的IP地址。

更改前

ALLOWED_HOSTS = []

更改后

※如果要允许全部
ALLOWED_HOSTS = [‘*’]
*如果要指定IP地址
ALLOWED_HOSTS = [‘111.222.333.444’]

数据库设置
进行与Django连接数据库的设置。初始设置使用sqlite3,现在改为设置为PostgreSQL。

更改前

DATABASES = {
‘default’: {
‘ENGINE’: ‘Django.db.backends.sqlite3’,
‘NAME’: os.path.join(BASE_DIR, ‘db.sqlite3’),
}
}

更改后

DATABASES = {
‘default’: {
‘ENGINE’: ‘Django.db.backends.postgresql_psycopg2’,
‘NAME’: ‘数据库名称’,
‘USER’: ‘PostgreSQL连接用户名’,
‘PASSWORD’: ‘PostgreSQL连接用户的密码’,
‘HOST’: ‘数据库连接的IP地址’,
‘PORT’: ‘连接到PostgresQL的端口号’,
}
}

执行迁移

    1. 执行Django的迁移命令,生成数据库的模式。

 

    1. $ python3 manage.py migrate

执行该命令后,会输出以下内容,并在最后继续显示”Applying”字符串。如果没有任何输出,则可能是无法连接到数据库。请检查settings.py文件的设置。
系统检查发现了一些问题:

警告:
polls.Choice:(models.W042)在没有定义主键类型的情况下使用自动生成的主键,默认为’Django.db.models.AutoField’。
提示:配置DEFAULT_AUTO_FIELD设置或者设置PollsConfig.default_auto_field属性,以指向AutoField的子类,例如’Django.db.models.BigAutoField’。
polls.Question:(models.W042)在没有定义主键类型的情况下使用自动生成的主键,默认为’Django.db.models.AutoField’。
提示:配置DEFAULT_AUTO_FIELD设置或者设置PollsConfig.default_auto_field属性,以指向AutoField的子类,例如’Django.db.models.BigAutoField’。
要执行的操作:
应用所有迁移:admin,auth,contenttypes,polls,sessions
正在执行迁移:
应用contenttypes.0001_initial… OK
应用auth.0001_initial… OK
应用admin.0001_initial… OK
应用admin.0002_logentry_remove_auto_add… OK
应用admin.0003_logentry_add_action_flag_choices… OK
应用contenttypes.0002_remove_content_type_name… OK
应用auth.0002_alter_permission_name_max_length… OK
应用auth.0003_alter_user_email_max_length… OK
应用auth.0004_alter_user_username_opts… OK
应用auth.0005_alter_user_last_login_null… OK
应用auth.0006_require_contenttypes_0002… OK
应用auth.0007_alter_validators_add_error_messages… OK
应用auth.0008_alter_user_username_max_length… OK
应用auth.0009_alter_user_last_name_max_length… OK
应用auth.0010_alter_group_name_max_length… OK
应用auth.0011_update_proxy_permissions… OK
应用auth.0012_alter_user_first_name_max_length… OK
应用polls.0001_initial… OK
应用sessions.0001_initial… OK

创建Django的超级用户

注册Django的超级用户。在简单投票(poll)应用程序的管理界面中,使用此处创建的用户登录。

$ python3 manage.py createsuperuser

Username (leave blank to use 'dai'): [ユーザー名を入力]
Email address: [メールアドレスを入力]
Password:  [パスワードを入力]
Password (again): [パスワードを入力] 
Superuser created successfully.

创建演示数据

我們將製作一個即將啟動的「簡單投票應用程式」的示範資料。
這次我們將創建一個有關今天天氣的投票數據,如下所示。

    • 今日の天気

質問: 今日の天気は?
回答: 1.雨、2.曇り、3.晴れ

    1. 使用Django的管理脚本manage.py启动Shell。

 

    1. $ python3 manage.py shell

在Shell中执行以下内容,将数据存入数据库。
from polls.models import Choice, Question
from Django.utils import timezone
q = Question(question_text=”今天的天气”, pub_date=timezone.now())
q.save()
q.question_text = “今天的天气是?”
q.save()
q.choice_set.create(choice_text=’雨’, votes=0)
q.choice_set.create(choice_text=’多云’, votes=0)
q.choice_set.create(choice_text=’晴朗’, votes=0)
exit

现在,准备工作已经完成。接下来只需要启动Web服务器!

确认动作:启动Web服务器

    1. 使用Django的runserver[测试用简易服务器]来启动。

 

    1. 0.0.0.0:8000是指可以接受来自任何IP地址的8000端口的意思。

 

    1. $ python3 manage.py runserver 0.0.0.0:8000

如果成功启动,将会输出以下信息:Starting development server…
系统检查发现2个问题(0个被屏蔽)。
2022年10月02日 – 03:05:12
使用设置’mysite.settings’的Django版本为4.0.7
在http://0.0.0.0:8000/上启动开发服务器
使用CONTROL-C退出服务器。

在浏览器中,使用Web服务器的浮动IP地址,访问以下URL:”http://(浮动IP地址):8000/polls”。

アプリケーションの画面遷移図

在浏览器访问时,您可以通过控制台确认以下的访问日志正在流动。

[03/Oct/2022 15:38:07] "GET /polls/ HTTP/1.1" 200 549
[03/Oct/2022 15:38:07] "GET /static/polls/style.css HTTP/1.1" 404 179
[03/Oct/2022 15:38:07] "GET /polls/1/ HTTP/1.1" 200 945
[03/Oct/2022 15:38:07] "POST /polls/1/vote/ HTTP/1.1" 302 0
[03/Oct/2022 15:38:07] "GET /polls/1/results/ HTTP/1.1" 200 568
[03/Oct/2022 15:38:07] "GET /polls/1/ HTTP/1.1" 200 945
[03/Oct/2022 15:38:08] "POST /polls/1/vote/ HTTP/1.1" 302 0
[03/Oct/2022 15:38:08] "GET /polls/1/results/ HTTP/1.1" 200 568
[03/Oct/2022 15:38:08] "GET /polls/1/ HTTP/1.1" 200 945
[03/Oct/2022 15:38:08] "POST /polls/1/vote/ HTTP/1.1" 302 0
[03/Oct/2022 15:38:08] "GET /polls/1/results/ HTTP/1.1" 200 568
[03/Oct/2022 15:38:08] "GET /polls/1/ HTTP/1.1" 200 945
[03/Oct/2022 15:38:09] "GET /polls/ HTTP/1.1" 200 549

最后

现在,我已经成功地将Django应用程序部署在IBM Cloud的Virtual Private Cloud(VPC)的虚拟实例上。

作为下一步,我创建了一篇关于在基础设施和应用层面上进行可视化和监控的挑战的Qiita文章。请同时阅读以下的Qiita文章。

    インフラ視点での可視化・モニタリング

 

    アプリ視点での可視化・モニタリング

 

我使用Django的runserver作为运行Django应用程序的Web服务器,但是我想在另一篇文章中写到uWSGI或Gunicorn的操作方式。

广告
将在 10 秒后关闭
bannerAds