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
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,
}
}
}
修改配置文件使用数据库
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 #这一步要按照提示
Mrdoc 超级用户密码为root/root
- 启动测试(后续我们会用wsgi方式在njet中启动)
以python 模式启动应用,查看配置是否配置好了
python manage.py runserver 0.0.0.0:8888
启动成功
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