使用AWS EC2、Flask和WSGI来尝试创建一个网站

请小心

如果为了训练目的而构建网站,在使用完毕后,请务必停止EC2实例。

环境

    • Windows 10 Home

 

    • AWS EC2

 

    • ubuntu 22.04

 

    Flask 3.0.0

背景:

我之前一直在VPS上托管网页应用,但是现在是云时代了,所以我想挑战AWS。

總結

我使用AWS EC2托管了一个基于Flask的动态网站,但是由于没有使用到云特有的功能,所以操作步骤和VPS完全相同。换句话说,我通过ssh连接到EC2,从GitHub上克隆项目,并在apache2服务器上进行路由配置。

云端的特殊功能之一是使用具有良好可扩展性的数据库服务RDS,将其独立于EC2进行安置。在这次的案例中,我们并未使用云端特殊功能,而是通过EC2托管了一个动态网站,实现了完成一体化。

使用AWS EC2托管动态网站

动态网站是指可以动态更新内容和交互的网站。

通过 API 访问数据库等方式实现每次显示都不一样的网站被称为动态网站。虽然本次网站不是动态网站,但由于使用了 WSGI 和 Flask,将成为访问动态网站的入口。

连接到EC2实例的SSH步骤

在连接到EC2之前,下面链接中的视频非常易于理解。

由于手动执行了app.py,所以只有在执行时才能访问到下方链接中的网站。通过使用WSGI,就像本文所示,可以始终托管网站。

 

安装apache2

连接到EC2后,继续执行后续步骤。

Apache2是一台可以托管多个网站的服务器。

使用以下命令安装apache2。

由于处于活动状态,已经成功安装。

$ sudo apt update
...
$ sudo apt install apache2
...
$ sudo systemctl enable apache2
...
$ systemctl status apache2
...
Active: active (running)
...

请使用以下命令确认是否已创建apache2文件夹。

$ cd /etc
/etc$ ls -l
...
drwxr-xr-x 8 root root       4096 Oct 20 14:45 apache2
...

添加Apache2的配置文件

为了新建的网站,添加关于apache2的配置文件。

如果访问者访问”awsec2test.yourdomainname.com”,将会被路由到”/var/www/AWSTest/app.wsgi”页面,根据以下配置预设。

这次,域名是”yourdomainname.com”,子域名是”awsec2test”。另外,项目文件夹是”/var/www/AWSTest/”。

/etc$ cd apache2
/etc/apache2$ ls -l
...
drwxr-xr-x 2 root root  4096 Oct 20 14:45 sites-available
drwxr-xr-x 2 root root  4096 Oct 20 14:45 sites-enabled
...
/etc/apache2$ cd  sites-available
/etc/apache2/sites-available$ ls -l
total 12
-rw-r--r-- 1 root root 1332 May  3 20:02 000-default.conf
-rw-r--r-- 1 root root 6338 May  3 20:02 default-ssl.conf
/etc/apache2/sites-available$ sudo touch awsec2test.yourdomainname.com.conf
/etc/apache2/sites-available$ ls -l
total 12
-rw-r--r-- 1 root root 1332 May  3 20:02 000-default.conf
-rw-r--r-- 1 root root    0 Oct 20 14:55 awsec2test.yourdomainname.com.conf
-rw-r--r-- 1 root root 6338 May  3 20:02 default-ssl.conf
/etc/apache2/sites-available$ sudo nano awsec2test.yourdomainname.com.conf
/etc/apache2/sites-available$ cat awsec2test.yourdomainname.com.conf
<VirtualHost *:80>
    ServerName awsec2test.yourdomainname.com

    WSGIDaemonProcess awstest threads=5
    WSGIScriptAlias / /var/www/AWSTest/app.wsgi

    <Directory /var/www/AWSTest/>
        WSGIProcessGroup awstest
        WSGIApplicationGroup %{GLOBAL}
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/awstest_error.log
    CustomLog ${APACHE_LOG_DIR}/awstest_access.log combined
</VirtualHost>

激活Apache2的配置文件。

现在激活刚刚创建的apache2配置文件。

/etc/apache2/sites-available$ cd ../
/etc/apache2$ ls -l
...
drwxr-xr-x 2 root root  4096 Oct 20 14:56 sites-available
drwxr-xr-x 2 root root  4096 Oct 20 14:45 sites-enabled
...
/etc/apache2$ cd  sites-enabled
/etc/apache2/sites-enabled$ ls -l
total 0
lrwxrwxrwx 1 root root 35 Oct 20 14:45 000-default.conf -> ../sites-available/000-default.conf
$ sudo a2ensite awsec2test.yourdomainname.com.conf
/etc/apache2/sites-enabled$ ls -l
lrwxrwxrwx 1 root root 35 Oct 20 14:45 000-default.conf -> ../sites-available/000-default.conf
lrwxrwxrwx 1 root root 51 Oct 20 14:57 awsec2test.yourdomainname.com.conf -> ../sites-available/awsec2test.yourdomainname.com.conf
$ sudo systemctl restart apache2

网站项目文件夹

假设项目文件夹已经在GitHub上创建完成。

这次,如下所示的网站已经被推送到GitHub上。

templates
    -index.html
app.py
app.wsgi
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def home():
    return render_template('index.html')

if __name__ == "__main__":
    app.run()
import sys
sys.path.insert(0, '/var/www/AWSTest')

from app import app as application
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Hello AWS</title>
</head>
<body>
    <h1>Hello AWS. Hello Flask with WSGI.</h1>
</body>
</html>

将数据从GitHub复制到EC2。

请在下述中的”yourname”部分填入您的GitHub用户名。

下面的AWSTest是GitHub仓库的名称。如果名称不同,请进行更改。

/var/www$ sudo git clone https://github.com/yourname/AWSTest
...
/var/www$ ls -l
total 8
drwxr-xr-x 4 root root 4096 Oct 20 15:15 AWSTest
drwxr-xr-x 2 root root 4096 Oct 20 14:45 html

安装模块以使WSGI功能正常运行。

安装libapache2-mod-wsgi-py3。

$ sudo apt-get install libapache2-mod-wsgi-py3
$ sudo systemctl restart apache2

安装将在本次使用的Python模块(Flask)。

我們要安裝Flask。

$ sudo apt install python3-pip
...
$ pip3 install flask
...

设定DNS的A记录

因为我从Xserver VPS获得了域名,所以我从那里添加了一个新的A记录。

「XXX.XXX.XXX.XXX」这部分是指AWS的EC2实例的IP地址。

添加DNS记录可能需要一些时间才能生效(大约5到20分钟左右)。

awsec2test.yourdomainname.com    A    XXX.XXX.XXX.XXX

确认是否成功。

访问「awsec2test.yourdomainname.com」,以确认网站是否显示。

如果能够显示出在index.html中所记录的字符串(本次为”Hello AWS. Hello Flask with WSGI.”),那么就算是成功了。

未来的展望 de

我想尝试使用Amazon GameLift。我还想尝试使用AutoScailing。但是要小心避免无限制的收费。

请竞争对手作为参照。

    https://www.youtube.com/watch?v=AGmkG0wJ8LA
广告
将在 10 秒后关闭
bannerAds