使用Gradio与Nginx构建互联网可访问服务

最近在使用Gradio进行一些demo的编写,需要提供一个外网的服务。找了网上很多的内容,发现这篇文章说的很清楚,我也根据这篇文章结合我的实践进行了修改。

文章原文:https://blog.fat.plus/archives/272

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 ~ /(\.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就可以访问啦!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注