ubuntu部署python项目(virtualenv + flask + uwsgi + nginx)

时间:2024-06-03 21:01:21

以下为我部署pthon flask + virtualenv + uwsgi + nginx的艰苦之路(我使用的是ubuntu 及python3.6)
安装好python3.6后(上一编文章有讲啦):

创建python虚拟环境:VirtualEnv(非常牛逼及非常重要,在这里你可以do evertything
首先先安装virtualenv模块(要多敲命令,就只贴图了)
ubuntu部署python项目(virtualenv + flask + uwsgi + nginx)

创建虚拟环境:假如我的项目目录在/home/python_project/test,进入到这个目录下,执行如下命令(virtualenv venv):venv是虚拟环境名称,随便你写
ubuntu部署python项目(virtualenv + flask + uwsgi + nginx)

看到这样子就是创建成功了:
ubuntu部署python项目(virtualenv + flask + uwsgi + nginx)
这时当前目录下就会生成venv文件夹(这个就是你的虚拟环境文件)
启用虚拟环境:
ubuntu部署python项目(virtualenv + flask + uwsgi + nginx)

启用虚拟环境后,你就可以为所欲为了。
下面开始安装项目依赖(注意:虚拟环境不要使用sudo 命令,否则也会安装到正式的python环境中
项目依赖比较多,一般建议引用清单安装:requirements.txt(这个文件使用命令:
pip freeze > requirements.txt获得)
如下为清单:
ubuntu部署python项目(virtualenv + flask + uwsgi + nginx)

安装清单文件:
ubuntu部署python项目(virtualenv + flask + uwsgi + nginx)

注意:在虚拟环境中安装依赖遇到个大坑(对我来说)
就是安装的时候凡是有报:没有权限的,一律给相应文件加上写的权限就行了。千万不要使用sudo去安装(我前面已经说过了)
经过亲身体验,只需要加上这几个文件夹的权限就行了(虚拟环境)

sudo chmod 777 venv/lib/python3.6/site-packages/pycache
sudo chmod 777 venv/lib/python3.6/site-packages
udo chmod 777 venv/bin

安装好依赖后,你可以上传项目文件到当前文件夹下了:
可使用命令:sudo rz上传(这个不是自带的,需要安装 sudo apt-get install lrzsz)
上传后,目录结构如下(网上随便截图来的不用在意一些细节):
ubuntu部署python项目(virtualenv + flask + uwsgi + nginx)
这里我贴下我 manage.py 的代码:

from flask import request
from flask_script import Manager, Command
 
from comm import create_app
from comm.k_error import KFlaskErr
from comm.result import R
 
 
#初始化,__name__代表主模块名或者包
app = create_app()
manager = Manager(app=app)
 
 
#@manager.command
class Hello(Command):
    def run(self):
        print("hello world")
 
 
manager.add_command('hello', Hello())
 
if __name__ == '__main__':
    manager.run()
 
create_app代码:
import os
 
from flask import Flask
from . import app
 
 
def create_app():
    print('create app...')
    base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    templates_dir = os.path.join(base_dir, 'templates')
    static_dir = os.path.join(base_dir, 'static')
    # app = Flask(__name__)
    app = Flask(__name__, static_folder=static_dir, template_folder=templates_dir)
    app.register_blueprint(app, url_prefix='/kapi')     # 将app交由blue管理
 
    return app

安装uwsgi:
ubuntu部署python项目(virtualenv + flask + uwsgi + nginx)

配置uwsgi:
在当前目录创建config.ini配置文件,内容如下

[uwsgi]
 
# uwsgi 启动时所使用的地址与端口
socket = 127.0.0.1:5000
# 指向网站的目录
chdir = /home/python_project/kapi
# python 启动程序文件
#wsgi-file = manager.py
module = manager
# python 程序内用以启动的application变量名(app是manager.py程序文件内的一个变量,这个变量是Flask的application类)
callable = app
# 处理器数
processes = 4
# 线程数
threads = 2
# 状态检测地址
#stats = 127.0.0.1:9191
# url地址长度
buffer-size = 32168
# 允许主线程存在(true)
master = true
plugins = python
#daemonize = %(chdir)/log/uwsgi.log
stats = %(chdir)/uwsgi/uwsgi.status
pidfile = %(chdir)/uwsgi/uwsgi.pid
disable-loggin = true
#logto = %(chdir)/log/uwsgi.log

测试运行:
ubuntu部署python项目(virtualenv + flask + uwsgi + nginx)

按ctrl + C就可退出。

将uwsgi添加为系统服务
在我们运行或者调试uwsgi的时候:
ubuntu部署python项目(virtualenv + flask + uwsgi + nginx)
如果Ctrl+C或者退出ssh链接,都会导致uwsgin进程关闭。
这时,我们需要进程管理软件管理 uwsgi 进程的运行了。Ubuntu 自带的 systemd 是最简单的方法,可以将我们的项目变为系统服务。首先创建 myproject.service 文件
sudo vim /etc/systemd/system/myproject.service

[Unit]
Description=uWSGI instance to serve myproject
After=network.target
 
[Service]
[Unit]
Description=uWSGI instance to serve myproject
After=network.target
 
[Service]
WorkingDirectory=/home/python_project/kapi
ExecStart=/home/python_project/kapi/venv/bin/uwsgi --ini /home/python_project/kapi/config.ini
ExecStop=/home/python_project/kapi/venv/bin/uwsgi --stop /home/python_project/kapi/uwsgi/uwsgi.pid
ExecReload=/home/python_project/kapi/venv/bin/uwsgi --reload /home/python_project/kapi/uwsgi/uwsgi.pid
 
[Install]
WantedBy=multi-user.target

o [Unit]部分主要是对这个服务的说明,内容包括Description和After,Description用于描述服务,After用于描述服务类别
o [Service]部分是服务的关键,是服务的一些具体运行参数的设置
• WorkingDirectory: 你的项目目录。
• ExecStart:服务启动的代码
• ExecReload:重启命令
• ExecStop:停止命令
• WantedBy=multi-user.target:指明会跟随系统启动而启动该服务。
o 注意以上所有路径为绝对路径。

配置完毕需要reload systemdctl(命令:systemctl daemon-reload
接下来可以愉快的启动了(kapi 就是 kapi.service 文件名去掉扩展名)
启用:systemctl start kapi.service
停止:systemctl stop kapi.service
重载:systemctl reload kapi.service

ubuntu部署python项目(virtualenv + flask + uwsgi + nginx)

使用命令 ps aux | grep uwsgi 查看进程
ubuntu部署python项目(virtualenv + flask + uwsgi + nginx)

配置nginx:
ubuntu部署python项目(virtualenv + flask + uwsgi + nginx)

遇到的还有一些问题(集合所有网友的力量,有的直接copy过来的):
一、uwsgi启用后,访问项目:invalid request block size: 4161 (max 4096)…skip问题

之前一个没有去详细搜索过,也没有具体去看错误产生的原因,因为只是偶尔出现,并且有时候重试的时候是可以登陆的,所以没有太多的去关注,今天因为在会议演示的过程中又出现这个问题,所以不得不重视了。
搜索一下,其实问题很简单:url地址长度超过了4096个字符,而4096就是uwsgi配置中buffer-size的默认值,所以只需要将buffer-size改大一点即可。
我是使用uwsgi -x 指定uwsgi配置文件来启动服务器的,所以只需要修改成以下方式启动即可:
uwsgi -x platform.uwsgi.xml --buffer-size 32768
或在config.ini配置文件加buffer-size = 32168(前面的配置文件我已经加上去了)
二、uwsgi-- unavailable modifier requested: 80 –

这个问题好像只有我出现了也,其实问题是这样的:因为我这个项目提供接口给其它项目去调用,另一个项目也部署到本服务器上。所以我调用接口的时候我直接使用127.0.0.1:5000/这个地址粗暴的调用导致的,后面配置了nginx,使用了域名调用就毛问题啦

三、项目启动时(只有用到opencv-python才可能会出这个错):ImportError: libSM.so.6: cannot open shared object file: No such file or directory
ubuntu部署python项目(virtualenv + flask + uwsgi + nginx)

解决:
sudo apt-get install -y python-qt4

垮过很多坑(好像也不是很多也~~!),终于把项目部署并启用起来。
好了,搬砖时间又到了。你们耍。