CentOS7下python3+Flask+uWSGI+Nginx+Supervisor环境搭建

简介: 在生产环境中通常用uwsgi作为Flask的web服务网关,通过nginx反向代理进行负载均衡,通过supervior进行服务进行的管理。这一套搭下来还是有一些坑要踩,本文通过一个简单的Flask web应用记录了CentOS7下python3+Flask+uWSGI+Nginx+Supervisor环境搭建的全过程,以及一些注意事项,以免遗忘。

在生产环境中通常用uwsgi作为Flask的web服务网关,通过nginx反向代理进行负载均衡,通过supervior进行服务进行的管理。这一套搭下来还是有一些坑要踩,本文通过一个简单的Flask web应用记录了CentOS7下python3+Flask+uWSGI+Nginx+Supervisor环境搭建的全过程,以及一些注意事项,以免遗忘。

一、Python3环境安装

CentOS7下Python3环境安装参考 http://xiejava.ishareread.com/posts/57cef505/

查看python版本

[root@localhost ~]# python -V
Python 3.8.12

二、安装Flask

1、创建Python虚拟环境

在home目录下创建flask_web目录(目录根据具体实际环境创建,本教程是/home/flask_web)
通过venv创建虚拟环境
[root@localhost flask_web]# python -m venv /home/flask_web
创建成功后可以看到在目录下自动建了一些文件夹,包括python命令及依赖库等,激活以后是个独立的python虚拟运行环境。
python虚拟运行环境

在目录下运行source bin/activate 激活虚拟环境

[root@localhost flask_web]# source bin/activate
(flask_web) [root@localhost flask_web]#

2、安装Flask

通过pip install flask安装flask

(flask_web) [root@localhost flask_web]# pip install flask

安装的时候有可能报ModuleNotFoundError: No module named '_ctypes'的错误,原因是缺少libffi-devel包,具体可参考 https://blog.csdn.net/qq_36416904/article/details/79316972
安装Flask报错

运行yum install libffi-devel -y 并且要重新编译执行安装python
解决包依赖的问题
(flask_web) [root@localhost flask_web]# yum install libffi-devel -y
进入到python源码包目录 执行使用make&make install 命令重新编译并安装python(这里比较坑)
然后再pip install flask 进行安装
安装完成后可以尝试运行flask run,提示没有Flask应用程序,说明flask已经安装成功并且可以运行了。

(flask_web) [root@localhost flask_web]# flask run
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
Usage: flask run [OPTIONS]
Try 'flask run --help' for help.

Error: Could not locate a Flask application. You did not provide the "FLASK_APP" environment variable, and a "wsgi.py" or "app.py" module was not found in the current directory.

3、建立测试应用
vi hello.py创建一个hello.py的文件,copy下面的内容到文件中:wq保存退出

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

通过python hello.py运行测试程序

(flask_web) [root@localhost flask_web]# python hello.py
 * Serving Flask app 'hello' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

新开一个shell窗口执行curl http://127.0.0.1:5000/ 可以看到有Hello World返回说明应用在flask框架下运行没有问题。

[root@localhost ~]# curl http://127.0.0.1:5000/
Hello World!

三、安装及配置uwsgi

uWSGI是一个Web Server,并且独占uwsgi协议,但是同时支持WSGI协议、HTTP协议等,它的功能是把HTTP协议转化成语言支持的网络协议供python使用。有点类似于Java的web服务容器中间件tomcat

1、安装uwsgi

通过pip命令安装

(flask_web) [root@localhost flask_web]# pip install uwsgi

如果顺利的话会显示Successfully installed uwsgi-2.0.20,表示安装成功了。

2、配置uwsgi

新建一个uwsgi.ini配置文件,并将配置信息复制到配置文件
vi uwsgi.ini

[uwsgi]
#http=127.0.0.1:3366  #如果是http,通过proxy_pass http链接
socket=127.0.0.1:3366 #如果是socket,通过nginx配置uwsgi_pass socket链接
wsgi-file=/home/flask_web/hello.py
callable=app
touch-reload=/home/flask_web/
#最大请求数,最多请求5000次就重启进程,以防止内存泄漏
max-requests=5000
#请求超时时间,超过60秒关闭请求
harakiri=60
#进程的数量
processes=1
#线程数
threads = 2
#记录pid的文件
pidfile=/home/flask_web/uwsgi.pid
buffer-size = 32768
#日志最大50M
log-maxsize=50000000
#配置虚拟环境路径,如果是在虚拟环境下启动,这个一定要配,不配会有些包找不到,应用会报错。可以在uwsgi.log文件中看报错信息
virtualenv =/home/flask_web
#uwsgi日志文件,如果是通过supervisor托管,daemonize配置需要屏蔽
#daemonize=/home/flask_web/uwsgi.log
#项目更新后,自动加载
python-autoreload=1
#状态检测地址
stats = 127.0.0.1:9191

3、运行uwsgi

(flask_web) [root@localhost flask_web]# uwsgi --ini /home/flask_web/uwsgi.ini

启动以后通过访问curl http://127.0.0.1:3366 有Hello World!的返回信息表示uwsgi已经成功启动,并且应用程序正常。

[root@localhost flask_web]# curl http://127.0.0.1:3366
Hello World!

四、配置Nginx反向代理

ps -ef|grep nginx 找到nginx的配置文件
nginx配置文件
如果uwsgi配置的是socket连接
[uwsgi]
socket=127.0.0.1:3366 #如果是socket,通过nginx配置uwsgi_pass socket链接
nginx的server配置如下:

 server {
   
   
      listen 808;
      server_name localhost;

      location / {
   
   
           include uwsgi_params;
           uwsgi_pass 127.0.0.1:3366;
       }
       access_log /home/flask_web/access.log;
       error_log /home/flask_web/error.log;
   }

如果uwsgi配置的是http
[uwsgi]
http=127.0.0.1:3366 #如果是http,通过proxy_pass http链接
nginx的server配置如下:

server {
   
   
      listen 808;
      server_name localhost;

      location / {
   
   
           proxy_pass http://127.0.0.1:3366;
       }
       access_log /home/flask_web/access.log;
       error_log /home/flask_web/error.log;
   }

重新加载nginx配置后,通过浏览器访问可以正常显示访问结果

五、通过Supervisor进行进程托管

生产环境中,可以通过supervisor来进行uwsgi和nginx进程的托管,界面化的方式管理uwsgi和nginx,包括进程的监控、启停等。

1、安装supervisor

通过pip安装

pip install supervisor

离线安装请参考:http://xiejava.ishareread.com/posts/d670c9b8/

2、配置supervisor

找到supervisord的安装目录在/usr/local/bin下

[root@localhost bin]# which supervisord
/usr/local/bin/supervisord

cd到/usr/local/bin目录下
通过echo_supervisord_conf > supervisord.conf

[root@localhost bin]# echo_supervisord_conf > supervisord.conf

可以看到生成了一个supervisord.conf的配置文件。
将生成的supervisord.conf配置文件放到/etc/目录下

mv supervisord.conf /etc/

修改supervisord.conf的配置文件,主要是将子配置文件路径开启并指定配置文件路径,按照惯例将配置文件放到/etc目录下

[include]
files = /etc/supervisord.d/*.ini

supervisord.conf配置文件

我们在/etc目录下建个supervisord.d目录用来保存supervisor托管进程的配置文件

[root@localhost ~]# cd /etc/
[root@localhost etc]# mkdir supervisord.d

建立并配置子配置文件

[root@localhost etc]# cd supervisord.d/
[root@localhost supervisord.d]# vi uwsgi.ini

复制以下内容至uwsgi.ini文件中

[program:uwsgi]
command =uwsgi --ini /home/flask_web/uwsgi.ini
directory=/home/flask_web
startsecs=10
startretries=5
autostart=true
autorestart=true
stdout_logfile=/home/flask_web/uwsgi_sup_log.log
stdout_logfile_maxbytes=10MB
user=root
stopasgroup=true
killasgroup=true

3、启动supervisor

在启动supervisor拉起uwsgi前两个注意事项
1) uwsgi的配置文件中daemonize一定要屏蔽掉,否则守护进程一直会重启,导致端口每次都被占用,Supervisor托管不了。
uwsgi.ini
2) 在启动之前先将已经启动的uwsgi进程停掉,否则通过supervisor拉起uwsgi进程时端口冲突
kill uwsgi进程

启动supervisord进程

[root@localhost bin]# supervisord -c /etc/supervisord.conf

修改配置文件后重新加载可以通过 supervisorctl reload 命令重新加载
查看supervisor托管状态

[root@localhost supervisord.d]# supervisorctl status
uwsgi                            STARTING

可以看到uwsgi被supervisor托管并已经启动。如果需要通过supervisor的web控制界面进行进程的管理。需要修改/etc/supervisord.conf的配置文件将访问的IP地址限制放开,设置用户名、口令

[inet_http_server]         ; inet (TCP) server disabled by default
port=*:9001        ; ip_address:port specifier, *:port for all iface
username=user              ; default is no username (open server)
password=user@123               ; default is no password (open server)

重新启动supervisor,重启时会报需要验证的错误

[root@localhost supervisord.d]# supervisorctl shutdown
Server requires authentication
error: <class 'xmlrpc.client.ProtocolError'>, <ProtocolError for 127.0.0.1/RPC2: 401 Unauthorized>: file: /usr/local/lib/python3.8/site-packages/supervisor/xmlrpc.py line: 542

可以直接kill -9杀掉supervisor的进程再启动,也可以通过supervisorctl 输入用户名、口令通过shutdown然后再重启。
启动命令:supervisord -c /etc/supervisord.conf

这时就可以通过supervisor的web控制界面进行进程的管理了。
Supervisor
至此,CentOS7下python3+Flask+uWSGI+Nginx+Supervisor环境全部搭建好了。


作者博客:http://xiejava.ishareread.com/

目录
相关文章
|
3月前
|
应用服务中间件 Linux 网络安全
如何在 CentOS 7 上为 Nginx 创建自签名 SSL 证书
如何在 CentOS 7 上为 Nginx 创建自签名 SSL 证书
194 1
|
1月前
|
应用服务中间件 Linux nginx
CentOS7安装Nginx
CentOS7安装Nginx
|
1月前
|
监控 应用服务中间件 nginx
详细解释容器以及虚拟机centos7.9容器化部署基础服务(容器化部署nginx)
容器是一种轻量级、可移植的软件打包和隔离技术,将应用程序及其依赖项打包,确保在任何环境中一致运行。容器共享主机操作系统内核,相比虚拟机更高效、轻量,具有快速启动和高资源利用率的特点。容器的关键技术包括命名空间(如 PID、NET 等)、控制组(cgroups)和联合文件系统(UnionFS)。使用容器可以提高开发和部署效率,简化管理,确保环境一致性。例如,在 CentOS 7.9 上部署 Nginx 时,可以通过 Docker 下载和运行 `nginx:1.20` 镜像,并通过端口映射使外部请求访问 Nginx 服务。此外,还可以将测试页面复制到容器中,进一步验证容器的功能。
|
3月前
|
应用服务中间件 Linux 网络安全
2022年超详细在CentOS 7上安装Nginx方法(源码安装)
这篇文章提供了在CentOS 7系统上通过源码安装Nginx的详细步骤,包括从官网下载Nginx源码包、上传至虚拟机、解压、删除压缩包、编译安装前的配置、安装PCRE库(因为Nginx使用PCRE库解析正则表达式)、安装zlib和OpenSSL库(用于支持HTTPS协议)、重新编译Nginx、安装后启动Nginx服务、关闭服务、修改默认端口、以及重启服务测试等步骤。文章还提供了相关命令和操作截图,帮助用户更好地理解和执行安装过程。
2022年超详细在CentOS 7上安装Nginx方法(源码安装)
|
2月前
|
监控 应用服务中间件 nginx
nginx+uwsgi+flask
nginx+uwsgi+flask
|
3月前
|
Linux 开发工具 C语言
centos7编译安装python3
centos7编译安装python3
|
3月前
|
应用服务中间件 Linux nginx
在CentOS上使用源码包安装Nginx、以及手动启动Nginx的步骤过程
这篇文章介绍了在CentOS系统上使用Nginx源码包进行安装和配置的详细步骤,包括源码包的获取、解压、配置、编译、安装、启动验证以及注意事项。
385 0
在CentOS上使用源码包安装Nginx、以及手动启动Nginx的步骤过程
|
3月前
|
物联网 应用服务中间件 Linux
CentOS7.9 Nginx+EMQX集群组建MQTTS平台
通过以上步骤,您已成功搭建了一个基于CentOS 7.9、Nginx和EMQX的MQTTS平台。这个平台既能保证数据传输的安全性,又能利用Nginx的负载均衡能力和EMQX的高性能、高并发处理能力,实现稳定高效的消息服务。在部署和配置过程中,务必注意证书、域名以及EMQX配置的正确性,确保系统安全和稳定运行。此外,定期更新软件和系统,以及监控系统性能,也是保证MQTTS平台长期稳定运行的重要环节。
108 4
|
3月前
|
物联网 应用服务中间件 Linux
CentOS7.9 Nginx+EMQX集群组建MQTTS平台
通过以上步骤,您已成功搭建了一个基于CentOS 7.9、Nginx和EMQX的MQTTS平台。这个平台既能保证数据传输的安全性,又能利用Nginx的负载均衡能力和EMQX的高性能、高并发处理能力,实现稳定高效的消息服务。在部署和配置过程中,务必注意证书、域名以及EMQX配置的正确性,确保系统安全和稳定运行。此外,定期更新软件和系统,以及监控系统性能,也是保证MQTTS平台长期稳定运行的重要环节。
132 3
|
3月前
|
Linux Python
Centos7安装Python虚拟环境之virtualenv
Centos7安装Python虚拟环境之virtualenv
下一篇
无影云桌面