服务器部署FastApi遇到的若干问题

807 阅读6分钟

问题汇总

  1. mysql 安装
  2. fastapi 环境部署
  3. nginx安装和 https 证书申请

mysql 安装

我是基于阿里云 Ubuntu 22.04 的服务器,安装 mysql 过程中主要遇到如下问题:

  1. 本地连接,为安全考虑,只能本地连接
  2. 远程连接,为开发调试方便,可远程连接

本地安装与连接

通过命令安装 mysql

apt install mysql-server

安装完成后一般是无密码的,可以通过mysql -u root进入数据库,然后通过下面方式设置密码:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

这样下次进入时就需要设置密码了。

设置远程连接

通过如下命令修改配置:

vi /etc/mysql/mysql.conf.d/mysqld.cnf

在配置文件中,找到 bind-address 设置。127.0.0.1仅允许本地连接,0.0.0.0允许所有地址连接。将 bind-address 设置为 0.0.0.0 或指定允许的 IP 地址后,要确保你的 MySQL 用户具有从远程主机连接的权限。

CREATE USER 'username'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'username'@'%';
FLUSH PRIVILEGES;

'username''password' 替换为相应的用户名和密码。

启动、重启、停止、关闭命令

systemctl start mysql
systemctl restart mysql
systemctl stop mysql
systemctl status mysql

fastapi 环境部署

ubuntu 22.04 中为python3.10,python官方自带 venv 虚拟环境,如果python版本满足要求,那直接用venv即可。

python虚拟环境

cd 到项目目录,然后 python3 -m venv myenv即可,或者给一个指定路径python3 -m venv /path/to/new/myenv 相关命令主要如下:

# 激活虚拟环境
source myenv/bin/activate # linux/mac 
myenv\Scripts\activate # win

# 退出虚拟环境
deactivate

# 删除虚拟环境
rm -rf /path/to/venv

安装相关包

激活虚拟环境后,需要安装相关的包环境,主要如下:

pip install fastapi uvicorn

关于 uvicorn

Uvicorn 是一个快速的 ASGI(异步服务器网关接口)服务器,用于运行 Python 的异步 web 应用程序,包括 FastAPI、Starlette 和其他兼容 ASGI 的框架。以下是 Uvicorn 的一些主要特点和功能:

  1. 异步支持:Uvicorn 原生支持异步编程,允许开发者利用 Python 的 asyncawait 关键字来编写高效的异步代码,从而更好地处理并发请求。

  2. 性能:Uvicorn 以高性能著称,能够处理大量并发连接,适合需要高吞吐量和低延迟的应用。

  3. 简单易用:Uvicorn 的安装和使用都很简单,通常只需通过 pip 安装,并使用命令行启动应用即可。例如:

  4. 兼容性:Uvicorn 兼容 ASGI 规范,这意味着它可以与任何遵循 ASGI 的框架或库一起使用。除了 FastAPI 和 Starlette,它还可以与 Django Channels 等库一起工作。

  5. 支持 HTTP/2:Uvicorn 支持 HTTP/2 协议,这对于需要更快响应时间和更好性能的应用非常有用。

  6. 热重载:在开发模式下,Uvicorn 支持代码更改时的热重载,方便开发者快速测试和调试。

  7. 部署选项:Uvicorn 可以作为独立的服务器运行,也可以与反向代理(如 Nginx)一起使用,以处理 SSL、静态文件和负载均衡等。

启动命令

uvicorn main:app --host 0.0.0.0 --port 8000

uvicorn 启动命令中的 main:app 是一个 Python 导入路径,表示从哪个模块中导入 ASGI 应用程序。具体规则如下:

  • main:这是包含 FastAPI 应用的 Python 文件名(不带 .py 后缀)。在这个例子中,它指的是名为 main.py 的文件。

  • app:这是在 main.py 文件中定义的 FastAPI 应用实例的名称。通常,你会在 main.py 中创建一个 FastAPI 实例,如下所示:

    python
    复制代码
    from fastapi import FastAPI
    
    app = FastAPI()
    

结合示例

假设你的项目结构如下:

bash
复制代码
/your_project
    ├── main.py
    └── other_files...

main.py 文件中,你定义了 FastAPI 应用:

python
复制代码
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def read_root():
    return {"Hello": "World"}

当你运行以下命令时:

bash
复制代码
uvicorn main:app --host 0.0.0.0 --port 8000
  • Uvicorn 会导入 main.py 文件中的 app 对象,并将其作为 ASGI 应用运行。
  • 通过指定 --host--port 参数,Uvicorn 将会在指定的 IP 和端口上监听请求。

这种格式使得 Uvicorn 能够轻松地找到并运行你的 FastAPI 应用。

nginx安装和 https 证书申请

安装 Nginx

安装 Nginx 作为反向代理。

# 更新包管理器
apt update

# 安装 Nginx
apt install nginx

Nginx 配置

Nginx 将作为反向代理,处理 HTTPS 请求并将请求转发给 FastAPI 应用。

创建新的 Nginx 配置文件

# 创建新的配置文件
sudo nano /etc/nginx/sites-available/fastapi_app

Nginx 配置内容

在编辑器中添加以下内容,确保替换 your_domain.com 为实际的域名或 IP 地址:

nginx
复制代码
# 处理 HTTP 请求,强制重定向到 HTTPS
server {
    listen 80;  # 监听 80 端口(HTTP)
    server_name your_domain.com;  # 替换为你的域名或 IP

    # 301 重定向,将所有 HTTP 请求重定向到 HTTPS
    return 301 https://$host$request_uri;  # 301 表示永久重定向
}

# 处理 HTTPS 请求
server {
    listen 443 ssl;  # 启用 SSL,监听 443 端口(HTTPS)
    server_name your_domain.com;  # 替换为你的域名或 IP

    # SSL 证书和私钥的路径
    ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;  # SSL 证书路径
    ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;  # SSL 私钥路径

    # 设置访问日志和错误日志(可选)
    access_log /var/log/nginx/fastapi_access.log;  # 访问日志
    error_log /var/log/nginx/fastapi_error.log;  # 错误日志

    # 处理根路径的请求
    location / {
        # 将请求转发到 FastAPI 应用,假设应用在本地的 8000 端口上运行
        proxy_pass http://localhost:8000;  # FastAPI 应用的地址
        proxy_set_header Host $host;  # 设置 Host 头
        proxy_set_header X-Real-IP $remote_addr;  # 转发真实客户端 IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 转发 IP
        proxy_set_header X-Forwarded-Proto $scheme;  # 转发协议(HTTP 或 HTTPS)
    }
}

启用新的配置

# 创建符号链接以启用新的 Nginx 配置
sudo ln -s /etc/nginx/sites-available/fastapi_app /etc/nginx/sites-enabled/

这两个sites-available sites-enabled什么区别? sites-availablesites-enabled 是 Nginx 配置的两个目录,它们的区别如下:

sites-available

  • 存放配置文件:这个目录用于存放所有可用的站点配置文件。每个配置文件对应一个网站或服务的设置。
  • 未启用的配置:在这个目录中的配置文件并不会自动生效,只有通过链接到 sites-enabled 目录的配置才会被 Nginx 加载和使用。

sites-enabled

  • 启用的配置:这个目录包含了所有当前启用的站点配置文件。Nginx 只会加载这里的配置文件。
  • 符号链接:通常,通过创建符号链接将 sites-available 中的配置文件链接到 sites-enabled 中来启用一个站点。例如,使用 ln -s 命令。

总结

  • sites-available:所有配置文件(可用的站点),但不一定生效。
  • sites-enabled:当前启用的配置文件,Nginx 会读取这些文件并应用其设置。

这种结构使得管理站点变得更加灵活,可以方便地启用或禁用站点配置,而无需删除文件。

检查 Nginx 配置

# 检查 Nginx 配置是否正确
nginx -t

重启 Nginx

# 重启 Nginx,使配置生效
systemctl restart nginx

申请 SSL 证书(使用 Let's Encrypt)

使用 Certbot 申请免费 SSL 证书,并自动配置 Nginx。

# 安装 Certbot
apt install certbot python3-certbot-nginx

# 获取 SSL 证书,自动配置 Nginx
certbot --nginx -d your_domain.com

7. 定期更新证书(可选)

测试自动更新功能,以确保证书定期更新:

# 测试自动更新
certbot renew --dry-run