如果你从来没有弄过python restful api 请参考以下链接入门。
如何在Ubuntu 18.04上使用uWSGI和Nginx服务Flask应用程序
注意: 以上链接有一些坑,可能会踩到:
.ini
文件中指定项目中的wsgi的路径nginx
配置好后无法访问项目,报权限问题或者连接被拒821605718
或者加我个人qq:2768861003
#!/usr/bin/python
# -*- coding: UTF-8 -*-
from flask import Flask
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class HelloWorld(Resource):
"""
api: /api/HelloWorld
restful 接口调用测试
"""
def get(self):
print('Hello world of RESTful api!')
return {'hello': 'world'}
api.add_resource(HelloWorld, '/api/HelloWorld')
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000)
wsgi.py
:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import sys
import os
FATHER_DIRECTORY = os.path.dirname(
os.path.split(os.path.realpath(__file__))[0])
sys.path.append(FATHER_DIRECTORY)
from restfulServer.app import app
if __name__ == '__main__':
app.run()
sudo apt update
sudo apt install python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools
我们将建立一个虚拟环境,以将Flask应用程序与系统上的其他Python文件隔离
venv
模块venv
模块sudo apt install python3-venv
test
,进入test,复制上面可运行的python demo到这里mkdir ~/test
cd ~/test
cp -r ~/flaskTest ./.
python3.6 -m venv testenv
source testenv/bin/activate
此时您已处于虚拟环境中, 界面会展示为:
(testenv)user@host:~/test$
注意:: 在激活的虚拟环境里,一律使用:
pip
,而不是pip3
以下操作都是在虚拟环境中的操作
pip install wheel
pip install uwsgi flask
sudo ufw allow 5000
测试访问:
cd ~/test/flaskTest/restfulServer
python app.py
注意: 如果有没有安装的包,请安装上,安装命令为:
pip install 包名字
执行后会看到以下输出:
Output
* Serving Flask app "test" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
访问:
http://your_server_ip:5000
以上虽然可以运行,但是ctrl + c结束后就没有了,因此我们需要一个程序的入口点:wsgi.py
,以便交互
cd ~/test/flaskTest/restfulServer
uwsgi --socket 0.0.0.0:5000 --protocol=http -w wsgi:app
访问:
http://your_server_ip:5000
如果你想长期使用的话,请执行以下操作
nano ~/test/test.ini
[uwsgi]
chdir=/home/ubuntu/test
module = flaskTest.restfulServer.wsgi:app
master = true
processes = 5
socket = test.sock
chmod-socket = 664
vacuum = true
die-on-term = true
[uwsgi]
: 知道以下配置属于uwsgi
chdir
: 定义你的项目目录
module
:.
就类似linux里的/
,我们将指定两件事: 模块本身(通过引用wsgi.py减去扩展名的文件)和文件中的可调用项app
master
: 告诉uwsgi以master模式启动
processes
:生成5个进程
socket
: 生成Unix套接字,放在chdir
指定的目录里。这里的socket文件将用于和nginx进行配合访问
chmod-socket
: 更改socket文件的权限
vacuum
:当进程停止时,使用这个关键字清理socket
die-on-term
: 这可以帮助确保init系统和uWSGI对每个过程信号的含义具有相同的假设
创建一个.service以/etc/systemd/system目录结尾的单元文件用来启动:
sudo nano /etc/systemd/system/test.service
[Unit]
Description=uWSGI instance to serve pythonRestfulApiServer
After=network.target
[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/test
Environment="PATH=/home/ubuntu/test/testenv/bin"
ExecStart=/home/ubuntu/test/testenv/bin/uwsgi --ini /home/ubuntu/test/test.ini
[Install]
WantedBy=multi-user.target
到这里,我们的systemd服务文件就完成了,接下来启动uWSGI服务
sudo systemctl start test
sudo systemctl enable test
检查状态:
sudo systemctl status test
输出:
Output
● test.service - uWSGI instance to serve test
Loaded: loaded (/etc/systemd/system/test.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2018-07-13 14:28:39 UTC; 46s ago
Main PID: 30360 (uwsgi)
Tasks: 6 (limit: 1153)
CGroup: /system.slice/myproject.service
├─30360 /home/ubuntu/test/testEnv/bin/uwsgi --ini myproject.ini
├─30378 /home/ubuntu/test/testEnv/bin/uwsgi --ini myproject.ini
├─30379 /home/ubuntu/test/testEnv/bin/uwsgi --ini myproject.ini
├─30380 /home/ubuntu/test/testEnv/bin/uwsgi --ini myproject.ini
├─30381 /home/ubuntu/test/testEnv/bin/uwsgi --ini myproject.ini
└─30382 /home/ubuntu/test/testEnv/bin/uwsgi --ini myproject.ini
sudo nano /etc/nginx/sites-available/test
server {
listen 80;
server_name 94.191.19.28;
location / {
include uwsgi_params;
uwsgi_pass unix:/home/ubuntu/test/test.sock;
}
}
sudo ln -s /etc/nginx/sites-available/test /etc/nginx/sites-enabled
sudo nginx -t
sudo nginx -s reload
访问:
http://your_domain
如果遇到任何错误请检查:
sudo less /var/log/nginx/error.log:检查Nginx错误日志。
sudo less /var/log/nginx/access.log:检查Nginx访问日志。
sudo journalctl -u nginx:检查Nginx进程日志。
sudo journalctl -u myproject:检查Flask应用的uWSGI日志。