我们可以用uwsgi来部署Flask项目,或者单独部署Flask,那么我们为什么还要使用Nginx + uwsgi来部署呢?
使用Nginx有如下一些优点:
安全:不管什么请求都要经过代理服务器,这样就避免了外部程序直接攻击web服务器
负载均衡:根据请求情况和服务器负载情况,将请求分配给不同的web服务器,保证服务器性能
提高web服务器的IO性能:对于一些静态文件,可以直接由反向代理处理,不经过web服务器
NGINX
#安装
sudo apt-get install nginx
#测试是否安装成功
sudo nginx -t
#查看版本
nginx -v
#Nginx 查看状态|停止|运行|重启
service nginx status|stop|start|restart
(也可以用ps-aux去查看所有进程)
nginx文件结构
/usr/sbin/nginx/ #主程序
/etc/nginx/ #配置文件
/usr/share/nginx/ #静态文件
/var/log/nginx/ #日志文件
退出与动态更新配置
#优雅退出nginx
sudo nginx -s quit
#强制退出
sudo service nginx stop
#启动nginx
sudo service nginx start
#动态加载配置(可在不断开的情况下重新加载新配置)
sudo nginx -s reload
UWSGI:
#对wsgi , uwsgi的说明
https://www.cnblogs.com/wspblog/p/8575101.html
#conda下安装uwsgi
#不要直接用pip方式,会报错,用如下命令:
conda install -c conda-forge uwsgi
conda install -c conda-forge libiconv
#查看uwsgi版本及测试是否成功
uwsgi --version
#单独测试uwsgi
生成一个test.py,内容如下:
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b'Hello World From My Uwsgi prprpr']
然后再外面:
uwsgi --http :8080 --wsgi-file test.py
在浏览器输入127.0.0.1:8080,查看是否正确打开
#查看uwsgi进程
ps -ef | grep uwsgi
#关闭uwsgi
sudo pkill -f uwsgi -9
FLASK
测试代码
OnlyFlask.py :
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return"<h1>I'm Flask miaomiaomiao</h1>"
if __name__ == "__main__":
app.run(host='0.0.0.0',port=8888)
使用uwsgi部署Flask项目
直接使用命令行去部署:
uwsgi --socket 0.0.0.0:5555 --protocol=http -p 3 -w OnlyFlask:app
说明:
--socket 0.0.0.0:5555 指定暴露端口号为5555
--protocol=http 说明使用 http 协议,即端口5555可以直接使用HTTP请求进行访问。
-p 3表示启动的服务占用3个进程。
-w OnlyFlask:app:-w 指明了要启动的模块,OnlyFlask就是项目启动文件OnlyFlask.py去掉扩展名,app是OnlyFlask.py文件中的变量 app,即 Flask 实例。
编写配置文件部署:
项目目录(其实在哪生成都行,项目路径是在下面配置的)下生成uwsgi.ini,内容如下:
[uwsgi]
# 程序启动文件
wsgi-file = RunFlask.py
# 程序内启动 application 的变量名
callable = app
# 处理器数
processes = 2
# 线程数
threads = 4
# 项目路径地址
chdir = /home/vinsuan/code/Time/2019_12/Online_Face_Server
# socket连接方式
socket = 127.0.0.1:9009
# socket权限
chmod-socket = 660
# log地址
logto = /home/vinsuan/code/Time/2019_12/Online_Face_Server/log/uwsgi_log.log
# 当服务停止的时候,自动移除unix Socket 和 Pid 文件
vacuum = true
#protocol = http
之后在命令行输入:
uwsgi --ini uwsgi.ini
(正式使用应该用nohup uwsgi --ini uwsgi.ini &)
即可启动成功
说明:
- processes相当于之前的-p参数;
如果我们没有添加 protocol = http,那此时我们暴露的端口不能使用HTTP请求直接访问,需要经过Nginx进行反向代理。
NGINX反向代理FLASK
修改/etc/nginx/sites-enabled/default如下:
********************START*****************************
server {
listen 80; #服务器监听端口
server_name 192.168.1.64; #公网IP
charset utf-8; #编码
client_max_body_size 75M; # 之前写的关于GET和POST的区别,这里应该是原因之一吧
location / {
include uwsgi_params; # 导入uwsgi配置
uwsgi_pass 127.0.0.1:9009; # 转发端口,需要和uwsgi配置当中的监听端口一致
uwsgi_param UWSGI_PYTHON /home/vinsuan/anaconda3/envs/tf36/bin; #python
uwsgi_param UWSGI_CHDIR /home/vinsuan/code/TEMP/TestNginx/; #项目根目录
#uwsgi_param UWSGI_SCRIPT OnlyFlask:app; # 和Flask以及其中实例一致
}
}
*******************END*********************************
然后使用如下命令启动nginx:
service nginx start
再手动启动uwsgi后,就可以在192.168.1.64那里看到页面了