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 flask
pip install uwsgi
5.创建项目目录
mkdir myapp
6.创建uwsgi.ini配置文件
vi uwsgin.ini
7.复制内容
[uwsgi]
http=0.0.0.0:5000
chdir=/home/myapp
wsgi-file=app.py
callable=app
processes=4
threads=2
buffer-size=65536
stats=0.0.0.0:9191
home=/home/myapp/venv
pythonpath=/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 Flask
app = 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~