我们将使用以下技术栈,这是一个非常流行和强大的组合:

- 操作系统: Ubuntu Server (以 22.04 LTS 为例)
- Python 版本管理:
pyenv(推荐,用于管理多个 Python 版本) - Web 服务器: Gunicorn (一个 Python WSGI HTTP 服务器)
- 反向代理: Nginx (用于处理静态文件、SSL 终止和请求转发)
- WSGI 应用: Flask (一个轻量级的 Python Web 框架,示例用)
- 进程管理: Systemd (让应用在后台作为服务运行)
第 0 步:准备工作
- 购买/准备一台 Ubuntu 服务器:你可以从阿里云、腾讯云、AWS、Vultr 或 DigitalOcean 等服务商购买一台 VPS。
- 连接服务器:使用 SSH 连接到你的服务器。
ssh your_username@your_server_ip
- 更新系统:这是良好习惯,确保所有软件包都是最新的。
sudo apt update && sudo apt upgrade -y
第 1 步:安装基础工具和 Python 环境
1 安装编译工具和依赖
pyenv 需要从源码编译 Python,所以需要先安装编译所需的工具和 Python 的一些依赖库。
sudo apt install -y make build-essential libssl-dev zlib1g-dev \ libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \ libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
2 安装 pyenv
pyenv 是一个极其方便的工具,可以让你在同一台机器上轻松安装和管理多个 Python 版本。
# 克隆 pyenv 仓库 curl https://pyenv.run | bash # 配置环境变量 echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc echo 'eval "$(pyenv init -)"' >> ~/.bashrc # 重新加载 shell 配置 exec "$SHELL"
3 使用 pyenv 安装 Python
现在我们可以安装一个稳定且最新的 Python 版本,Python 3.11。
# 查找可安装的版本 pyenv install --list # 安装指定版本 (3.11.4) pyenv install 3.11.4 # 设置全局默认 Python 版本 pyenv global 3.11.4 # 验证安装 python --version # 应该输出: Python 3.11.4
第 2 步:创建和配置 Python 项目
1 创建项目目录和虚拟环境
为你的项目创建一个目录,并在其中创建一个虚拟环境。强烈推荐始终在虚拟环境中工作,以避免包冲突。

# 创建项目目录 sudo mkdir -p /var/www/my_flask_app sudo chown -R $USER:$USER /var/www/my_flask_app # 将所有权给你自己 cd /var/www/my_flask_app # 创建虚拟环境 python -m venv venv # 激活虚拟环境 source venv/bin/activate # 你的终端提示符前面会出现 (venv),表示虚拟环境已激活
2 安装项目依赖
我们将创建一个简单的 Flask 应用,所以需要安装 Flask 和 gunicorn。
# 在虚拟环境中安装 pip install --upgrade pip pip install flask gunicorn
3 编写 Flask 应用
创建一个名为 app.py 的文件。
nano app.py
将以下代码粘贴进去:
# app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "<h1>Hello from a Python App on Ubuntu!</h1><p>This is served by Gunicorn and Nginx.</p>"
if __name__ == "__main__":
# 注意:这个 run() 仅用于开发,生产环境用 Gunicorn
app.run()
4 测试应用(开发模式)
在虚拟环境中运行 Flask 的开发服务器来确保它能工作。

# 确保虚拟环境已激活 # source venv/bin/activate # 运行应用 FLASK_APP=app.py flask run --host=0.0.0.0 --port=5000
在你的浏览器中访问 http://your_server_ip:5000,你应该能看到 "Hello from a Python App on Ubuntu!" 的消息。
测试成功后,按 Ctrl+C 停止开发服务器。
第 3 步:使用 Gunicorn 部署应用
Gunicorn 是一个生产级的 WSGI 服务器,它会运行你的 Python 应用并处理 HTTP 请求。
1 用 Gunicorn 运行应用
在项目根目录下(虚拟环境已激活),执行以下命令:
# 格式: gunicorn -w [worker数量] -b [绑定地址:端口] [模块名:应用实例名] gunicorn -w 4 -b 0.0.0.0:8000 app:app
-w 4: 启动 4 个 worker 进程,通常设置为(2 x CPU核心数) + 1。-b 0.0.0.0:8000: 绑定到服务器的所有网络接口的 8000 端口。app:app: 第一个app是app.py文件名(不包含.py),第二个app是 Flask 的应用实例名(即app = Flask(__name__)中的app)。
在浏览器中访问 http://your_server_ip:8000,你应该能看到同样的页面,这说明 Gunicorn 已经成功运行了你的应用。
测试成功后,按 Ctrl+C 停止 Gunicorn。
第 4 步:配置 Nginx 作为反向代理
Nginx 将作为前端服务器,接收来自外部的请求(如 80 端口),然后转发给后端的 Gunicorn(8000 端口),它还能高效地处理静态文件。
1 安装 Nginx
sudo apt install nginx -y
2 创建 Nginx 配置文件
为你的应用创建一个新的 Nginx 配置文件。
sudo nano /etc/nginx/sites-available/my_flask_app
粘贴进去。记得将 your_server_ip 替换成你的实际 IP 地址或域名。
server {
listen 80;
server_name your_server_ip; # 替换成你的域名或IP
location / {
# 将请求转发给 Gunicorn
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;
}
# 可选:如果应用有静态文件,可以在这里配置
# location /static {
# alias /var/www/my_flask_app/static;
# expires 30d;
# }
}
3 启用配置文件
创建一个符号链接来启用这个站点配置。
sudo ln -s /etc/nginx/sites-available/my_flask_app /etc/nginx/sites-enabled/
4 测试并重启 Nginx
测试 Nginx 配置是否正确,然后重启服务。
# 测试配置 sudo nginx -t # 如果输出 successful,则重启 sudo systemctl restart nginx
5 配置防火墙
如果启用了 UFW (Uncomplicated Firewall),需要允许 HTTP 流量。
sudo ufw allow 'Nginx Full'
6 最终测试
在浏览器中访问 http://your_server_ip (不再是 8000 了),Nginx 会将你的请求转发给 Gunicorn,你应该能看到应用页面,至此,你的应用已经通过 Nginx + Gunicorn 成功部署了!
第 5 步:使用 Systemd 让应用作为服务运行
Gunicorn 进程在你退出 SSH 会话后就会停止,我们需要使用 systemd 来创建一个系统服务,让它开机自启并在后台持续运行。
1 创建 Systemd 服务文件
sudo nano /etc/systemd/system/my_flask_app
