Django 部署

本节内容

  • Django项目配置

  • 准备CentOS+Python+Nginx环境

  • Django 生产部署理论

  • Nginx+Gunicorn+Django生产部署

  • Nginx+uWSGI+Django生产部署

一   Django项目配置

1.  关闭Debug模式

用命令 django-admin.py startproject 创建了一个项目,其中settings的DEBUG设置默认为True,

Django会根据这个设置来改变相应的行为,Debug设置为True意味着:

  • 所有的数据库查询将被保存在内存中,以django.db.connection.queries的形式,占用内存

  • 任何404错误都将呈现django的特殊404页面,这个页面包含敏感信息

  • 应用中任何捕获的异常,从基本的Python语法错误到数据库错误以及模板语法错误都会返回到Django错误页面,暴露敏感信息

所以 “DEBUG”设置为“False”

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

ALLOWED_HOSTS = ['*']

2.  实现一个404模板

当 “DEBUG”设置为“False”,显示404错误页面时,回去模板的根目录中寻找 “404.html”的模板

3.  实现一个500模板

类似404页面,在模板的根目录下新增“500.html”页面

 

二   准备CentOS+Python+Nginx环境

测试环境: 

CentOS  7.3

Python 3.6.1

Virtualenv

Nginx 1.10.2

系统环境准备

1.  禁用防火墙

  • systemctl stop firewalld.service        # 关闭防火墙

  • systemctl disable firewalld.service   # 禁止防火墙开机启动

2.  禁用selinux    vim /etc/sysconfig/selinux   -->  SELINUX=disabled

3.  配置IP地址

编译安装 Python 3.6.1

1.  安装依赖包

# yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel sqlite-devel

2.  编译安装 Python 3.6.1 

"""
mkdir /application
cd   /application
wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz
tar -zxvf Python-3.6.1.tgz
cd Python-3.6.1
./configure --prefix=/usr/local/python3
make && make install
ln -s /usr/local/python3/bin/python3  /usr/bin/python3
"""

3.  配置Python3 路径

# vim ~/.bash_profile

# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin:/usr/local/python3/bin
export PATH

# source ~/.bash_profile

4.  检查python3和pip3是否安装正确

[root@localhost Python-3.6.1]# python3 -V
Python 3.6.1
[root@localhost Python-3.6.1]# pip3 -V
pip 9.0.1 from /usr/local/python3/lib/python3.6/site-packages (python 3.6)

virtualenv 安装与使用

pip3 install virtualenv
mkdir /usr/local/envs # 创建存储环境的总目录
cd /usr/local/envs
virtualenv env_jms    # 存储具体的应用环境
cd env_jms
source bin/activate   # 启动,注意提示名的变化
deactivate            # 退出

在虚拟环境中可以安装各种第三方包,注意虚拟环境中为 pip

补充pip 常用命令:

1.  查看当前虚拟环境安装的第三方包信息

# pip freeze 

(env_jms) [root@localhost env_jms]# pip freeze
Django==1.11.5
djangorestframework==3.6.4
pytz==2017.2
(env_jms) [root@localhost env_jms]# 

2.  将当前虚拟环境安装的第三包信息导出到文件

# pip freeze > requirements.txt

3.  批量安装requirements.txt文件中的第三方包

# pip install -r requirements.txt

4.  为具体项目创建虚拟环境,并批量安装第三方包

yum install -y git 
makedir /usr/local/projects
cd /usr/local/projects/
git clone https://github.com/ibuler/jms.git
cd jms
virtualenv env_jms
source  env_jms/bin/activate
pip install -r requirements.txt   # 注意所在目录
pip freeze # 查看是否正确安装第三方包
python manage.py runserver 0.0.0.0:8080 # 运行django测试

 

Nginx 安装

说明:Apache和Nginx都是基于http协议来传输超文本,提供web服务。Apache功能较多,比较重,

而Nginx专注web服务,轻量级,采用不同的网络IO,epoll模型,效率高(处理速度快,并发高)

测试版本 nginx 1.10.2

 

安装方式一:yum 安装

1.  安装扩展源,nginx软件

# yum install -y epel-release

# yum install -y nginx

2.  修改配置文件

vim  /etc/nginx/nginx.conf

root  /usr/share/nginx/html --> 根目录

3.  启动服务

systemctl start nginx

user nginx;             # 用户 nginx
worker_processes auto;  # 扫描CPU核数,开并发进程数
error_log  /var/log/nginx/error.log;  # 错误日志文件
pid  /run/nginx.pid;    # pid文件

include /usr/share/nginx/modules/*.conf;  # 扩展模块包

events{
    workder_connections 1024;  # 进程资源单位,线程执行单位,该配置表示一个进程下启动的线程数
}

http {
    log_format main xxxxxx;    # 定义日志格式
    access_log  /var/log/nginx/access.log  main; # 访问日志,按照main定义的格式
    
    ...... # 各种优化参数

    include /etc/nginx/conf.d/*.conf;  # 导入额外配置


    # 学习的重点
    server {
    listen  80 default_server;
    listen  [::]:80 default_server;
    server_name ;
    root    /usr/share/nginx/html;  # 网站访问文件的根目录
    
    include /etc/nginx/default.d/*.conf  # 导入额外配置
    
    location / {  # /a/b/c.txt  / 开始
    # 默认是没有 root 配置的,就读全局的root /usr/share/nginx/html;
    # 可以自定义设置 
        root  /var/www/html;  # 分号结束,重新定义root 目录
    index index.html index.htm;    
        }
    }
}
配置文件解析
""" 
url  定位到某台主机  http://192.168.1.2:80
uri  定位到某台主机的具体资源  http://192.168.1.2:80/a/b/c.txt
192.168.1.2:80/a/b/c.txt   --->    /usr/share/nginx/html/a/b/c.txt
 
http://192.168.1.2:80/a/b/c.txt  三段说明
第一段: http://   --->  server 端是基于http协议给client发送数据的
第二段: 192.168.1.2:80  --->  定位到全世界范围内唯一一款软件
第三段: /a/b/c.txt  --->   /usr/share/nginx/html/a/b/c.txt
"""
访问地址解析
""" 
systemctl start nginx

systemctl restart nginx   # 先stop 再start,生产中用reload

systemctl reload nginx   # 不会stop,重新读配置文件

systemctl stop nginx

systemctl status nginx

"""
yum安装nginx常用命令
"""
正向代理
A访问B,A把自己的请求让C代理,C去访问B
正向代理时A明确知道自己的代理C的存在,A明确指定自己的代理地址是C,让C去访问B,拿到结果再给A,通常用来FQ

反向代理
用户请求发给nginx后,由nginx负载给代理的机器,拿到结果,再由nginx返回给客户端
nginx便把一堆自己代理的机器隐藏到后端,外界访问的就是nginx

透明代理
用户不知道代理的存在,用户->交换机->路由器->代理服务器,代理服务器可以控制用户上网行为,
比如限制用户可以访问和不可以访问的网站,多用于用户行为管理
"""
各种代理说明

负载均衡 LB:http://nginx.org/en/docs/http/load_balancing.html

 

安装方式二:编译安装

yum install gcc-* glibc-* openssl openssl-devel pcre pcre-devel zlib zlib-devel -y
cd /application
wget http://nginx.org/download/nginx-1.10.2.tar.gz
tar -zxvf nginx-1.10.2.tar.gz
cd  nginx-1.10.2
./configure --sbin-path=/usr/local/nginx/nginx  
--conf-path=/usr/local/nginx/nginx.conf  
--pid-path=/usr/local/nginx/nginx.pid 
--with-http_ssl_module  
--without-http_rewrite_module 
make && make install

说明:

'''
pcre:用来作地址重写的功能
zlib:nginx的gzip模块,传输数据打包,省流量(但消耗资源)
openssl:提供ssl加密协议
安装:http://www.cnblogs.com/crazyacking/p/5138146.html
相关参数:http://blog.csdn.net/xifeijian/article/details/20956605
location:http://www.tuicool.com/articles/Jr63qy
'''

编译安装常用命令:

/usr/local/nginx/nginx  -t   # 检查配置文件nginx.conf是否正确
/usr/local/nginx/nginx       # 启动nginx
/usr/local/nginx/nginx -s reload    # 重新载入配置文件
/usr/local/nginx/nginx -s reopen    # 重启 Nginx
/usr/local/nginx/nginx -s stop      # 停止 Nginx

三  Django 生产部署理论

Python的Web框架(Flask, Django)自带的Web服务器是用户开发调试,而不是生产环境

 

用于生产环境的Python web项目部署方式

浏览器  <--> Web服务器 <--> WSGI容器 <--> Web框架

 

Web服务器:提供Web服务,常见Nginx、Apache等

WSGI:全称Web Server Gateway Interface,规定了一种在Web服务器和Web应用程序之间的推荐标准接口

常见WSGI容器(软件)

Gunicorn 易于配置,兼容性好,CPU消耗极少

uWSGI是C编写,实现了自有协议uwsgi的Web服务器,性能十分强大

 

Django项目的几种启动方式

1.  runserver 直接启动

2.  通过uWSGI或Gunicorn启动Django

3.  完整 Nginx + uWSGI或Gunicorn + Django 方式启动

 

四  Nginx+Gunicorn+Django生产部署

待续

五  Nginx+uWSGI+Django生产部署

1.  安装  uWSGI

cd /usr/local/projects/jms
source env_jms/bin/activate

pip install uwsgi
uwsgi --version

2.  收集项目静态文件配置

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

STATIC_ROOT = os.path.join(BASE_DIR, 'static_files')

将django admin和django app的静态文件收集到STATIC_ROOT目录下:

#  python manage.py collectstatic

3.  修改nginx.conf 配置

确保配置文件目录下有uwsgi_params,没有时可下载

https://github.com/nginx/nginx/blob/master/conf/uwsgi_params

  location / {
            uwsgi_pass unix:/usr/local/projects/jms/jms.sock;
            include uwsgi_params;
            root   html;
            index  index.html index.htm;
        }

  location /static/ {
      alias /usr/local/projects/jms/static_files/;
  }

4.  重启nginx服务

/usr/local/nginx/nginx -s reopen

5.  通过uWSGI启动Django项目

uwsgi --socket jms.sock --module jms.wsgi --chmod-socket=666

注:unix socket 不同进程间文件共享 

 

附:除了 uWSGI除了sock 启动,还可以把相关参数写成配置文件启动 jms_uwsgi.ini

1.  在项目目录下 新增文件 jms_uwsgi.ini

# 项目目录
chdir= /usr/local/projects/jms/
# 启动uwsgi的用户名和用户组
uid=root
gid=root
# 指定项目的application
module=jms.wsgi:application
# 指定sock的文件路径
socket=/usr/local/projects/jms/jms.sock
master=true
workers=5
pidfile=/usr/local/projects/jms/uwsgi.pid
vacuum=true
thunder-lock=true
enable-threads=true
harakiri=30
post-buffering=4096
# 设置日志目录
daemonize=/usr/local/projects/jms/uwsgi.log

 2.   通过uwsgi --ini jms_uwsgi.ini启动

(env_jms) [root@localhost jms]# uwsgi --ini jms_uwsgi.ini
[uWSGI] getting INI configuration from jms_uwsgi.ini

 

更多信息参考:

http://edu.51cto.com/course/9039.html

http://www.pythontip.com/study/books/djangobook-py3k-cn

http://www.cnblogs.com/linhaifeng/articles/6045600.html#_label19

原文地址:https://www.cnblogs.com/jonathan1314/p/7550863.html