Python_wsgi

1. 功能说明

WSGI 是 Web 服务器网关接口。它是一种规范,描述 Web 服务器如何与 Web 应用程序通信,以及 Web 应用程序如何链接在一起来处理一个请求。

OpenNJet现在支持WSGI接口,提供WSGI运行的环境

2.依赖模块

njet.conf:

load_module modules/njt_python_wsgi_module.so;

3. 指令说明

python_stack_size [size] 函数交换的栈大小,函数越复杂,栈配置的越大。
wsgi <string> Python wsgi需要的模块名称

4. 前置条件

  • 加载 njt_python_wsgi_module.so模块
  • 配置好相关python环境(njet-wsgi-3.0.1-1.el7.x86_64 带有打包好的python基础环境)

5. 以下为安装njet并配置开启WSGI功能 启动Mrdoc应用的步骤

5.1 安装两个rpm包

安装最新版本的njet rpm和njet-wsgi rpm

5.2 安装mysql

yum install -y mariadb-server

配置应用的用户密码等信息

mysql -u root
create user 'mrdoc'@'localhost' IDENTIFIED BY 'mrdoc';
create database mrdoc;
GRANT CREATE, SELECT, INSERT, UPDATE, ALTER, DELETE, DROP, INDEX ON mrdoc.* TO 'mrdoc'@'localhost';

5.3 使用njet自带的python环境

  • 配置python环境

最好不配置到root用户,配置给njet用户比较好。防止系统混乱,但是使用rpm安装的pyenv只能配置到root用户下,用户也可以自行安装pyenv到其他的操作用户下面。

ln -s /usr/local/njet/pyenv ~/.pyenv
  • 将以下命令复制到~/.bashrc中,
export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

export PATH=/usr/local/njet/pyenv/versions/3.8.19/bin/:$PATH
export LD_LIBRARY_PATH=/usr/local/njet/pyenv/versions/3.8.19/lib:$LD_LIBRARY_PATH
  • 查看是否生效
pip3 -V
which python3
python3 -V

img img

5.4 复制并修改Mrdoc应用及配置

以Mrdoc应用为例演示wsgi功能

  • 修改配置
修改 MrDoc/setting.py
插入:
'mysql_connector':'mysql.connector.django',
插入:
if db_engine == 'mysql_connector':
   DATABASES = {
        'default': {
            'ENGINE': DATABASE_MAP[CONFIG['database']['engine']],
            'NAME': CONFIG['database']['name'],
            'USER': CONFIG['database']['user'],
            'PASSWORD': CONFIG['database']['password'],
            'HOST': CONFIG['database']['host'],
            'PORT': CONFIG['database']['port'],
            'OPTIONS': {
                'use_pure': True,
                'auth_plugin': 'mysql_native_password',
                'ssl_disabled': True,
            }
        }
   }

img img

img img

修改配置文件使用数据库

vi config/config.ini
# mysql -u mrdoc  -pmrdoc -D mrdoc 这样测试一下

[database]
# engine,指定数据库类型,接受sqlite、mysql、oracle、postgresql
#engine = mysql
engine = mysql_connector
# name表示数据库的名称
name = mrdoc
# user表示数据库用户名
user = mrdoc
# password表示数据库用户密码
password = mrdoc
# host表示数据库主机地址
host = 127.0.0.1
# port表示数据库端口
port = 3306
  • 初始化MrDoc
cd MrDoc-v0.9.2
#检查一下是否使用的是njet的python环境
which pip3 
which python3  

# 安装依赖
pip3 install -r  ./requirements.txt 
pip3 install mysql-connector
pip3 install mysql-connector-python

python3 manage.py makemigrations
python3 manage.py migrate
python3 manage.py createsuperuser #这一步要按照提示

img img

img img

img img

Mrdoc 超级用户密码为root/root

  • 启动测试(后续我们会用wsgi方式在njet中启动)

以python 模式启动应用,查看配置是否配置好了

python manage.py runserver 0.0.0.0:8888

启动成功

img img

5.5 NJET启动wsgi

5.5.1 将Mrdoc 应用放到NJET用户可以访问的位置

mkdir -p /usr/local/njet/app/mrdoc
mv ~/MrDoc-v0.9.2/ /usr/local/njet/app/mrdoc/

以njet 启动python应用

5.5.2 njet.conf:

load_module modules/njt_python_wsgi_module.so;

helper ctrl modules/njt_helper_ctrl_module.so /etc/njet/conf/ctrl.conf;
helper broker modules/njt_helper_broker_module.so conf/mqtt.conf;

worker_processes  auto;
cluster_name helper;
node_name test_node1;


error_log logs/error.log info;  
pid        /etc/njet/njet.pid;

events {
    worker_connections  1024;
}


python_stack_size 512k; #这个要设置得大一些


http {
        include mime.types;

    server {
        listen 8080;

       root  /usr/local/njet/app/mrdoc/MrDoc-v0.9.2;
        location /static {
            root  /usr/local/njet/app/mrdoc/MrDoc-v0.9.2;
        }


       location / {
           root  /usr/local/njet/app/mrdoc/MrDoc-v0.9.2;
           wsgi  MrDoc;
        }

    }
}

5.5.3 需要配置ldconfig

#root 用户配置
cat << EOF >> /etc/ld.so.conf.d/njet.conf
/usr/local/njet/pyenv/versions/3.8.19/lib
EOF
ldconfig 

5.5.4 设置环境变量,会在PYTHONPATH下查找对应的模块

export PYTHONPATH=/etc/njet:/usr/local/njet/app/mrdoc/MrDoc-v0.9.2
  • 启动脚本如下:
sudo -u njet --preserve-env=PYTHONPATH /usr/local/njet/sbin/njet -p /usr/local/njet -c conf/njet.conf
  • 或者修改service
[Unit]
Description=njet
After=network.target

[Service]
Type=forking
User=njet
Group=njet
WorkingDirectory=/usr/local/njet
Environment="PYTHONPATH=/etc/njet:/usr/local/njet/app/mrdoc/MrDoc-v0.9.2"
ExecStart=/usr/local/njet/sbin/njet -p /usr/local/njet -c conf/njet.conf
ExecStop=/usr/local/njet/sbin/njet -p /usr/local/njet -c conf/njet.conf -s stop
ExecReload=/usr/local/njet/sbin/njet -p /usr/local/njet -c conf/njet.conf -s reload
RestartPreventExitStatus=SIGKILL
PrivateTmp=true

[Install]
WantedBy=multi-user.target


systemctl daemon-reload
systemctl start njet

njet启动不需要配置其他的环境变量,例如PATH,LD_LIBRARY_PATH。

因为njet启动过程中,在 python module初始化过程内增加了两个setenv,效果类似于下面两指令,只在njet启动后生效。

export PATH=/usr/local/njet/pyenv/versions/3.8.19/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/njet/pyenv/versions/3.8.19/lib:$LD_LIBRARY_PATH

5.5.5 访问njet 启动的应用

img img