了云服务器安全组、生产级 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)
- 密码:登录密码
- 端口:22
- 上传:把本地代码文件夹直接拖拽 到 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桌面程序必备 |
- 前台运行:
|----------------------|
| bash python3 main.py |
- 后台运行同「场景 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:
- Ubuntu 防火墙放行端口
- 云服务器安全组开放端口
- 程序绑定 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必备依赖工具
- 自动创建并激活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 "\n3/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 "\n4/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 "\n5/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 服务名 即可更新项目。