了云服务器安全组、生产级 Web 部署(Flask/Django 禁用开发服务器)、一键命令、避坑指南,所有步骤复制即用,适配 Ubuntu 20.04/22.04/24.04(服务器 / 桌面版通用)。
Python 程序部署 Ubuntu 完整详细流程
核心适用场景
✅ 普通 Python 脚本(爬虫 / 定时任务 / 工具)
✅ Ubuntu 桌面 GUI 程序
✅ Flask/Django Web 程序(测试 + 生产双模式)
✅ 云服务器(阿里云 / 腾讯云 / 华为云)+ 本地虚拟机
一、前期准备:Ubuntu 系统初始化(必做)
1.1 登录系统
- 服务器:用 Xshell / FinalShell 远程连接(IP + 用户名 + 密码)
- 桌面版:直接打开终端(快捷键 Ctrl+Alt+T)
1.2 更新系统 + 安装基础工具
所有命令直接复制执行,输入密码时不显示字符,(注意整篇文章bash文字的不用输入,否则出错)输完回车即可
|
bash
# 1. 更新软件源(解决安装失败问题)
sudo apt update && sudo apt upgrade -y
# 2. 安装Python必备工具(pip=包管理,venv=虚拟环境)
sudo apt install python3-pip python3-venv git curl -y |
1.3 验证环境(确认安装成功)
|
bash
python3 --version # 输出Python 3.8+ 即为正常
pip3 --version # 输出pip版本即为正常 |
二、上传 Python 代码到 Ubuntu(2 种新手方案)
方案 1:图形化上传(首选,零命令)FileZilla
FileZilla 是一款免费开源、跨平台、零门槛的专业FTP/SFTP文件传输解决方案,是服务器文件上传下载的主流工具,适配Windows、Mac系统连接Ubuntu服务器。软件持续稳定迭代,官方最新版本:客户端 V3.68.1(2025-04-02更新)、服务端 V1.10.2(2025-04-10更新),具备无广告、轻量化、传输稳定的特点,完全适配新手入门及日常运维工作。
官方原生核心功能与优势:
- 极简易用:操作界面直观,拖拽式传输,上手难度低于绝大多数FTP工具
- 多协议兼容:全面支持 FTP、FTPS、SFTP 主流安全传输协议
- 多语言适配:原生支持多国语言,完美适配简体中文界面
- 高效多任务:支持多标签并行工作,可同时传输多个文件、文件夹
- 实用工具功能:自带远程文件查找、批量文件管理、传输队列管理
- 专业站点管理:支持保存多个服务器站点,一键连接,无需重复输入信息
- 高速稳定传输:多线程传输,断点续传,大幅提升大文件上传成功率
- 本地下载 FileZilla
- 连接配置(顶部输入):
- 主机:Ubuntu的IP地址(服务器公网 IP / 虚拟机局域网 IP)
- 用户名:Ubuntu 登录用户名(默认 ubuntu/root)
- 上传:把本地代码文件夹直接拖拽到 Ubuntu 的 /home/用户名/ 目录(推荐路径,无权限问题)
方案 2:命令行上传(无图形界面,scp)
在你自己的电脑终端执行,不要在 Ubuntu 里执行:
|
bash
# 格式:scp -r 本地代码路径 Ubuntu用户名@IP:/home/用户名/
# 示例:把本地 D:\my_app 传到 192.168.1.100 的ubuntu用户目录
scp -r D:\my_app ubuntu@192.168.1.100:/home/ubuntu/ |
三、核心:配置程序独立环境(虚拟环境,必做!)
作用:隔离不同程序的依赖,避免冲突(新手 90% 的报错都是依赖冲突)
3.1 进入代码目录
假设你的程序上传到:/home/ubuntu/my_app
|
bash
# 进入程序文件夹
cd /home/ubuntu/my_app
# 查看目录下文件(确认代码上传成功)
ls |
3.2 创建 + 激活虚拟环境
|
bash
# 1. 创建虚拟环境(文件夹名固定为 env,不用改)
python3 -m venv env
# 2. 激活虚拟环境(激活成功后,终端开头会显示 (env))
source env/bin/activate |
✅ 退出虚拟环境命令:deactivate(不用时执行)
3.3 安装程序依赖
情况 1:项目有 requirements.txt(推荐)
|
bash
# 直接安装所有依赖(必须激活虚拟环境后执行)
pip install -r requirements.txt |
情况 2:本地生成依赖文件(本地电脑执行)
|
bash
# 本地电脑终端进入你的Python项目,执行:
pip freeze > requirements.txt
# 把生成的 requirements.txt 一起上传到Ubuntu |
情况 3:无依赖文件(手动安装)
|
bash
# 示例:安装flask、django
pip install flask django |
四、分场景运行程序(前台测试 + 后台持久运行)
通用规则
- 先前台测试(看是否报错),无报错再配置后台运行
- 后台运行:关闭终端、重启服务器,程序都不会停
场景 A:普通 Python 脚本(爬虫 / 工具 / 定时任务)
1. 前台测试(临时运行,关闭终端即停止)
|
bash
# 替换 main.py 为你的启动文件
python3 main.py |
无报错 → 按 Ctrl+C 停止,配置后台运行
2. 后台持久运行(2 种方案)
方案 1:nohup(临时部署,最简单)
|
bash
# 运行脚本,日志保存到 app.log
nohup python3 main.py > app.log 2>&1 &
# 查看运行状态
ps -ef | grep python3
# 停止程序(找到进程ID,替换 12345)
kill -9 12345 |
方案 2:systemd(生产级,开机自启 + 崩溃自动重启,首选)
|
bash
# 1. 创建系统服务文件
sudo nano /etc/systemd/system/python-app.service |
粘贴以下配置(只需要修改 WorkingDirectory 路径):
|
ini
[Unit]
Description=Python Script App
After=network.target
[Service]
User=ubuntu
WorkingDirectory=/home/ubuntu/my_app # 你的程序目录
ExecStart=/home/ubuntu/my_app/env/bin/python3 main.py # 虚拟环境+启动命令
Restart=always # 崩溃自动重启
RestartSec=5
[Install]
WantedBy=multi-user.target |
保存退出:Ctrl+O → 回车 → Ctrl+X
|
bash
# 2. 启动服务 + 开机自启
sudo systemctl daemon-reload
sudo systemctl start python-app
sudo systemctl enable python-app
# 3. 查看运行状态(绿色active即成功)
sudo systemctl status python-app |
场景 B:Ubuntu 桌面 GUI 程序(桌面版专用)
- 安装 GUI 依赖:
|
bash
sudo apt install python3-tk -y # Tkinter桌面程序必备 |
- 前台运行:
- 后台运行同「场景 A」
场景 C:Web 程序(Flask/Django)⚠️ 关键避坑
❌ 禁止用 runserver 做生产环境(开发服务器,性能差、不安全)
✅ 测试用开发服务器,生产用 Gunicorn + Nginx
第一步:前台测试(本地验证)
|
bash
# Flask 测试运行
python3 app.py
# Django 测试运行
python3 manage.py runserver 0.0.0.0:8000 |
浏览器访问:http://UbuntuIP:端口 能打开 → 测试成功
第二步:生产级部署(Gunicorn)
- 安装 Gunicorn(虚拟环境内)
|
bash
pip install gunicorn |
- Flask 启动命令
|
bash
gunicorn -w 4 -b 0.0.0.0:5000 app:app |
- Django 启动命令
|
bash
gunicorn -w 4 -b 0.0.0.0:5000 项目名.wsgi:application |
- 配置 systemd 后台运行(同场景 A,仅修改 ExecStart)
|
ini
ExecStart=/home/ubuntu/my_app/env/bin/gunicorn -w 4 -b 0.0.0.0:5000 app:app |
五、端口开放(Web 程序必须做)
5.1 Ubuntu 防火墙放行端口
|
bash
# 放行你的程序端口(Flask/Django默认5000/8000)
sudo ufw allow 5000/tcp
# 启用防火墙
sudo ufw enable
# 查看放行状态
sudo ufw status |
5.2 云服务器额外配置(必做!)
阿里云 / 腾讯云 / 华为云:控制台 → 安全组 → 放行对应端口(否则外网无法访问)
六、服务管理万能命令(systemd)
|
bash
# 启动
sudo systemctl start python-app
# 停止
sudo systemctl stop python-app
# 重启
sudo systemctl restart python-app
# 查看状态
sudo systemctl status python-app
# 查看实时日志(排查报错)
journalctl -u python-app -f |
七、新手 99% 常见问题(一键排查)
- 权限不足:命令前加 sudo
- 依赖安装失败:确认终端开头有 (env)(虚拟环境未激活)
- 外网无法访问 Web:
- 程序绑定 0.0.0.0(不是 [127.0.0.1](127.0.0.1))
- 端口被占用:
|
bash
sudo lsof -i:5000 # 查看占用进程
kill -9 进程ID # 关闭占用 |
- 程序报错:查看日志
|
bash
cat app.log # nohup日志
journalctl -u python-app -f # systemd日志 |
总结(极简核心流程)
- 初始化:sudo apt update && 安装python工具
- 上传代码:FileZilla 拖拽
- 虚拟环境:python3 -m venv env && source env/bin/activate
- 装依赖:pip install -r requirements.txt
- 前台测试:python3 启动文件.py
- 后台运行:systemd配置 + 开机自启
- Web 程序:开放端口 + 安全组放行
八、全自动一键部署脚本(零手动配置)
为彻底简化部署流程,适配新手无脑操作,特此编写通用一键部署Shell脚本,兼容普通Python脚本、Flask、Django项目,自动完成环境更新、虚拟环境创建、依赖安装、服务配置、开机自启、端口放行全流程,全程只需复制执行一条命令。
8.1 脚本核心功能
- 自动更新Ubuntu系统软件源、安装Python必备依赖工具
- 自动读取requirements.txt安装项目所有依赖
- 自动生成systemd生产级服务文件,配置崩溃重启、开机自启
8.2 完整一键部署脚本
在Ubuntu项目根目录下,新建部署脚本文件:
|
bash 一键部署脚本sudo nano deploy.sh |
复制粘贴以下完整脚本(仅需修改脚本顶部项目名称、启动文件、端口3个自定义参数即可):
|
bash 完整全自动部署脚本#!/bin/bash
# ========== 仅需修改以下3个参数 ==========
APP_NAME="python-app" # 服务名称(自定义,无空格)
APP_MAIN="main.py" # 项目启动文件(Flask为app.py、Django无需修改)
APP_PORT=5000 # 项目运行端口(Flask5000、Django8000)
DJANGO_MODE=false # Django项目改为true,普通脚本/Flask保持false
# ========================================
# 获取当前项目目录
WORK_DIR=$(pwd)
ENV_DIR="${WORK_DIR}/env"
echo "========== 开始全自动部署Python项目 =========="
echo "项目目录:$WORK_DIR"
echo "启动文件:$APP_MAIN"
echo "运行端口:$APP_PORT"
# 1. 更新系统、安装基础依赖
echo -e "\n[1/6] 更新系统并安装必备工具..."
sudo apt update && sudo apt upgrade -y
sudo apt install python3-pip python3-venv git curl -y
# 2. 创建并激活虚拟环境
echo -e "\n[2/6] 配置虚拟环境..."
if [ ! -d "$ENV_DIR" ]; then
python3 -m venv env
fi
source env/bin/activate
# 3. 安装项目依赖
echo -e "\n[3/6] 安装项目依赖..."
if [ -f "requirements.txt" ]; then
pip install --upgrade pip
pip install -r requirements.txt
# Web项目自动安装gunicorn生产服务器
pip install gunicorn
else
echo "未检测到requirements.txt,跳过批量依赖安装,可手动补充依赖"
fi
# 4. 配置systemd开机自启服务
echo -e "\n[4/6] 配置生产级系统服务..."
SERVICE_FILE="/etc/systemd/system/${APP_NAME}.service"
# 区分Django/Flask/普通脚本启动命令
if [ $DJANGO_MODE = true ]; then
# 自动识别Django wsgi配置
WSGI_FILE=$(find . -name "wsgi.py" | head -n1)
WSGI_PATH=$(dirname $WSGI_FILE | sed 's/\.\///')
START_CMD="${ENV_DIR}/bin/gunicorn -w 4 -b 0.0.0.0:${APP_PORT} ${WSGI_PATH}.wsgi:application"
elif [[ $APP_MAIN == "app.py" ]]; then
START_CMD="${ENV_DIR}/bin/gunicorn -w 4 -b 0.0.0.0:${APP_PORT}} app:app"
else
START_CMD="${ENV_DIR}/bin/python3 ${WORK_DIR}/${APP_MAIN}"
fi
# 写入服务配置
sudo cat > $SERVICE_FILE << EOF
[Unit]
Description=$APP_NAME Python Application
After=network.target
[Service]
User=$USER
WorkingDirectory=$WORK_DIR
ExecStart=$START_CMD
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
# 5. 防火墙放行端口
echo -e "\n[5/6] 放行项目端口..."
sudo ufw allow ${APP_PORT}/tcp
sudo ufw reload
# 6. 启动服务并配置开机自启
echo -e "\n[6/6] 启动项目服务..."
sudo systemctl daemon-reload
sudo systemctl stop $APP_NAME >/dev/null 2>&1
sudo systemctl start $APP_NAME
sudo systemctl enable $APP_NAME
# 输出部署结果
echo -e "\n========== 部署完成! =========="
sudo systemctl status $APP_NAME
echo -e "\n操作命令:"
echo "重启服务:sudo systemctl restart $APP_NAME"
echo "停止服务:sudo systemctl stop $APP_NAME"
echo "查看日志:journalctl -u $APP_NAME -f"
echo "访问地址:http://$(hostname -I | awk '{print $1}'):${APP_PORT}" |
8.3 脚本运行步骤
- 将脚本中顶部3个自定义参数,修改为自己项目的对应信息;
- 赋予脚本执行权限:chmod +x deploy.sh
- 一键执行部署:./deploy.sh
- 等待脚本自动执行完毕,显示 active (running) 即部署成功。
8.4 脚本使用注意事项
- 部署前务必将项目文件全部上传至Ubuntu,且进入项目根目录执行脚本;
- Django项目需提前在 settings.py 中配置 ALLOWED_HOSTS = ['*'],否则外网无法访问;
- 云服务器需额外在控制台安全组放行对应端口,配合防火墙规则生效;
- 首次部署成功后,后续修改代码只需执行 sudo systemctl restart 服务名 即可更新项目。
所有评论(0)