1. Linux环境下Python3与Django部署全攻略
作为一个长期在Linux环境下折腾Python项目的开发者,我深知从零开始部署Python3+Django环境会遇到多少"坑"。不同于Windows的一键安装体验,Linux环境下的部署往往需要处理依赖冲突、权限管理、环境隔离等一系列问题。本文将基于我在CentOS和Ubuntu两大主流Linux发行版上的实战经验,手把手带你完成从Python3编译安装到Django项目上线的完整流程。
2. 环境准备与Python3安装
2.1 系统基础环境配置
在开始之前,我们需要确保系统具备基本的编译环境。不同Linux发行版的包管理命令略有差异:
# Ubuntu/Debian系 sudo apt update sudo apt install -y build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget # CentOS/RHEL系 sudo yum groupinstall -y "Development Tools" sudo yum install -y openssl-devel bzip2-devel libffi-devel sqlite-devel这些依赖包包含了Python编译所需的头文件和库文件。我曾经因为漏装libffi-dev导致pip安装失败,花了两个小时才排查出问题根源。
2.2 Python3源码编译安装
虽然大多数Linux发行版自带Python2或Python3,但版本往往较旧。我推荐手动编译安装最新稳定版Python3:
wget https://www.python.org/ftp/python/3.9.12/Python-3.9.12.tgz tar -xvf Python-3.9.12.tgz cd Python-3.9.12 ./configure --enable-optimizations make -j$(nproc) sudo make altinstall关键参数说明:
--enable-optimizations:启用优化,提升Python运行效率约10%altinstall:避免覆盖系统默认Python版本-j$(nproc):使用所有CPU核心并行编译
注意:不要使用
make install,这会覆盖系统默认Python链接,可能导致yum等系统工具失效。
验证安装:
python3.9 --version pip3.9 --version3. 虚拟环境与Django安装
3.1 创建项目专用虚拟环境
Python虚拟环境是项目隔离的最佳实践,我强烈建议每个Django项目使用独立环境:
python3.9 -m venv ~/venvs/myproject source ~/venvs/myproject/bin/activate虚拟环境激活后,命令行提示符前会出现(myproject)标记。常见问题:
- 虚拟环境未激活时安装的包会进入全局site-packages
- Windows和Linux的激活命令不同
- 退出虚拟环境使用
deactivate命令
3.2 Django安装与项目创建
在激活的虚拟环境中安装Django:
pip install django==4.0.4为什么选择4.0.4版本?这是当前LTS(Long Term Support)版本,官方支持到2023年12月。创建项目:
django-admin startproject myproject cd myproject python manage.py migrate python manage.py createsuperuser项目结构说明:
myproject/ ├── manage.py # 项目管理脚本 └── myproject/ ├── __init__.py ├── settings.py # 项目配置 ├── urls.py # URL路由 └── wsgi.py # WSGI入口4. 生产环境部署方案
4.1 开发服务器测试
Django自带开发服务器,适合初期测试:
python manage.py runserver 0.0.0.0:8000但请注意:
- 开发服务器性能差,不能用于生产环境
- 默认不处理静态文件
- 没有HTTPS支持
4.2 Nginx + Gunicorn方案
生产环境我推荐Nginx+Gunicorn组合,这是目前最稳定的Django部署方案之一。
4.2.1 安装Gunicorn
pip install gunicorn创建Gunicorn启动脚本gunicorn_start.sh:
#!/bin/bash NAME="myproject" DIR=/home/user/myproject USER=user GROUP=user WORKERS=3 BIND=unix:/run/gunicorn.sock DJANGO_SETTINGS_MODULE=myproject.settings DJANGO_WSGI_MODULE=myproject.wsgi cd $DIR source ~/venvs/myproject/bin/activate exec gunicorn ${DJANGO_WSGI_MODULE}:application \ --name $NAME \ --workers $WORKERS \ --user=$USER \ --group=$GROUP \ --bind=$BIND \ --log-level=debug \ --log-file=-设置可执行权限:
chmod +x gunicorn_start.sh4.2.2 配置Nginx
安装Nginx:
# Ubuntu sudo apt install -y nginx # CentOS sudo yum install -y nginx创建Nginx配置文件/etc/nginx/sites-available/myproject:
server { listen 80; server_name yourdomain.com; location = /favicon.ico { access_log off; log_not_found off; } location /static/ { alias /home/user/myproject/static/; } 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 nginx4.3 静态文件收集
Django开发模式下静态文件由开发服务器处理,生产环境需要单独配置:
# settings.py STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'static')运行收集命令:
python manage.py collectstatic5. 系统服务与自动化
5.1 创建Systemd服务
为了让Gunicorn随系统启动,创建/etc/systemd/system/gunicorn.service:
[Unit] Description=gunicorn daemon After=network.target [Service] User=user Group=user WorkingDirectory=/home/user/myproject ExecStart=/home/user/myproject/gunicorn_start.sh Restart=on-failure [Install] WantedBy=multi-user.target启用服务:
sudo systemctl daemon-reload sudo systemctl start gunicorn sudo systemctl enable gunicorn5.2 日志监控
关键日志位置:
- Gunicorn日志:
/var/log/gunicorn/(需自行配置) - Nginx访问日志:
/var/log/nginx/access.log - Nginx错误日志:
/var/log/nginx/error.log
我习惯使用tail -f实时监控日志:
tail -f /var/log/nginx/error.log6. 安全加固与优化
6.1 基础安全配置
# settings.py DEBUG = False ALLOWED_HOSTS = ['yourdomain.com', 'localhost'] SECURE_HSTS_SECONDS = 3600 SECURE_CONTENT_TYPE_NOSNIFF = True SECURE_BROWSER_XSS_FILTER = True SESSION_COOKIE_SECURE = True CSRF_COOKIE_SECURE = True X_FRAME_OPTIONS = 'DENY'6.2 性能优化建议
- 数据库连接池:
pip install django-db-geventpool- 缓存配置(使用Redis):
CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379/1", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", } } }- Gunicorn调优:
# 根据服务器CPU核心数调整workers WORKERS=$((2 * $(nproc) + 1))7. 常见问题排查
7.1 502 Bad Gateway错误
可能原因及解决方案:
- Gunicorn未运行:
sudo systemctl status gunicorn - Socket文件权限问题:
chmod 777 /run/gunicorn.sock - Nginx配置错误:
sudo nginx -t
7.2 静态文件404
检查:
STATIC_ROOT设置是否正确- Nginx配置中的
alias路径 - 是否执行了
collectstatic
7.3 数据库连接问题
Django默认使用SQLite,如需切换MySQL:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mydatabase', 'USER': 'mydatabaseuser', 'PASSWORD': 'mypassword', 'HOST': 'localhost', 'PORT': '3306', } }记得安装MySQL驱动:
pip install mysqlclient8. 进阶部署方案
8.1 Docker化部署
创建Dockerfile:
FROM python:3.9 ENV PYTHONUNBUFFERED 1 RUN mkdir /code WORKDIR /code COPY requirements.txt /code/ RUN pip install -r requirements.txt COPY . /code/ EXPOSE 8000 CMD ["gunicorn", "--bind", ":8000", "myproject.wsgi:application"]8.2 CI/CD集成
.gitlab-ci.yml示例:
stages: - test - deploy test: stage: test script: - pip install -r requirements.txt - python manage.py test deploy_prod: stage: deploy script: - scp -r . user@server:/home/user/myproject - ssh user@server "cd /home/user/myproject && git pull && source venv/bin/activate && python manage.py migrate && sudo systemctl restart gunicorn" only: - master经过以上步骤,你应该已经拥有了一个稳定运行的Django生产环境。我在实际部署中最常遇到的问题是权限设置和静态文件配置,建议在这两个环节多花些时间测试验证。