奋斗
努力

ubuntu 22.04系统部署web服务器python + Django+mysql?

云计算

在 Ubuntu 22.04 上部署 Python + Django + MySQL 的 Web 服务器,通常采用 Nginx + Gunicorn (WSGI) + MySQL 的经典架构。这种组合稳定、高效且易于维护。

以下是完整的分步部署指南:

1. 系统更新与基础环境安装

首先更新软件包列表并安装必要的依赖(Python3, pip, MySQL 客户端库等)。

sudo apt update && sudo apt upgrade -y

# 安装 Python3, pip, git, 编译工具以及 MySQL 开发库
sudo apt install python3-pip python3-venv python3-dev libmysqlclient-dev nginx mysql-server mysql-client -y

注意:Ubuntu 22.04 默认已预装较新的 Python 版本,但为了安全起见,建议通过 apt 安装 python3-venv 来创建虚拟环境。

2. 配置 MySQL 数据库

启动 MySQL 服务并初始化安全设置:

sudo systemctl start mysql
sudo systemctl enable mysql
sudo mysql_secure_installation

按照提示设置 root 密码,并删除匿名用户、禁止远程 root 登录等。

创建项目数据库和用户

登录 MySQL 命令行:

sudo mysql -u root -p

执行以下 SQL 语句(请替换为你自己的数据库名、用户名和密码):

-- 创建数据库
CREATE DATABASE myproject_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 创建用户并授权
CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON myproject_db.* TO 'myuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

3. 准备 Django 项目

使用虚拟环境隔离项目依赖,避免污染系统 Python。

# 创建项目目录
mkdir ~/myproject
cd ~/myproject

# 创建虚拟环境
python3 -m venv venv

# 激活虚拟环境
source venv/bin/activate

# 升级 pip
pip install --upgrade pip

# 安装 Django 和 MySQL 驱动 (mysqlclient)
# 注意:如果安装 mysqlclient 报错,确保已安装 libmysqlclient-dev
pip install django mysqlclient gunicorn

生成 Django 项目

django-admin startproject myproject .
python manage.py migrate
python manage.py createsuperuser

配置 settings.py

编辑 myproject/settings.py,找到 DATABASES 部分进行修改:

import os
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

SECRET_KEY = 'your-secret-key-here' # 生产环境请使用随机生成的密钥

DEBUG = False  # 生产环境必须为 False

ALLOWED_HOSTS = ['your_domain.com', 'localhost', '127.0.0.1'] # 替换为你的域名或 IP

# ... 其他配置 ...

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'myproject_db',
        'USER': 'myuser',
        'PASSWORD': 'StrongPassword123!',
        'HOST': 'localhost',
        'PORT': '3306',
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
        },
    }
}

收集静态文件(Django 生产环境必备):

python manage.py collectstatic

4. 配置 Gunicorn (应用服务器)

Gunicorn 负责将 Django 请求转发给 Nginx。我们需要创建一个 systemd 服务文件以便后台运行。

sudo nano /etc/systemd/system/gunicorn.service

填入以下内容(路径需根据实际调整):

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=ubuntu          # 或者你的当前用户名
Group=www-data       # 确保有权限访问项目目录
WorkingDirectory=/home/ubuntu/myproject
Environment="PATH=/home/ubuntu/myproject/venv/bin"
ExecStart=/home/ubuntu/myproject/venv/bin/gunicorn 
          --access-logfile - 
          --workers 3 
          --bind unix:/home/ubuntu/myproject/gunicorn.sock 
          myproject.wsgi:application

[Install]
WantedBy=multi-user.target

重要:请将 User=ubuntu 替换为你当前的 Linux 用户名。

启动并启用服务:

sudo systemctl start gunicorn
sudo systemctl enable gunicorn
sudo systemctl status gunicorn

5. 配置 Nginx (反向X_X)

Nginx 作为前端 Web 服务器,处理静态文件并将动态请求转发给 Gunicorn。

创建站点配置

sudo nano /etc/nginx/sites-available/myproject

填入以下配置(注意修改域名和静态文件路径):

server {
    listen 80;
    server_name your_domain.com www.your_domain.com; # 替换为你的域名或 IP

    location /static/ {
        alias /home/ubuntu/myproject/staticfiles/; # 对应 collectstatic 后的目录
    }

    location /media/ {
        alias /home/ubuntu/myproject/media/; # 如果有上传媒体文件
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/ubuntu/myproject/gunicorn.sock;

        # 可选:优化 WebSocket 支持
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

启用站点并重启 Nginx

# 创建软链接
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/

# 测试配置语法
sudo nginx -t

# 如果测试通过,重启 Nginx
sudo systemctl restart nginx

6. 防火墙与安全配置

Ubuntu 默认可能未开启防火墙,建议使用 ufw 管理。

# 允许 SSH, HTTP (80), HTTPS (443)
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
# 如果只使用 HTTP,也可以只允许 Nginx HTTP
# sudo ufw allow 'Nginx HTTP'

# 启用防火墙
sudo ufw enable

7. 验证部署

  1. 检查服务状态
    sudo systemctl status gunicorn
    sudo systemctl status nginx
  2. 浏览器访问
    在浏览器中输入 http://your_server_iphttp://your_domain.com。你应该能看到 Django 的欢迎页面或你自定义的首页。
  3. 测试数据库连接
    确保 settings.py 中的数据库配置正确,且能正常迁移数据。

8. 进阶:HTTPS (SSL 证书)

生产环境强烈建议使用 HTTPS。可以使用 Certbot 免费获取 Let’s Encrypt 证书。

# 安装 Certbot 插件
sudo apt install certbot python3-certbot-nginx

# 自动申请并配置证书
sudo certbot --nginx -d your_domain.com -d www.your_domain.com

运行过程中按提示输入邮箱,Certbot 会自动修改 Nginx 配置并重载服务,同时强制跳转 HTTPS。


常见问题排查

  • MySQL 连接失败
    • 检查 settings.py 中的 HOST 是否为 localhost
    • 确认 MySQL 用户是否有 localhost 权限('myuser'@'localhost'),而不是 'myuser'@'%'
    • 如果是 Docker 环境,HOST 应改为容器名称或宿主机 IP。
  • Permission Denied (权限错误)
    • 确保 gunicorn 运行的用户(通常是当前登录用户)对 /home/ubuntu/myproject 目录有读写权限。
    • 命令:sudo chown -R $USER:$USER /home/ubuntu/myproject
  • Gunicorn 无法启动
    • 查看日志:sudo journalctl -u gunicorn -f
    • 检查虚拟环境是否激活,路径是否正确。

至此,你的 Ubuntu 22.04 Django + MySQL 生产环境已部署完成。

未经允许不得转载:云服务器 » ubuntu 22.04系统部署web服务器python + Django+mysql?