BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离

BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离

AI 智能摘要
我们将以一个实际的DjangoBlog项目为例,手把手教你如何从Python环境准备、源码下载、配置修改,一直到最终实现Nginx + uWSGI + 动静分离的高效生产级部署,并且演示在BT宝塔面板环境下载的安装图文教程,让你轻松应对各种部署难题!

随着Python在Web开发领域的崛起,Django作为其最受欢迎的Web框架之一,以其“开箱即用”的强大功能和完善的生态系统,赢得了无数开发者的青睐。然而,将一个Django项目从开发环境顺利部署到生产环境,并确保其高性能、高稳定运行,对于许多初学者或经验不足的开发者而言,仍是一个不小的挑战。

主题铺今天将为你带来一份Python Django项目生产级部署的深度指南,我们将以一个实际的DjangoBlog项目为例,手把手教你如何从Python环境准备、源码下载、配置修改,一直到最终实现Nginx + uWSGI + 动静分离的高效生产级部署,并且演示在BT宝塔面板环境下载的安装图文教程,让你轻松应对各种部署难题!

还没安装免费BT宝塔面板,赶快下载安装吧>>>

Django项目生产级部署核心步骤

本教程将以部署DjangoBlog项目为例,带你完成整个部署流程。

一、Python环境准备

一个干净、隔离的Python环境是项目部署的基石。

  1. Python版本下载与安装
    • 首先,确保你的服务器上安装了合适版本的Python。推荐使用Python 3.x的最新稳定版本。
    • 你可以通过系统包管理器(如Ubuntu/Debian的aptCentOS/AlmaLinux的yum/dnf)安装,或从Python官网下载源码编译安装。
      • Ubuntu/Debiansudo apt update && sudo apt install python3 python3-pip
      • CentOS/AlmaLinuxsudo dnf install python3 python3-pip
    • 主题铺提示: 建议使用pyenv或miniconda等工具管理Python版本,以便在同一服务器上运行多个Python项目。
  2. 创建并激活虚拟环境
    • 为了避免不同项目之间Python包结构混乱和依赖冲突,强烈建议为每个项目创建一个独立的虚拟环境。
    • 进入你的项目目录(或计划存放项目的目录),执行以下命令创建虚拟环境:
      cd /path/to/your/project/
      python3 -m venv venv_djangoblog # 创建名为venv_djangoblog的虚拟环境
    • 激活虚拟环境:
      source venv_djangoblog/bin/activate
    • 主题铺点评: 虚拟环境是Python开发和部署的“好习惯”,它能让你更好地管理项目依赖,避免“依赖地狱”。

二、下载源码并调教数据库连接配置

我们将下载DjangoBlog项目的源码,并根据实际情况调整数据库配置。

下载项目源码

使用git工具克隆DjangoBlog项目的源码到你的服务器上:
git clone https://gitee.com/lylinux/DjangoBlog.git

进入项目根目录:
cd DjangoBlog

配置文件修改

DjangoBlog项目默认推荐使用MySQL数据库。主题铺提示: 如果你的服务器没有安装MySQL,或你更倾向于使用其他数据库(如PostgreSQL),你需要进行相应的修改。

djangoblog项目的配置文件位于 /DjangoBlog/djangoblog/settings.py。你可以看到默认的数据库信息和Redis缓存配置。

切换为PostgreSQL (PgSQL) 数据库

如果你的服务器安装了PgSQL,需要修改 settings.py 中的 DATABASES 配置。

添加 psycopg2-binary 依赖:由于切换到PgSQL,你需要安装连接PgSQL的第三方库 psycopg2-binary。在激活的虚拟环境下执行:
pip install psycopg2-binary
并确保你的 requirements.txtPipfile 中也包含此依赖。

修改 settings.py 中的 DATABASES 配置,示例如下(请替换为你的PgSQL实际信息):

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2', # 修改此处
        'NAME': 'your_db_name',
        'USER': 'your_db_user',
        'PASSWORD': 'your_db_password',
        'HOST': 'localhost', # 或你的数据库服务器IP
        'PORT': '',
    }
}

使用环境变量文件配置数据库和Redis缓存

DjangoBlog项目支持从环境变量中获取配置信息,这是一种更安全、更灵活的配置方式。

在项目根目录(或你方便管理的位置)创建一个名为 myenvd 的文件(或其他你喜欢的名称),并在其中配置数据库和Redis缓存的环境变量,例如:

# myenvd 文件内容示例
DATABASE_NAME=your_db_name
DATABASE_USER=your_db_user
DATABASE_PASSWORD=your_db_password
DATABASE_HOST=localhost
DATABASE_PORT=5432

REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_DB=0
REDIS_PASSWORD=your_redis_password

在启动项目时,你需要确保这些环境变量被加载。

三、添加并初始化Django项目

在配置好数据库连接后,我们需要对项目进行初始化。

  1. 安装项目依赖
    • 在激活的虚拟环境下,安装项目所需的全部Python包:
      pip install -r requirements.txt
      (如果项目使用Pipenv,则执行pipenv install
  2. 项目初始化命令
    • Django项目需要将模型映射到数据库中。在激活的虚拟环境下,执行数据库迁移命令:
      python manage.py makemigrations
      python manage.py migrate
    • 主题铺提示: 如果你没有执行这些初始化命令,项目启动时可能会因为找不到数据库表而失败。
  3. 等待项目创建成功
    • 执行完迁移命令后,数据库结构就已准备就绪。

四、检查运行状态与创建管理员

在生产部署之前,先在开发模式下检查项目是否能正常运行,并创建管理员账号。

  1. 测试项目运行
    • 在激活的虚拟环境下,并确保环境变量已加载(例如,通过 source myenvd 或在启动命令中指定),尝试运行Django的开发服务器: python manage.py runserver 0.0.0.0:8000
      • 主题铺提示: 原始文章中提到“访问失败,排查后发现本地监听的是127.0.0.1不是0.0.0.0,内网无法访问”。为了让内网或其他IP可以访问,runserver 命令需要指定监听地址为 0.0.0.0
    • 在浏览器中访问 http://你的服务器IP:8000,检查网站是否能正常显示。如果出现错误,请检查前面的步骤是否有遗漏。
  2. 创建管理员
    • 在项目运行正常后,创建一个Django超级用户(管理员账号):
      python manage.py createsuperuser
    • 按照提示输入用户名、邮箱和密码。

五、实现生产级部署:Nginx + uWSGI + 动静分离

这是将Django项目部署到生产环境的关键步骤,它能显著提升项目性能和稳定性。

uWSGI托管Web应用

安装uWSGI:在激活的虚拟环境下安装uWSGI:
pip install uwsgi

uWSGI配置:在项目根目录创建一个 uwsgi.ini 配置文件,用于定义uWSGI如何运行你的Django应用。

# uwsgi.ini
[uwsgi]
# Django项目根目录
chdir = /path/to/your/DjangoBlog/

# Django WSGI文件路径
module = djangoblog.wsgi:application

# 监听地址和端口,或Unix Socket
socket = 127.0.0.1:8000  # 或 socket = /tmp/djangoblog.sock

# 进程数和线程数
master = true
processes = 4
threads = 2

# 自动清理所有进程
vacuum = true

# 启用Python虚拟环境
virtualenv = /path/to/your/DjangoBlog/venv_djangoblog/

# 启用守护进程模式并指定日志文件
daemonize = /var/log/uwsgi/djangoblog.log # 确保路径存在且uwsgi有写入权限
pidfile = /tmp/djangoblog.pid

# 加载环境变量文件(如果使用)
env = DJANGO_SETTINGS_MODULE=djangoblog.settings
# 也可以通过env参数加载myenvd文件中的环境变量
# env = PYTHON_ENV_FILE=/path/to/your/DjangoBlog/myenvd
  • 主题铺提示: 确保 chdirvirtualenv 路径正确。

关闭DEBUG模式,切换到uWSGI服务运行

  • 修改 djangoblog/settings.py 文件:
DEBUG = False  # 生产环境务必设置为False
ALLOWED_HOSTS = ['your_domain.com', 'your_server_ip'] # 替换为你的域名和IP
  • 启动uWSGI服务:uwsgi --ini uwsgi.ini
    • 你可以使用 ps aux | grep uwsgi 检查uWSGI进程是否正常运行。

Nginx代理服务与动静分离

安装Nginx:如果你的服务器尚未安装Nginx,请通过系统包管理器安装:

Ubuntu/Debiansudo apt install nginx

CentOS/AlmaLinuxsudo dnf install nginx

Nginx配置

  • 在Nginx的配置目录(通常是 /etc/nginx/conf.d//etc/nginx/sites-available/)创建一个新的网站配置文件,例如 djangoblog.conf。配置Nginx代理uWSGI服务,并实现动静分离。

# /etc/nginx/conf.d/djangoblog.conf (或 sites-available/djangoblog.conf)
server {
    listen 80;
    server_name your_domain.com your_server_ip; # 替换为你的域名和IP

    # 动态文件(通过uWSGI处理)
    location / {
        include uwsgi_params; # 引入uWSGI的通用参数
        uwsgi_pass 127.0.0.1:8000; # 对应uwsgi.ini中设置的socket
        # 如果uWSGI使用Unix Socket:
        # uwsgi_pass unix:///tmp/djangoblog.sock;
    }

    # 静态文件(由Nginx直接返回,实现动静分离)
    # DjangoBlog项目将静态文件收集到collectedstatic目录,并以/static/路由访问
    location /static/ {
        alias /path/to/your/DjangoBlog/collectedstatic/; # 替换为你的实际路径
        expires 30d; # 缓存30天
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    }

    # 媒体文件(如果项目有用户上传的媒体文件)
    # location /media/ {
    #     alias /path/to/your/DjangoBlog/media/; # 替换为你的实际路径
    #     expires 30d;
    #     add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    # }
}

主题铺提示: 确保 alias 中的路径与你实际的静态文件收集路径一致。expiresadd_header Cache-Control 有助于浏览器缓存静态文件,提升用户体验。

检查Nginx配置并重启

sudo nginx -t             # 检查配置语法
sudo systemctl restart nginx # 重启Nginx服务

配置域名和外网映射

  • DNS解析:将你的域名(your_domain.com)解析到你的服务器IP地址。
  • 本地Host设置(测试阶段):在测试阶段,你可以在本地电脑的 hosts 文件中添加一条记录,将域名映射到服务器IP,例如:
    你的服务器IP地址 your_domain.com
  • 外网映射:如果你的服务器在内网,需要配置路由器或防火墙进行端口转发,将外部请求映射到服务器的80端口。

六、静态文件收集与压缩

Django项目中的静态文件(CSS, JS, 图片等)需要被收集到统一的目录,以便Nginx直接提供服务。

  1. 收集静态文件
    • 在激活的虚拟环境下,执行以下命令将Django项目中所有应用的静态文件收集到 STATIC_ROOT 指定的目录(在 settings.py 中配置)。
      python manage.py collectstatic --noinput
    • 主题铺提示: DjangoBlog项目默认将静态文件收集到 collectedstatic 目录。
  2. 压缩静态文件(可选,但推荐)
    • DjangoBlog项目可能使用了 django-compressor 等库来压缩静态文件。执行压缩命令:
      python manage.py compress --force
    • 主题铺点评: 压缩静态文件能进一步减小文件大小,加快传输速度,提升用户体验。

七、访问测试

现在,你可以通过域名或服务器IP访问你的Django项目了。

  1. 通过域名访问:在浏览器中输入你的域名 http://your_domain.com
  2. 通过IP访问:在浏览器中输入 http://你的服务器IP
  3. 检查动静分离
    • 打开浏览器的开发者工具(F12),切换到“网络”(Network)标签。
    • 刷新页面,观察静态资源的请求(CSS, JS, 图片),它们的请求应该直接由Nginx返回,而不是经过uWSGI。

将Python Django项目部署到生产环境,并利用Nginx代理uWSGI服务,同时实现动静分离,是确保网站高性能和稳定运行的业界标准实践。虽然涉及的步骤较多,但每一步都有其明确的目的和优化效果。

如果使用BT宝塔面板的话部署如下:

还没安装免费BT宝塔面板,赶快下载安装吧>>>

1. Python环境准备
a、版本下载

图片[1]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺

b.虚拟环境建立, 使用刚才安装的Python环境创建一个虚拟环境,防止包结构混乱带来的管理麻烦

图片[2]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺

2. 下载源码,调教一下数据库链接配置
a.  1. git下载git clone https://gitee.com/lylinux/DjangoBlog.git

图片[3]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺

b.配置文件
i.djangoblog项目默认推荐使用的是mysql数据库,但是我测试的机器没有安装,故切换为pgsq数据库
ii.在djangoblog项目的配置文件在/DjangoBlog/djangoblog/settings.py,可以看到默认使用的数据库信息, 和Redis缓存方式

图片[4]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺
图片[5]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺

iii.修改为支持pgsql, 因为使用了pgsql,所以需要再第三方包记录文件中添加 psycopg2-binary这个链接pgsql的第三方库

图片[6]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺

iv.因为该项目支持从环境环境变量获取配置信息,所以这里我使用创建一个名为myenvd的环境变量文件来配置数据库和redis缓存,方便后续管理

图片[7]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺
图片[8]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺

3.添加Python项目
a.填写项目信息

图片[9]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺

b.初始化命令,这个也可之后自己在终端输入执行,不过django项目需要数据库信息才能正常访问,所以这里如果没执行初始化命令,会启动失败

图片[10]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺
图片[11]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺

c.等待项目创建成功

图片[12]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺

4.检查运行状态

a.正常运行, 如果没能正常运行可以检查是否有遗漏某些操作,没执行初始化是可能会出现启动失败的

图片[13]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺

b.创建管理器

图片[14]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺

c.直接访问服务, 发现访问失败,排查后发现本地监听的是127.0.0.1不是0.0.0.0,内网无法访问,遂修改启动命令,使内网可直接访问

图片[15]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺
图片[16]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺
图片[17]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺
图片[18]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺

5.实现生产级部署 (Nginx + uwsgi + 动静分离)
a.这里测试DjangoBlog项目是一个基于Python的wsgi网络协议运行的,可将web应用托管给uWsgi服务,提高运行效率,在通过Nginx代理服务,同时将静态文件分离由Nginx直接返回。
b.关闭DEBUG模式,切换到uwsgi服务运行

图片[19]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺
图片[20]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺

c.配置域名 (此处测试是通过本地host设置代替DNS域名解析的)

图片[21]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺

d.配置外网映射

图片[22]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺
图片[23]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺

e.配置动静态分离, djangoBlog项目支持将静态文件收集并压缩,放在一个固定的文件夹下,同时使用/static/.*的路由格式访问静态文件。静态文件收集并压缩的命令是之前初始化执行的命令

python manage.py collectstatic --noinput
python manage.py compress --force

由于Django将数据收集到了collectionstatic目录,所以此处我将使用NGINX路由重写实现

location /static/ {
    rewrite ^/static/(.*)$ /collectedstatic/$1 break;
}
图片[24]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺

访问测试

图片[25]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺
© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容