在Vultr上部署Flask应用:从零搭建安全Web服务

本文详细介绍了如何在Vultr云平台上部署Flask应用,包括创建优化云实例、配置Python虚拟环境、实现CSRF保护和内容安全策略,以及使用Nginx作为反向代理并配置HTTPS证书的全过程。

在Vultr上部署Flask应用

介绍

Flask是一个用于构建Web应用的Python框架。通过Flask,开发者可以轻松定义路由、处理HTTP请求和响应,并使用Jinja2模板渲染动态内容。它还支持扩展,允许开发者集成数据库访问、表单处理和用户认证等功能。

在本文中,我们将使用Gunicorn部署一个Flask应用,同时实现CSRF保护和内容安全策略。我们还将使用Nginx设置反向代理,并通过Let’s Encrypt申请免费SSL证书来实现HTTPS。

部署Vultr优化云实例

  1. 注册并登录Vultr客户门户
  2. 导航到产品页面
  3. 从侧边菜单选择计算
  4. 点击中心的部署服务器按钮
  5. 选择优化云计算作为服务器类型
  6. 选择服务器位置
  7. 选择Ubuntu 24.04作为操作系统
  8. 选择合适的套餐
  9. 根据需要选择任何附加功能
  10. 点击立即部署

添加演示应用程序代码文件

设置Python虚拟环境

安装python3-venv包

1
$ sudo apt install python3-venv

创建虚拟环境

1
$ python3 -m venv myenv

激活虚拟环境

1
$ source myenv/bin/activate

添加演示应用程序代码文件

克隆GitHub仓库

1
$ git clone https://github.com/mayankdebnath/flask-todo-demo.git

导航到项目目录

1
$ cd flask-todo-demo/sample/

安装Flask和Gunicorn包

1
$ pip install flask gunicorn

允许传入连接到端口5000

1
$ ufw allow 5000

应用CSRF保护和内容安全策略

跨站请求伪造(CORS)是一种漏洞,允许攻击者利用用户在受信任网站上的登录会话来向用户信任的不同网站发出未经授权的请求。WTForms是一个Flask扩展,默认集成了CSRF保护以防止CORS攻击。

内容安全策略(CSP)是为Web应用程序提供的额外安全层,可保护它们免受恶意攻击。CSP指示浏览器允许在特定网页上加载哪些资源。通常,网站管理员通过向服务器响应添加特殊标头来配置CSP,然后浏览器接收CSP标头并了解允许加载哪些资源。Talisman是一个Flask扩展,简化了向Flask应用添加CSP的过程。

安装flask-wtf和talisman包

1
$ pip install flask-wtf talisman

打开app.py文件

1
$ nano app.py

编辑app.py文件以包含内容安全策略

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from talisman import Talisman

talisman = Talisman(
    app,
    content_security_policy={
        'default-src': ['\'self\''],
        'script-src': ['\'self\'', '\'unsafe-inline\'', 'https://code.jquery.com'],
        'style-src': ['\'self\'', '\'unsafe-inline\'', 'https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css', 'https://todoapp5.ddns.net/static/styles.css', 'https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css'],
    },
    force_https=True,
    session_cookie_secure=True,
    frame_options='DENY',
)

在app.py文件中,导入并配置CSRF保护

1
2
3
4
5
from flask_wtf.csrf import CSRFProtect

app.config['SECRET_KEY'] = 'your_secret_key_here'
csrf = CSRFProtect(app)
csrf._csrf_request_token_key = 'X-CSRFToken'

保存并关闭文件。

导航到templates目录

1
$ cd templates

打开index.html文件

1
$ nano index.html

编辑HTML页面以包含CSRF配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<script>
var csrfToken = $('input[name="csrf_token"]').val();

$.ajaxSetup({
    beforeSend: function(xhr, settings) {
    if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {
    xhr.setRequestHeader("X-CSRFToken", csrfToken);
        }
    }
});
</script>

保存并关闭文件。

退出templates目录

1
$ cd ..

配置Nginx作为反向代理

Nginx充当Web服务器和客户端之间的反向代理。它根据您的请求配置设置指导传入请求。在本节中,我们将为应用程序配置反向代理以实现高效的请求处理和负载均衡。我们还将从Let’s Encrypt申请免费SSL证书,以为我们的域名实现HTTPS,保护用户和Web服务器之间的通信。

  1. 登录Vultr客户门户
  2. 导航到产品页面
  3. 从侧边菜单展开网络下拉菜单,选择DNS
  4. 点击中心的添加域名按钮
  5. 通过选择服务器的IP地址按照设置过程添加您的域名
  6. 在您的域名注册商处设置以下主机名作为您域名的主要和次要名称服务器:
    • ns1.vultr.com
    • ns2.vultr.com

安装Nginx

1
$ sudo apt install nginx

创建新的Nginx配置文件

1
$ sudo nano /etc/nginx/sites-available/app.conf

将以下配置粘贴到文件中

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
server {
    listen 80;
    listen [::]:80;

    server_name <your_domain>;

    location / {
        proxy_pass http://127.0.0.1:5000/;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

激活虚拟主机配置

1
$ sudo ln -s /etc/nginx/sites-available/app.conf /etc/nginx/sites-enabled/

测试Nginx配置

1
$ sudo nginx -t

重新加载Nginx

1
$ sudo systemctl reload nginx

允许传入连接到端口80和443

1
$ sudo ufw allow 80/tcp && sudo ufw allow 443/tcp

安装certbot包

1
$ sudo snap install --classic certbot

请求SSL证书

1
$ sudo certbot --nginx -d example.com -d www.example.com

启动Gunicorn服务器

1
$ gunicorn -b 0.0.0.0:5000 app:app

您现在可以通过https://<your_domain>访问您的Flask应用程序。

在Vultr上使用Python应用做更多事情

  • 容器化Python Web应用程序
  • 在Ubuntu 24.04上安装Python和Pip
  • 在Python中使用Vultr Cloud Inference
  • 深入探索重要的AI/ML Python包
  • 使用Python和Milvus向量数据库实现AI驱动的搜索
  • 使用Python执行自然语言处理任务

结论

在本文中,我们探讨了如何使用Nginx反向代理和Gunicorn部署Flask应用,同时实现CSRF保护和CSP。我们还通过添加SSL证书和启用HTTPS访问来保护应用程序。

这是Vultr赞助的文章。Vultr是世界上最大的私有云计算平台。作为开发者的最爱,Vultr已为185个国家的超过150万客户提供灵活、可扩展的全球云计算、云GPU、裸金属和云存储解决方案。了解更多关于Vultr的信息。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计