为了能访问在云服务器用gradio部署的大模型,配置一下nginx。
还是和上一个博客一样,不注重讲流程,只是记录踩过的坑,和一些细节、完整文件内容。
常用命令
vi /etc/nginx/conf.d/gradio.conf #编辑配置
nginx -t #检查配置是否正确
systemctl restart nginx #重启nginx
systemctl status nginx #查询状态
lsof -i :7870 #查看哪个进程正在占用7870端口
grep -r "server_name 12.34.56.78" /etc/nginx/ #确保同一个出现一次
ps aux|grep nginx
nohup python basic_demo/web_demo_gradio.py &
ps aux | grep -E "python( .*/| )web_demo_gradio.py" | grep -v grep | awk '{print $2}' | xargs kill -9 && nohup python web_demo_gradio.py &
gradio.conf 配置
单页面配置
最简单版本,仅有一个web_demo_gradio.py文件,其中端口情况是
demo.launch(server_name="127.0.0.1", server_port=7870, inbrowser=True, share=False)
/etc/nginx/conf.d/gradio.conf的内容是
server {
listen 80;
server_name 12.34.56.78; # 替换为你的服务器IP地址或域名
location / {
proxy_pass http://127.0.0.1:7870; # Gradio 运行的本地地址和端口
proxy_set_header Host $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;
}
}
之前gpt还给了配置位置是/etc/nginx/nginx.conf.gradio,但是还要改 /etc/nginx/nginx.conf 文件,后来问了gpt更推荐哪一个,答案是
在这两种目录之间,通常推荐使用 /etc/nginx/conf.d/gradio.conf
来存放 Gradio 的 Nginx 配置文件。以下是原因:
-
标准化:
/etc/nginx/conf.d/
目录是 Nginx 配置文件的标准路径之一,专门用于存放额外的虚拟主机或服务的配置文件。将 Gradio 的配置文件放在这个目录下更符合标准的 Nginx 配置结构,便于维护和管理。 -
模块化:
conf.d
目录中的配置文件会自动被包括在主 Nginx 配置文件中,无需修改主配置文件。这种方式便于模块化管理,避免直接修改/etc/nginx/nginx.conf
文件,从而降低了因误操作引发的问题。 -
可读性:将各个服务的配置文件分别存放在
/etc/nginx/conf.d/
目录下,可以保持配置的清晰度和可读性,更容易进行排错和更新。
因此,建议将 Gradio 的 Nginx 配置文件放在 /etc/nginx/conf.d/gradio.conf
路径下。
如果不小心配置了多个文件,并且server_name和端口号都一样,那么检查时会报错。通过这个命令排查:
grep -r "server_name 12.34.56.78" /etc/nginx/
如果出现了两行,可以看端口号是否一致,一般都是80,很可能会冲突。
多页面配置
这里我写了三个页面,一个原有的大模型脚本,地址为添加/chatglm,一个hello world脚本,地址为添加/greet,一个主页,地址就是服务器地址,显示上面两个页面。
/etc/nginx/conf.d/gradio.conf
server {
listen 80;
server_name 12.34.56.78;
location / {
proxy_pass http://127.0.0.1:7860;
proxy_set_header Host $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;
}
location /greet/ {
proxy_pass http://127.0.0.1:7861;
proxy_set_header Host $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;
}
location /chatglm/ {
proxy_pass http://127.0.0.1:7870;
proxy_set_header Host $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;
}
}
gradio_greet.py
import gradio as gr
def greet(name):
return f"Hello {name}!"
# 定义Gradio接口
iface = gr.Interface(fn=greet, inputs="text", outputs="text")
# 配置并启动应用
iface.launch(
server_name="0.0.0.0", # 允许外部访问
server_port=7861, # 指定端口
root_path="/greet", # 设置 URL 前缀为 /greet
share=True,
debug=True, # 开启调试模式
)
gradio_home.py
import gradio as gr
with gr.Blocks() as demo:
gr.HTML("""
<div style="text-align:center;">
greet
<a href="http://12.34.56.78/greet" target="_blank">http://12.34.56.78/greet</a>
<br>
chatglm
<a href="http://12.34.56.78/chatglm" target="_blank">http://12.34.56.78/chatglm</a>
</div>
""")
# 启动应用
demo.launch(
server_name="0.0.0.0", # 允许外部访问
server_port=7860, # 指定端口
root_path="/", # 设置 URL 前缀为 /
share=True,
debug=True, # 开启调试模式
)
web_demo_gradio.py末尾改为了
demo.launch(server_name="127.0.0.1", server_port=7870, root_path='/chatglm', inbrowser=True, share=True, show_error=True)
特别注意root_path='/chatglm'
这些一定要加上。(尽管看起来和gradio.conf重复了)。
nohup
保持脚本在后台长期运行,断开ssh连接也不会停止:
nohup python basic_demo/web_demo_gradio.py &
查找正在运行的python web_demo_gradio.py(或python xxx/web_demo_gradio.py),将它停止,然后运行新的web_demo_gradio.py:
ps aux | grep -E "python( .*/| )web_demo_gradio.py" | grep -v grep | awk '{print $2}' | xargs kill -9 && nohup python web_demo_gradio.py &
不滑动查看版:
ps aux | grep -E "python( .*/| )web_demo_gradio.py" | grep -v grep | awk '{print $2}' | xargs kill -9 && nohup python web_demo_gradio.py &
当然还有终端复用器 screen、tmux 等方法。