Nginx+Uwsgi部署Django项目

Nginx+Uwsgi部署Django项目

环境 ubuntu 16.04

1、准备工作

云服务器(腾讯云有学生活动,15天体验),当然没有也没关系,在虚拟机上配置也是可以的,因为害怕在云主机上玩坏,所以先在虚拟机上部署了一遍,也顺利通过了;
ubuntu 16.04自带python2.7和python3.5两个版本,这对于本次部署django项目已经足够了。

2、上传Django项目

把自己已经完成好的django项目传到服务器上,我是放在github上,然后再clone下来的。我的django项目名为version,放在/var目录下,所以项目根目录为/var/version;当然,在除了/home目录下,操作文件需要root权限,这个不要忘记了。
这里可以先测试一下项目是否有问题,同时把所需要的包导好

3、安装uwsgi

网上许多blog都有写到需要先安装python开发版本gcc

sudo apt-get install python-dev
sudo apt-get install gcc

安装uwsgi

pip install uwsgi

如果不是用pip安装的uwsgi,而是用apt的话后面运行可能会错,需要在你的命令前面加上

--plugins python

4、测试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

运行uwsgi(http协议,端口号可以自己更改):

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

浏览器打开127.0.0.1:8000,(此处用虚拟机的话输入本机地址127.0.0.1,若是云服务器需要输入你的公网ip,后面同理)不出意外可以看到’Hello World’,这里uwsgi已经没问题了。

5、把uwsgi和django项目关联起来

在项目根目录下创建文件my_uwsgi.ini,内容如下:

[uwsgi]

http		= 127.0.0.1:8000
#项目目录
chdir		= /var/version
#加载wsgi,项目中的wsgi文件
module		= version.wsgi
#启用主进程管理
master		= true
#进程数
processes	= 4
#线程数
threads		= 2
#存储进程的pid
pidfile		= uwsgi.pid
#服务器退出时自动删除pid文件和sock文件
vacuum		= true
#日志
daemonize	= /var/version/uwsgi.log

然后启动uwsgi服务,终端显示如下内容说明启动成功
启动成功截图

在浏览器输入127.0.0.1:8000,你可以看到网页没有任何样式,这是因为没有加载静态文件,这时需要进行下一步,配置nginx服务器。

6、安装nginx服务器

sudo apt-get install nginx

安装好之后浏览器输入127.0.0.1或者localhost,可以看到nginx默认的欢迎页面,这说明nginx是没有问题的。

在配置nginx之前,确保在django项目的setting.py文件里已经修改好了所有配置,这里就不说了,相信大家都能解决。

下面配置nginx,你可以在/etc/nginx/sites-enabled/目录下创建一个配置文件(需要删除default),也可以直接在default文件上做修改,写入以下内容:

server{
	#监听端口
	listen		8000;
	#路径
	root		/var/version;
	#日志,记得在/var/version下创建log文件夹
	access_log	/var/version/log/access_log;
	error_log	/var/version/log/error_log;
	location /static {
		alias	/var/version/static;
	}
	location / {
		uwsgi_pass	127.0.0.1:8000;
		include		/etc/nginx/uwsgi_params;
	}
}

在虚拟机上部署想用域名而不是用ip地址访问的话,可以修改为server_name your. Address.com;然后在hosts配置文件里加上127.0.0.1 your. Address.com;就可以了。

接下来重启nginx服务器:

/etc/init.d/nginx restart

浏览器访问127.0.0.1:8000,结果报502错误(也可能会出现还是没有样式的情况)
502

这个错误卡了我好久呢,看下解决流程,用排除法

首先检查nginx和uwsgi的配置是否有错,然后检查nginx服务器,在浏览器输入127.0.0.1:8000/static/admin/css/base.css,发现是可以访问到静态文件的,nginx服务器并没有出错。

然而uwsgi理论上来说也并没有错误,前面的test.py已经测试过了,那就是在nginx和uwsgi交互过程出现了问题,这里我是保存了运行日志的,但因为本人看着这些头痛,所以放弃了,否则直接在日志里寻找答案效率可能更佳。网上查了许多技术blog,最后对配置文件做了一些小改动,就解决了。

这里直接上图吧

nginx配置最终版
nginx配置

这里看网上有文章说nginx里listen 8000跟uwsgi里8000端口冲突了,但在测试过程中并没有出错,在把listen 8000改为80之后,发现需要访问127.0.0.1:80而不是127.0.0.1:8000了,所以我觉得listen 8000 并没有错,我理解为是nginx监听的8000端口,而不是使用8000端口。个人见解,若有错误请指正。

uwsgi配置最终版
uwsgi配置

对于http和socket的理解可以参考如下文章:点击跳转

修改配置之后记得重启nginx服务器和uwsgi服务,在启动uwsgi服务之前务必保证关闭之前所有的uwsgi进程,否则可能会出现其他问题。
关闭uwsgi,这里可以用配置文件保存下来的pid关闭:

uwsgi --stop uwsgi.pid

如果不行的话,另一种办法:

killall -9 uwsgi

可以利用

ps -ax

查看所有的进程。

一切成功之后就可以在浏览器访问你设置的ip查看效果了。

博主作为一名新手,对这其中的原理理解不是很深刻,刚开始还奇怪怎么不直接用nginx,为什么还要加上uwsgi,最后也仅是知道了uwsgi与django动态交互,nginx加载静态资源,但做出来了还是挺高兴的。
忽然想起一句话:因为站在巨人的肩膀上,所以看得更远,还好有许多文章可以参考,非常感谢他们,所以决定以后也要写blog,不仅记录自己学习经历,也能让后来者参考。
顺便吐槽一下腾讯云,在使用时经常断开连接,在终端手动输入命令时按下一个键要等好久才有反应,实在是痛苦,可能是由于我用的便宜的学生云服务器,钱没给到位的原因吧。

参考文章:
从零开始在 Ubuntu 下部署 Nginx uWSGI Django 服务器
https://blog.csdn.net/m0_37887449/article/details/73086899
通过Nginx部署Django(基于ubuntu)
https://www.cnblogs.com/fnng/p/5268633.html
Django 部署(Nginx)
https://code.ziqiangxuetang.com/django/django-nginx-deploy.html

最后附效果图
效果图(这是自己django项目里写的404页面)
404

效果图(网上扒的模板)

login

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值