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
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错误(也可能会出现还是没有样式的情况)
这个错误卡了我好久呢,看下解决流程,用排除法:
首先检查nginx和uwsgi的配置是否有错,然后检查nginx服务器,在浏览器输入127.0.0.1:8000/static/admin/css/base.css,发现是可以访问到静态文件的,nginx服务器并没有出错。
然而uwsgi理论上来说也并没有错误,前面的test.py已经测试过了,那就是在nginx和uwsgi交互过程出现了问题,这里我是保存了运行日志的,但因为本人看着这些头痛,所以放弃了,否则直接在日志里寻找答案效率可能更佳。网上查了许多技术blog,最后对配置文件做了一些小改动,就解决了。
这里直接上图吧
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配置最终版
对于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页面)
效果图(网上扒的模板)