最近使用flask写了一些简单的服务。html
服务部署到服务器上进行使用,这个过程会有一些问题,须要进行记录一下。python
说明运行的环境状况。使用的是python3.6的虚拟环境,系统是centos7,其余的有uwsgi,supervisor,ngnix。nginx
首先准备一个简单的flask服务。django
代码ipapp.py:flask
# 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()
1、安装python3.6centos
1.下载服务器
# wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz app
2.解压 curl
# tar -zxvf Python-3.6.8.tgz socket
3.到解压好的文件夹先配置
# cd Python-3.6.8
# ./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等
2、安装并配置uwsgi
uwsgi是服务器的一种,主要用来跑你的服务
1.安装
在虚拟环境执行
# pip install uwsgi
2.测试uwsgi
使用uwsgi启动一下个人flask服务
------
为了方便,先装了一个screen
# yum install screen
而后在screen内测试uwsgi
------
简单启动个人ipapp.py
# uwsgi --http 127.0.0.1:5000 --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:5000 wsgi-file = ipapp.py callable = app
再使用文件打开服务,注意在虚拟环境
# uwsgi --ini test_uwsgi.ini
结果与使用uwsgi命令运行服务相同
若是使用uwsgi打开服务有问题,多是uwsgi路径或者配置相关问题,须要找到对应方案解决
3、安装并配置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:10050; 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地址,获得我写的网页
*若是访问不起,检查一下端口防火墙之类的。
到此,服务就部署可用了。
4、安装并使用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