flask+uwsgi+nginx简单配置指北

您所在的位置:网站首页 cores是什么 flask+uwsgi+nginx简单配置指北

flask+uwsgi+nginx简单配置指北

#flask+uwsgi+nginx简单配置指北| 来源: 网络整理| 查看: 265

最近为了给公司展示策略指标,简单在服务器上搭了一套网页用json给那边取数据,为了防止重新配服务器又不会了,简单记录一下

1 flask 配置

flask配置是最简单的,目前Centos服务器里用的环境是:

Python 3.7.2PycharmFlask 2.2.3Mysql 5.7virtualenv 与 virtualenvwrapper

直接进入虚拟环境pip安装即可,注意里面click版本可能会和qt5-tool里的click版本冲突,在装之前最好查好版本号,不过我也不用click( )

pip3 install Flask

flask程序就先摘一个别人的例子,来自

import json import flask from flask import Flask server = Flask(__name__) # 实例化server,把当前这个python文件当作一个服务,__name__代表当前这个python文件 @server.route('/index', methods=['get']) # 'index'是接口路径,如methods不写,则默认get请求 # 装饰器,下面的函数变为一个接口 def index(): res = {'msg': '这是我开发的第一个接口', 'msg_code': '0000'} return json.dumps(res, ensure_ascii=False) # json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False if __name__ == "__main__": server.run(port=8888, debug=True, host='0.0.0.0') # 启动服务;端口不写默认是5000,也可以自定义,但注意不要与机器上已占用的port起冲突,

之后运行一下可以在浏览器看到结果即可,对面用get就能取数据库数据了,如果报错需要查看下端口是否被占用

用命令:

lsof -i:8888

后面8888是要查询的端口号,输入会显示占用此端口的PID,如果没显示就是空着的端口,占用的话就用kill -9杀了。或者可能ip端口没开,首先firewall要放开,但是我一般都直接把firewall关了,但还是要配置iptables:

iptables -A INPUT -p tcp --dport 8888 -j ACCEPT

开放8888的入端口,再将出端口全部开放:

iptables -P OUTPUT ACCEPT

使用 iptables -L -n查看开放的端口

2 uwsgi 配置

需要退出虚拟环境,由于我直接都在root账户下操作,不需要再进行其他的权限操作,过程会比较简单。

在虚拟环境外,直接使用pip安装

pip3 install uwsgi

注意要提前安装gcc那些库等,我因为安装过qt,那些库已经齐全了。

安装完毕后再进入虚拟环境,使用

touch uwsgi.ini

创建初始化配置文件,我就直接放在root主文件下了,编辑uwsgi.ini:

[uwsgi] # uwsgi启动时所使用的地址与端口 #socket=127.0.0.1:8888 #socket=172.16.1.25:8888 socket=:8888 # 必须全部为绝对路径 # 项目的路径 ,pwd指令中显示的路径 chdir=/root/LGLH/flask_repo # flask的wsgi文件 启动文件 wsgi-file=/root/LGLH/flask_repo/main.py # python 程序内用以启动的 application 变量名 callable=server # Python虚拟环境的路径 , 进入到虚拟环境目录里面执行pipenv --venv得到 home=/envs/LGLH # 进程相关 # 主进程 buffer-size = 65536 master=True # 最大数量的工作进程 processes=2 # 线程数 threads=1 vacuum=true harakiri=3600 python-autoreload=1 socket-timeout=3600 # 通过该端口可以监控 uwsgi 的负载情况 stats = 127.0.0.1:9000 #状态检测地址 stats=/root/stats.socket pidfile=/root/uwsgi.pid daemonize=/root/uwsgi.log

注意文件都要绝对路径,同时需要设置python启动的home环境,你在哪里运行的写哪里的路径,写根目录就行,同时一定要设置buffer-size,默认的比较小,发请求的时候经常buffer不够大就给拒绝了。同时设置服务器响应时间和请求等待时间,harakiri和socket-timeout为60分钟,这样之后传较大的文件也不会断链。

选http-socket是为了直接运行uwsgi就能使用,在配置nginx可以直接改回socket,因为又nginx做上层接受http请求,callable需要根据程序里给的变量名命名,直接写:8888是为了对应程序中的host=“0.0.0.0”,其他的根据自己的需求设定即可。

使用 uwsgi --ini uwsgi.ini命令即可启动

我当时还遇到了个这个问题:

*** Starting uWSGI 2.0.21 (64bit) on [Thu Mar 23 15:08:13 2023] *** compiled with version: 4.8.5 20150623 (Red Hat 4.8.5-44) on 22 March 2023 09:45:48 os: Linux-3.10.0-1160.88.1.el7.x86_64 #1 SMP Tue Mar 7 15:41:52 UTC 2023 nodename: node-01 machine: x86_6 。。。。。。。。。。 WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x1a1b8a0 pid: 1737 (default app) uWSGI running as root, you can use --uid/--gid/--chroot options *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** *** uWSGI is running in multiple interpreter mode *** spawned uWSGI master process (pid: 1737) spawned uWSGI worker 1 (pid: 1739, cores: 2) spawned uWSGI worker 2 (pid: 1740, cores: 2) spawned uWSGI worker 3 (pid: 1741, cores: 2) spawned uWSGI worker 4 (pid: 1742, cores: 2) bind(): No such file or directory [core/socket.c line 230] ...brutally killing workers... VACUUM: pidfile removed. unlink(): No such file or directory [core/uwsgi.c line 1675] Thu Mar 23 15:08:13 2023 - uWSGI worker 1 screams: UAAAAAAH my master disconnected: i will kill myself !!! Thu Mar 23 15:08:13 2023 - uWSGI worker 2 screams: UAAAAAAH my master disconnected: i will kill myself !!! Thu Mar 23 15:08:13 2023 - uWSGI worker 2 screams: UAAAAAAH my master disconnected: i will kill myself !!! Thu Mar 23 15:08:13 2023 - uWSGI worker 3 screams: UAAAAAAH my master disconnected: i will kill myself !!! Thu Mar 23 15:08:13 2023 - uWSGI worker 4 screams: UAAAAAAH my master disconnected: i will kill myself !!! Thu Mar 23 15:08:13 2023 - uWSGI worker 4 screams: UAAAAAAH my master disconnected: i will kill myself !!!

当时找这个bind(): No such file or directory [core/socket.c line 230]花了好久的时间,最后发现是自己没把stats监视端口开开,同时把和uwsgi重名的文件夹都删干净就OK了。(不过底下那个screams还挺好玩的,没这错还看不到了)

同时学习了一下看编译过程找bug的命令,有其他错误也可以用这个看:

strace -f [ -o trace.log ] uwsgi --ini uwsgi.ini

启动后uwsgi会在命令行运行,设置log文件后就自动在后台了。

3 nginx 配置

最后学习了一下nginx,首先安装epel

yum install epel-release

yum update

之后就可以安装nginx了

yum install nginx

cd 到 etc/nginx/conf.d下,新建一个conf文件,我的是sql_link.conf

这里是nginx配置文件下include的配置,nginx配置文件主要使用正则表达,我这里没有静态文件,主要靠uwsgi来处理请求,uwsgi通过flask连接数据库处理请求。于是添加的conf文件如下

upstream sql_link{ server 0.0.0.0:8888; } # 配置服务器 server { # 监听的端口号,改成什么就是用什么端口访问服务器 ,默认是80 listen 8080; # 域名,即公网ip server_name xxxxxx; charset utf-8; # 静态文件访问的url(此处没有) # 发送所有非静态文件请求到flask服务器 location / { # 需要与之前uwsgi配置一样 uwsgi_pass 0.0.0.0:8888; # uwsgi_params文件地址 include /etc/nginx/uwsgi_params; # 环境地址以及项目地址 uwsgi_param UWSGI_PYHOME /envs/LGLH; uwsgi_param UWSGI_CHDIR /root/LGLH/flask_repo; } }

配置完毕后开放之前设置的监听端口,启动nginx服务和uwsgi服务,

service nginx restart

uwsgi --ini uwsgi.ini

4 使用uwsgitop监控性能

直接pip安装uwsgitop

使用命令uwsgitop stats.socket监控性能,其中stats.socket是uwsgi.init文件中设置的stats存储文件,打开是这样的:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3