1.nginx和uwsgi的关系
nginx相当于是服务器,负责接收请求
uwsgi是服务器和服务端应用程序的通信协议,规定了怎么把请求转发给应用程序和返回
2个基本概念:
服务器(接收请求),应用程序(处理请求并返回)
通信过程:
客户端发送一个http请求,被nginx服务器接收,nginx服务器将请求转发给uwsgi,uwsgi将请求转发给实现uwsgi协议的应用程序(flask,gunicorn等等)
2.uwsgi
1.安装
直接下载uwsgi的安装包并进行本地编译
注意:uwsgi目前只支持python2.7
2.使用
uwsgi自带服务器程序,可以实现nginx很少一部分功能(主要用于调试,并发量跟nginx相比却差很多),因此在服务端应用程序开发阶段,可以先用uwsgi进行应用程序的调试
(当然,像flask自带调试服务器,可以在main函数中直接启动服务器,进行逻辑调试)
这里,我们以flask为例,讲述如何将应用程序托管到uwsgi上(为什么要托管?因为服务器要上线,需要接受大规模的并发请求,用uwsgi托管是nginx转发的第一步)
1.使用支持uwsgi的网络框架写好应用程序
#coding=utf-8
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello World!'
if __name__ == '__main__':
app.run(host="10.210.178.27", port=5000,debug=True)
2.写完应用程序后,直接运行main函数,调试应用程序是否有逻辑错误(在这里我们的应用程序很简单,就不用调试了)
3.写应用程序的uwsgi配置文件
[uwsgi]
socket = 127.0.0.1:5000
processes = 4
threads = 2
master = true
pythonpath = /home/admin/test
module = test
callable = app
memory-report = true
应用程序要托管,需要告诉uwsgi应用程序的位置,用pythonpath = /home/admin/test指明当前应用程序的项目路径,module指明uwsgi需要托管的主程序文件名,callable就是在应用程序中指明的uwsgi需要调用的应用程序,在程序中是
app = Flask(__name__)
,因此callable指定为app. socket是uwsgi 进行socket通信的端口.
4.uwsgi调试
写好配置文件后,就可以开始用uwsgi命令启动服务器进行调试,为了便于在浏览器端访问调试,调试中使用http协议(socket协议用于nginx代理, 否则会出现:invalid request block size错误
使用http协议启动uwsgi的命令为:
uwsgi --http :5800 --ini uwsgi_conf.ini -d ./uwsgi.log --pidfile=uwsgi.pid
–http指定用5800端口启动http协议
–ini 指定上述的启动配置文件
-d指定uwsgi的log,方便我们调试
–pidfile将启动的进程号写到uwsgi.pid文件中,方便我们在需要停止服务器时kill掉
启动后查看uwsgi.log,如果一切正常,就在浏览器内访问:
http://10.210.178.27:5800
会输出hello world
,表明此时uwsgi工作正常。
再以socket形式(默认),启动uwsgi:
uwsgi --ini uwsgi_conf.ini -d ./uwsgi.log
socket端口为配置文件中的端口:5000.
接下来配置nginx转发请求到uwsgi。
3.nginx
1.安装nginx
nginx的安装直接用pip install nginx
即可
2.nginx代理配置
nginx的启动仅仅需要指定nginx的根目录以及nginx的配置文件,安装完nginx后,nginx conf目录下会有很多启动nginx所需要的文件,这些文件在启动nginx时是必不可少的。因此,我们通常为了项目的完整性,将nginx下的conf文件拷贝到我们的项目目录中,然后修改nginx的配置文件。
在我们的项目中,nginx配置文件修改如下:
server {
listen 8888;
server_name localhost;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:5000;
}
}
++特别注意:uwsgi_params在nginxconf文件夹下自带,uwsgi_pass一定要跟uwsgi_conf.ini中写的地址完全一致。++
然后启动nginx:
bash
/usr/local/nginx/sbin/nginx -p /home/admin/test -g "pid nginx.pid;"
/usr/local/nginx/sbin/nginx
:nginx执行文件的路径
-p
:执行的目录(nginx在此目录下找conf文件夹,并加载nginx.conf文件)
-g
:nginx指令,pid
创建pid为nginx.pid号的进程(方便我们kill)
至此,我们已经可以通过nginx8888端口转发uwsgi,进行访问应用程序。
需要重启时:
nginx:
kill -9 nginx.pid
uwsgi:
uwsgi --stop uwsgi.pid
参考文档:http://juxuan.fu.blog.163.com/blog/static/112129259201411188132562/