在Vultr上部署Flask应用:从环境配置到HTTPS安全部署

本文详细介绍了如何在Vultr云服务器上部署Flask应用,包括Python虚拟环境配置、Gunicorn服务器部署、Nginx反向代理设置,以及CSRF保护和内容安全策略的实施,最后通过Let's Encrypt实现HTTPS加密。

在Vultr上部署Flask应用

Flask是一个用于构建Web应用的Python框架。开发者可以轻松定义路由、处理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'

保存并关闭文件。

导航到模板目录:

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>

保存并关闭文件。

退出模板目录:

1
$ cd ..

配置Nginx作为反向代理

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

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

– 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云推理
  • 深入探索重要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 设计