部署一个flask服务记录
最近使用flask写了一些简单的服务。
服务部署到服务器上进行使用,这个过程会有一些问题,需要进行记录一下。
说明运行的环境情况。使用的是python3.6的虚拟环境,系统是centos7,其他的有uwsgi,supervisor,ngnix。
首先准备一个简单的flask服务。
代码ipapp.py:
# encoding=utf-8
# date: 2019/3/5
__author__ = "Masako" from flask import Flask app = Flask(__name__) @app.route('/')
def index():
return "<p>my ip: 37.221.204.206</p>" if __name__ == "__main__":
app.run()
一、安装python3.6
1.下载
# wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz
2.解压
# tar -zxvf Python-3.6..tgz
3.到解压好的文件夹先配置
# cd Python-3.6.
# ./configure
*遇到问题

安装gcc
# yum install -y gcc
再配置,成功。
4.继续编译及安装
# make && make install
5.创建虚拟环境
我的工作文件夹为 /root/ip_tool, 在这里执行命令
# virtualenv -p /usr/local/bin/python3 ip_env
创建的是自己安装的python3的虚拟环境
然后在虚拟环境安装一些需要的python库,如flask等
二、安装并配置uwsgi
uwsgi是服务器的一种,主要用来跑你的服务
1.安装
在虚拟环境执行
# pip install uwsgi
2.测试uwsgi
使用uwsgi启动一下我的flask服务
------
为了方便,先装了一个screen
# yum install screen
然后在screen内测试uwsgi
------
简单启动我的ipapp.py
# uwsgi --http 127.0.0.1: --wsgi-file ipapp.py --callable app
由于在screen内运行的uwsgi,所以退到screen外部执行
# curl http://127.0.0.1:5000
验证得到下图

3.配置文件
把uwsgi的参数写到文件里面,保存为test_uwsgi.ini
[uwsgi]
base = /root/ip_pool
http = 127.0.0.1:
wsgi-file = ipapp.py
callable = app
再使用文件打开服务,注意在虚拟环境
# uwsgi --ini test_uwsgi.ini
结果与使用uwsgi命令运行服务相同
如果使用uwsgi打开服务有问题,可能是uwsgi路径或者配置相关问题,需要找到对应方案解决
三、安装并配置nginx
nginx是一个代理服务器。
1.安装
# yum install nginx
*出现问题 No package nginx available.
安装一下源
# yum install epel-release
再执行上一条命令,成功
2.测试
打开nginx
# /bin/systemctl start nginx.service
在别的地方输入服务器的地址,或者curl,可以看到 "Welcome to nginx" 之类的字样
3.配置
先到nginx安装的文件夹,如/etc/nginx/,有可能是其他的,可以自己找一下
# cd /etc/nginx/
编辑 "nginx.conf"
如果有一些配置文件,可以都放在一个文件夹中,如"conf.d",然后在配置中包含这个文件夹,即在nginx.conf的末尾加上
include /etc/nginx/conf.d/*.conf;
在这里,我简单配置,直接修改nginx.conf
找到“location /”,将大括号里的内容修改如下
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:;
uwsgi_param UWSGI_PYHOME /root/ip_pool/ip_env/bin/python;
uwsgi_param UWSGI_CHDIR /root/ip_pool;
uwsgi_param UWSGI_SCRIPT ipapp:app;
}
此时,我的ipapp.py放在文件夹“/root/ip_pool”中,并有虚拟环境ip_env,启动文件为ipapp.py, 应用名为app。
我们再修改一下uwsgi的配置,
[uwsgi]
base = /root/ip_pool
# http = 127.0.0.1:5000
socket = 127.0.0.1:10050
wsgi-file = ipapp.py
callable = app
可以看到,将http更换成了socket,并且保持地址与nginx中配置的 uwsgi_pass 一致。
我们重启nginx /bin/systemctl reload nginx.service
在虚拟环境启uwsgi服务

4.再测试
在另一个地方(另一台机器)输入我的IP地址,得到我写的网页

*如果访问不起,检查一下端口防火墙之类的。
到此,服务就部署可用了。
四、安装并使用supervisor
supervisor主要用来管理进程,这里使用其管理uwsgi程序。
1.安装,使用机器环境
# yum install supervisor
生成配置文件
# echo_supervisord_conf > /etc/supervisord.conf
启动supervisor服务
# supervisord -c /etc/supervisord.conf
查看状态
# supervisorctl status
*出现 unix:///tmp/supervisor.sock no such file , 创建文件后出现 unix:///tmp/supervisor.sock refused connection,可能是服务没有启动
2.配置
配置配置文件,在 "/etc/supervisord.conf"文件中,取消注释"[include]",增加自己的配置文件夹,这里我使用supervisord.d
即在"/etc/supervisord.conf"增加以下2行内容
[include]
files = supervisord.d/*.conf
*.conf是我自己的文件后缀,默认是.ini
配置自己的项目,编辑我自己的项目配置,配置如下
[program:ip]
directory=/root/ip_pool
command=/root/ip_pool/ip_env/bin/uwsgi --ini test_uwsgi.ini
autostart=true
user=root
stderr_logfile=/tmp/ip_stderr.log
stdout_logfile=/tmp/ip_stdout.log
这个文件放在/etc/supervisord.d里面即可,名字随便取一个,后缀为.conf
重启supervisorctl,这个任务就跑起来了

如果跑不起来,端口占用,可能是之前的uwsgi任务没有关。
这个时候再次访问服务器ip地址,得到的结果与之前相同。也就是supervisor只是用来跑这个程序的辅助工具。
总结
使用uwsgi + nginx 配置服务,加上supervisor管理,需要的流程比较长,配置的文件比较多。
需要耐心处理,遇到问题,多看提示,不会的搜索一下,很多人会遇到同样的问题。
总的来说,除了安装必要的环境,需要修改或增加的文件有以下几个:
1.nginx,修改nginx.conf,配置路由、接口
2.uwsgi,增加uwsgi.ini,也可以不增加,直接执行命令,跑flask应用
3.supervisor,增加myapp.conf,配置我的uwsgi的参数
4.supervisor,修改supervisord.conf,增加包含自己编辑的配置文件路径,以使supervisor找到配置文件并启动程序
后续再同一台机器上配置其他服务时,只需要修改路由,增加两个配置文件(supervisor和uwsgi),文件大致相同,修改端口和需要执行的命令即可。
如果涉及到更加复杂的服务,可以丰富一下配置文件,根据需求,增加配置参数。
参考文章链接:
http://docs.jinkan.org/docs/flask/
http://www.supervisord.org/introduction.html
http://www.runoob.com/django/django-nginx-uwsgi.html
https://www.cnblogs.com/liubiao/p/6689081.html
https://www.cnblogs.com/if-then/p/7259865.html
https://www.cnblogs.com/alice-bj/articles/9298177.html
部署一个flask服务记录的更多相关文章
- [傻瓜式一步到位] 阿里云服务器Centos上部署一个Flask项目
网络上关于flask部署Centos的教程有挺多,不过也很杂乱. 在我第一次将flask上传到centos服务器中遇到了不少问题,也费了挺大的劲. 在参考了一些教程,并综合了几个教程之后才将flask ...
- 【Centos】【Python】【Flask】阿里云上部署一个 flask 项目
1. 安装 python3 和 pip3 参考:http://www.cnblogs.com/mqxs/p/8692870.html 2.安装 lnmpa 集成开发环境 参考:http://www.c ...
- 【k8s】使用k8s部署一个简单的nginx服务
名词解释 Namespace 表示命名空间 Deployment 表示pod发布 Service 表示多个pod做为一组的集合对外通过服务的表示 kubectl 是k8s的命令行操作命令,可以创建和更 ...
- 从docker到docker-compose部署一个nginx+flask+mysql+redis应用
目的是把一个flask项目的mysql数据库.redis数据库.flask应用.nginx服务分别装到四个容器中,然后用docker-compose命令同时启动与关闭 一.安装docker Docke ...
- 关于一个flask的服务接口实战(flask-migrate,flask-script,SQLAlchemy)
前言 最近接到一个接收前端请求的需求,需要使用python编写,之前没有写过python,很多技术没有用过,在这里做一个学习记录,如有错误,请不了赐教. Flask Api文档管理 使用Falsk A ...
- gunicorn部署Flask服务
作为一个Python选手,工作中需要的一些服务接口一般会用Flask来开发. Flask非常容易上手,它自带的app.run(host="0.0.0.0", port=7001)用 ...
- 高并发Flask服务部署
高并发Flask服务部署 AI模型持久化 OOP: 利用面向对象思想,实现算法在内存上的实例化及持久化.即一次模型加载,多次请求调用. class ocr_infer_class(threading. ...
- kubernetes实战篇之部署一个.net core微服务项目
目录 继上一篇kubernetes理论知识完结.本篇主要讲解基于nexus搭建一个docker镜像仓库(当然大家实践过程是不必完全跟着做,也可以搭建harbor仓库或者直接把镜像推送到docker h ...
- Knative 实战:一个微服务应用的部署
作者 | 元毅 阿里云智能事业群高级开发工程师 在 Istio 中提供了一个 Bookinfo 的示例,用于演示微服务之间的调用,那么如何在 Knative 中部署这个示例呢?本文将会给大家介绍一下在 ...
随机推荐
- app开发中如何利用sessionId来实现服务端与客户端保持回话
app开发中如何利用sessionId来实现服务端与客户端保持回话 这个问题太过于常见,也过于简单,以至于大部分开发者根本没有关注过这个问题,我根据和我沟通的开发者中,总结出来常用的方法有以下几种: ...
- 8 种提升 ASP.NET Web API 性能的方法 (转)
出处:http://www.oschina.net/translate/8-ways-improve-asp-net-web-api-performance ASP.NET Web API 是非常棒的 ...
- 整理用js实现tab标签页
首先是css样式,比如这样的: <style> *{ ; ; list-style: none; font-size: 12px; } .notice{ width: 298px; hei ...
- 安装及运行 RabbitMQ 服务器 (windows)
1. 一些网址 http://www.rabbitmq.com/ http://www.rabbitmq.com/install-windows.html http://www.rabbitmq.co ...
- linux每天一小步---grep命令详解
1 命令功能 grep(global regular expression print全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来. g ...
- Python之模块和包学习
模块简介 python是由一系列的模块组成的,每个模块就是一个py为后缀的文件,同时模块也是一个命名空间,从而避免了变量名称冲突的问题.模块我们就可以理解为lib库,如果需要使用某个模块中的函数或对象 ...
- 看懂gc日志
使用的是:+PrintGCDetails -XX:+PrintGCTimeStamps 输出的日志格式: [Times: user=0.03 sys=0.00, real=0.01 secs] 363 ...
- jQuery限制文本框的输入长度
jQuery限制文本框输入,包含粘贴. //限制文本框的输入长度 $(function () { $(document).on("keypress", ".txt-val ...
- wpf(怎么跨线程访问wpf控件)
在编写代码时,我们经常会碰到一些子线程中处理完的信息,需要通知另一个线程(我这边处理完了,该你了). 但是当我们通知WPF的UI线程时需要用到Dispatcher. 首先我们需要想好在UI控件上需要显 ...
- SQL 增加列
-- 判断是否存在该列 if exists(SELECT * FROM syscolumns WHERE id=object_id('@Table') and name='@COLUMN') ALTE ...