ubuntu16.04上利用Nginx代理uwsgi处理Flask web应用
1、环境要求
ubuntu16.04 ---- 阿里云的服务器
Nginx
python2
uwsgi
2、简单介绍Nginx
nginx是一个高性能的http和反向代理的服务器,Nginx采采用的epoll的机制,而没有使用select和poll,虽然,在用户活跃数量比较高的时候,epoll性能不如select,但是,我们用Nginx来作为web服务器还是很不错的。nginx是一个轻量级的web服务器,他占用内存少,并发能力强,非常适合作为静态资源的服务器使用。
apt-get安装nginx:
sudo apt-get update sudo apt-get install software-properties-common sudo add-apt-repository ppa:nginx/stable sudo apt-get update sudo apt-get install nginx
安装完成后,打开浏览器访问你的服务器,如果看到了nginx的欢迎页,说明你安装成功了,如果没有看到欢迎页,也不用着急,先检查自己的阿里云服务器的安全组规则中是否允许了80端口,如果没有,直接添加安全组规则。
添加安全组规则方法链接:https://jingyan.baidu.com/article/fea4511a2e387cf7bb912532.html
3、简单介绍uWsgi
uwsgi是一个web服务器,它实现了wsgi、uwsgi、http等协议。
uwsgi可以理解为Nginx和flask项目之间的桥梁,当nginx发现用户请求的不是static文件时,他就请求uwsgi,uwsgi又将请求抛给了flask,flask找到相应的api然后返回。
安装uwsgi:pip install uwsgi
让我们从一个简单的”Hello World”开始:
def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return [b"Hello World"]
(将其保存为 foobar.py
)。
正如你所见,它由一个简单的Python函数组成。之所以称之为 “application”,是因为它是uWSGI Python加载器将会搜索的默认函数 (但你显然可以自定义)。
将其部署在http端口9090,如果是阿里云服务器需要注意,添加9090端口到安全组
现在,启动uWSGI来运行一个HTTP服务器/路由器,它会传递请求到你的WSGI应用:
uwsgi --http :9090 --wsgi-file foobar.py
4、线上调式flask项目
确保项目所需文件都安装完成,使用flask自带的web应用服务器Werkzeug运行项目
如果项目运行失败,请自行检查问题所在
注意:添加端口到安全组
5、配置uwsgi
确定nginx,uwsgi都安装正常,同时flask也能正常运行。
[uwsgi] socket = 127.0.0.1:8080 #配置nginx chdir = /home/python/app #配置项目目录 module = manage #加载指定的python WSGI模块(模块路径必须在PYTHONPATH里) wsgi-file = manage.py #配置入口模块 master = True #开启master callable = app #设置在收到请求时,uWSGI加载的模块中哪个变量将被调用,默认是名字为“application”的变量 processes = 1 #配置进程数 threads = 1 #配置线程数 vacuum = true #推出是清空变量环境 daemonize = wsgi.log #配置守护进程 pidfile=uwsgi.pid #进程pid
6、配置nginx
如果按照我的方法,用apt安装的话,配置文件应该在/etc/nginx/sites-enabled/目录下有个defalut文件,我们就直接修改这个文件,当然 ,在修改前最好先备份一下。
a、首先将下面的代码注释掉
#location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. #try_files $uri $uri/ =404; #}
b、添加一下代码(注意:一定要确保自己的项目目录下存在logs/access.log和logs/error.log两个文件夹,不然nginx将会报错)
location /api 将符合/api的请求转给uwsgi处理
location / 指定静态文件处理时的目录 (注意:用alias的话,路径的末尾一定要加/,不然会找不到报forbidden错误)
access_log /home/python/app/logs/access.log; error_log /home/python/app/logs/error.log; location /api { include uwsgi_params; uwsgi_pass 127.0.0.1:8080; } location /{ alias /home/python/app/www/static/html/; }