Django 从 0 到 1 打造完整电商平台:Nginx + uWSGI 部署 Django 项目
IT策士 10余年一线大厂经验专注 IT 思维、架构、职场进阶。经过 26 篇的扎实开发我们的电商平台已经具备了完整的功能用户系统、商品管理、购物车、订单支付、缓存优化、日志追踪……但这一切都还运行在python manage.py runserver这个开发服务器上仅能在本地访问而且性能极差。今天我们要让项目正式上线让外网也能访问我们的电商平台。我将带大家用Nginx uWSGI这一经典组合来部署 Django 项目。这是 Python Web 部署的标配方案稳定、高效、久经考验。完成本篇后你的电商项目就算真正落地了。一、为什么要用 Nginx uWSGI1.1 Django 开发服务器的局限python manage.py runserver是 Django 内置的开发服务器它的特点单线程或有限的多线程一次只能处理一个请求不处理静态文件虽然配置了static()函数但效率极低没有安全防护不适合暴露在公网官方文档明确警告不要在生产环境使用 runserver。1.2 uWSGI 和 Nginx 的分工用户浏览器 → Nginx反向代理 静态文件→ uWSGIWSGI 应用服务器→ Django业务代码一句话总结uWSGI 负责运行动态 Python 代码Nginx 负责处理静态资源和转发动态请求各司其职高效配合。二、部署架构概览┌─────────────────────────────────────────────────┐ │ Nginx(80/443)│ │ │ │ /static/ ───→ 直接返回静态文件 │ │ /media/ ───→ 直接返回媒体文件 │ │ / ───→ 转发到 uWSGI(127.0.0.1:8001)│ └─────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────┐ │ uWSGI(多进程)│ │ ├─ 进程1: Django 应用 │ │ ├─ 进程2: Django 应用 │ │ ├─ 进程3: Django 应用 │ │ └─...(可配置进程数)│ └─────────────────────────────────────────────────┘三、服务器环境准备3.1 目标环境假设我们有一台运行 Ubuntu 22.04 LTS 的云服务器阿里云 ECS、腾讯云 CVM 等IP 地址为123.456.789.0已通过 SSH 登录。3.2 更新系统并安装基础依赖sudoaptupdatesudoaptupgrade-ysudoaptinstall-ypython3 python3-venv python3-pip python3-dev build-essential libssl-dev libffi-devsudoaptinstall-ygit# 如果通过 Git 拉取代码控制台输出Get:1 http://archive.ubuntu.com/ubuntu jammy InRelease... Setting up python3-venv(3.10.6-1~22.04)... Processing triggersforlibc-bin(2.35-0ubuntu3.1)...3.3 创建项目目录和虚拟环境# 创建部署目录sudomkdir-p/var/www/django_ecommercesudochown$USER:$USER/var/www/django_ecommerce# 进入目录cd/var/www/django_ecommerce# 创建虚拟环境python3-mvenv venvsourcevenv/bin/activate3.4 上传项目代码通过 Git 或 SCP 将项目代码上传到服务器。假设我们使用 Gitgitclone https://your-repo-url.git.# 或# 使用 scp 上传本地项目# scp -r ./django_ecommerce user123.456.789.0:/var/www/如果项目在本地可以使用rsync同步排除虚拟环境和不必要的文件rsync-avz--excludevenv/--exclude.git/--exclude__pycache__/\~/Projects/django_ecommerce/ user123.456.789.0:/var/www/django_ecommerce/3.5 安装项目依赖cd/var/www/django_ecommercesourcevenv/bin/activate pipinstall-rrequirements.txt pipinstalluwsgi# uwsgi 通常单独安装不在 requirements.txt 中控制台输出CollectingDjango4.2Downloading Django-4.2-py3-none-any.whl(8.6MB)... Successfully installed Django-4.2...四、配置生产环境 settings开发环境和生产环境的配置不同我们需要将敏感信息和环境相关配置分离。4.1 创建生产配置文件在django_ecommerce/目录下创建settings_production.pyfrom .settingsimport*# 安全配置 DEBUGFalse ALLOWED_HOSTS[123.456.789.0,www.yourdomain.com,yourdomain.com]# 替换为实际 IP 和域名# 静态文件 # 生产环境下 Nginx 处理静态文件但 Django 需要配置 STATIC_ROOTSTATIC_URL/static/STATIC_ROOTBASE_DIR /staticfiles# 数据库 # 生产环境建议使用 MySQL 或 PostgreSQL# 这里先用 SQLite 演示正式部署请切换DATABASES{default:{ENGINE:django.db.backends.sqlite3,NAME:BASE_DIR /prod_db.sqlite3,# 使用独立的数据库文件}}# Redis 配置 # 服务器上的 Redis 可能需要密码CELERY_BROKER_URLredis://127.0.0.1:6379/0CELERY_RESULT_BACKENDredis://127.0.0.1:6379/1CACHES[default][LOCATION]redis://127.0.0.1:6379/2# 密钥 SECRET_KEY替换为真实密钥# 生产环境必须修改不要用默认的4.2 收集静态文件在项目根目录执行python manage.py collectstatic--settingsdjango_ecommerce.settings_production控制台输出You have requested to collect static files at the destination location as specifiedinyour settings: /var/www/django_ecommerce/staticfiles This will overwrite existing files!Are you sure you want todothis?(yes/no):yes128static files copied to/var/www/django_ecommerce/staticfiles.所有静态文件Bootstrap、CSS、JS、图片都被复制到了staticfiles/目录中供 Nginx 直接访问。五、安装和配置 uWSGI5.1 创建 uWSGI 配置文件在项目根目录创建uwsgi.ini[uwsgi]# 项目目录chdir/var/www/django_ecommerce# Django 的 wsgi 模块moduledjango_ecommerce.wsgi:application# 使用虚拟环境home/var/www/django_ecommerce/venv# 使用生产配置envDJANGO_SETTINGS_MODULEdjango_ecommerce.settings_production# socket 文件通过 Unix socket 与 Nginx 通信推荐socket/var/www/django_ecommerce/django_ecommerce.sock# 或者使用 TCP 端口# socket 127.0.0.1:8001# 工作进程数通常是 CPU 核心数的 2 倍processes4# 线程数threads2# 启用主进程管理mastertrue# 进程 ID 文件pidfile/var/www/django_ecommerce/uwsgi.pid# 日志文件logto/var/www/django_ecommerce/logs/uwsgi.log# 用户权限Nginx 通常以 www-data 用户运行uidwww-data gidwww-data# 设置 socket 权限chmod-socket666# 自动清理 socket 文件vacuumtrue# 进程最大请求数防内存泄漏max-requests5000# 请求超时时间harakiri30# 缓冲区大小buffer-size327685.2 测试 uWSGI 是否正常工作# 创建日志目录mkdir-p/var/www/django_ecommerce/logs# 启动 uWSGI前台运行测试uwsgi--iniuwsgi.ini控制台输出[uWSGI]getting INI configuration from uwsgi.ini *** Starting uWSGI2.0.23(64bit)on[Wed May2710:00:002026]*** compiled with version:11.4.0 on26May202610:30:00... spawned uWSGI master process(pid:12345)spawned uWSGI worker1(pid:12346, cores:2)spawned uWSGI worker2(pid:12347, cores:2)spawned uWSGI worker3(pid:12348, cores:2)spawned uWSGI worker4(pid:12349, cores:2)看到 4 个 worker 进程启动说明 uWSGI 配置正确。按CtrlC停止前台运行我们后面会用systemd或supervisor管理。六、安装和配置 Nginx6.1 安装 Nginxsudoaptinstall-ynginx安装后 Nginx 自动启动访问服务器 IP 应该能看到 Nginx 欢迎页面。6.2 创建 Nginx 站点配置在/etc/nginx/sites-available/下创建配置文件django_ecommercesudonano/etc/nginx/sites-available/django_ecommerce写入以下配置# 80 端口 HTTP 服务server{listen80;server_name123.456.789.0 yourdomain.com www.yourdomain.com;# 替换为实际 IP 和域名# 日志access_log /var/log/nginx/django_ecommerce_access.log;error_log /var/log/nginx/django_ecommerce_error.log;# 静态文件location /static/{alias/var/www/django_ecommerce/staticfiles/;expires 30d;# 静态文件缓存 30 天}# 媒体文件location /media/{alias/var/www/django_ecommerce/media/;expires 7d;}# 动态请求转发到 uWSGIlocation /{include uwsgi_params;uwsgi_pass unix:///var/www/django_ecommerce/django_ecommerce.sock;# 如果使用 TCP 端口# uwsgi_pass 127.0.0.1:8001;}# 上传文件大小限制client_max_body_size 10M;}6.3 启用站点# 创建软链接到 sites-enabledsudoln-s/etc/nginx/sites-available/django_ecommerce /etc/nginx/sites-enabled/# 删除默认站点可选sudorm/etc/nginx/sites-enabled/default# 测试配置文件是否正确sudonginx-t控制台输出nginx: the configurationfile/etc/nginx/nginx.conf syntax is ok nginx: configurationfile/etc/nginx/nginx.conftestis successful6.4 重载 Nginxsudosystemctl reload nginx控制台输出Reloading A high performance web server and a reverse proxy server.七、使用 systemd 管理 uWSGI为了让 uWSGI 在后台持续运行并在服务器重启后自动启动我们使用systemd管理。7.1 创建 systemd 服务文件sudonano/etc/systemd/system/uwsgi_django.service内容[Unit]DescriptionuWSGI daemonforDjango EcommerceAfternetwork.target[Service]Userwww-dataGroupwww-dataWorkingDirectory/var/www/django_ecommerceExecStart/var/www/django_ecommerce/venv/bin/uwsgi--ini/var/www/django_ecommerce/uwsgi.iniExecStop/var/www/django_ecommerce/venv/bin/uwsgi--stop/var/www/django_ecommerce/uwsgi.pidRestartalwaysRestartSec5KillSignalSIGQUITTypenotifyNotifyAccessallStandardErrorsyslogStandardOutputsyslog[Install]WantedBymulti-user.target7.2 启动 uWSGI 服务sudosystemctl daemon-reloadsudosystemctl start uwsgi_djangosudosystemctlenableuwsgi_django# 开机自启检查服务状态sudosystemctl status uwsgi_django控制台输出● uwsgi_django.service - uWSGI daemonforDjango Ecommerce Loaded: loaded(/etc/systemd/system/uwsgi_django.service;enabled)Active: active(running)since Wed2026-05-2710:30:00 UTC;1min ago Main PID:12345(uwsgi)Tasks:5(limit:1137)Memory:120.0M CGroup: /system.slice/uwsgi_django.service ├─12345 /var/www/django_ecommerce/venv/bin/uwsgi--ini... ├─12346 /var/www/django_ecommerce/venv/bin/uwsgi--ini... ├─12347 /var/www/django_ecommerce/venv/bin/uwsgi--ini... ├─12348 /var/www/django_ecommerce/venv/bin/uwsgi--ini... └─12349 /var/www/django_ecommerce/venv/bin/uwsgi--ini...Active: active (running)表示一切正常。八、初始化生产数据库cd/var/www/django_ecommercesourcevenv/bin/activate# 执行迁移python manage.py migrate--settingsdjango_ecommerce.settings_production# 创建超级管理员python manage.py createsuperuser--settingsdjango_ecommerce.settings_production# 初始化商品数据python manage.py init_product_data--settingsdjango_ecommerce.settings_production控制台输出Operations to perform: Apply all migrations: admin, auth, cart, contenttypes, orders, payment, products, sessions,usersRunning migrations: Applying contenttypes.0001_initial... OK... Applying users.0001_initial... OK Superuser created successfully. 开始初始化数据... 分类创建完成 SPU 创建完成 SKU 创建完成 初始化完成九、启动 Celery Worker后台运行生产环境的 Celery 也需要使用systemd管理。9.1 创建 Celery 服务文件sudonano/etc/systemd/system/celery_django.service内容[Unit]DescriptionCelery WorkerforDjango EcommerceAfternetwork.target redis-server.service[Service]Userwww-dataGroupwww-dataWorkingDirectory/var/www/django_ecommerceEnvironmentDJANGO_SETTINGS_MODULEdjango_ecommerce.settings_productionExecStart/var/www/django_ecommerce/venv/bin/celery-Adjango_ecommerce worker-linfo-QceleryExecStop/bin/kill-sTERM$MAINPIDRestartalwaysRestartSec5[Install]WantedBymulti-user.target启动sudosystemctl daemon-reloadsudosystemctl start celery_djangosudosystemctlenablecelery_django十、测试完整部署10.1 确认所有服务运行sudosystemctl status nginxsudosystemctl status uwsgi_djangosudosystemctl status celery_djangosudosystemctl status redis-server都应该是active (running)。10.2 浏览器访问在浏览器输入服务器 IP 地址http://123.456.789.0/你将看到电商平台首页样式、图片正常加载。10.3 测试静态文件访问http://123.456.789.0/static/css/bootstrap.min.css应返回 Bootstrap CSS 文件内容。终端日志Nginx access logsudotail-f/var/log/nginx/django_ecommerce_access.log输出123.456.789.0 - -[27/May/2026:10:35:20 0000]GET / HTTP/1.12004567123.456.789.0 - -[27/May/2026:10:35:20 0000]GET /static/css/bootstrap.min.css HTTP/1.1200232148123.456.789.0 - -[27/May/2026:10:35:20 0000]GET /static/js/bootstrap.bundle.min.js HTTP/1.12008024510.4 测试动态请求登录、浏览商品、下单、支付沙箱功能应与本地开发环境一致。十一、常见问题与排查11.1 502 Bad Gateway原因Nginx 无法连接到 uWSGI。排查步骤# 检查 uWSGI 是否运行sudosystemctl status uwsgi_django# 检查 socket 文件是否存在ls-la/var/www/django_ecommerce/django_ecommerce.sock# 查看 uWSGI 日志tail-f/var/www/django_ecommerce/logs/uwsgi.log11.2 静态文件 404原因Nginx 没有正确配置静态文件路径。排查步骤# 检查静态文件目录是否存在ls/var/www/django_ecommerce/staticfiles/# 检查 Nginx 配置中 alias 路径sudonginx-t11.3 503 Service Unavailable原因uWSGI worker 崩溃或请求超时。解决办法增加processes和harakiri值检查 Django 日志是否有异常。十二、总结与下集预告今天我们成功将电商项目部署到了生产环境理解了 Nginx uWSGI 的部署架构和各自角色准备了 Linux 服务器环境安装了 Python 虚拟环境创建了生产配置文件收集了静态文件编写了 uWSGI 和 Nginx 配置文件通过 Unix socket 通信使用 systemd 管理 uWSGI 和 Celery 进程实现开机自启和崩溃重启完成了生产数据库初始化和功能测试。现在世界各地的用户都可以访问你的电商平台了但还有一个问题访问地址是 HTTP 明文传输数据和支付信息不够安全。第 28 篇我将带大家用Docker 容器化电商项目让部署更加标准化、可移植。而 HTTPS 安全证书和域名绑定将在第 29 篇详细讲解。想了解更多也可以任意平台搜索「IT策士」一起升级 IT 思维 本文为《Django 从 0 到 1 打造完整电商平台》系列第 27 篇作者IT策士未经授权禁止转载。