云服务器安全组、生产级 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 主流安全传输协议
  • 多语言适配:原生支持多国语言,完美适配简体中文界面
  • 高效多任务:支持多标签并行工作,可同时传输多个文件、文件夹
  • 实用工具功能:自带远程文件查找、批量文件管理、传输队列管理
  • 专业站点管理:支持保存多个服务器站点,一键连接,无需重复输入信息
  • 高速稳定传输:多线程传输,断点续传,大幅提升大文件上传成功率
  1. 本地下载 FileZilla
  1. 连接配置(顶部输入):
  • 主机:Ubuntu的IP地址(服务器公网 IP / 虚拟机局域网 IP)
  • 用户名:Ubuntu 登录用户名(默认 ubuntu/root
  • 密码:登录密码
  • 端口:22
  1. 上传:把本地代码文件夹直接拖拽到 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

四、分场景运行程序(前台测试 + 后台持久运行)

通用规则

  1. 前台测试(看是否报错),无报错再配置后台运行
  1. 后台运行:关闭终端、重启服务器,程序都不会停

场景 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 程序(桌面版专用)

  1. 安装 GUI 依赖:

bash
sudo apt install python3-tk -y  # Tkinter桌面程序必备

  1. 前台运行:

bash
python3 main.py

  1. 后台运行同「场景 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)

  1. 安装 Gunicorn(虚拟环境内)

bash
pip install gunicorn

  1. Flask 启动命令

bash
gunicorn -w 4 -b 0.0.0.0:5000 app:app

  1. Django 启动命令

bash
gunicorn -w 4 -b 0.0.0.0:5000 项目名.wsgi:application

  1. 配置 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% 常见问题(一键排查)

  1. 权限不足:命令前加 sudo
  1. 依赖安装失败:确认终端开头有 (env)(虚拟环境未激活)
  1. 外网无法访问 Web
  • Ubuntu 防火墙放行端口
  • 云服务器安全组开放端口
  • 程序绑定 0.0.0.0(不是 [127.0.0.1](127.0.0.1))
  1. 端口被占用

bash
sudo lsof -i:5000  # 查看占用进程
kill -9 进程ID     # 关闭占用

  1. 程序报错:查看日志

bash
cat app.log  # nohup日志
journalctl -u python-app -f  # systemd日志

总结(极简核心流程)

  1. 初始化:sudo apt update && 安装python工具
  1. 上传代码:FileZilla 拖拽
  1. 虚拟环境:python3 -m venv env && source env/bin/activate
  1. 装依赖:pip install -r requirements.txt
  1. 前台测试:python3 启动文件.py
  1. 后台运行:systemd配置 + 开机自启
  1. 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 "\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 脚本运行步骤

  1. 将脚本中顶部3个自定义参数,修改为自己项目的对应信息;
  1. 赋予脚本执行权限:chmod +x deploy.sh
  1. 一键执行部署:./deploy.sh
  1. 等待脚本自动执行完毕,显示 active (running) 即部署成功。

8.4 脚本使用注意事项

  • 部署前务必将项目文件全部上传至Ubuntu,且进入项目根目录执行脚本;
  • Django项目需提前在 settings.py 中配置 ALLOWED_HOSTS = ['*'],否则外网无法访问;
  • 云服务器需额外在控制台安全组放行对应端口,配合防火墙规则生效;
  • 首次部署成功后,后续修改代码只需执行 sudo systemctl restart 服务名 即可更新项目。

更多推荐