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/myappwsgi-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=app,app = 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__)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
重启发现报错。我们没有安装mysql
好的, 查看这篇文章安装mysql
重启后没有发现报错
直接访问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~
