环境搭建——Linux 下部署 Django 环境

Django

Posted by xiaochao on January 6, 2019

安装基础环境

安装 Nginx

yum install nginx

安装完成后,执行如下命令来启动 Nginx

systemctl start nginx.service

systemctl enable nginx.service

安装 Python 环境

yum install https://centos7.iuscommunity.org/ius-release.rpm -y 

yum install python36u  -y

yum install python36u-pip python36u-devel  -y

配置 Python PIP 的清华镜像

mkdir ~/.config/pip/pip.conf

编辑pip.conf

vim /root/.config/pip/pip.conf

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

安装 MySQL

yum install mariadb mariadb-server -y 
systemctl start mariadb.service
systemctl enable mariadb.service

安装完成后,执行如下命令来进行 mariadb 的初始化,并根据提示设置 root 的密码(默认密码为空)

mysql_secure_installation

初始化 Python 项目

初始化虚拟环境

为了不影响外界环境的清洁,所以我们使用虚拟环境来配置 Django 项目

cd /home/
mkdir django
cd django
python3.6 -m venv venv

创建完成后,执行命令,进入虚拟环境

source venv/bin/activate

然后在虚拟环境中安装 django 并初始化项目

pip install django
django-admin startproject my
cd my 
python manage.py startapp mine  

预览项目

创建完成 App 后,我们需要修改 my/settings.py 使 Django 能处理来做所有域名中的请求

    """
Django settings for my project.

Generated by 'django-admin startproject' using Django 2.0.5.

For more information on this file, see
https://docs.djangoproject.com/en/2.0/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.0/ref/settings/
"""

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '^p3prd2a*$y-#n%jy2#@)setwu(1+yv#2kas4l*4r5_ss&+3zm'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = ['*']


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'my.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'my.wsgi.application'


# Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


# Password validation
# https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME':     'django.contrib.auth.password_validation.NumericPasswordValidator',
        },
    ]


# Internationalization
# https://docs.djangoproject.com/en/2.0/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.0/howto/static-files/

STATIC_URL = '/static/'

修改完成后,执行如下命令来启动 Django 的测试服务器。

配置 Uwsgi

安装 Uwsgi

deactivate

接下来,我们来安装配置 Uwsgi

yum install gcc -y
python3.6 -m pip install uwsgi  

测试 Uwsgi

执行如下命令,测试使用 uwsgi 来启动 django

uwsgi --http :80 --chdir /home/django/my --home=/home/django/venv --module my.wsgi

配置 Uwsgi

首先,我们来创建一个目录用于存放 Django 的配置文件

然后在这个目录下创建一个文件 uwsgi.ini

[uwsgi]
socket = /home/django_conf/my.sock
chdir = /home/django/my
wsgi-file = my/wsgi.py
plugins = python
virtualenv = /home/django/venv/
processes = 2
threads = 4
chmod-socket = 664
chown-socket = nginx:nginx
vacuum = true

配置 Nginx

配置完成 Uwsgi 后,我们来创建 Nginx 的配置文件(/etc/nginx/conf.d/my.conf)

server {
    listen      80;
    server_name asm100.com;
    charset     utf-8;

    client_max_body_size 75M;

    location /media  {
        alias /home/django/my/media;
    }

    location /static {
        alias /home/django/my/static;
    }

    location / {
        uwsgi_pass  unix:///home/django_conf/my.sock;
        include     /etc/nginx/uwsgi_params;
    }
}

然后,重启 Nginx

systemctl restart nginx.service

配置 Supervisord

接下来,我们来配置 Supervisord ,确保我们的 django 可以持久运行 首先,我们要安装 pip ,用来安装 Supervisord。

yum install python-pip -y

安装完成后,我们使用 pip 来安装 supervisord,并输出配置文件

python -m pip install supervisor
echo_supervisord_conf > /etc/supervisord.conf

并在配置文件(/etc/supervisord.conf)底部添加如下代码

[program:my]
command=/usr/bin/uwsgi --ini /home/django_conf/uwsgi.ini
directory=/home/django/my
startsecs=0
stopwaitsecs=0
autostart=true
autorestart=true

添加完成后,执行如下命令来启动 supervisord