Flask结合gunicorn和nginx反向代理的生产环境部署及踩坑记录

这篇具有很好参考价值的文章主要介绍了Flask结合gunicorn和nginx反向代理的生产环境部署及踩坑记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

个人博客:https://xzajyjs.cn

前言

之前自己写的flask使用gunicorn上线生产环境没有什么问题,但是最近搭建了一个现成的flask项目,当使用python直接运行时不会有问题,而使用gunicorn时则会出现一些问题。


部署过程

运行测试

这里使用pyenv创建了一个虚拟环境,并安装好依赖

pyenv virtualenv 3.9.6 freegpt
pyenv activate freegpt
pip install -r requirements.txt

下面是入口函数run.py

from server.app import app
from server.website import Website
from server.backend import Backend_Api
from json import load


if __name__ == '__main__':
    # Load configuration from config.json
    config = load(open('config.json', 'r'))
    site_config = config['site_config']
    # Set up the website routes
    site = Website(app)
    for route in site.routes:
        app.add_url_rule(
            route,
            view_func=site.routes[route]['function'],
            methods=site.routes[route]['methods'],
        )

    # Set up the backend API routes
    backend_api = Backend_Api(app, config)
    for route in backend_api.routes:
        app.add_url_rule(
            route,
            view_func=backend_api.routes[route]['function'],
            methods=backend_api.routes[route]['methods'],
        )
    # Run the Flask server
    print(f"Running on port {site_config['port']}")
    app.run(**site_config)
    print(f"Closing port {site_config['port']}")

其中site_config.json文件如下:

{
        "site_config": {
                "host": "127.0.0.1",
                "port": 1234,
                "debug": false
        },
        "use_auto_proxy": false
}

意思是,运行flask服务于127.0.0.1:1234,只运行本地访问,后期我们需要搭建Nginx进行反向代理。

我们先使用python直接运行测试一下看能否跑起来以及能否正常访问。

python run.py

Flask结合gunicorn和nginx反向代理的生产环境部署及踩坑记录,踩坑经历,技术分享总结,flask,gunicorn,nginx,linux,python,后端

我们在服务器使用curl进行请求

curl 127.0.0.1:1234

Flask结合gunicorn和nginx反向代理的生产环境部署及踩坑记录,踩坑经历,技术分享总结,flask,gunicorn,nginx,linux,python,后端

数据返回正常,说明可以正常访问。


gunicorn搭建

Gunicorn是一个WSGI HTTP Server,是针对Python的、在Unix系统上运行的、用来解析HTTP请求的网关服务。
它的特点是:能和大多数的Python web框架兼容;使用简单;轻量级的资源消耗;高性能。

首先在当前虚拟环境下安装gunicorn

pip install gunicorn

然后我们使用gunicorn将flask项目跑起来,并且仅对本机开放,端口4444

gunicorn run:app -b 127.0.0.1:4444 --access-logfile access.log --error-logfile error.log &

使用ps命令可以看到当前已经成功在后台运行起来了

ps aux | grep gunicorn

Flask结合gunicorn和nginx反向代理的生产环境部署及踩坑记录,踩坑经历,技术分享总结,flask,gunicorn,nginx,linux,python,后端

踩坑

但是此时当我们再次使用curl访问127.0.0.1:4444时:

Flask结合gunicorn和nginx反向代理的生产环境部署及踩坑记录,踩坑经历,技术分享总结,flask,gunicorn,nginx,linux,python,后端

出现了404的错误。

我们查看gunicorn生成的日志文件:

# access.log
127.0.0.1 - - [13/Jul/2023:12:51:11 -0400] "GET / HTTP/1.1" 404 207 "-" "curl/7.76.1"

可以看到成功的请求到了我们的wsgi server,但是返回了404。在外网论坛上摸索了一番,问题出在了run.py上。

run.py文件中的所有代码都是写在if __name__ == "__main__":之下的,这在python语法中代表着主函数入口。

  • 当使用Python直接运行脚本时(例如:python run.py),if __name__ == '__main__'条件下的代码块会被执行,包括app.run()。这将启动Flask服务器,并让应用程序开始监听指定的主机和端口。
  • 当使用Gunicorn运行应用程序时(例如:gunicorn --bind 127.0.0.1:4444 run:app),if __name__ == '__main__'条件下的代码块不会被执行。因为Gunicorn实际上是将你的代码作为一个模块导入,而不是直接运行该代码。在这种情况下,Gunicorn会在内部处理Flask服务器的启动逻辑,并监听指定的主机和端口。也就因此自己在app.run(**kwargs)中设定的hostportdebug等参数也就失效了。

因此,无论是使用Python直接运行还是使用Gunicorn运行应用程序,app.run()只会在Python直接运行脚本时执行。而在使用Gunicorn运行时,if __name__ == '__main__'条件下的代码块将被跳过,包括app.run()。这是因为Gunicorn已经处理了服务器的启动逻辑。

因此,if __name__ == '__main__'条件的目的是为了确保在直接运行脚本时才执行特定的代码块,而在被导入为模块时跳过这些代码块。这样可以确保在使用Gunicorn启动应用程序时不会重复启动Flask服务器,并避免出现意外行为。


解决方案

既然已经知道了错误的逻辑,那么解决方法就很简单了,只要把除了app.run()的其他代码全部移出if __name__ == "__main__"即可。修改后的run.py如下:

from server.app import app
from server.website import Website
from server.backend import Backend_Api
from json import load

 # Load configuration from config.json
config = load(open('config.json', 'r'))
site_config = config['site_config']
# Set up the website routes
site = Website(app)
for route in site.routes:
    app.add_url_rule(
        route,
        view_func=site.routes[route]['function'],
        methods=site.routes[route]['methods'],
    )

# Set up the backend API routes
backend_api = Backend_Api(app, config)
for route in backend_api.routes:
    app.add_url_rule(
        route,
        view_func=backend_api.routes[route]['function'],
        methods=backend_api.routes[route]['methods'],
    )

if __name__ == '__main__':
    # Run the Flask server
    print(f"Running on port {site_config['port']}")
    app.run(**site_config)
    print(f"Closing port {site_config['port']}")

这样就可以保证python和gunicorn方式均可正常运行。

先kill掉之前正在运行的gunicorn,并重新启动

kill -9 1275864 1275865
gunicorn run:app -b 127.0.0.1:4444 --access-logfile access.log --error-logfile error.log &

可以看到现在请求127.0.0.1:4444已经正确响应了

Flask结合gunicorn和nginx反向代理的生产环境部署及踩坑记录,踩坑经历,技术分享总结,flask,gunicorn,nginx,linux,python,后端


Nginx反向代理

目前搭建的服务只能服务器自己访问到,下面我们通过nginx反向代理将其映射到对外的80端口

安装配置nginx就不多说了,下面讲讲配置文件的写法。其实很简单

vim /etc/nginx/nginx.conf
# nginx.conf
...
server {
        listen          80;
        server_name     xxxxxxxx;		# 此处填绑定的域名

        location / {
                proxy_pass http://localhost:4444;
                proxy_set_header Host $host:$server_port;
                proxy_set_header X-Real-IP $remote_addr;
        }
    }
...

然后运行nginx即可

nginx -t
nginx

此时使用本机访问域名的80端口已可以正常访问了。

Flask结合gunicorn和nginx反向代理的生产环境部署及踩坑记录,踩坑经历,技术分享总结,flask,gunicorn,nginx,linux,python,后端文章来源地址https://www.toymoban.com/news/detail-571417.html

到了这里,关于Flask结合gunicorn和nginx反向代理的生产环境部署及踩坑记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端项目部署上线nginx反向代理

    参考 https://www.cnblogs.com/wangjingguan/articles/12817442.html 项目部署—需要服务器+域名 ● 部署(手动/自动化)到服务器—打包/构建(发版)、上线 下载模块包 yarn add webpack-dev-serve -D 在package.json自定义webpack开发服务器启动命令serve 启动当前工程里的webpack开发服务器 yarn serve 服务器配置

    2024年02月09日
    浏览(44)
  • Nginx反向代理配置+负载均衡集群部署

    什么是代理 正向代理既是通过代理服务器访问外网资源,而反向代理与之相反是将局域网的资源通过反向代理服务器提供给互联网用户浏览和使用等。 实验环境图 流量过程 当客户端发起请求后通过Internet (本实验为NAT网卡)来到代理服务器上,代理服务器经算法选择后调用

    2024年02月13日
    浏览(41)
  • 【Nginx】静态资源部署、反向代理、负载均衡

    个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ nginx配置文件整体分为三部分: 全局块 :Nginx运行相关的全局配置 events块 :网络连接相关的配置 http块 :代

    2024年02月13日
    浏览(47)
  • 【linux】在Ubuntu下部署nginx——nginx的反向代理

    介绍 这里是小编成长之路的历程,也是小编的学习之路。希望和各位大佬们一起成长! 以下为小编最喜欢的两句话: 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡。 一个人为什么要努力? 我见过最好的答案就是:因为我喜欢的东西都很贵,

    2024年02月09日
    浏览(41)
  • nginx部署以及反向代理多域名实现HTTPS访问

    直接进入/opt/nginx_main/nginx-info里面创建了 选择域名 然后配置免费ssl证书 证书设置我们需要的域名 然后申请之后稍等一段时间 之后点击下载,下载nginx的证书文件 一个pem,一个key 然后把下载的证书放到上面的 ssl路径 记录好位置即可,步骤 2.5会用到 1.先进入阿里云的数字证

    2024年02月12日
    浏览(50)
  • Nginx分端口部署两个或多个项目(包含反向代理配置)

    Author:think 一、部署Nginx 若读者没有部署安装Nginx,则可以参考下面这篇文章进行安装。 CentOS 7非编译安装Nginx_think_mzs的博客-CSDN博客 二、分析Nginx配置文件 通过上面的方法安装的Nginx,其配置文件在 /etc/nginx/ 目录下,如下图所示。 其中 nginx.conf 为Nginx的主要配置文件,在 co

    2024年02月05日
    浏览(48)
  • 反向代理神器 Nginx Proxy Manager 群晖Docker部署

    本文将使用 NginxProxyManager 中文版 介绍NginxProxyManager基于群晖Docke的部署方法,并且所有操作均在群晖网页端完成,不需要命令行操作,非常适合新手。 GitHub:xiaoxinpro/nginx-proxy-manager-zh Docker:chishin/nginx-proxy-manager-zh CSDN:NginxProxyManager 中文版简介 1. 下载映像 登录群晖后台并打

    2024年02月04日
    浏览(56)
  • 03Nginx的静态资源部署,反向代理,负载均衡,动静分离的配置

    部署静态资源 Nginx相对于Tomcat处理静态资源的能力更加高效,所以在生产环境下一般都会将Nginx可以作为静态web服务器来部署静态资源 静态资源: 在服务端真实存在并且能够直接展示的一些html页面、css文件、js文件、图片、视频等资源文件 将静态资源部署到Nginx非常简单,只需要

    2024年02月04日
    浏览(44)
  • linux环境下docker中搭建 jenkins 及自定义访问路径,利用nginx反向代理

    前两天发布了完整的 linux服务器上Docker中安装jenkins 在实际的开发中,可能我们并不能直接开放8081或者8080端口给jenkins使用,常常是通过nginx方向代理来实现的,这里我们来配置一下。 如果你还没有安装 可以参考我这篇文章 linux服务器上Docker中安装jenkins 看到目录: 创建一个

    2024年02月16日
    浏览(56)
  • 使用Nginx反向代理,将React项目打包后部署到服务器的二级子目录

    我们上线一个项目的时候如果服务器上只有这一个项目的话可以直接将打包后的代码部署到服务器指定的根目录,然后直接上线看就可以看到,不用配置其他项。 但是,如果服务器有多个项目的话,我们就需要将代码部署到服务器根目录里边的子目录了,而放到子目录的话,

    2024年03月26日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包