一、网络架构:
调用流:当客户端发送服务请求时,若使用nginx作为代理服务器的话,先转为nginx服务器处理,然后再转给uwsgi服务器,再由uwsgi来调用项目中的代码处理服务请求并返回。
二、安装python(python中已自带pip安装)
1、python中已自带pip安装,若没有带,则需要额外安装
2.、Linux也支持pip命令
三、安装uWSGI
pip install uwsgi
四、安装flask
pip install flask
五、将项目文件传输到服务器
1、放到某个目录下,如 /usr/
2、或者新建某个文件目录
3、执行Linux命令:rz 压缩文件,可以为zip格式,然后使用unzip命令解压
六、创建和配置 uwsgi 配置文件 uwsgi.ini
uwsgi.ini的配置文件放在了项目目录下,跟flask的启动脚本放在同一目录下。
touch uwsgi.ini vim uwsgi.ini
配置如下:
[uwsgi] socket=0.0.0.0:5000 #socket协议,用于和nginx通讯,端口可配置成别的端口;如果有nginx在uwsgi之前作为代理的话应该配socket 如:socket=0.0.0.0:5000,而如果客户端请求直接给uwsgi的话那么就配http。如:http=0.0.0.0:5000;IP和端口与项目启动文件app.py中一致; 127.0.0.1虽然是表示本地IP,但想要在同一网段下访问必须设置host=0.0.0.0才不受IP限制 chdir=/usr/flask/ #项目目录,定位到项目的第一层,如项目名称为falsk wsgi-file=/usr/flask/app.py #项目启动文件(需要带上文件路径) callable=app #程序内的application变量名,也即执行run方法的那个实例的名称 processes=4 #进程数 threads=10 #每个进程中线程数 daemonize=uwsgi.log #使进程在后台运行,并将日志打到指定的日志文件,文件若不存在则会自动创建 disable-logging = true :#不记录请求信息的日志,只记录错误以及uWSGI内部消息到日志中。如果不开启这项,日志中会大量请求记录: pidfile=uwsgi.pid #进程号存储文件,若不存在则会自动创建,pid里面只记录一个进程号,若存在多个进程processes,则使用uwsgi命令通过uwsgi.pid文件停止、重启uwsgi服务不全 buffer-size = 65536#不设置该关键字,请求超过4k就会报错(待确认) harakiri = 60# 超过时间,单位秒 vacuum = True # 当服务器退出的时候自动清理环境
备注:非注释复制文件
[uwsgi] http=0.0.0.0:443 chdir=/usr/flask/ wsgi-file=/usr/flask/app.py callable=app processes=1 threads=10 daemonize=uwsgi.log disable-logging = true pidfile=uwsgi.pid buffer-size = 65536 harakiri = 60 vacuum = True
七、启动服务
若进入项目下(uwsgi.ini所在的文件夹下),执行如下启动命令:
uwsgi --ini uwsgi.ini # 启动uwsgi服务 启动成功信息: [uWSGI] getting INI configuration from uwsgi.ini ps -ef |grep uwsgi 查看当前是否开启的uwsgi进程 启动失败可查看uwsgi日志,日志位置在配置文件中我们自己配置的路径 tail -f uwsgi
若不通过配置文件启动uwsgi服务,也可以通过命令启动:
uwsgi --http 0.0.0.0:443 --wsgi-file app.py --callable app --processes 4 --threads 2
常用命令:
uWSGI 通过 xxx.ini 启动后会在相同目录下生成一个 xxx.pid 的文件,里面只有一行内容是 uWSGI 的主进程的进程号。 uwsgi --ini cms_uwsgi.ini //启动 uwsgi cms_uwsgi.ini --deamonize //后台运行启动 uwsgi --stop uwsgi.pid //停止服务 uwsgi --reload uwsgi.pid //可以无缝重启服务
若不使用nginx,则如上即可完成uwsgi服务部署即OK;若想使用nginx作为服务代理,则在步骤六启动uwsgi服务前需要先执行如下步骤;
八、安装nginx
yum install nginx
九、nginx配置
修改nginx配置文件nginx.conf ,将原来默认内容删掉,添加如下:
server {
listen 80;
server_name localhost;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:5000;
}
}
说明:
listen监听端口,也就是我们在浏览器要访问的端口,默认80; server_name外网访问服务器的地址 include uwsgi_params 引入uwsgi配置 proxy_pass就是启动flask项目绑定的host和port,也即应用程序启动文件app.py中配置的host和port,配置与uwsgi的配置文件里的socket一致。
备注:如果有多个项目的话,在一个nginx下部署多个应用, 如果用域名到很简单配置多个nginx server 和uwsgi就可以
# 第一个服务器
server {
listen 192.168.1.1:80; # 监听此ip的80端口
server_name example.org www.example.org; # 服务器名
...
}
# 第二个服务器
server {
listen 192.168.1.1:80 default_server; # 监听此ip的80端口
server_name example.net www.example.net; # 服务器名,为此ip,端口的默认服务器
...
}
# 第三个服务器
server {
listen 192.168.1.2:80 default_server; # 监听此ip的80端口
server_name example.com www.example.com; # 服务器名,为此ip,端口的默认服务器
...
}
十、启动nginx
service nginx start #启动nginx service nginx status # 查看nginx状态,是否启动 service nginx restart # 重启nginx ps -ef |grep nginx # 查看nginx是否已启动 kill -9 nginx #强制停止 tail -f error.log #查看nginx日志
十一、可能存在的问题
1、如果遇到问题,先查看nginx是否启动成功,如果没成功,nginx日志
当nginx成功以后再去排uwsgi的错误,看看是不是Flask项目的python环境没对应上,或者是缺少某些模块 查看uwsgi日志,找到日志文件的目录 tail -f uwsgi.log
2、Python3安装后导致yum不能使用,因为执行yum需要python2的版本,修改两个文件
vim /usr/bin/yum
vim /usr/libexec/urlgrabber-ext-down 把#!/usr/bin/python 修改为 #!/usr/bin/python2
3、通过nginx访问时自动加末尾斜杠的问题
配置完nginx之后访问每次都是404,经过原因排查,发现是这么回事:
在后端代码中,我写的是@app.route(’/info’,methods=[‘GET’,‘POST’])这样的。当不使用uwsgi+nginx部署,而是用flask自带的web服务器进行测试时,我访问xxxx:xx/info,可以访问到界面。但是通过nginx访问时,nginx会把所有末尾不带斜杠的非文件类请求都加上斜杠,并且给出301回应,然后重定向到有斜杠的URL下。这可能是因为其他一些比较经典的WEB开发语言中请求往往是一个文件如.php,.aspx,.html等,而python的框架实际上是把一个“目录”节点作为一个html文件给出了。这就使得末尾要加上一个斜杠,才能让nginx知道这是一个指向目录的请求。
解决的办法也很简单,通过浏览器直接发起GET请求的页面(也就是一定要经过nginx访问的),路由设置时记得加上末尾的斜杠就好了。因为不同过键盘打到浏览器地址栏这种方式的GET请求(比如页面的一个超链接的href值,或者AJAX发起指向的URL)都是不会自动补齐斜杠的,所以其他那些页面也都不会受影响。
4、Linux安装uWSGI失败处理办法Exception: you need a C compiler to build uWSGI
解决方案:yum install gcc



