您好,登录后才能下订单哦!
# 基于Ubuntu通过Nginx部署Django
## 前言
在现代Web开发中,Django作为Python最流行的Web框架之一,以其"开箱即用"的特性和强大的功能受到开发者青睐。而Nginx作为高性能的Web服务器和反向代理服务器,能够有效处理高并发请求。本文将详细介绍如何在Ubuntu系统上通过Nginx部署Django项目,涵盖从环境准备到生产环境配置的全过程。
## 一、环境准备
### 1.1 系统要求
- Ubuntu Server 20.04 LTS 或 22.04 LTS(推荐)
- 至少1GB RAM(生产环境建议2GB以上)
- 至少10GB可用磁盘空间
- 已配置sudo权限的用户
### 1.2 更新系统包
在开始之前,首先更新系统软件包:
```bash
sudo apt update
sudo apt upgrade -y
安装后续步骤所需的工具:
sudo apt install -y curl wget git build-essential
Ubuntu通常预装Python,但可能需要特定版本:
sudo apt install -y python3 python3-pip python3-venv
验证安装:
python3 --version
pip3 --version
为项目创建隔离的Python环境:
mkdir ~/django_project
cd ~/django_project
python3 -m venv venv
source venv/bin/activate
激活虚拟环境后,提示符前会显示(venv)
。
在虚拟环境中安装Django:
pip install django gunicorn
验证安装:
django-admin --version
创建新项目(或使用已有项目):
django-admin startproject myproject
cd myproject
编辑myproject/settings.py
:
# 修改ALLOWED_HOSTS
ALLOWED_HOSTS = ['your_domain_or_ip', 'localhost', '127.0.0.1']
# 静态文件配置
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
# 生产环境需设置DEBUG=False
DEBUG = False
运行开发服务器测试:
python manage.py runserver 0.0.0.0:8000
访问http://your_server_ip:8000
应能看到Django欢迎页面。
Django支持多种数据库,生产环境推荐PostgreSQL:
sudo apt install -y postgresql postgresql-contrib libpq-dev
sudo -u postgres psql
在PostgreSQL控制台中:
CREATE DATABASE myprojectdb;
CREATE USER myprojectuser WITH PASSWORD 'mypassword';
ALTER ROLE myprojectuser SET client_encoding TO 'utf8';
ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE myprojectuser SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE myprojectdb TO myprojectuser;
\q
安装psycopg2适配器:
pip install psycopg2-binary
修改settings.py
中的DATABASES配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'myprojectdb',
'USER': 'myprojectuser',
'PASSWORD': 'mypassword',
'HOST': 'localhost',
'PORT': '',
}
}
迁移数据库:
python manage.py migrate
Gunicorn将作为应用服务器:
gunicorn --bind 0.0.0.0:8000 myproject.wsgi
创建systemd服务文件:
sudo nano /etc/systemd/system/gunicorn.service
内容如下:
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=your_username
Group=www-data
WorkingDirectory=/home/your_username/django_project/myproject
ExecStart=/home/your_username/django_project/venv/bin/gunicorn \
--access-logfile - \
--workers 3 \
--bind unix:/run/gunicorn.sock \
myproject.wsgi:application
[Install]
WantedBy=multi-user.target
启动并启用服务:
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
检查状态:
sudo systemctl status gunicorn
sudo apt install -y nginx
创建Nginx配置文件:
sudo nano /etc/nginx/sites-available/myproject
内容如下:
server {
listen 80;
server_name your_domain_or_ip;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/your_username/django_project/myproject;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
}
启用配置:
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
sudo nginx -t # 测试配置
sudo systemctl restart nginx
允许HTTP流量:
sudo ufw allow 'Nginx Full'
Django需要收集静态文件供Nginx直接服务:
python manage.py collectstatic
使用Let’s Encrypt免费证书:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d your_domain
不要将敏感信息直接写在代码中,推荐使用python-decouple或django-environ:
pip install python-decouple
创建.env
文件:
SECRET_KEY=your_secret_key
DEBUG=False
DB_NAME=myprojectdb
DB_USER=myprojectuser
DB_PASSWORD=mypassword
修改settings.py
:
from decouple import config
SECRET_KEY = config('SECRET_KEY')
DEBUG = config('DEBUG', cast=bool)
# 在http块中添加
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m;
server {
# ... 原有配置 ...
location / {
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
# ... 其他配置 ...
}
}
创建gunicorn_conf.py
:
import multiprocessing
bind = "unix:/run/gunicorn.sock"
workers = multiprocessing.cpu_count() * 2 + 1
worker_class = "gthread"
threads = 3
max_requests = 1000
max_requests_jitter = 50
timeout = 30
keepalive = 2
更新systemd服务文件中的ExecStart:
ExecStart=/path/to/venv/bin/gunicorn -c /path/to/gunicorn_conf.py myproject.wsgi:application
查看Nginx日志:
sudo tail -f /var/log/nginx/error.log
查看Gunicorn日志:
sudo journalctl -u gunicorn -f
考虑使用Fabric或Ansible自动化部署流程。
设置定期数据库备份:
# 每日备份
sudo crontab -e
添加:
0 3 * * * pg_dump -U myprojectuser -h localhost myprojectdb > /backups/myprojectdb_$(date +\%Y\%m\%d).sql
502 Bad Gateway错误:
sudo systemctl status gunicorn
静态文件不加载:
collectstatic
已执行数据库连接问题:
settings.py
中的数据库配置临时开启Django调试模式:
DEBUG = True
然后重启Gunicorn:
sudo systemctl restart gunicorn
安装Channels:
pip install channels
安装Celery:
pip install celery redis
可以配置多个Gunicorn工作节点,并使用Nginx进行负载均衡。
通过本文的详细步骤,您已经成功在Ubuntu系统上使用Nginx和Gunicorn部署了Django应用。这种架构结合了Nginx的高性能静态文件服务和反向代理能力,以及Gunicorn的稳定WSGI服务能力,能够满足大多数生产环境的需求。
记住,生产环境的部署是一个持续优化的过程,需要根据实际流量和性能需求不断调整配置。建议定期更新系统软件包,监控服务器资源使用情况,并根据需要进行扩展。
管理Gunicorn服务:
sudo systemctl [start|stop|restart|status] gunicorn
管理Nginx服务:
sudo systemctl [start|stop|restart|reload|status] nginx
更新Let’s Encrypt证书:
sudo certbot renew
希望本文能为您提供全面的Django生产环境部署指导。随着项目的发展,您可能需要考虑容器化部署(Docker)、云服务集成等更高级的主题,这些都可以在现有架构基础上逐步实现。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。