之前用Resnet和Yolo等炼了个“海獭/水獭分类器”,想放个demo到i网上。
最初硬用flask后端+vue前端搭了个网站出来,但是部署实在太麻烦了。
最后发还是Gradio比较方便。
0. 前言
Gradio包本身可以设定share=True启动参数,让Gradio官方帮我们创建一个公网链接。
但是这个方法网络很慢,而且链接24小时就生效了。
所以最好还是通过nginx在自己的云服务器上部署。
这是成品:ai.fat.plus
1. Gradio安装和python代码
首先创建venv虚拟环境
python -m venv venv
启动venv环境
source ./venv/bin/activate
pip安装Gradio依赖包
pip install gradio
创建一个demo.py文件,就用官方的演示代码好了:
import gradio as gr
def greet(name):
return "Hello " + name + "!"
demo = gr.Interface(fn=greet, inputs="text", outputs="text")
demo.launch()
可以先启动py文件尝试一下效果:
python app.py
按默认设定,它会启动一个127.0.0.1:7860的web服务
但目前他只能监听本地端口的,需要通过nginx反向代理到这个端口,以提供公网服务。
2. nginx反向代理配置
如果还没安装nginx的话,建议使用Oneinstack脚本一次性安装LNPM环境。
并可以通过它的vhost.sh脚本创建nginx配置文件,很方便。
nginx的配置文件例子如下,
关键是proxy_pass http://127.0.0.1:17860;
那几个location块,
将外网访问ai.fat.plus的请求全部将代理到127.0.0.1:7860。
注:这里我用的网址的是ai.fat.plus,并且配置了ssl证书。
这方面的教程可以参考别的文章……
server {
listen 80;
listen [::]:80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl_certificate /usr/local/nginx/conf/ssl/ai.fat.plus.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl/ai.fat.plus.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256;
ssl_conf_command Ciphersuites TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256;
ssl_conf_command Options PrioritizeChaCha;
ssl_prefer_server_ciphers on;
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_buffer_size 2k;
add_header Strict-Transport-Security max-age=15768000;
ssl_stapling on;
ssl_stapling_verify on;
server_name ai.fat.plus;
access_log /data/wwwlogs/ai.fat.plus_nginx.log combined;
index index.html index.htm index.php;
root /data/wwwroot/Gradio;
if ($ssl_protocol = "") { return 301 https://$host$request_uri; }
location / {
proxy_connect_timeout 60;
proxy_read_timeout 60;
proxy_send_timeout 60;
proxy_intercept_errors off;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:7860;
}
#好像Gradio的ws协议是通过/queue路径的,所以这里加上
location /queue {
proxy_pass http://127.0.0.1:7860;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection Upgrade;
}
location ~ .*\.(wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|png|swf|flv|mp4)$ {
valid_referers none blocked *.fat.plus ai.fat.plus;
if ($invalid_referer) {
return 403;
}
proxy_pass http://127.0.0.1:7860;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
proxy_pass http://127.0.0.1:7860;
expires 30d;
access_log off;
}
location ~ .*\.(js|css)?$ {
proxy_pass http://127.0.0.1:7860;
expires 7d;
access_log off;
}
location ~ /(\.user\.ini|\.ht|\.git|\.svn|\.project|LICENSE|README\.md) {
deny all;
}
location /.well-known {
allow all;
}
3. 配置systemctl后台服务
为了python demo.py进程在后台持续运行,把它配置到后台服务并开机启动。
先用root权限:
sudo -i
创建配置文件:
vi /etc/systemd/system/gradio.service
配置文件实例如下:
[Unit]
Description=for Gradio
After=network.target
[Service]
#这里填写你安装ubuntu的用户和用户组
User=ubuntu
Group=ubuntu
#这里填写demo.py文件的位置
WorkingDirectory=/data/wwwroot/Gradio
#/data/wwwroot/Gradio/venv/bin/python是venv虚拟环境python的
#/data/wwwroot/Gradio/demo.py是demo文件的位置
ExecStart=/data/wwwroot/Gradio/venv/bin/python /data/wwwroot/Gradio/app.py
[Install]
WantedBy=multi-user.target
完成配置文件后,启动服务:
systemctl start gradio.service
确认是否启动成功:
systemctl status gradio.service
正常的话,把服务设定成开机启动
systemctl enable gradio.service
4.完成
正常的话,打开ai.fat.plus就可以访问啦!
文章评论
请问如果要对多个app进行代理,如7860和7861端口,应该怎么设置呢
👍