在实现一些算法模式后,考虑的就是模型的部署了。对于一些相对独立的模型应用,如 OCR 识别引擎等,部署为独立的 Web 应用,以提供 API 的供其他系统调用的方式将是一个不错的解决方案。此方案的优点有以下几个方面:
pip install Django
django-admin startproject demosite
将会在当前目录下创建一个web项目,项目目录结构如下:
demosite/
├── demosite
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
在 demosite/demosite/ 目录下创建 views.py 文件,输入代码:
from diango.http import HttpResponse
def hello(request):
return HttpResponse("Hello World! [CSD]")
进入 urls.py 文件中添加:
from demosite.views import hello
在 urlpatterns 中添加 url 路径:
urlpatterns = [
path('admin/', admin.site.urls),
path('hello/', hello),
]
修改 settings.py 文件,将本地的IP添加到 ALLOWED_HOSTS = [], 如:
ALLOWED_HOSTS = ['192.168.0.100']
在 demosite 目录下,运行:
python manage.py runserver 192.168.0.100:8000
然后在浏览器中输入 url:
http://192.168.0.100:8000/hello/
就可以看的返回的
Hello World! [CSD]
Django 更高级的使用和配置可以参考官方文档:https://docs.djangoproject.com/en/2.2/
使用 uWSGI 就可以部署一个简单的 Django Web 应用,管理 WEB 请求实现良好的并发访问。同时 uWSGI 是 Django 推荐的方式: How to use Django with uWSGI,详情可参考 uWSGI 的官网.
安装 uWSGI 需要 c 编译器,安装方法参考官方的安装指南,也可以用 conda 直接安装:
conda install -c conda-forge uwsgi
在 demosite 目录下(也可以在其他目录)新建 demo_uwsgi.ini 配置文件:
[uwsgi]
chdir = /home/csd/demosite
wsgi-file = demosite/wsgi.py
buffer-size = 65536
master = true
processes = 8
threads=10
http = 192.168.0.100:8080
vaccum = true
daemonize = /home/csd/demosite/logs/demo_uwsgi.log
在 demosite 目录下创建文件夹:logs/
启动命令如下:
uwsgi --ini demo_uwsgi.ini --enable-threads
--enable-threads
参数用于启动多线程支持。
此时可以访问链接:
http://192.168.0.100:8080/hello/
此时关闭项目需要执行:
killall -9 uwsgi
如果上面启动 uwsgi 报错:
uwsgi: error while loading shared libraries: libiconv.so.2: cannot open shared object file: No such file or directory
则需要安装 libiconv
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
tar zxvf libiconv-1.14.tar.gz
cd libiconv-1.14
./configure
sudo make
sudo make install
如果 make 出错:
/stdio.h:1010:1: error: ‘gets’ undeclared here (not in a function)
_GL_WARN_ON_USE (gets, “gets is a security hole - use fgets instead”);
则在 libiconv-1.14/srclib/stdio.in.h 文件中,将698行的代码:
_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
替换为:
#if defined(__GLIBC__) && !defined(__UCLIBC__) && !__GLIBC_PREREQ(2, 16)
_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
#endif
然后从新执行:
./configure
sudo make
sudo make install
安装完成后,切换 root 账户,输入以下命令:
echo '/usr/local/lib' >> /etc/ld.so.conf
ldconfig
最后输入:
iconv --version
如果能执行则安装正确。
使用 nginx 服务器部署,实现负载均衡,更好得管理 WEB 请求。
需要下载以下几个安装包:
nginx-1.14.0.tar.gz
nginx_uploadprogress_module-0.9.0.tar.gz
openssl-1.0.2o.tar.gz
pcre-8.42.tar.gz
解压后进入 nginx-1.14.0/ 编译并安装 nginx:
./configure --prefix=/home/csd/nginx --with-openssl=../openssl-1.0.2o --with-pcre=../pcre-8.42 --add-module=../masterzen-nginx-upload-progress-module-a788dea --without-http_gzip_module
make
make install
进入安装目录 (/home/csd/nginx/) 下的 conf 目录,修改 nginx.conf 配置文件
将工作进程设置为4:
worker_processes 4;
nginx 默认监听 80 端口,所以有必要先查看 80 端口是否已被占用:
netstat -lnp|grep 80
如果被占用则改为其他端口,server 配置中增加如下配置:
server {
listen 90;
server_name 192.168.0.100;
large_client_header_buffers 4 16k;
client_max_body_size 300m;
client_body_buffer_size 128k;
proxy_connect_timeout 600;
proxy_read_timeout 600;
proxy_send_timeout 600;
proxy_buffer_size 256k;
proxy_buffers 16 256k;
proxy_busy_buffers_size 512k;
proxy_temp_file_write_size 512k;
location / {
root html;
index index.html index.htm;
include uwsgi_params;
uwsgi_pass unix:/home/csd/demosite/uwsgi.sock;
}
location /static {
alias /home/csd/demosite/static;
}
location /media {
alias /home/csd/demosite/media;
}
}
接着在 demosite 目录下创建 static/
和 media/
两个文件夹。将 demo_uwsgi.ini
中的
http = 192.168.0.100:8080
修改为
socket = /home/csd/demosite/uwsgi.sock
在 settings.py
文件最后添加:
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
收集静态文件,在 demosite 目录下运行:
python manage.py collectstatic
启动 uwsgi:
uwsgi --ini demo_uwsgi.ini --enable-threads
启动 nginx:
sudo /home/csd/nginx/sbin/nginx
此时访问:
http://192.168.0.100:90/hello/