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 """
""" 正向代理 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
posted on 2017-10-18 11:00 Jonathan1314 阅读(1077) 评论(0) 编辑 收藏 举报