Ubuntu Python 部署终极版教程

云服务器安全组、生产级 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 "\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 脚本运行步骤

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

8.4 脚本使用注意事项

  • 部署前务必将项目文件全部上传至Ubuntu,且进入项目根目录执行脚本;
  • Django项目需提前在 settings.py 中配置 ALLOWED_HOSTS = '\*',否则外网无法访问;
  • 云服务器需额外在控制台安全组放行对应端口,配合防火墙规则生效;
  • 首次部署成功后,后续修改代码只需执行 sudo systemctl restart 服务名 即可更新项目。
相关推荐
光影少年1 小时前
Redux Toolkit 用法、解决原生Redux 冗余问题
开发语言·前端·javascript·react.js·中间件·前端框架·ecmascript
KANGBboy1 小时前
java知识二(数组)
java·开发语言·python
Cloud_Shy6181 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第一章 Item 4 - 6)
android·数据库·论文阅读·python
零陵上将军_xdr1 小时前
后端转全栈学习-Day3-JavaScript 基础-1
开发语言·javascript·学习
llilay1 小时前
企业级FastAPI后端模板搭建(二)整合路由Router
开发语言·python·fastapi
scan7241 小时前
根据上下文中的用户信息,切换提示词
python
不会C语言的男孩2 小时前
C++ Primer Plus 第13章:类继承
开发语言·c++
我材不敲代码2 小时前
Python基础: 函数超全详解:定义、参数、返回值、作用域与递归
开发语言·python·算法
承渊政道2 小时前
Linux系统学习【进程控制:进程创建、终止与等待、进程程序替换、自主shell命令行解释器详解】
linux·服务器·c++·学习·ubuntu·bash·远程工作