- 阿里云服务器:Ubuntu 16.04
- Python版本:3.6
- Tensorflow: 1.5
使用的是Pycharm创建自带的Flask项目,xxx.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
执行python xxx.py就可以运行 在浏览器中测试http://127.0.0.1:5000,可以正常访问就ok。 若直接在dos窗口中:输入命令 wget http://127.0.0.1:5000 也可测试。
- 服务器python版本为3.x
- 安装pip (sudo apt-get install python-pip)
- 安装Nginx,https://lnmp.org/ 或者 (sudo apt-get install nginx)
- 安装虚拟环境
pip3 install virtualenv
新建一个目录用作网站根目录,这里使用lnmp的根路径/home/wwwroot/myflask,并进入该目录
cd/home/wwwroot/myflask
创建一个独立的Python环境,命名为``envFflask```,完成后激活该环境
virtualenv envFlask--python=python3.6
source envFlask/bin/activate
- 安装gunicorn和flask 在虚拟环境下分别执行
pip3 install gunicorn
pip3 install flask
同时将项目文件xxx.py,上传到/home/wwwroot/myflask,尝试执行python xxx.py 在本机浏览器访问 http://ip:8000,ip是服务器ip,如果正常的话,环境就没问题了。 但是这个时候还是使用的python自带的web服务器,下面我们使用gunicorn
执行命令gunicorn -w 3 -b 127.0.0.1:8000 xxx:app 在本机浏览器访问 http://ip:5000,ip是服务器ip,如果正常的话,环境就没问题了。 解释命令:-w 3表示开3个线程,-b 120.0.0.1:8000表示路径设置,xxx:app:xxx表示入口文件,app表示主函数 疑问:为什么python自带的就可以运行了, 还需要这么复杂?
先按Ctrl+C,停止gunicorn, Nginx配置文件地址:/etc/nginx/sites-enabled/default 如下修改:
server
{
listen 9004; # 自己设置,同时在阿里云防火墙打开该端口
server_name 39.108.91.172; # 这是HOST机器的外部域名,用地址也行
location / {
proxy_pass http://127.0.0.1:8000; # 这里是指向 gunicorn host 的服务地址
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
重启Nginx:
sudo service nginx restart
此时,就可以使用ip还是无法正常访问,因为我们前面停止了gunicorn, 现在使用gunicorn -w 3 -b 127.0.0.1:8000 xxx:app启动起来, 浏览器测试正常,下一步Go--
创建一个systemd单元文件 我们需要处理的下一件事是systemd服务单元文件。创建一个systemd单元文件将允许Ubuntu的init系统自动启动Gunicorn,并在服务器启动时为Flask应用程序提供服务。 在/ etc / systemd / system目录中创建以.service结尾的单元文件(myflask.service)以开始: 给出我的配置文件myflask.service
[Unit]
Description=Gunicorn instance to serve the falcon application
After=network.target
[Service]
User=root
Group=www-data
Environment="PATH=/home/wwwroot/myflask/envFlask/bin"
WorkingDirectory=/home/wwwroot/myflask
ExecStart=/home/wwwroot/myflask/envFlask/bin/gunicorn -w 3 -b 127.0.0.1:8000 xxx:app
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
在/ etc / systemd / system目录输入以下命令:
sudo systemctl start myflask
//启动gunicorn后台管理
重新在虚拟环境的项目目录启动gunicorn命令,开始后台运行gunicorn;:
gunicorn -w 3 -b 127.0.0.1:8000 xxx:app
关闭虚拟环境:
deactivate
这里可以使用ps -ef查看进程运行情况.
上传替代文件(我们的模型,代码文件),在/ etc / systemd / system目录重启service,再运行gunicorn
sudo systemctl start myflask //启动
sudo systemctl stop myflask //停止
- main.py 重命名为 xxx.py
- 将文件中所有的 os.path.getcwd() 代码更改为 :os.path.dirname(os.path.abspath( file ))
- app.run(host='127.0.0.1',port=5002) 更改为 app.run()
- 屏蔽了断言(应该没必要):
# assert FLAGS.clip < 5.1, "gradient clip should't be too much"
# assert 0 <= FLAGS.dropout < 1, "dropout rate between 0 and 1"
# assert FLAGS.lr > 0, "learning rate must larger than zero"
# assert FLAGS.optimizer in ["adam", "sgd", "adagrad"]
- gunicorn -w 3 -b 127.0.0.1:8000 xxx:app 该命令中 -w ,-b ,作为参数出入了被调用的xxx.py文件,而xxx.py文件中没有接受该参数的flages 导致出错!(Tensorflow中flages的特别之处)
- 解决方法一:增加 flags.DEFINE_string/_int接受 -w,3,-b,127.0.0.1:8000 参数, 后面可以仿照这改语法使用参数。 如:
flags.DEFINE_int("w", 3, "Set the number of threads")
- 解决方法二:使用gunicorn启动项目时,不要传参了! gunicorn xxx:app 即可!! 然后,需要更改/et /systemd/system 中的myflask.service配置参数。也将 -w,-b ,127.0.0.1:8000 去掉!
- 更改xxx.py中的代码:
import json
...
...
# return jsonify(aa)
return json.dumps(aa, ensure_ascii=False)
-
在/et/systemd/system目录下重启的myflask.service服务,重启gunicorn, 完成!
-
可利用爬虫技术反复调用该接口