🚀大模型落地开发实战指南!请关注微信公众号:「AGI启程号」 深入浅出,助你轻松入门!
📚 数据分析、深度学习、大模型与算法的综合进阶,尽在CSDN博客主页

目录

本文是从创建 ECS 实例FastAPI 服务部署及后续的反向代理与域名优化的完整流程总结。

部署项目介绍:本项目主要是通过微信公众号api获取保存到草稿箱中的文章信息项目链接

本流程首先在阿里云控制台基于 Ubuntu 22.04 LTS 镜像创建 ECS 实例,并配置网络与安全组;随后通过网页 SSH 连接安装 Python3、Miniconda 并创建虚拟环境;接着上传或克隆项目、安装依赖,并使用 Uvicorn 或 Gunicorn 启动 FastAPI;最后在同一 ECS 上安装 Nginx 进行反向代理,根据域名或路径路由到不同服务,并在 DNS 控制台将已有域名通过 A 记录解析到绑定的弹性公网 IP,实现稳定、高可用的在线访问。

一、创建 ECS 实例

1. 选择镜像与实例规格

  • 阿里云控制台 → Elastic Compute Service → 实例,点击“创建实例”,在公共镜像中选择 Ubuntu 22.04 64 位;注意:选择镜像的时候,注意查询相关镜像是否长期维护,例如CentOS 7 已 EOL(End Of Life)后续将不再更新不选择,应尽量选择LTS版本的镜像,有5年的标准支持,对于Ubuntu来说,24.04 LTS 刚发布不久,虽然支持至 2029 年 4 月,但生态与第三方工具可能尚未全面适配,所以最终选择更加稳定的版本 22.04 。
  • 按业务并发需求选择实例规格(如 2 vCPU 4 GiB 内存起步),并决定包年包月或按量付费模式;若需绑定 EIP,应采用按量付费模式。可以按照包年包月模式先购买(有优惠99/年),再转到按量付费模式。

2. 配置网络与安全组

  • 购买并绑定弹性公网 IP(EIP),使实例拥有固定公网地址;在 EIP 控制台选择 BGP 线路并绑定到 ECS 实例主网卡。注意如需绑定EIP,需要保证弹性公网IP所在地区和ECS实例所在地区一致。我在绑定时出现了错误,后来转换为按量付费后,自动获得了公网IP,也就不需要再另行绑定EIP,已经获得了稳定的IP地址。
  • 在实例所属安全组中入方向放行 SSH (22)、应用端口(如 8000、8888)等所需 TCP 端口;如需细粒度控制,可使用 VPC 子网与 NAT 网关(help.aliyun.com, blog.csdn.net)。

二、访问与环境准备

1. SSH 连接

重置密码:在这里插入图片描述
FinalShell:

密码连接:

在这里插入图片描述
在这里插入图片描述
登录成功:
在这里插入图片描述

密钥连接:

如果你是用密钥对登录,选 “密钥”,.pem 文件加载进来(创建密钥后,浏览器会自动下载这个后缀的文件)
在这里插入图片描述
登录成功:
在这里插入图片描述

2. 安装 Python3 与 Conda

  • 更新软件源:

    sudo apt update && sudo apt install -y
    
  • 安装 Python3(Ubuntu 22.04 默认已预装 Python 3.10,可验证版本或重装):

    python3 --version
    sudo apt install -y python3 python3-venv python3-pip
    
  • 下载并安装 Miniconda:

    curl -O https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh   # 下载 Miniconda 安装脚本
    bash Miniconda3-latest-Linux-x86_64.sh  # 运行并安装
    source ~/.bashrc  # 初始化 Conda
    

    推荐默认安装路径(~/miniconda3),无需手动在根目录创建额外文件夹(cnblogs.com)。

  • 创建并激活环境:

    conda create -n pj-wx_articles python=3.10  
    conda activate pj-wx_articles  
    
  • 安装 JupyterLab(可选项,不安装可略过):

    conda install -c conda-forge jupyterlab
    
  • 可选:若希望在 JupyterLab 中直接选择并运行其他 Conda 环境,可额外安装 nb_conda_kernels:

    conda install -c nb_conda_kernels nb_conda_kernels
    

    安装后,在启动 JupyterLab 时即可在 Kernel 列表中看到所有环境。

  • 启动与运行 JupyterLab:

    jupyter lab --ip=0.0.0.0 --port=8888 --no-browser &
    

    –ip=0.0.0.0 允许外部访问;

    –no-browser 禁止自动在服务器上打开浏览器。

    & 将命令放到后台(可不选)

  • 注意:这里可能会报错“Running as root is not recommended. Use --allow-root to bypass.”当以 root 用户直接启动 JupyterLab 时,服务端会因安全考量拒绝运行。
    • 解决方案:加上 --allow-root 参数。如果您暂时无须切换用户,可在原命令末尾添加该标志,强制允许以 root 身份启动:
      jupyter lab --ip=0.0.0.0 --port=8888 --no-browser --allow-root
      
    • 使用非 root 用户启动(推荐):出于安全和权限隔离的考虑,更推荐 以普通用户(如 ubuntu) 运行 JupyterLab:
      • 创建新用户,并设置密码:
        adduser jupyteruser
        # 按提示设置密码、填写信息
        usermod -aG sudo jupyteruser
        
      • 切换到该用户:
        su - jupyteruser
        
      • 在其家目录下激活 conda 环境并启动:
        conda activate pj-wx_articles
        jupyter lab --ip=0.0.0.0 --port=8888 --no-browser
        
        此时无需 --allow-root,也可避免 root 权限带来的安全隐患参考链接
  • 访问方式:

    http://<您的EIP>:8888
    
  • 长期运行:

    若需后台或开机自启,可考虑使用 tmux/screen 或配置 systemd 服务。

三、部署 FastAPI 服务

1. 代码准备与依赖安装

  • 在服务器上创建项目目录并上传代码或克隆仓库:

    cd /home/codes
    mkdir pj-wx_articles 
    cd pj-wx_articles 
    git clone <仓库地址> .  
    

    这里我git 命令无法生效,原因是需要配置vpn,我临时解决方法是从本地上传,从jupyter lab 中从本地上传的文件

  • 在激活的 Conda 环境中安装项目依赖:

    pip install fastapi uvicorn gunicorn  
    

    (blog.csdn.net)

2. 启动应用

  • 环境变量

    在项目根目录新建 .env,内容示例:

    APPID=你的公众号 AppID
    APPSecret=你的公众号 Secret
    

    或者把相同内容写入 ~/.bashrc / ~/.profile:

    export APPID=你的公众号 AppID
    export APPSecret=你的公众号 Secret
    

    然后执行

    source ~/.bashrc 使之生效。
    

详细流程:将变量写入 ~/.bashrc 或 `~/.profile
1.1 单行命令追加
# 如果你当前已是 root:
echo 'export APPID="你的公众号 AppID"' >> ~/.bashrc  
echo 'export APPSecret="你的公众号 Secret"' >> ~/.bashrc  

# 若不是 root,但要写入 root 的配置,则用 sudo:
sudo sh -c 'echo export APPID="你的公众号 AppID"   >> /root/.bashrc'  
sudo sh -c 'echo export APPSecret="你的公众号 Secret" >> /root/.bashrc'
  • >> 表示“追加”到文件末尾,不会覆盖原有内容 (support.cpanel.net)。
  • 如果你更习惯 ~/.profile(在登录 shell 中生效),同样替换文件名即可 (unix.stackexchange.com)。
1.2 手动编辑
  1. 打开文件:

    vim ~/.bashrc
    # 或者
    nano ~/.bashrc
    
  2. 在末尾添加:

    export APPID="你的公众号 AppID"  
    export APPSecret="你的公众号 Secret"
    
  3. 保存并退出:在 Vim 中按 Esc,输入 :wq 并回车;在 Nano 中按 Ctrl+O 回车保存,Ctrl+X 退出 (autodesk.com)。

  • 立即生效

    source ~/.bashrc
    # 或者
    source ~/.profile
    
  • 验证

    echo $APPID     # 应输出你的公众号 AppID  
    echo $APPSecret # 应输出你的公众号 Secret  
    
  • 若无输出,请确认你正在使用的是同一个用户环境,并且编辑的文件路径正确 。


  • 开发模式 使用(二选一) Uvicorn:

    uvicorn api.index:app --host 0.0.0.0 --port 8000 --reload  
    
  • 生产模式 使用(二选一) Gunicorn + Uvicorn Worker:

    gunicorn api.index:app -w 2 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000 &
    

    其中 -w 指定工作进程数,推荐 2×CPU核心+1-k 指定使用异步 Worker(cnblogs.com)。

四、反向代理配置

1. 安装 Nginx

sudo apt install -y nginx

(blog.csdn.net)

2. 基于域名或路径的路由

切换到 root 或使用 sudo,然后用您喜欢的编辑器打开 Nginx 的默认配置文件

sudo nano /etc/nginx/conf.d/default.conf

/etc/nginx/conf.d/default.conf 中添加:

server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  _;

    # 兜底处理:返回 404
    return 404;
}

我已经有了处理我的域名的配置文件,这个default配置文件主要用作非指定域名的默认处理,所以我这里没有指向确定的域名。每个 IP:端口 组合必须有一个明确的“默认服务器”,用于处理所有未匹配到其它 server_name 的请求。

针对子域名,在 /etc/nginx/conf.d/wx-api.example.com.conf中添加:

# 1. Redirect all HTTP → HTTPS
server {
    listen       80;
    listen       [::]:80;
    server_name  wx-api.example.com;

    return 301 https://$host$request_uri;
}

# 2. HTTPS reverse proxy
server {
    listen              443 ssl;
    listen              [::]:443 ssl;
    server_name         wx-api.example.com;

    ssl_certificate     /etc/nginx/ssl/wx-api.example.com/wx-api.example.com.pem;
    ssl_certificate_key /etc/nginx/ssl/wx-api.example.com/wx-api.example.com.key;

    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    location / {
        proxy_pass           http://127.0.0.1:8000;
        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_buffering      off;
    }
}

保存后退出(Nano 下按 Ctrl+O 回车,Ctrl+X 退出)

测试 Nginx 配置是否有语法错误:

sudo nginx -t

配置完成后重载 Nginx:

sudo nginx -s reload

(blog.csdn.net)

五、域名与访问优化策略

1. DNS 解析

  • 在域名注册商或阿里云云解析控制台添加 A 记录,主机记录填写 @www,记录值填写实例的 EIP 地址,TTL 通常保持默认(600 秒)(help.aliyun.com)。
  • 使用 pingdig 检查域名是否正确解析到 EIP。

2. HTTPS 与安全

我自己目前尝试的方法,由于域名是在火山域名服务购买的,我是直接申请了对应域名的免费证书,并且下载了对应的证书,在写nginx的conf文件时上传并验证。后续可能会尝试下边的一些方法。

  • 推荐通过 Let’s Encrypt 免费证书或阿里云 SSL 证书,为 Nginx 配置 HTTPS:

    sudo apt install certbot python3-certbot-nginx  
    sudo certbot --nginx -d example.com -d www.example.com
    
  • 在安全组中仅放行 80/443 端口,关闭无用端口,结合 WAF 或云盾等加强防护(help.aliyun.com)。

3. 多服务扩展

  • 多端口/多服务:对不同子域或路径配置多个 Nginx server 块,分发到对应应用端口。
  • 容器化:可选用 Docker Compose 编排多个 FastAPI 服务与 Nginx 容器,方便依赖隔离与水平扩展(blog.csdn.net)。

至此,您已完成从实例创建、环境准备、FastAPI 服务部署,到 Nginx 反向代理及域名优化的全流程,具备多服务与容器化的扩展思路,可根据业务增长灵活调整。祝部署顺利!

六、问题解答:如何关闭已经启动的jupyter lab 服务

方法一:在当前终端(前台)停止

如果你直接在终端中运行了:

jupyter lab --ip=0.0.0.0 --port=8888

此时服务在前台运行,按下

Ctrl + C

即可正常优雅地停止 JupyterLab。


方法二:后台运行时关闭

1. 使用 jobs + kill %N

若你用 & 将命令放到后台:

jupyter lab --ip=0.0.0.0 --port=8888 --no-browser &

执行 jobs 查看后台任务编号:

jobs
# 输出如:
# [1]+  Running                 jupyter lab ... &

然后用 kill 停止对应任务:

kill %1

(将 %1 换成你实际的任务号)

2. 使用 ps + killpkill (我当前使用的方法)
  1. 查找 JupyterLab 进程:

    ps aux | grep '[j]upyter-lab'
    

    ps aux | grep '[j]upyter'
    
  2. 找到对应进程的 PID(第一列数字),执行:

    kill <PID>
    

    如果进程未响应,再强制:

    kill -9 <PID>
    
  3. 也可直接对进程名批量关闭:

    pkill -f jupyter-lab
    

    pkill -f "jupyter lab"
    

方法三:如果通过 systemdSupervisor 管理

  • systemd
    如果你为 JupyterLab 写了一个服务单元(如 /etc/systemd/system/jupyter.service),可用:

    sudo systemctl stop jupyter
    
  • Supervisor
    如果通过 Supervisor 管理,执行:

    supervisorctl stop jupyter
    

选择以上任一方式,即可成功停止云服务器上运行的 JupyterLab 服务。

七、查找与确认正在运行的 Uvicorn 服务

以下内容分为五大部分,概述了如何在 Ubuntu ECS 上:

  1. 查找与确认 已通过 uvicorn 启动的 FastAPI 服务
  2. 切换到 Gunicorn 以在生产环境启用多进程工作模式
  3. 进程管理(Supervisor / systemd)确保服务稳定运行
  4. Nginx 反向代理 根据域名或路径将请求路由到不同服务
  5. 多服务与域名策略,支持后续多应用部署

一、查找与确认正在运行的 Uvicorn 服务

1.1 使用 pspgrep 定位进程

要确认 uvicorn api.index:app --host 0.0.0.0 --port 8000 是否仍在运行,可在终端执行:

ps aux | grep '[u]vicorn'  

该命令会列出所有包含 “uvicorn” 字样的进程行,避免 grep 自身被匹配(stackoverflow.com)。

或使用更精准的 pgrep

pgrep -fl uvicorn  

-f 匹配完整命令行,-l 显示进程名和 PID,有助快速确认命令参数(askubuntu.com)。

1.2 使用 lsofss 查看端口占用

若想知道哪个进程在监听 8000 端口,可执行:

lsof -i :8000  

输出中 “COMMAND” 列即为该端口的服务名称,通常显示 uvicornpython 进程(copdips.com)。

同样可用 ss

ss -ltnp | grep ':8000'  

显示监听 TCP 端口及对应 PID/程序路径,确保服务确实在 0.0.0.0:8000 上运行(copdips.com)。


二、使用 Gunicorn 启动生产级服务

要在生产环境充分利用多核 CPU,并借助 Gunicorn 的管理特性,请按以下步骤操作:

2.1 安装 Gunicorn
pip install gunicorn  

Gunicorn 是成熟的 WSGI/ASGI 进程管理器,常与 Uvicorn Worker 配合使用(stackoverflow.com)。

2.2 运行命令详解
gunicorn \
  app.main:app \                             # 指定 FastAPI 应用实例:MODULE:VARIABLE
  -w 4 \                                     # 启动 4 个 worker 进程[一般推荐 2×CPU核心数+1]:contentReference[oaicite:5]{index=5}
  -k uvicorn.workers.UvicornWorker \         # 使用 Uvicorn 的 ASGI Worker 类处理请求:contentReference[oaicite:6]{index=6}
  --bind 0.0.0.0:8000                        # 绑定所有网卡的 8000 端口,接受来自公网或内网的请求:contentReference[oaicite:7]{index=7}
  • -w(workers):并行进程数量,平衡 CPU 与内存利用率(reddit.com)

  • -k(worker class):Uvicorn Worker 提供异步处理能力(medium.com)

  • 也可添加日志文件参数:

    --access-logfile /var/log/myapp-access.log \
    --error-logfile  /var/log/myapp-error.log
    

三、进程管理与守护

3.1 使用 systemd 管理服务

创建 /etc/systemd/system/fastapi.service

[Unit]
Description=FastAPI via Gunicorn
After=network.target

[Service]
User=ubuntu
WorkingDirectory=/home/ubuntu/app
ExecStart=/home/ubuntu/app/venv/bin/gunicorn app.main:app \
  -w 4 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
Restart=always

[Install]
WantedBy=multi-user.target

启用并启动:

sudo systemctl daemon-reload  
sudo systemctl enable fastapi  
sudo systemctl start  fastapi  

该机制自动重启崩溃的进程,适合长期稳定运行(uvicorn.org)。

3.2 使用 Supervisor 管理(可选)

安装并配置 /etc/supervisor/conf.d/fastapi.conf

[program:fastapi]
command=/home/ubuntu/app/venv/bin/gunicorn app.main:app \
        -w 4 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
directory=/home/ubuntu/app
user=ubuntu
autostart=true
autorestart=true
stderr_logfile=/var/log/fastapi.err.log
stdout_logfile=/var/log/fastapi.out.log

启动 Supervisor:

sudo supervisorctl reread  
sudo supervisorctl update  
sudo supervisorctl start fastapi  

四、Nginx 反向代理配置

在同机安装 Nginx,通过域名和路径将外部请求分发到不同服务端口。

4.1 安装 Nginx
sudo apt install -y nginx  

(askubuntu.com)

4.2 示例配置

/etc/nginx/sites-available/myapp 中:

server {
    listen       80;
    server_name  api.example.com;

    location / {
        proxy_pass         http://127.0.0.1:8000;
        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;
    }
}

server {
    listen      80;
    server_name www.example.com;

    root /home/ubuntu/app/web_static;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

启用并重载:

sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/  
sudo nginx -t  
sudo systemctl reload nginx  

该配置让 api.example.com 路由到 FastAPI 服务,www.example.com 提供静态网页(yellowduck.be, forum.openmediavault.org)。


五、多服务与域名路由策略

5.1 基于域名的拆分
  • 不同子域(如 api.admin.)指向不同端口。
  • 在 DNS 中分别添加 A 记录解析到同一 EIP。
5.2 基于路径的统一域名

在同一 server 块内使用 location /api/location /app2/ 进行路由:

location /api/ { proxy_pass http://127.0.0.1:8000; }
location /app2/ { proxy_pass http://127.0.0.1:8001; }
5.3 容器化部署(进阶)
  • 使用 Docker Compose 编排多个 FastAPI 服务与 Nginx:

    services:
      fastapi1:
        image: myapp1
        ports: ["8000"]
      fastapi2:
        image: myapp2
        ports: ["8001"]
      nginx:
        image: nginx
        ports: ["80:80"]
        volumes: ["./nginx.conf:/etc/nginx/nginx.conf"]
    
  • 每个容器运行单一进程,方便水平扩展与自动化管理。


通过以上步骤,您可从“开发模式”平滑过渡至“生产级”多进程部署,并利用 Nginx 灵活路由多服务与静态内容,确保项目具备高可用、易扩展与安全访问能力。祝部署顺利!

八、使用 systemd 管理 FastAPI/Gunicorn 服务时的关键技巧

概览:

以下整理了使用 systemd 管理 FastAPI/Gunicorn 服务时的关键技巧,重点保证路径和环境变量配置正确,并辅以命令行直接启动时的日志记录方法、systemd 日志配置(含两种载入环境变量方式)、日志检查与监控,以及常见问题与解决思路,供您后续对照验证。


一、命令行直接启动并记录日志

1. 启动命令示例

在项目根目录(如 /root/codes/pj-wx_articles)下,使用以下命令即可启动并写入日志:

gunicorn api.index:app \
  -w 2 \
  -k uvicorn.workers.UvicornWorker \
  --bind 0.0.0.0:8000 \
  --access-logfile ./logs/fastapi-access.log \
  --error-logfile  ./logs/fastapi-error.log
  • --access-logfile FILE:指定访问日志文件,默认写入 stdout【(docs.gunicorn.org)】。
  • --error-logfile FILE:指定错误日志文件,默认写入 stderr【(docs.gunicorn.org)】。
  • 确保先 mkdir -p logs,并授予当前用户写权限【(stackoverflow.com)】。

二、使用 systemd 管理时的日志配置

编辑 /etc/systemd/system/fastapi.service,在 [Service] 段添加日志路径与环境变量。

1. 方案一:在单元文件中声明环境变量
[Service]
User=root
WorkingDirectory=/root/codes/pj-wx_articles
Environment="APPID=你的公众号AppID"
Environment="APPSecret=你的公众号Secret"
ExecStart=/root/miniconda3/envs/pj-wx_articles/bin/gunicorn \
  api.index:app -w 2 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000 \
  --access-logfile /root/codes/pj-wx_articles/logs/fastapi-access.log \
  --error-logfile  /root/codes/pj-wx_articles/logs/fastapi-error.log
Restart=always
  • Environment=:可多行指定多个变量,systemd 会将它们注入进程环境中【(flatcar.org)】。
2. 方案二:通过外部文件管理环境变量
  1. 在项目目录创建 .env

    cat <<EOF > /root/codes/pj-wx_articles/.env
    APPID=你的公众号AppID
    APPSecret=你的公众号Secret
    EOF
    
  2. 单元文件引用:

    [Service]
    EnvironmentFile=/root/codes/pj-wx_articles/.env
    
  • EnvironmentFile=:引用一个或多个文件,每个非注释行按 KEY=VALUE 解析;若文件缺失,可在前面加 - 忽略错误【(serverfault.com)】。

三、检查与监控日志

1. 使用 journalctl
sudo journalctl -u fastapi -f

实时跟踪 systemd 管理的 stdout/stderr 日志,包括 Gunicorn 异常启动信息【(linux-audit.com)】。

2. 直接查看日志文件
tail -f /root/codes/pj-wx_articles/logs/fastapi-access.log
tail -f /root/codes/pj-wx_articles/logs/fastapi-error.log

用于监控访问日志和错误堆栈,便于排查请求处理或应用异常【(docs.vultr.com)】。


四、常见问题与解决

1. status=200/CHDIR 错误
  • 原因WorkingDirectory= 指定的目录不存在或 systemd 无法访问,导致切换失败并退出【(askubuntu.com)】。

  • 解决:确认目录拼写无误、已创建且对服务用户可读执行:

    sudo mkdir -p /root/codes/pj-wx_articles/logs
    sudo chown -R root:root /root/codes/pj-wx_articles
    sudo chmod -R 755  /root/codes/pj-wx_articles
    

    然后 sudo systemctl daemon-reload && sudo systemctl start fastapi【(superuser.com)】。

2. 环境变量未生效
  • 症状:启动日志中仍出现 RuntimeError: Missing APPID or APPSecret…

  • 排查

    • 查看 sudo journalctl -u fastapi 中是否有 “Failed to load environment file” 提示。
    • 确认 .env 文件路径与 EnvironmentFile= 完全一致;或者 Environment= 写法无误。
3. 日志文件权限问题
  • 症状:Gunicorn 启动时报 “permission denied” 或日志未生成。

  • 解决:确保日志目录和文件对服务用户可写:

    sudo touch /root/codes/pj-wx_articles/logs/fastapi-access.log
    sudo chown root:root /root/codes/pj-wx_articles/logs/*.log
    sudo chmod 644 /root/codes/pj-wx_articles/logs/*.log
    

通过以上整理,您即可校验并完善 systemd 管理下的 FastAPI/Gunicorn 服务配置,确保 路径正确环境变量加载日志记录 均能正常工作。祝后续尝试顺利!

4.

问题概述

在阿里云中国内地服务器上部署的服务,内网和本机(127.0.0.1:8000)访问均能正常返回 JSON,但外部通过域名 https://wx-api.agiyunting.com/ 访问时,始终被阿里云边缘拦截,返回 “Non‑compliance ICP Filing” 的 403 页面,无法到达 Nginx 或后端服务(Alibaba Cloud)。

核心原因

  • 法规要求:根据《非经营性互联网信息服务备案管理办法》,凡在中华人民共和国境内提供非经营性互联网信息服务的网站或应用,必须先依法完成工信部ICP备案;未经备案,不得上线对外服务(help.aliyun.com)。
  • 阿里云拦截:阿里云监测到域名解析至其中国内地节点且未接入或完成备案,会在 CDN/边缘层自动阻断该域名的访问,并返回备案提示页面,而不会将请求转发至用户的 Nginx 服务器(Alibaba Cloud)。

影响

  • 内网测试无异常

    • 使用 curl http://127.0.0.1:8000/curl -vk https://localhost/ 均能获取到预期数据,说明 Gunicorn 与 Nginx 的内网代理配置正常(AlibabaCloud)。
  • 外部访问受限

    • 外部用户或脚本通过正式域名访问时,所有请求都在阿里云边缘被拦截成备案提示,导致服务对外不可用。

解决建议

  1. 完成ICP备案

    • 登录阿里云控制台进入“备案 → ICP备案”,提交主体信息、域名和服务器信息,等待工信部审核通过;审核通过后,外部访问将恢复正常(help.aliyun.com)。
  2. 临时开发调试方案

    • 使用服务器的公网 IP (http://8.137.8.85:8000/) 或内部主机名直接访问后端接口。
    • 将服务放在已备案的香港/海外节点或通过海外 CDN 转发,以规避大陆机房的备案拦截(AlibabaCloud)。
Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐