阿里云ECS部署Django全流程与优化实践 1. 项目概述去年夏天我终于决定把积压多年的个人网站计划付诸实践。作为一名Python开发者Django自然成为我的首选框架。但真正开始搭建时才发现从零开始配置服务器环境远比想象中复杂。这篇记录将详细分享我在阿里云ECS服务器上部署Django的完整过程包括那些官方文档没提到的实操细节。2. 环境准备2.1 服务器选择与初始化我选择了阿里云的基础版ECS实例1核2G内存CentOS 7.9系统这个配置足够承载日均5000PV的个人网站。首次登录后立即执行# 更新系统 yum update -y # 安装基础工具 yum install -y vim wget git重要提示务必先配置SSH密钥登录并禁用root密码登录这是服务器安全的第一道防线。具体操作可参考阿里云官方文档《ECS服务器安全配置指南》。2.2 Python环境搭建为避免系统Python版本冲突我选择手动编译安装Python 3.9# 安装依赖 yum install -y gcc openssl-devel bzip2-devel libffi-devel # 下载源码 wget https://www.python.org/ftp/python/3.9.16/Python-3.9.16.tgz tar xzf Python-3.9.16.tgz cd Python-3.9.16 # 编译安装 ./configure --enable-optimizations make altinstall这里使用altinstall而非install是为了保留系统自带的Python2.7避免影响yum等系统工具运行。安装完成后需要手动创建软链接ln -s /usr/local/bin/python3.9 /usr/bin/python3 ln -s /usr/local/bin/pip3.9 /usr/bin/pip33. Django安装与配置3.1 虚拟环境创建使用virtualenv创建独立环境是Python项目的最佳实践pip3 install virtualenv mkdir /opt/myproject cd /opt/myproject virtualenv venv source venv/bin/activate3.2 Django安装与验证在虚拟环境中安装Django 4.1 LTS版本长期支持版更稳定pip install django4.1.8 # 验证安装 python -m django --version创建测试项目验证基础功能django-admin startproject mysite cd mysite python manage.py migrate python manage.py runserver 0.0.0.0:8000此时访问http://服务器IP:8000 应该能看到Django欢迎页面。但注意这仅是开发服务器绝不能用于生产环境4. 生产环境部署4.1 WSGI配置生产环境需要使用WSGI服务器我选择GunicornNginx组合pip install gunicorn # 测试运行 gunicorn --bind 0.0.0.0:8000 mysite.wsgi创建Gunicorn系统服务文件/etc/systemd/system/gunicorn.service[Unit] Descriptiongunicorn daemon Afternetwork.target [Service] Userwww Groupwww WorkingDirectory/opt/myproject/mysite ExecStart/opt/myproject/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/opt/myproject/mysite.sock mysite.wsgi:application [Install] WantedBymulti-user.target4.2 Nginx配置安装Nginx并创建站点配置yum install -y nginx vim /etc/nginx/conf.d/mysite.conf配置文件内容示例server { listen 80; server_name yourdomain.com; location /static/ { alias /opt/myproject/mysite/static/; } location / { include proxy_params; proxy_pass http://unix:/opt/myproject/mysite.sock; } }经验之谈静态文件路径权限是常见坑点务必确保Nginx用户通常是nginx或www-data对static目录有读取权限。5. 数据库配置5.1 MySQL安装虽然Django默认使用SQLite但生产环境建议使用MySQLyum install -y mariadb-server mariadb-devel systemctl start mariadb systemctl enable mariadb mysql_secure_installation安装Python连接器pip install mysqlclient5.2 Django数据库设置修改settings.pyDATABASES { default: { ENGINE: django.db.backends.mysql, NAME: mydatabase, USER: mydbuser, PASSWORD: complexpassword123, HOST: localhost, PORT: 3306, OPTIONS: { init_command: SET sql_modeSTRICT_TRANS_TABLES, } } }6. 安全加固6.1 基础安全措施禁用DEBUG模式DEBUG False设置ALLOWED_HOSTSALLOWED_HOSTS [yourdomain.com, 服务器IP]配置SECRET_KEY环境变量而非硬编码6.2 HTTPS配置使用Certbot免费SSL证书yum install -y certbot python3-certbot-nginx certbot --nginx -d yourdomain.com自动续期测试certbot renew --dry-run7. 常见问题排查7.1 502 Bad Gateway错误可能原因及解决方案Gunicorn未运行systemctl status gunicornSocket文件权限问题chmod 755 /opt/myproject/mysite.sockNginx配置错误nginx -t检查语法7.2 静态文件404检查步骤确认python manage.py collectstatic已执行检查Nginx配置中的alias路径验证目录权限ls -l /opt/myproject/mysite/static7.3 数据库连接失败典型错误信息django.db.utils.OperationalError: (2002, Cant connect to local MySQL server through socket /var/lib/mysql/mysql.sock)解决方法确认MariaDB服务状态systemctl status mariadb检查数据库用户权限GRANT ALL PRIVILEGES ON mydatabase.* TO mydbuserlocalhost IDENTIFIED BY complexpassword123;验证防火墙设置firewall-cmd --list-ports8. 性能优化建议启用Gzip压缩在Nginx配置中添加gzip on;配置缓存使用Memcached或Redis数据库优化添加适当索引定期执行ANALYZE TABLE静态文件CDN将/media和/static目录托管到对象存储整个部署过程最耗时的部分是各种服务的权限配置和调试。建议每完成一个步骤就立即测试相关功能不要等到全部配置完再排查问题。我的个人网站在这个架构下已经稳定运行半年日均响应时间保持在200ms以内。