Nginx反向代理通过端口80接受Web请求,并通过端口5000将这些请求转发到 Flask Web服务器。Flask Web服务器完成请求并将响应内容返回给Nginx。本文将主要介绍如何使用亚马逊免费VPS“Amazon Lightsail容器”在Nginx反向代理后面配置Flask Web服务器。
Amazon Lightsail容器既托管Nginx容器又托管Flask容器。通过公共端点可以对Nginx服务器进行外部访问。
亚马逊云科技官网:开始免费试用3个月Amazon Lightsail
一、Nginx反向代理配置前提条件
开始使用应用程序之前,先完成以下前提条件。
一个AWS账户,而且必须在系统上安装Docker、Docker Compose、AWS命令行界面 (CLI) 工具和Lightsail Control (lightsailctl) 插件。如果没有上述某些工具或插件。
AWS账户注册指南:
二、获取源代码1、在本地克隆GitHub存储库。
git clone https://github.com/awsgeek/lightsail-containers-nginx.git
2、切换到项目目录。
在本指南的后续步骤中,所有命令均从项目目录运行。
三、Flask应用程序cd lightsail-containers-nginx
Flask应用程序包含一个hello_world() 函数,当请求路由/时会触发该函数。此应用程序在运行时会绑定到系统上的所有IP (0.0.0.0) 并监听端口5000(默认Flask端口)。
1、以下代码块中显示了Flask应用程序app.py的源代码。
from flask import Flask
app = Flask(__name__)@app.route(“/”)
def hello_world():
return “Hello, World!”if __name__ == “__main__”:
app.run(host=”0.0.0.0″, port=5000)
2、Flask应用程序的Dockerfile使用Python alpine镜像尽可能降低容器镜像的大小。容器启动时运行的命令与从命令行运行的命令相同:python app.py。
四、构建Flask容器# Set base image (host OS)
FROM python:3.8-alpine# By default, listen on port 5000
EXPOSE 5000/tcp# Set the working directory in the container
WORKDIR /app# Copy the dependencies file to the working directory
COPY requirements.txt .# Install any dependencies
RUN pip install -r requirements.txt# Copy the content of the local src directory to the working directory
COPY app.py .# Specify the command to run on container start
CMD [“python”, “./app.py”]
通过完成以下步骤在本地系统上构建Flask应用程序容器。
1、使用Docker构建容器。从项目目录完成以下命令:
此命令使用Dockerfile在当前目录下构建一个容器,并将该容器标记为flask-container。
docker build -t flask-container ./flask
2、容器构建完成后,通过运行容器在本地测试Flask应用程序。
docker run -p 5000:5000 flask-container
3、Flask应用程序将在容器中运行,并且将通过端口5000向本地系统公开数据。
浏览到http://localhost:5000或从命令行使用curl,将看到Hello, World!
若要停止容器,请输入CTRL-C。
五、Nginx反向代理配置curl localhost:5000
Hello, World!
1、Nginx反向代理通过端口5000将所有请求转发到Flask应用程序。若要配置Nginx以转发请求,需要使用下面的简单配置文件nginx.conf:
此配置会将所有请求转发到上游的Flask服务器。当容器运行时,Flask服务器的主机名和端口会以环境变量的形式提供。
events {}
http {
upstream flask {
server ${FLASK_HOST}:${FLASK_PORT};
}# a simple reverse-proxy
server {listen 80 default_server;
location / {
# pass requests to the Flask host
proxy_pass http://flask;
}
}
}
2、Nginx反向代理的Dockerfile 使用头部Nginx alpine镜像,并且只是将nginx.conf配置文件复制到相应的目录。
如以下代码所示。
六、构建Nginx容器FROM nginx:1.19-alpine
COPY ./nginx.conf /etc/nginx/templates/nginx.conf.template
通过完成以下步骤在本地系统上构建Nginx反向代理容器。
1、使用Docker构建容器。从项目目录完成以下命令:
此命令使用Dockerfile在当前目录下构建一个容器,并将该容器标记为nginx-container。
docker build -t nginx-container ./nginx
2、容器构建完成后,通过运行容器在本地测试Nginx代理和Flask应用程序:
docker-compose up –-build
3、Flask应用程序和Nginx反向代理容器都将运行。Nginx服务器通过端口80监听请求,并将请求转发到Flask应用程序。浏览到http://localhost或从命令行使用curl,将看到Hello, World!
若要停止容器,请输入CTRL-C。
七、创建Amazon Lightsail容器服务curl localhost
Hello, World!
通过完成以下步骤来创建亚,亚马逊VPS Amazon Lightsail容器服务并将本地容器镜像推送到新容器服务。
1、使用create-container-service命令创建Amazon Lightsail容器服务。
power和scale参数用于指定容器服务的容量。在本指南中,需要的容量很小。
create-container-service命令的输出结果表明新服务的状态为PENDING(如第二个代码块所示)。
aws lightsail create-container-service –service-name sample-service \
–power small \
–scale 1{
“containerService”: {
“containerServiceName”: “sample-service”,
…
“state”: “PENDING”,
2、使用get-container-services命令监控创建中的容器的状态。待容器服务的状态更改为ACTIVE后,再继续执行下一步。容器服务应当在几分钟后就会变为ACTIVE状态。
aws lightsail get-container-services –service-name sample-service
3、使用push-container-image命令将Flask应用程序容器推送到Amazon Lightsail。
注意:sample-service.flask-container.X中的X将为一个数值。如果这是首次将镜像推送到容器服务,则此数值为1。在下一步中将需要此数值。
aws lightsail push-container-image –service-name sample-service \
–label flask-container \
–image flask-container…
Refer to this image as “:sample-service.flask-container.X” in deployments.
4、使用push-container-image命令将Nginx反向代理容器推送到Amazon Lightsail。
注意:sample-service.nginx-container.Y中的Y将为一个数值。如果这是首次将镜像推送到容器服务,则此数值为1。在下一步中将需要此数值。
八、部署容器aws lightsail push-container-image –service-name sample-service \
–label nginx-container \
–image nginx-container…
Refer to this image as “:sample-service.nginx-container.Y” in deployments.
通过完成以下步骤,创建用于部署和公共端点配置的JSON文件,然后将容器镜像部署到容器服务。
1、创建一个名为containers.json的新文件。
编辑该文件并添加以下代码块。
将sample-service.flask-container.X中的X和sample-service.nginx-container.Y中的Y替换为上一步中的数值。保存该文件。
containers.json文件用于描述将在容器服务上启动的容器的设置。在此实例中,containers.json文件描述了Nginx容器和Flask容器以及这些容器将使用的镜像和公开数据的端口。此外,文件还提供了用于指定Flask主机和端口的环境变量。在运行时,Nginx会将nginx.conf文件中的占位符值替换为此处提供的实际值。
{
“sample-nginx”: {
“image”: “:sample-service.nginx-container.Y”,
“command”: [],
“ports”: {
“80”: “HTTP”
},
“environment”: {
“NGINX_ENVSUBST_OUTPUT_DIR”: “/etc/nginx”,
“FLASK_HOST”: “localhost”,
“FLASK_PORT”: “5000”
}
},
“sample-flask”: {
“image”: “:sample-service.flask-container.X”,
“ports”: {
“5000”: “HTTP”
}
}
2、创建一个名为public-endpoint.json的新文件。
编辑该文件并添加以下代码。 保存该文件。
public-endpoint.json文件用于描述容器服务的公共端点的设置。在此实例中,publicendpoint.json文件表明Nginx容器将通过端口80公开数据。只有要进行公共访问的服务才需要设置公共端点。
{
“containerName”: “sample-nginx”,
“containerPort”: 80
}
3、在AWS CLI中,使用create-container-service-deployment命令将容器部署到容器服务。
create-container-service-deployment命令的输出结果表明容器服务的状态现在为DEPLOYING(如第二个代码块所示)。
aws lightsail create-container-service-deployment –service-name sample-service \
–containers file://containers.json \
–public-endpoint file://public-endpoint.json{
“containerServices”: [{
“containerServiceName”: “sample-service”,
…
“state”: “DEPLOYING”,
4、使用get-container-services命令监控容器的状态,待状态更改为RUNNING后再继续执行下一步。get-container-service命令还会返回容器服务的端点URL。
待容器服务的状态更改为RUNNING后,通过浏览器前往此URL,以验证容器服务是否正常运行。和之前一样,浏览器输出结果应当显示“Hello, World!”。
到目前为止,已使用Amazon Lightsail容器成功部署了容器化Nginx反向代理和Flask应用程序。
九、清除aws lightsail get-container-services –service-name sample-service
{
“containerServices”: [{
“containerServiceName”: “sample-service”,
…
“state”: “RUNNING”,
…
“url”: “https://sample-service…
通过完成以下步骤来清除在学习本教程的过程中创建的Amazon Lightsail容器服务。
1、若要清除和删除Amazon Lightsail资源,请使用delete-container-service命令。delete-container-service命令会删除容器服务、任何关联的容器部署以及容器镜像。
aws lightsail delete-container-service –service-name sample-service
{
“containerService”: {
“containerServiceName”: “sample-service”,
…
“state”: “PENDING”,
相关推荐:
(本文由美国主机侦探原创,转载请注明出处“美国主机侦探”和原文地址!)

微信扫码加好友进群
主机优惠码及时掌握

QQ群号:938255063
主机优惠发布与交流