线上生产环境部署Djngao+Nginx+Uwsgi

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线上生产环境部署Djngao+Nginx+Uwsgi相关的知识,希望对你有一定的参考价值。

是否曾想过把django项目从windows移植到Linux上运行,Linux性能众所周知,作为Django运行的服务器再合适不过啦,今天分享一下如何在线上云机器的Linux环境运行Django项目。

客户端访问服务端的流程
1.首先客户端请求服务资源, 
2.nginx作为直接对外的服务接口,接收到客户端发送过来的http请求,会解包分析。
3.如果是静态文件请求就根据nginx配置的静态文件目录,返回请求的资源,否则会根据django配置文件设置的static目录去找资源。
4.如果是动态的请求,nginx就通过配置文件,将请求传递给uwsgi;
5.uwsgi 将接收到的包进行处理,并转发给wsgi, wsgi根据请求调用django工程的某个文件或函数,处理完后,django将返回值交给wsgi, wsgi将返回值进行打包,转发给uwsgi,
6.uwsgi接收后转发给nginx,nginx最终将返回值返回给客户端(如浏览器)。

补充一点知识:
1.wsgi是web服务器与web程序之间的一种低级别的接口
2.uwsgi是一个基于uwsgi协议、wsgi协议和Http协议的WEB接口,简单说就是web通过uwsgi访问到django文件

一、环境准备

  1. Linux服务器一台
  2. Nginx软件包
  3. mysql软件包
  4. Django项目

二、环境部署
1.在Linux安装python,根据自己项目需要安装python版本

1.1安装相关依赖
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel

1.2编译安装

cd /usr/local/
tar xf Python-3.5.1.tgz 
cd Python-3.5.1/
./configure --enable-optimizations
cd Python-3.5.1/
make && make install

1.3修改Python文件

mv /usr/bin/python /usr/bin/python2.7.5
ln -s /usr/local/bin/python3.5 /usr/bin/python
python -V   #这里输出是你编译版本就OK啦
Python 3.5.1

1.4修改yum配置文件,因为修改了python文件,yum是无法使用

vim /usr/bin/yum 
#!/usr/bin/python2.7.5   修改为之前移动的python文件

还有一些因为Yum安装报错可以根据上面修改即可

2.安装模块

2.1 安装uwsgi模块
pip3 install uwsgi
2.2 安装pymysql模块
pip3 install pymysql
2.3 安装django
pip3 install django==2.0

3.修改django配置文件
3.1在项目中的init文件写入下面代码,如果不填会连接不了数据库哈

import pymysql
pymysql.install_as_MySQLdb()

3.2修改setting.py配置文件

DEBUG = False    #这里需要改为False,不然程序报错,会在WEB页面显示出来
ALLOWED_HOSTS = [‘IP‘]      #这里设置你允许哪些IP访问
DATABASES = 
    ‘default‘: 
        ‘ENGINE‘: ‘django.db.backends.mysql‘,  #这是指连接数据库的驱动
        ‘NAME‘: ‘xxxxx‘,                      #你的项目数据库名
        ‘USER‘: ‘xxxxx‘,                       #连接数据库用户
        ‘PASSWORD‘: xxxxxxxxx‘,      #数据库密码
        ‘HOST‘: "xxxxxxxx",                 #主机
        ‘PORT‘: ‘3306‘,                         #端口
    

TIME_ZONE = ‘Asia/Shanghai‘               #修改为中国区域
USE_TZ = False                                      #关闭
STATIC_ROOT= "/data/autoops/static"    #设置为你的静态目录

4.编译安装niginx
5.二进制安装mysql
6.上传django项目代码到Linux服务器,根据你的需求放到指定目录
技术图片
7.编写uwsgi文件,我的文件在/data/autoops/script/uwsgi.ini (重点)

[uwsgi]
# 项目目录
chdir=/data/autoops/
# 指定项目的application
module=autoops.wsgi:application
# 进程个数
workers=8
pidfile=/data/autoops/script/uwsgi.pid
# 指定IP端口
#http=192.168.10.155:8003    ##可以不启用,利用socket文件,如果只是测试,需要启用
# 指定静态文件目录
static-map=/static=/data/autoops/static
# 启动uwsgi的用户名和用户组
uid=root
gid=root
# 启用主进程
master=true
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 设置日志目录
daemonize=/data/autoops/script/uwsgi.log
# 指定sock的文件路径
socket=/data/autoops/script/uwsgi.sock
die-on-term=true 

8.uwsgi命令

uwsgi --reload uwsgi.pid  重启
uwsgi --stop uwsgi.pid 关闭
uwsgi --ini uwsgi.ini 启动

9.在启动之前,需要注意的,如果你setting的DEBUG是关闭状态的,需要在django项目中执行python manage.py collectstatic,作用是收集Django项目中所有涉及到的静态资源,统计放到 STATIC_ROOT 管理访问,如果你不执行,你会发现,django项目无法加载CSS样式,JS脚本。
如图下方
技术图片

10.初始化django项目的ORM

   1. python manage.py makemigrations 把models.py里面的改动记录下来,记录到migrations文件夹下面
   2. python manage.py migrate   把改动翻译成SQL语句去数据库执行

11.配置Nginx文件并且检查语法启动

worker_processes  1;
events 
    worker_connections  1024;

http 
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server 
        listen       你的端口号;
        server_name  公网IP;
        location / 
                include uwsgi_params;             
                uwsgi_connect_timeout 30;          
                uwsgi_pass unix:/data/autoops/script/uwsgi.sock;    #你的uwsgi.sock文件位置
        
    

12.启动uwsgi和nginx

[root@xxxxxxxxx08:56:29/data/autoops]# uwsgi --ini script/uwsgi.ini 
[uWSGI] getting INI configuration from script/uwsgi.ini
[uwsgi-static] added mapping for /static => /data/autoops/static

三、测试访问nginx
技术图片

总结:部署不难,需要注意一下,文章有些地方没详细说的,自己可以思考哈,下次再分享

以上是关于线上生产环境部署Djngao+Nginx+Uwsgi的主要内容,如果未能解决你的问题,请参考以下文章

配置开发环境测试环境线上生产环境

42 线上生产环境的RocketMQ集群进行消息轨迹的追踪

线上生产环境同步时间服务器时报错the NTP socket is in use, exiting

TFS线上生成环境发布历程

一次JVM FullGC的背后,竟隐藏着惊心动魄的线上生产事故!石杉的架构笔记

Kafka产线集群部署