问题汇总
- mysql 安装
- fastapi 环境部署
- nginx安装和 https 证书申请
mysql 安装
我是基于阿里云 Ubuntu 22.04 的服务器,安装 mysql 过程中主要遇到如下问题:
- 本地连接,为安全考虑,只能本地连接
- 远程连接,为开发调试方便,可远程连接
本地安装与连接
通过命令安装 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 的一些主要特点和功能:
-
异步支持:Uvicorn 原生支持异步编程,允许开发者利用 Python 的
async和await关键字来编写高效的异步代码,从而更好地处理并发请求。 -
性能:Uvicorn 以高性能著称,能够处理大量并发连接,适合需要高吞吐量和低延迟的应用。
-
简单易用:Uvicorn 的安装和使用都很简单,通常只需通过
pip安装,并使用命令行启动应用即可。例如: -
兼容性:Uvicorn 兼容 ASGI 规范,这意味着它可以与任何遵循 ASGI 的框架或库一起使用。除了 FastAPI 和 Starlette,它还可以与 Django Channels 等库一起工作。
-
支持 HTTP/2:Uvicorn 支持 HTTP/2 协议,这对于需要更快响应时间和更好性能的应用非常有用。
-
热重载:在开发模式下,Uvicorn 支持代码更改时的热重载,方便开发者快速测试和调试。
-
部署选项: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-available 和 sites-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