用django开发项目的时候,都是用debug=True模式运行,所以静态文件都是django去处理。在实际项目中,还是需要多线程以及专门处理静态文件的服务来配合,才能提升整个系统的性能。因此,可以选用nginx+uwsgi+django的架构进行部署。

前期准备

  1. 安装nginx
  2. 安装python
  3. git(可以不用)

一、安装virtualenv

建议大家都使用virtualenv,方便不同项目不同的包版本不同导致冲突。不了解的同学可以先去了解下

pip3 install virtualenv

添加到环境变量并建立软链接

ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv

二、项目代码部署到服务器

进入到服务器项目部署目录

cd /www/deploy/

git 拉取代码

# 这是我的项目 你的要换成你的
git clone [email protected]:kingofzihua/django.git django/master
# ps: 项目代码的路径为 /www/deploy/django/master 个人习惯,你可以用你自己喜欢的方式

项目目录结构分析

每个项目的目录结构可能不一样,我的项目是自定义的,我在这里稍微说下,不然可能会犯晕

cd  /www/deploy/django/master # 进入项目根路径
tree -L 2 # tree命令找不到的话 就 yum install tree -y 安装下 -L 参数是显示几级目录
.
├── app #项目的目录
│   ├── comm
│   ├── index # index 模块
│   ├── __init__.py
├── bootstrap # 这个就是 django创建的那个很重要的目录
│   ├── __init__.py
│   ├── settings.py # 设置文件
│   ├── urls.py # url文件
│   └── wsgi.py #wsgi文件
├── config # 配置文件
│   ├── mysql.conf.example #mysql的配置文件 我是用 文件包含的方式,并没有在 settings中配置
│   └── uwsgi.xml.example #wsgi的配置文件 内容在下面
├── data # 导出的模块数据存放的目录 `python manage.py dumpdata`
│   └── models.json
├── manage.py
├── requirements.txt # 项目依赖
├── static # 静态文件存放路径
│   ├── js
│   ├── css
├── storage # 一些其他资源文件存放目录
│   └── logs # 日志目录
├── templates # 模版文件
│   ├── inclusion_tag
│   ├── index

三、创建并启动虚拟环境

创建指定版本的虚拟环境

cd  /www/deploy/django/master # 进入项目根路径
virtualenv --python=/usr/bin/python3 venv

启动虚拟环境

cd  /www/deploy/django/master # 进入项目根路径
source venv/bin/activate # 
# 这个时候你的命令行应该是这个样子的
# (venv) [root@localhost master]        # 前面多了一个 (venv)

四、部署项目

安装项目依赖

pip install -r requirements.txt

安装uwcgi

pip install uwcgi

修改数据库配置文件并进行数据填充

修改数据库配置文件:

根据你的配置文件 修改成正确的就行

数据填充:

python manage.py migrate

修改项目文件

bootstrap/settings.py:

DEBUG = False # 关闭DEBUG模式

ALLOWED_HOSTS = ['*'] # 表示此Django站点可以投放的主机/域名的字符串列表

创建uwcgi的配置文件

创建文件/www/deploy/django/master/config/uwsgi.xml写入一下内容:

<uwsgi>
    <socket>127.0.0.1:8080</socket> <!-- 内部端口,自定义 -->
    <chdir>/www/deploy/django/master/</chdir> <!-- 项目路径 -->
    <module>bootstrap.wsgi</module>  <!-- bootstrap为wsgi.py所在目录名-->
    <processes>4</processes> <!-- 进程数 -->
    <daemonize>storage/logs/uwsgi.log</daemonize> <!-- 日志文件 -->
</uwsgi>

创建nginx的配置文件

创建文件/etc/nginx/conf.d/django.conf 并写入一下内容:

server {
    listen       80;
    server_name  blog.kingofzihua.top; # 你的域名 或者ip

    charset utf-8;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        include uwsgi_params; # 引入uwsgi模块的文件
        uwsgi_pass 127.0.0.1:8080; # 端口要和uwsgi里配置的一样
        uwsgi_param UWSGI_SCRIPT bootstrap.wsgi; # wsgi.py所在的目录名+.wsgi 注意看我的目录结构
        uwsgi_param UWSGI_CHDIR /www/deploy/django/master; # #项目路径
    }

    location /static/ {
        alias /www/deploy/django/master/static; # 静态资源访问路径
    }
}

查看配置文件是否正确:

nginx -tc /etc/nginx/nginx.conf

检查如果输出下面这样就说明配置文件没有语法错误

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

启动 uwcgi并重启 nginx

cd /www/deploy/django/master
uwsgi -x config.uwcgi.xml # 启动uwcgi
nginx -s reload # 重启nginx 使得 配置文件生效

访问你的域名

浏览器打开你的域名查看项目部署情况

几个关键的文件配置

django database

bootstrap/settings.py

# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            'read_default_file': os.path.join(BASE_DIR, 'config/mysql.conf'),
            # 设定sql_mode
            # https://docs.djangoproject.com/en/2.1/ref/databases/#mysql-sql-mode
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"
        },
    }
}

config/mysql.conf

[client]
host = 127.0.0.1
port = 3306
database = platform
user = root
password = root
default-character-set = utf8mb4

uwcgi 配置

config/uwsgi.xml

<uwsgi>
    <socket>127.0.0.1:8001</socket> <!-- 内部端口,自定义 -->
    <chdir>/you/path/django/</chdir> <!-- 项目路径 -->
    <module>bootstrap.wsgi</module>  <!-- bootstrap为wsgi.py所在目录名-->
    <processes>4</processes> <!-- 进程数 -->
    <daemonize>storage/logs/uwsgi.log</daemonize> <!-- 日志文件储存位置 -->
</uwsgi>

@ django中文网