linux+uWSGI+Nginx部署django项目

前言

此前写了一个django项目,由于接触不久,不太了解项目部署,因此实在windows上面直接采用runserver来部署。但是runserver部署性能太差,又是单线程,在使用过程中存在诸多问题,考虑到linux的稳定性(其实是因为windows不支持uwsgi),决定采用linux+uwsgi+Nginx来进行部署。花了好几天,遇到诸多问题,终于部署成功。分享一下,希望能帮到有需要的伙伴萌。(项目实际需求不同,过程会有差异,仅供参考)

扯扯原理

(这也是我看视频学的,有兴趣的同学可以自行了解)

什么是WSGI

WSGI,全称Web Server Gateway Interface或者Python Web Server Gareway Interface,是为Python语言定义的web服务器和web应用程序或框架之间的一种简单而通用的接口,自动WSGI被开发出来以后,许多其他语言中也出现了类似接口。

其实WSGI就是一种协议,就像http一样,它指定了应用与服务器的一些传输规则

什么是uwsgi

跟WSGI一样,是一种通信协议

什么是uWSGI

这个是一个web服务器,支持WSGI、uwsgi、http等协议

什么是Nginx

这也是个web服务器,也是用来处理请求的。也实现了wsgi协议。但与uwsgi相比,它具备了优秀的静态内容处理能力,动态内容就转发给uWSGI服务器进行处理。

django+uWSGI+Nginx

这三个,django相当于应用,另外两个都是服务器。前端发送请求时,会先到Nginx,如果只是静态请求(如页面,js、css文件等),由nginx直接返回给前端。如果有一些动态请求(操作数据库等),Nginx将请求转发给uWSGI进行处理。而他们之间的通信(请求转发,返回数据等等),则按照他们之间支持的协议今星期

部署流程

我用的是阿里云的linux服务器进行部署,版本是gun的。其他版本应该大同小异。

整体流程

流程整体可以分为三步:

1、确保django项目能够在linux服务器上runserver跑起来
2、安装uwsgi,能够用uwsgi启动django项目
3、安装nginx,配置nginx,实现项目部署

1.准备,python环境、依赖包、项目依赖软件,全部集合

要确保django能够runserver跑起来,要确保django项目所需要的环境,依赖包,以及第三方软件全部在服务器上安装完毕。比如我的项目用到了mysql和redis,因此这些都需要安装。

打地基咯:python环境安装

注意,别动原来的地基:linux系统是自带python环境的,但是版本是2.7,如果你的项目python版本不同,要重新安装python,但是要注意,不要删除linux自带的python,因为linunx很多命令是依赖python才能运行的,删除原来的python会导致很多命令无法运行

开工,砌砖,安装步骤:
前置步骤:安装python的相关依赖:yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make(其他依赖:如mysql-devel,python-devel,gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel也要安装)

  1. 下载linux的python安装包,到python官网:https://www.python.org/downloads/,下载对应版本的source code即可(速度会比较慢,但是python也不大)
    linux+uWSGI+Nginx部署django项目_第1张图片

  2. 利用xftp将安装包传至linux服务器上,操作linux一般用xshell和xftp,这个为大伙儿准备好了(链接:https://pan.baidu.com/s/1hlCwfW3z-cm4Lsc4WwWHRA 提取码:lnzs )

  3. cd到安装包所在的文件夹,执行 tar -zxvf xxxxpython.tgz,解压python安装包

  4. 解压完成后(如果没有指定解压路径),会在当前目录下生成一个python文件夹,cd进入该文件夹,执行./configure命令

  5. 待第4步执行成功后,执行make && make install 命令,等待命令执行结束。

  6. 第5步成功后,你所需要的python版本就安装成功了。接着就是配置环境变量,环境变量的配置方法有很多种。(执行whereis python可以找到python3的安装目录)

1.在/etc的profile文件中添加新的python路径:在文件末尾添加(export PYTHON3=python的安装文件夹路径, export PATH= P Y T H O N 3 / b i n : PYTHON3/bin: PYTHON3/bin:PATH),然后执行:“suorce /etc/profile”重载文件
2.cd /etc/profile.d/文件夹下,新建一个python3.sh文件,在文件内写入:export PATH="$PATH:/usr/local/python3/bin",然后执行:“source …/profile”,重载文件
3在系统的bin目录下(如/usr/bin)创建只想新安装python的软连接:ln -s python的bin目录/python3 /usr/bin/python(意思是,在/usr/bin目录下创建一个叫python的链接,指向python3,当输入python时,系统会在这个目录下查找有没有python这个命令,找到就执行)
但是第三步要注意,系统原本有个python指向python2.7,新建python软连接时,要把原来的python重命名。(命令: mv 源文件名称 新文件名称)
注意:这里重命名后,很多命令会失效,因为系统默认用的是python2.7,所以遇到失效的命令,多是以can’t find xxx表现,就需要修改命令的配置文件,把对应配置文件第一行的python改为重命名后的那个名称即可。(具体遇到的时候百度即可)

  1. 至此,python环境安装完成。
钢筋,来!项目依赖软件安装(mysql5.7.26为例)

安装步骤:
1.新建文件夹/opt/mysql,并进入该文件夹
2.运行wget http://dev.mysql.com/get/mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar,下载mysql安装包(也可以到官网下载后用xftp上传)
3.运行tar -xvf mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar,解压(解压后会得到一些rpm包)
(centos自带的数据库是mariadb,会与mysql冲突,要先删除)
4.运行 rpm -qa | grep mari查询mariadb相关安装包
5.运行rpm -e --nodeps mariadb-libs,卸载
6.开始安装mysql,依次运行如下命令:
​ rpm -ivh mysql-community-common-5.7.26-1.el7.x86_64.rpm
​ rpm -ivh mysql-community-libs-5.7.26-1.el7.x86_64.rpm
​ rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm
​ rpm -ivh mysql-community-server-5.7.26-1.el7.x86_64.rpm
​ rpm -ivh mysql-community-libs-compat-5.7.26-1.el7.x86_64.rpm
7.运行systemctl start mysqld.service启动mysql
8.设置root密码:mysql会自动给root用户设置随机密码,运行grep “password” /var/log/mysqld.log可以看到当前密码
9.运行mysql -u root -p 输入以上随机密码进入mysql
10.设置密码策略:set global validate_password_policy=0(个人用户可以使用简单的密码策略,为零,生产环境设置更为复杂的密码,此处默认值为1)
11.set password for ‘root’@‘localhost’=password(“xxxxxxxxxx”); 设置密码
12.运行flush privileges,使密码生效。
(一般软件安装与安装python差不多,通过./configure和make && make install的方式,此处不多赘述了)

水泥,走起: 项目依赖包

python环境和相关软件安装好之后,可以通过pip > freeze requirements.txt, pip intall -r requirements.txt进行安装依赖。
安装完毕,用runserver测试能否启动,如果启动成功,即可进行下一步。

2.来了,墙刷起来,uWSGI!

一般流程

uwsgi安装简单很多,可以直接通过pip install uwsgi进行安装。(也可以下载好tar.gz包后上传)

注意:由于centos已经安装了python2.7,所以如果直接使用uwsgi启动django程序,可能导致其使用默认了python2.7进行执行,可能会发生找不到某些模块的问题。因此在uwsgi运行前或者运行发生错误后,检查uwsgi用的是哪一个版本的python(可以在uwsgi日志中查看)。

安装好uwsgi后,可以在项目根目录下运行:uwsgi --http 0:端口号 --file 绝对或相对路径/wsgi.py --static-map=/static=静态文件路径/static
(阿里云主机直接使用ip会出错,此处用0即可表示云主机的ip),(最后用于指定静态文件的路径,可以不写,不写的话会加载不出静态文件)
如果此处用uwsgi运行项目成功(通过访问ip:端口号能够访问项目页面),说明uwsgi没问题。
一般情况下,我们不通过uwsgi命令直接启动程序,而是通过配置文件来启动。

再刷一遍:使用uwsgi配置文件启动uWSGI[ini文件]

我们可以再项目根目录下新建一个script文件夹,在文件夹内新建uwsgi.ini文件,输入如下内容:

[uwsgi]
#项目目录
chdir=/opt/project_dir/#(此处是Django项目的根目录)
#启动uwsgi的用户名和用户组
uid=root
gid=root
#指定项目的application
module=projectname.wsgi:application#(此处是wsgi文件所处的文件夹名称.wsgi:application)
#指定sock的文件路径
socket=/opt/project_teacher/script/uwsgi.sock #(这里也可以指定ip:端口,如果指定了,稍后就不会生成.sock文件)
#启用主进程
master=true
#进程个数
workers=5
pidfile=/opt/project_dir/script/uwsgi.pid
#自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
#序列化接受的内容,如果可能的话
thunder-lock=true
#启用线程
enable-threads=true
#可以指定每个进程的线程数threads = n
#设置自中断时间
harakiri=30
#设置缓冲
post-buffering=4096
#设置日志目录
daemonize=/opt/project_dir/script/uwsgi.log

启动:uwsgi --ini uwsgi.ini(执行成功后,文件夹下会生成uwsgi.log、uwsgi.pid和uwsgi.sock文件,如果socket直接指定ip:端口的话,就不会又sock文件,sock文件配置Nginx时会用到)
在这里插入图片描述
可以通过ps -ef | grep uwsgi查看启动的uwsgi服务:
linux+uWSGI+Nginx部署django项目_第2张图片

一般来说,uwsgi命令能执行,配置正确的话,就没问题,如果出现无法访问,可以查看uwsgi.log文件查看日志,看下出了什么问题。

3.就快成功了,Nginx!装修搞起

第一步仍是安装,买货咯

1.简洁点来:下载Nginx.tar.gz包( http://nginx.org/en/download.html ),上传至服务器,tar -zxvf 解压,进入解压文件夹./configure,然后make && make install.–>一气呵成了吧现在
2.装好后先验证一下,启动nginx:进入nginx安装文件夹的sbin,./nginx启动nginx
3.ps -ef | grep nginx查看是否启动
在这里插入图片描述
4.用浏览器访问服务器ip或域名:端口(默认80),能够访问到nginx页面就是成功了。
5.有时候会失败,因为阿里云的80端口是被占用的,这个就是小意思了。查找到80端口,直接kill掉。或者在后面的配置文件中修改默认端口即可。

这是最后一步了:配置nginx,可以了,装完搞定

关于配置文件,可能也有多重方法,我使用的是在nginx安装文件夹下(whereis nginx可以找到),的conf文件夹内,编辑nginx.conf,内容如下

server {
    listen       80;#这个端口号可以改(最后项目请求的端口就是这个)
    server_name  xx.xx.xx.xx;#服务器的ip地址
    charset utf-8;#编码规则这就
    #access_log  logs/host.access.log  main;(这个accesslog测试的时候可以启用,但是生产环境建议别启用,时间长了会产生一个很大的文件,它把每次请求都记录下来了)
    gzip on;
    gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stram;
    
    location / {
        include uwsgi_params;
        uwsgi_connect_timeout 30;
        uwsgi_pass unix:/opt/d_vueProject/script/uwsgi.sock;#这个就是uwsgi的那个sock文件,相当于一个桥梁(如果那边写的ip:端口号,这里夜用ip:端口号)
    }
    #静态文件目录
    location /static/{
        alias /opt/d_vueProject/vueapp/dist/static/;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}    

修改配置文件后,重启nginx。
至此,django项目在linux上部署圆满成功。(如果能访问的话)

说说感想:从决定用linux部署到最终部署成功,花了很多时间。在部署过程中遇到了许许多多的问题,基本在百度的帮助下都解决了。而且,这次部署成功,也许在下次部署时又会出现不同的问题。我的技术仍然十分捞,但是我的妞说过:进一寸有一寸的欢喜。希望在每次的寸进中,慢慢提升自己的实力。也希望能帮助到有同样问题的小伙伴。

鸣谢:
我的妞
python创始人:Guido van Rossum的大力支持(开发了python)
百度公司倾力支持
mysql无私赞助
诸多开发者的大力支持

感谢大家

你可能感兴趣的:(django,nginx,linux)