初学者的django+uwsgi+nginx部署教程

部署环境要求

1、centos7 64位(CentOS Linux release 7.5.1804 (Core))

2、Python2.7 (系统自带了)和Python3.6.5

3、Mysql == 5.7.18

4、Django==2.0.1

5、mysqlclient==1.3.12

6、uWSGI==2.0.15

7、nignx==1.13.7
为了降低出现bug的机会,请尽量使用的一样的环境

安装好系统后可以使用如下命令将系统更新到最新

sudo yum update
sudo yum upgrade

安装原理

  • 首先客户端请求服务资源,
  • nginx作为直接对外的服务接口,接收到客户端发送过来的http请求,会解包、分析,
  • 如果是静态文件请求就根据nginx配置的静态文件目录,返回请求的资源,
  • 如果是动态的请求,nginx就通过配置文件,将请求传递给uWSGI;uWSGI 将接收到的包进行处理,并转发给wsgi,
  • wsgi根据请求调用django工程的某个文件或函数,处理完后django将返回值交给wsgi,
  • wsgi将返回值进行打包,转发给uWSGI,
  • uWSGI接收后转发给nginx,nginx最终将返回值返回给客户端(如浏览器)。
    注:不同的组件之间传递信息涉及到数据格式和协议的转换

作用:

  1. 第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程;
  2. 在nginx上加上安全性或其他的限制,可以达到保护程序的作用;
  3. uWSGI本身是内网接口,开启多个work和processes可能也不够用,而nginx可以代理多台uWSGI完成uWSGI的负载均衡;
  4. django在debug=False下对静态文件的处理能力不是很好,而用nginx来处理更加高效。

进入正题,一行命令,一行注释,使用root身份登录系统执行

1、安装各类基础模块

yum -y install gcc-c++(为centos系统增加编译功能)
yum -y install wget openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel mariadb-devel
(安装这些模块都是为了成功编译安装python3,防止出现各种异常)
yum install libxml* (安装这个模块是为了让uwsig支持使用“-x"选项,能通过xml文件启动项目)

2、编译安装python3

进入home路径(本人喜欢把东西都下载到这里),执行以下命令:
wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz
下载完成后,执行解压命令:
tar -zxvf Python-3.6.5.tgz
进入解压后的Python-3.6.5文件夹,依次执行以下命令

./configure --prefix=/usr/local/python3
(将python3安装到/usr/local/python3/路径下)
make -j2 (此选项用于开启多少内核编译,用于提高效率)
make install -j2 (此选项用于开启多少内核安装,用于提高效率)
mv /usr/bin/python /usr/bin/python.bak(备份python2的连接)
ln -s /usr/local/python3/bin/python3.6 /usr/bin/python
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3(以上两个ln命令是为了方便在终端中直接使用python3和pip3命令)
pip3 install --upgrade pip(升级pip)

最后修改yum对python2的配置:
vim /usr/bin/yum
将#! /usr/bin/python修改为#! /usr/bin/python2
vim /usr/libexec/urlgrabber-ext-down
将#! /usr/bin/python 也要修改为#! /usr/bin/python2
这样python 2.X和3.X便同时存在了,并且以3为主!

3、安装Virtualenv

3.1 安装virtualenv

pip3 install virtualenv

3.2 使用python3指定虚拟目录

如果您有数据盘,那么建议您创建到数据盘中(linux数据盘重新挂载教程),本次教程使用的目录为: /var/www/目录下

 cd  /var/www/  #进入到 /var/www/ 中
virtualenv -p /usr/bin/python  gdcj #指定python3创建虚拟目录gdcj

如果python位置不同可以使用,下面的命令,查找python的位置

which python
which python3

3.3 配置程序需求环境

使用命令进入虚拟目录,然后安装项目配置环境。

cd  /var/www/gdjcj #gdcj为python3创建虚拟目录
source  bin/activate #激活虚拟目录
pip3 install -r requirements.txt  # 安装原项目的环境配置

:以下内容未申明退出虚拟目录,均在虚拟目录中运行。如遇到权限不够,请在命令前加上sudo
注意:我在安装时出现了如下的错误提示:Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-97z4efug/mysqlclient/

4、M(MariaDB)

首先安装数据库M,但是需要注意下的是,CentOS 6之前的版本中提供了MySQL安装包,但是在CentOS 7.X已经用MariaDB替代了MySQL。而MariaDB实际上是MySQL的一个分支,所以MariaDB完全兼容MySQL,包括API和命令行,所以这里的LNMP的M是就是MariaDB:

yum install mariadb mariadb-server -y
yum install MySQL-python -y

注意这里使用的是yum不是pip,-y表示直接下载完成后直接安装。
安装完毕后对数据库进行初始化:

systemctl start mariadb.service
mysql_secure_installation
mysql -uroot -p密码
create database mysite;
exit
systemctl enable mariadb.service

第一行表示启动mariadb服务,第二行表示进入初始化(可以设置管理员密码),第三行表示用的root账号和设置的密码登录,第四行则是创建一个名为mysite的数据库。第五行是将mariadb服务加入到自启动。

5、安装uWSGI

不要在虚拟环境中安装uWSGI

5.1、安装:

pip install uwsgi
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi

5.2、测试uWSGI:

新建文件test.py,写入以下内容

def application(env, start_response):
    start_response('200 OK',[('Content-Type', 'text/html')])
        #return ['Hello world'] # Python2
        return [b'Hello world'] # Python3[root@localhost pro]#

5.3、运行

sudo uwsgi --http 0.0.0.0:8000 --wsgi-file test.py

5.4、调试

如果端口占用,使用

lsof -i :80001

列出占用端口的程序的pid号,并使用以下命令杀掉所有占用端口的程序

sudo kill -9 pid1
#如果使用pid文件
sudo uwsgi --stop uwsgi.pid

然后浏览 http://127.0.0.1:8000(或http://内网ip:8000、或http://外网ip:8000)查看效果,有”Hello World”输出即安装成功。

5.5、使用uwsgi测试项目

nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程,请参见【uWSGI+django+nginx的工作原理流程与部署历程】[1],我们可以直接使用uwsgi对项目进行测试。在项目目录下生成uwsgi.ini配置文件,如下

# 这句代码必须加上
[uwsgi]
#使用nginx连接时使用
#socket=127.0.0.1:9090
#直接做web服务器使用
http=0.0.0.0:8080
#项目目录
chdir=/home/www/gdcj
#项目中wsgi.py文件的目录,相对于项目目录
wsgi-file=gdcj/wsgi.py
processes=4
threads=2
master=True
pidfile=uwsgi.pid
daemonize=uwsgi.log

在项目中的settings.py文件中将服务器的ip添加
到ALLOWED_HOSTS 配置项中
启动

uwsgi --ini uwsgi.ini     

其它命令[2]

uwsgi --reload uwsgi.pid          # 重启
uwsgi --stop uwsgi.pid            # 关闭

此时使用在浏览器中输入http://服务器ip:8080即可看到项目的输出,说明配置已经成功。

6、安装nginx

由于新装的centos7中没有nginx的镜像源(参见centos yum 没有可用软件包 nginx。),因为nginx位于第三方的yum源里面,而不在centos官方yum源里面。解决办法如下:

yum install epel-release -y
yum update
yum install nginx -y

同时通过命令将其改开机启动:

systemctl start nginx

6.1、建立工程单独的nginx配置文件

首先确认自己准确的知道nginx的默认配置文件目录(nginx.conf)的路径,如果不清楚,请使用如下命令获取:

nginx -t

大概会列出以下类似信息:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

里面说明了nginx默认配置文件的路径是:/etc/nginx/nginx.conf;

6.2、确保nginx.conf的同目录下有uwsgi_params文件

如:/etc/nginx/uwsgi_params,没有的话根据链接获取, 后面要用到。

6.3、建立自己的nginx配置文件

自己的工程目录下,建立如gdcj.conf(/home/www/gdcj/gdcj.conf)的配置文件;复制nginx.conf里面全部的内容,全部写入destiny.conf中。
然后按照下面写的,把destiny.conf配置文件中的server段部分全部替换掉。

server {
    listen 80;
    server_name localhost;
    charset     utf-8;
    access_log      /home/www/gdcj/nginx_access.log;
    error_log       /home/www/gdcj/nginx_error.log;
    client_max_body_size 75M;

    location /static {
        alias /wwwroot/destiny/destiny/static;
    }

    location / {
        include     /etc/nginx/conf/uwsgi_params;
        uwsgi_pass  127.0.0.1:9090;
    }
}

其中的 listen 80代表服务器开放80端口;
location [目录名]代表项目路径的引导;
access_log 和error_log是定义nginx访问日志和错误日志的存放路径。
“location /static”中的”/static”是自己定义的项目引用静态文件时,浏览器中显示的静态资源所在的根目录名;这样的话,用户在浏览器中查看到的所有image、css或js资源都是处在http://127.0.0.1/static下的。
django静态文件的绝对路径是根据自己的实际情况来确定的,一般在自己的django的app名/static目录下,或自己python manage.py collectstatic后的路径下。本教程的是在/home/www/gdcj/static根目录下。
“location /”是指访问项目根目录时,nginx要做的事。其中需要指定 uwsgi_params文件的绝对路径,上面已经提到了;如果还有media文件之类的静态目录,仿照static的写法,自己补充。
127.0.0.1:9090是指uWSGI绑定的监听地址,这里使用了9090端口。所以我们要将在测试uwsgi时使用的uwsgi.ini文件修改如下:

# 这句代码必须加上
[uwsgi]
#使用nginx连接时使用
socket=127.0.0.1:9090
#直接做web服务器使用
#http=0.0.0.0:8080
#项目目录
chdir=/home/www/gdcj
#项目中wsgi.py文件的目录,相对于项目目录
wsgi-file=gdcj/wsgi.py
processes=4
threads=2
master=True
pidfile=uwsgi.pid
daemonize=uwsgi.log

6.4、更改静态目录权限归属者

需要注意的是,请确认自己django的静态文件目录所有者是www用户(如果不会建立请看第7步),如果不是,请用以下命令更改静态目录权限归属者:

sudo chown -R www:www /home/www/gdcj/static

6.5、nginx的一些操作(可以不看)[3]

6.5.1、启动

启动代码格式:nginx安装目录地址 -c nginx配置文件地址
例如:

nginx -c /home/www/gdcj/gdcj.conf

6.5.2、停止

1、查看进程号

 ps -ef|grep nginx

2、杀死进程

kill -QUIT 进程id

6.5.3、重启

1、验证nginx配置文件是否正确

nginx -t -c /home/www/gdcj/gdcj.conf

看到如下显示gdcj.conf syntax is ok
gdcj.conf test is successful
说明配置文件正确!

2、重启Nginx服务

nginx -s reload 

7、centos下配置用户及用户组权限[4]

groupadd www
useradd --shell /sbin/nologin -g www www

8、启动uwsgi和nginx

8.1、启动uWSGI

sudo uwsgi --ini /home/www/gdcj/gdcj.ini

8.2、启动nginx

在这之前,我们要先去nginx配置文件的根目录拷贝mime.types(/etc/nginx/mime.types)到工程目录(/home/www/gdcj/mime.types),和gdcj.conf放在一起。
否则用配置文件启动nginx会报错:
nginx: [emerg] open() "/**/**/**/mime.types" failed (2: No such file or directory)1

当然,如果不想拷贝mime.types文件,也可以将配置文件中“include mime.types;”一项,改成绝对路径“include /etc/nginx/mime.types;”
如果nginx已经开启,先关闭nginx(service nginx stop或nginx -s stop),再执行以下命令:

nginx -c /home/www/gdcj/gdcj.conf

这里的-c 表示加载配置文件启动

9、理一下路径

工程路径:                  /home/www/gdcj
工程静态文件路径:           /home/www/gdcj/static
wsgi.py的路径:             /home/www/gdcj/gdcj/wsgi.py
uwsgi.ini的路径:           /home/www/gdcj/uwsgi.ini
uwsgi日志路径:             /home/www/gdcj/uwsgi.log
destiny.conf的路径:        /home/www/gdcj/gdcj.conf
uwsgi_params的路径:        /etc/nginx/uwsgi_params
nginx访问日志路径:          /home/www/gdcj/nginx_access.log
nginx错误日志路径:          /home/www/gdcj/nginx_error.log

几乎把所有有关工程的配置文件和日志文件都放在工程目录下了,方便后期维护与查错。


  1. https://blog.csdn.net/c465869935/article/details/53242126

  2. (https://www.jianshu.com/p/c3b13b5ad3d7)

  3. (https://www.cnblogs.com/codingcloud/p/5095066.html)

  4. (https://blog.csdn.net/chaishen10000/article/details/46897901)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容