GLM-OCR部署教程:HTTPS反向代理配置(Nginx),支持域名+SSL安全访问

1. 为什么需要HTTPS反向代理?

当你成功部署了GLM-OCR服务,通过 http://localhost:7860 访问时,可能会遇到几个实际问题:

  • 只能在服务器本地访问:其他设备无法通过IP地址直接访问
  • 没有域名:只能记IP地址和端口,不方便分享和使用
  • 不安全:HTTP协议传输数据是明文的,存在安全风险
  • 端口暴露:直接暴露7860端口给公网,容易被扫描攻击

这就是为什么我们需要配置Nginx反向代理。简单来说,反向代理就像是一个"智能门卫":

  • 对外提供统一的访问入口(你的域名)
  • 使用HTTPS加密传输数据
  • 隐藏后端服务的真实端口
  • 还能做负载均衡和缓存

今天我就带你一步步配置Nginx反向代理,让GLM-OCR服务可以通过 https://your-domain.com 这样的安全地址访问。

2. 准备工作:确保GLM-OCR服务正常运行

在开始配置Nginx之前,先确认你的GLM-OCR服务已经正常启动。

2.1 检查服务状态

打开终端,执行以下命令:

# 进入项目目录
cd /root/GLM-OCR

# 启动GLM-OCR服务(如果还没启动的话)
./start_vllm.sh

# 检查服务是否在运行
curl http://localhost:7860

如果看到类似下面的输出,说明服务正常:

{"status": "running", "message": "GLM-OCR service is ready"}

2.2 确认端口监听

# 查看7860端口是否被监听
netstat -tlnp | grep 7860

# 或者用lsof命令
lsof -i :7860

你应该能看到类似这样的输出:

tcp6       0      0 :::7860                 :::*                    LISTEN      12345/python

记下这个进程ID(上面的12345),后面如果需要重启服务会用到。

3. 安装和配置Nginx

3.1 安装Nginx

如果你的服务器还没有安装Nginx,先安装它:

# Ubuntu/Debian系统
sudo apt update
sudo apt install nginx -y

# CentOS/RHEL系统
sudo yum install epel-release -y
sudo yum install nginx -y

# 启动Nginx并设置开机自启
sudo systemctl start nginx
sudo systemctl enable nginx

安装完成后,访问你的服务器IP地址,应该能看到Nginx的欢迎页面。

3.2 配置反向代理

现在我们来创建GLM-OCR的Nginx配置文件:

# 创建配置文件
sudo nano /etc/nginx/sites-available/glm-ocr

如果你用的是CentOS,路径可能是 /etc/nginx/conf.d/glm-ocr.conf

将以下配置粘贴进去:

server {
    listen 80;
    server_name your-domain.com;  # 替换为你的域名
    
    # 重定向所有HTTP请求到HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name your-domain.com;  # 替换为你的域名
    
    # SSL证书路径(稍后会生成)
    ssl_certificate /etc/nginx/ssl/your-domain.com.crt;
    ssl_certificate_key /etc/nginx/ssl/your-domain.com.key;
    
    # SSL优化配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
    ssl_prefer_server_ciphers off;
    
    # 反向代理配置
    location / {
        proxy_pass http://localhost: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;
        
        # WebSocket支持(如果GLM-OCR需要)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        
        # 超时设置
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
    
    # 静态文件缓存(可选)
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
    
    # 访问日志
    access_log /var/log/nginx/glm-ocr-access.log;
    error_log /var/log/nginx/glm-ocr-error.log;
}

重要提示:记得把 your-domain.com 替换成你实际的域名。

3.3 启用配置并测试

# 创建符号链接(Ubuntu/Debian)
sudo ln -s /etc/nginx/sites-available/glm-ocr /etc/nginx/sites-enabled/

# 测试Nginx配置语法
sudo nginx -t

# 如果看到"successful"字样,重启Nginx
sudo systemctl reload nginx

现在,你应该可以通过 http://your-domain.com 访问GLM-OCR了(会自动跳转到HTTPS,但证书还没配置,浏览器会显示不安全)。

4. 配置SSL证书(HTTPS加密)

要让网站显示"安全"的小锁图标,我们需要SSL证书。这里介绍两种获取证书的方法。

4.1 方法一:使用Let's Encrypt免费证书(推荐)

Let's Encrypt提供免费的SSL证书,自动续期,非常适合个人项目。

# 安装Certbot(证书管理工具)
# Ubuntu/Debian
sudo apt install certbot python3-certbot-nginx -y

# CentOS/RHEL
sudo yum install certbot python3-certbot-nginx -y

# 获取并安装证书
sudo certbot --nginx -d your-domain.com

# 按照提示操作:
# 1. 输入邮箱(用于证书到期提醒)
# 2. 同意服务条款
# 3. 选择是否接收邮件通知(建议选No)
# 4. 选择是否重定向HTTP到HTTPS(建议选2,强制HTTPS)

Certbot会自动修改Nginx配置,你不需要手动修改SSL证书路径了。

4.2 方法二:自签名证书(仅用于测试)

如果你只是想在本地测试,或者还没有域名,可以用自签名证书:

# 创建SSL证书目录
sudo mkdir -p /etc/nginx/ssl

# 生成自签名证书
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /etc/nginx/ssl/your-domain.com.key \
    -out /etc/nginx/ssl/your-domain.com.crt \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=Test/CN=your-domain.com"

# 设置正确的权限
sudo chmod 600 /etc/nginx/ssl/*

然后需要手动修改Nginx配置,使用这些证书路径。

4.3 验证SSL配置

配置完成后,检查一下:

# 重启Nginx使配置生效
sudo systemctl reload nginx

# 测试SSL连接
curl -I https://your-domain.com

如果使用Let's Encrypt,证书会自动续期。你可以手动测试续期:

# 测试续期(不实际更新)
sudo certbot renew --dry-run

# 查看证书信息
sudo certbot certificates

5. 高级配置和优化

基本的反向代理配置完成后,我们还可以做一些优化。

5.1 增加安全头部

在Nginx配置的 server 块中添加:

# 安全头部
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;

5.2 配置访问限制

如果你只想让特定IP访问:

location / {
    # 只允许特定IP访问
    allow 192.168.1.0/24;  # 内网IP段
    allow 203.0.113.1;     # 特定公网IP
    deny all;              # 拒绝其他所有
    
    proxy_pass http://localhost:7860;
    # ... 其他proxy设置
}

或者设置基础认证:

# 创建密码文件
sudo sh -c "echo -n 'username:' >> /etc/nginx/.htpasswd"
sudo sh -c "openssl passwd -apr1 >> /etc/nginx/.htpasswd"

# 输入两次密码

然后在Nginx配置中添加:

location / {
    auth_basic "Restricted Access";
    auth_basic_user_file /etc/nginx/.htpasswd;
    
    proxy_pass http://localhost:7860;
    # ... 其他proxy设置
}

5.3 优化性能参数

GLM-OCR处理图片可能需要较长时间,调整超时设置:

location / {
    proxy_pass http://localhost:7860;
    
    # 增加超时时间
    proxy_connect_timeout 300s;
    proxy_send_timeout 300s;
    proxy_read_timeout 300s;
    
    # 缓冲区设置
    proxy_buffering on;
    proxy_buffer_size 4k;
    proxy_buffers 8 4k;
    proxy_busy_buffers_size 8k;
    
    # 关闭代理缓冲(对于流式响应)
    proxy_buffering off;
}

5.4 配置负载均衡(可选)

如果你有多台服务器运行GLM-OCR,可以配置负载均衡:

upstream glm_ocr_servers {
    server 192.168.1.101:7860 weight=3;
    server 192.168.1.102:7860 weight=2;
    server 192.168.1.103:7860 weight=1;
    
    # 健康检查
    check interval=3000 rise=2 fall=5 timeout=1000 type=http;
    check_http_send "HEAD / HTTP/1.0\r\n\r\n";
    check_http_expect_alive http_2xx http_3xx;
}

server {
    # ... 其他配置
    
    location / {
        proxy_pass http://glm_ocr_servers;
        # ... 其他proxy设置
    }
}

6. 完整配置示例

这里是一个完整的Nginx配置示例,包含了所有我们讨论的优化:

# /etc/nginx/sites-available/glm-ocr

# HTTP重定向到HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name ocr.yourdomain.com www.ocr.yourdomain.com;
    
    # ACME挑战目录(Let's Encrypt验证用)
    location /.well-known/acme-challenge/ {
        root /var/www/html;
    }
    
    # 其他所有请求重定向到HTTPS
    location / {
        return 301 https://$server_name$request_uri;
    }
}

# HTTPS主配置
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name ocr.yourdomain.com www.ocr.yourdomain.com;
    
    # SSL证书(Let's Encrypt自动配置)
    ssl_certificate /etc/letsencrypt/live/ocr.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ocr.yourdomain.com/privkey.pem;
    
    # SSL优化
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_session_tickets off;
    
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    
    # HSTS(强制HTTPS)
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
    
    # 安全头部
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Referrer-Policy "no-referrer-when-downgrade" always;
    
    # 根目录配置
    root /var/www/html;
    index index.html;
    
    # GLM-OCR反向代理
    location / {
        # 访问控制(按需配置)
        # allow 192.168.1.0/24;
        # deny all;
        
        # 基础认证(按需配置)
        # auth_basic "GLM-OCR Access";
        # auth_basic_user_file /etc/nginx/.htpasswd;
        
        # 反向代理到GLM-OCR
        proxy_pass http://localhost:7860;
        
        # 传递真实IP和协议
        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;
        
        # WebSocket支持
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        
        # 超时设置(OCR处理可能需要较长时间)
        proxy_connect_timeout 300s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;
        
        # 缓冲区设置
        proxy_buffering on;
        proxy_buffer_size 4k;
        proxy_buffers 8 4k;
        proxy_busy_buffers_size 8k;
    }
    
    # 静态文件缓存
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
    
    # 禁止访问隐藏文件
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }
    
    # 访问日志
    access_log /var/log/nginx/glm-ocr-access.log combined buffer=32k flush=5s;
    error_log /var/log/nginx/glm-ocr-error.log warn;
    
    # 错误页面
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}

7. 常见问题排查

配置过程中可能会遇到一些问题,这里是一些常见问题的解决方法。

7.1 502 Bad Gateway错误

这个错误通常表示Nginx无法连接到后端的GLM-OCR服务。

检查步骤:

# 1. 检查GLM-OCR服务是否运行
ps aux | grep serve_gradio.py

# 2. 检查端口是否监听
netstat -tlnp | grep 7860

# 3. 测试本地连接
curl -v http://localhost:7860

# 4. 检查Nginx错误日志
sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/log/nginx/glm-ocr-error.log

可能的原因和解决方案:

  1. GLM-OCR服务没启动

    cd /root/GLM-OCR
    ./start_vllm.sh
    
  2. 端口被占用

    # 查看哪个进程占用了7860端口
    sudo lsof -i :7860
    
    # 如果不需要,停止该进程
    sudo kill -9 <PID>
    
  3. SELinux阻止(CentOS/RHEL):

    # 临时关闭SELinux
    sudo setenforce 0
    
    # 永久关闭(需要重启)
    sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
    

7.2 SSL证书问题

证书不信任警告

  • 自签名证书:浏览器会显示"不安全",这是正常的
  • Let's Encrypt证书:确保域名解析正确,证书申请成功

检查证书

# 查看证书信息
sudo openssl x509 -in /etc/nginx/ssl/your-domain.com.crt -text -noout

# 测试SSL连接
openssl s_client -connect your-domain.com:443 -servername your-domain.com

7.3 性能问题

如果GLM-OCR响应慢,可以调整Nginx配置:

# 在http块中添加(/etc/nginx/nginx.conf)
http {
    # 增加缓冲区大小
    proxy_buffer_size 128k;
    proxy_buffers 4 256k;
    proxy_busy_buffers_size 256k;
    
    # 启用gzip压缩
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss application/octet-stream;
}

7.4 连接超时

如果上传大图片时超时:

location / {
    proxy_pass http://localhost:7860;
    
    # 增加超时时间
    proxy_connect_timeout 600s;
    proxy_send_timeout 600s;
    proxy_read_timeout 600s;
    
    # 客户端超时设置
    client_max_body_size 100M;  # 允许上传100MB的文件
    client_body_timeout 600s;
}

8. 自动化部署脚本

为了简化部署过程,你可以创建一个自动化脚本:

#!/bin/bash
# deploy-glm-ocr-nginx.sh

set -e  # 遇到错误退出

echo "=== GLM-OCR Nginx反向代理部署脚本 ==="

# 变量配置
DOMAIN="ocr.yourdomain.com"
EMAIL="your-email@example.com"
GLM_PORT="7860"

echo "1. 安装Nginx..."
sudo apt update
sudo apt install nginx -y

echo "2. 配置Nginx反向代理..."
sudo tee /etc/nginx/sites-available/glm-ocr > /dev/null <<EOF
server {
    listen 80;
    server_name ${DOMAIN};
    
    location / {
        proxy_pass http://localhost:${GLM_PORT};
        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;
    }
}
EOF

echo "3. 启用站点配置..."
sudo ln -sf /etc/nginx/sites-available/glm-ocr /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

echo "4. 安装SSL证书(可选)..."
read -p "是否安装Let's Encrypt SSL证书?(y/n): " install_ssl
if [[ "$install_ssl" == "y" ]]; then
    sudo apt install certbot python3-certbot-nginx -y
    sudo certbot --nginx -d ${DOMAIN} --email ${EMAIL} --agree-tos --no-eff-email
fi

echo "5. 配置防火墙..."
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload

echo "=== 部署完成 ==="
echo "访问地址: http://${DOMAIN}"
if [[ "$install_ssl" == "y" ]]; then
    echo "HTTPS地址: https://${DOMAIN}"
fi

保存为 deploy-glm-ocr-nginx.sh,然后运行:

chmod +x deploy-glm-ocr-nginx.sh
./deploy-glm-ocr-nginx.sh

9. 监控和维护

配置完成后,还需要定期维护。

9.1 监控服务状态

# 查看Nginx状态
sudo systemctl status nginx

# 查看GLM-OCR服务状态
ps aux | grep serve_gradio.py

# 查看日志
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log
sudo tail -f /root/GLM-OCR/logs/glm_ocr_*.log

9.2 定期备份配置

# 备份Nginx配置
sudo tar -czf nginx-backup-$(date +%Y%m%d).tar.gz /etc/nginx/

# 备份SSL证书(如果使用Let's Encrypt)
sudo tar -czf letsencrypt-backup-$(date +%Y%m%d).tar.gz /etc/letsencrypt/

9.3 证书自动续期

如果使用Let's Encrypt,证书90天过期,需要自动续期:

# 测试续期
sudo certbot renew --dry-run

# 设置自动续期(crontab)
sudo crontab -e

添加以下行(每周日凌晨2点检查续期):

0 2 * * 0 /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"

9.4 性能监控

# 查看Nginx连接状态
sudo netstat -an | grep :443 | wc -l

# 查看服务器负载
top -b -n 1 | head -20

# 查看磁盘空间
df -h

# 查看内存使用
free -h

10. 总结

通过这篇教程,我们完成了GLM-OCR的HTTPS反向代理配置。现在你的GLM-OCR服务已经可以通过安全的HTTPS域名访问了。

主要收获:

  1. 安全性提升:从HTTP升级到HTTPS,数据传输加密,更安全
  2. 访问便利:使用域名代替IP+端口,更容易记忆和分享
  3. 专业形象:浏览器显示安全锁图标,提升信任度
  4. 灵活扩展:Nginx反向代理为后续扩展(如负载均衡、缓存)打下基础

配置要点回顾:

  • 确保GLM-OCR服务在7860端口正常运行
  • 安装并配置Nginx反向代理
  • 申请并配置SSL证书(推荐Let's Encrypt)
  • 优化Nginx配置提升性能和安全性
  • 设置监控和维护机制

下一步建议:

  1. 域名解析:如果你还没有域名,可以考虑注册一个
  2. CDN加速:如果用户分布广泛,可以考虑使用CDN
  3. 访问控制:根据需求配置IP白名单或基础认证
  4. 监控告警:设置服务监控,出现问题及时通知

现在你可以通过 https://your-domain.com 安全地访问GLM-OCR服务了。无论是文本识别、表格提取还是公式识别,都可以通过这个安全的接口进行调用。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐