一、先厘清:用户访问域名的完整流程(从浏览器到FastAPI服务)

首先纠正一个小误区:Nginx只负责转发HTTP请求到指定的「IP:端口」,systemd服务的作用是保障FastAPI服务持续在该端口监听运行。完整访问流程分为6步,每一步都对应你的配置:

步骤1:用户发起访问请求

用户在浏览器输入 https://gi.dbba.cc(或 http://gi.dbba.cc),浏览器先通过DNS解析,将域名 gi.dbba.cc 转换为你的服务器公网IP(这一步在服务器外部完成,由域名服务商提供解析服务)。

步骤2:请求到达服务器(防火墙/安全组放行)

请求通过互联网发送到你的服务器,首先经过服务器防火墙(如ufw)和云服务器安全组(如阿里云/腾讯云安全组),只有80端口(HTTP)和443端口(HTTPS)被放行(你已配置对应端口,请求才能进入服务器内部)。

步骤3:Nginx 80端口拦截,自动跳转HTTPS

你的第二个Nginx server块监听80端口,配置了「HTTP转HTTPS」逻辑:

1
2
3
if ($host = gi.dbba.cc) {
return 301 https://$host$request_uri; # 301永久重定向
}

此时,若用户访问 http://gi.dbba.cc(80端口),会被Nginx自动重定向到 https://gi.dbba.cc(443端口),确保请求使用加密连接。

步骤4:Nginx 443端口接收请求,匹配反向代理规则

你的第一个Nginx server块监听443端口(SSL加密端口),且server_name gi.dbba.cc与请求域名匹配,因此Nginx会处理该请求:

1
2
3
4
5
6
location / {
proxy_pass http://127.0.0.1:8000; # 核心:转发请求到本地8000端口
# 其他header配置:传递客户端IP、协议、域名等信息给FastAPI
}
#locstion是作为一个路由匹配规则,而非实际路径,直接转发给本地的8000端口,
本地的8000端口如果由py编写,则可以再次处理添加路由规则

Nginx作为「反向代理服务器」,会将用户的HTTPS请求,原样转发到 http://127.0.0.1:8000(服务器本地的8000端口,即FastAPI服务监听端口),同时携带必要的请求头信息。

步骤5:FastAPI服务接收并处理请求(由systemd保障运行)

你的systemd服务配置,已经将FastAPI注册为系统服务,核心作用是:

  1. 确保FastAPI服务持续在 0.0.0.0:8000 端口监听(ExecStart 中的 --host 0.0.0.0 --port 8000);

  2. 异常自动重启(Restart=always)、开机自启,保障8000端口始终有服务响应请求。

当Nginx将请求转发到8000端口后,FastAPI服务(uvicorn运行的main:app)会接收请求,处理业务逻辑(如接口查询、数据返回等),然后生成响应结果。

步骤6:响应原路返回给用户

  1. FastAPI将响应结果返回给Nginx(通过8000端口);

  2. Nginx接收响应后,将其封装为HTTPS响应,发送给用户浏览器;

  3. 用户浏览器渲染响应内容,完成整个访问流程。

流程总结(通俗版)

用户 → 域名解析 → 服务器80/443端口 → Nginx(80转443 + 反向代理) → 8000端口FastAPI服务(systemd保障运行) → 响应原路返回用户

Nginx = 前台接待员(接收用户请求,转发给后台);FastAPI = 后台工作人员(处理业务);systemd = 后勤保障(确保后台工作人员始终在岗)