使用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