vlambda博客
学习文章列表

centos部署flask+nginx+uwsgi之踩坑指南

最近写了个简单的表格维护代码用的是python的flask框架,想部署到测试服务器,发现一堆坑,所有坑踩了一遍,脑子嗡嗡的。现总结记录下也顺便给同学们同步下。

1.什么是uwsgi

一个网站 = web框架(如django、flask)+ web服务器(如uWSGI)一个分布式网站 = nginx(也是一个web服务器,负载均衡、反向代理)+ web框架(django、flask)+ Web服务器(如uWSGI)WSGI 是一种接口,一种规范,一种标准,全称the Python Web Server Gateway Interface (WSGI),用来保证不同Web服务器可以和不同的Python程序之间相互通信。uwsgi 是一种协议。uwsgi是一种线路协议而不是通信协议,常用于在uWSGI服务器与其他网络服务器的数据通信。uwsgi协议是一个uWSGI服务器自有的协议。uWSGI 是一个web服务器。uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。

2.什么是flask

flask是python的web开发的微框架,并列额的还有django

3.什么是nginx

nginx其实也是一个web服务器,它是一个代理服务器,客户端的请求必须经过nginx,然后nginx再将请求中的动态请求转发给上游的web服务器nginx有几个优点:负载均衡:根据请求情况和服务器负载情况,将请求分配给不同的web服务器,保证服务器性能。负载均衡的机制有3种,(1) 循环 - 对应用程序服务器的请求以循环方式分发,(2) 最少连接 - 下一个请求被分配给活动连接数最少的服务器,(3) ip-hash - 哈希函数用于确定应为下一个请求选择哪个服务器(基于客户端的IP地址)。反向代理:客户端的请求由代理服务器分配给某web服务器,而不是客户端指定的目标服务器。对于一些静态文件,可以直接由反向代理处理,不经过web服务器。安全性:客户端无法得知真正的服务器IP地址,保证了服务器的安全。

那么本文里面nginx的主要作用是作为反向代理,uwsgi作为web服务器

4.安装uwsgi

yum install python-devel   安装依赖(必须)这个坑了我好几个小时
pip install flaskpip install uwsgi

5.创建项目目录

mkdir myapp

6.创建uwsgi.ini配置文件

vi uwsgin.ini

7.复制内容

[uwsgi]http=0.0.0.0:5000chdir=/home/myapp wsgi-file=app.pycallable=appprocesses=4threads=2buffer-size=65536stats=0.0.0.0:9191home=/home/myapp/venvpythonpath=/home/myapp/venv/Lib/site-packages

chdir 文件绝对路径

wsgi-file=main.py 测试文件名字

pythonpath项目虚拟环境包路径

callable=appapp = Flask(__name__) 这个app对象

如果你的 ck = Flask(__name__)

那么callable=ck

pythonpath=/home/myapp/venv/Lib/site-packages

这个一定要写site-packages绝对路径。网上太多人带错路,太不负责了

8.编写测试文件:app.py

from flask import Flaskapp = Flask(__name__) @app.route("/")def index(): return "Hello This py36 uwsgi nginx flask centos7!"if __name__ == "__main__":    app.run(host='0.0.0.0',port=5000)

9.启动uwsgin

uwsgi --ini uwsgi.ini

显示 [uWSGI] getting INI configuration from uwsgi.ini 表明uwsgi运行成功。

后台运行(可选)

uwsgi -d --ini uwsgi.ini

查看是否启动:

ps -ef|grep uwsgi

停止运行命令:

uwsgi --stop uwsgi.pid或者sudo pkill -f uwsgi -9

10.上传源码到服务器myapp目录

11.编辑完配置文件后,必须重启uwsgi

centos部署flask+nginx+uwsgi之踩坑指南

重启发现报错。我们没有安装mysql

好的, 查看这篇文章安装mysql

centos部署flask+nginx+uwsgi之踩坑指南

重启后没有发现报错

直接访问Ip:5000:

13.配置nginx反向代理

user root;worker_processes 1;
error_log /var/log/nginx/error.log warn;pid /var/run/nginx.pid;
events { worker_connections 1024;}http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; gzip on; include /etc/nginx/conf.d/*.conf;        server_names_hash_bucket_size 64;server { listen 80; server_name 外网IP; charset utf-8;
location / { #include uwsgi_params; #uwsgi_pass 192.168.4.111:5000; proxy_pass http://外网IP:5000/; }        }}

设置代理成功后,只需要访问80端口,nginx会自动转发到某个服务器的5000端口上

直接访问:IP/域名

End~