Ubuntu中nginx+uwsgi部署Django项目方法及常见问题解决办法

前言:django项目是参考django中文网站教程自己弄的,只是做了些小修改,主要是测试django的部署,在部署中因为小白,所以也出现了很多问题。以下就是这些问题及解决办法。

部署环境:
nginx 1.10.3
uwsgi 2.0.18
Django 2.0
python 3.6
部署服务器:阿里云轻量应用服务器 Ubuntu18.04

前提条件:Django项目能在windows上正常运行,有一个Ubuntu服务器(我的是云服务器)。

步骤:
1,在windows下迁移自己python虚拟环境的包
2,把自己的项目以及备份的包发送到Ubuntu服务器上
3,Ubuntu上Python环境的安装
4,安装配置uwsgi
5,安装配置nginx
6,静态文件404问题
7,图片能加载,但是CSS样式丢失问题
8,可能出现的错误,以及解决方法和注意事项
注意:关于项目包的迁移这里不在叙述,可以参考前文的教程,本文我们项目放在了/home/myproject/myblog下。

1、Ubuntu上Python环境的安装

说明:Ubuntu18.04上会自带Python2.7和Python3.6,千万不要把Python2.7删了,因为Ubuntu系统还会用到Python2.7。
使用virtualenv(强烈推荐):
pip virtualenv # 安装
virtualenv -p python3 /myproject/pyenv # 创建虚拟环境,并指定python版本
激活虚拟环境:

cd /home/myproject/pyenv  # 进入环境目录
source activate   # 激活环境(注:以下步骤都是在这个虚拟环境下进行的)
deactivate  # 退出环境

迁移包:先进入到myPackage.txt所在的目录,然后输入:

pip instatll -r myPackage.txt # 安装myPackage.txt中记录的所有包。

到这里你的Python环境就算安装好了!
验证:进入到项目的根目录下,输入:

python manage.py runserver 0.0.0.0:80  # 运行你的项目。如果是阿里云服务器,一定要检查80端口是否处于开放状态。

在浏览器中输入你服务器的公网IP就可以访问到你的项目了。

2、安装配置uwsgi

说明:uwsgi是一个服务器,用于部署你的Django项目。即:与Django项目进行通信。
安装:

pip install uwsgi  # 会安装在你的虚拟python环境中。

验证是否安装成功:在你项目的同级目录下新建一个uwsgi_test.py文件,内容如下(内容是官网提供的):

1 def application(env, start_response):
2 start_response('200 OK',[('Content-Type', 'text/html')])
3 #return ['Hello world'] # Python2
4 return [b'Hello world'] # Python3

保存退出后,输入:

uwsgi --http :80 --wsgi-file uwsgi_test.py# 在windows中的浏览器输入你服务器的公网IP,如果出现“Hello world”则表示运行成功。

用uwsgi部署你的Django项目:更改项目中的settings文件:

DEBUG = False   # 关闭调试模式。
ALLOWED_HOSTS = ['*'] # 允许所有主机访问。

在你的项目根目录下(与manage.py同级)新建一个uwsgi.ini文件,内容如下:
[uwsgi]

#如果单独使用uwsgi来部署Django项目时,就用这一行。
http=0.0.0.0:80
#如果使用nginx+uwsgi来部署Django项目时,就用这行。其中,8001端口用来跟nginx通信。也要在阿里云防火墙中添加8001端口。
# socket=0.0.0.0:8001
#你项目的完整路径。
chdir=/home/myproject/myblog
#给socket文件赋权限,这里不用管。
# chmod-socket=664 
#启用主线程。
master=true
processes=4
threads=2
#指定日志文件(会自动创建)。这个很重要,如果uwsgi出现错误,可以通过日志文件来查错。
logto=uwsgi.log
#指定进程号文件(会自动创建)。这个也很重要,如果要重启和关闭uwsgi,则需要这个文件,里面记录了进程号。
pidfile=uwsgi.pid
#指定wsgi文件。在与settings.py同级目录中会有一个wsgi.py文件。
module=MyProject.wsgi:application

保存退出后,输入:

uwsgi --ini uwsgi.ini# 启动uwsgi,并指定配置文件。

验证:在浏览器中输入服务器公网IP就可以访问到你的项目了。如果不能,一定要查看日志文件uwsgi.log中的错误信息,文章结尾会有简单操作。

3、安装配置nginx

说明:nginx是一个反向代理服务器,用来接收浏览器的请求。如果是静态文件则由nginx处理;如果是动态请求则交给uwsgi处理。
安装:

sudo apt-get nginx

验证是否安装成功:
输入:

server nginx start    # 在Windows浏览器中可以看到nginx的欢迎界面。

配置:找到nginx.conf文件,一般会在/etc/nginx/下。如果没有,使用whereis nginx命令查看nginx的位置。

备份nginx.conf文件:

cp nginx.conf nginx.conf.bar

删除nginx.conf文件,并重新建一个nginx.conf文件,内容如下:

events {
worker_connections  1024;   # 不用管
}

http{
server {
listen 80;   # 这个端口用来监听浏览器的请求。
server_name www.xxx.com;  # 如果有域名可以填上域名,也可以填上公网IP。
charset UTF-8;
# 日志文件。如果nginx出现问题,都可以通过日志文件来查错。
access_log /var/log/nginx/myproject_access.log;  
error_log /var/log/nginx/myproject_error.log;
client_max_body_size 75M;

location / {
include uwsgi_params;# 使用uwsgi服务器。
uwsgi_pass 0.0.0.0:8009;# 把浏览器发来的请求转发到8009端口,而uwsgi也正在监听8009端口,所以就实现了nginx与uwsgi的通信。
uwsgi_read_timeout 30;   # 链接超时时间
}
location /static/{# 处理静态文件,处理链接是以/static/开头的请求。即:如果是静态文件,就不用发给uwsgi了,nginx自己处理。
alias /usr/DjangoProject/MyProject/static/;   # 项目静态文件的绝对路径。即:告诉nginx应该去哪里找静态文件。后面会介绍。
   }
   }
}

验证是否配置成功:
保存并退出,进入到项目根目录下:修改uwsgi.ini文件,把http=0.0.0.0:80注释掉,使用socket=0.0.0.0:8009 用来监听8009端口,与上面nginx对接。
保存并退出,输入:

 uwsgi -d --ini uwsgi.ini# 启动uwsgi服务器。-d表示在后台运行。这样就不会占用当前窗口了。
 server nginx start      # 启动nginx服务器。

在浏览器中输入服务器公网IP就可以访问了。如果出现错误,后面会介绍。

4、静态文件404问题

说明:由于静态文件(图片, css, js)是由nginx来处理,所以就不会把请求通过uwsgi发送到我们的Django项目。于是我们还要告诉我们的项目应该到哪里去找这些 静态文件。
在settings.py文件中添加这一行:

STATIC_ROOT = os.path.join(BASE_DIR, 'static')# DASE_DIR为项目的绝对路径(已经获取到了)。

在urls.py文件中添加:

from django.conf.urls.static import static
from ShenDengBlog import settings
urlpatterns += static('/static/', document_root=settings.STATIC_ROOT)   # 这一行不要放在urlpatterns里面了。这一句就是告诉我们的项目,以/static/开头的静态文件路径都会转到项目根目录下的static文件夹中去找。

保存并退出,在项目根目录中,输入:

python manage.py collectstatic   # 收集静态文件,把所有app下static文件中的内容都复制到项目根目录中的static文件夹中,包括admin中的静态文件。

重启uwsgi。如果出现错误,文章结尾会有解决方法。
再次在浏览器中访问你的公网IP,应该就可以加载静态文件了。

5、图片能加载,但是CSS样式丢失问题

说明:在访问网页时,发现图片能加载,而CSS样式全部丢失;但是在浏览器中F12->网络(network)发现css文件已经发送过来了(状态码为200或304)。
解决:只需要把模板文件第一行的<!DOCTYPE html>改成<!DOCTYPE>,或者直接删掉就好了。
原因:在segmentfault上找到了解释。因为<!DOCTYPE html>会让浏览器用标准模式来解析你的这个文档,而不加的话就会用兼容模式。这是链接
如果返回的错误在日志中查看是权限问题,那就是因为你把项目路径设置在了root根目录里面,root目录是指允许root用户操作,所以会报错权限问题,建议项目按照要求放入var/或者home/目录。

6、可能出现的错误,以及解决方法和注意事项

说明:在重启uwsgi或nginx时有时候会出现重启报错,或者是不报错也不成功的情况。
注意1:如果修改了uwsgi配置文件,或者修改了项目中的文件,一定要重启uwsgi,不然修改无效或者会出现一些奇怪的Bug。
注意2:在使用uwsgi和nginx时,不管出现什么问题,都先去日志文件中查看错误记录,最有可能导致错误的原因是“端口占用”;如果解决不了再去百度。

开启uwsgi:

uwsgi --ini uwsgi.ini   # uwsgi还支持其他文件格式,比如xml和json。建议使用ini文件。

重启uwsgi:

uwsgi --reload uwsgi.pid   # uwsgi.pid是在uwsgi.ini中指定的。

关闭uwsgi:

uwsgi --stop uwsgi.pid  # 同上。

开启nginx:

server nginx start

重启nginx:

server nginx restart

关闭nginx:

server nginx stop

测试nginx:

nginx -t   # 如果是nginx的问题,可以通过测试发现原因。

启动或重启uwsgi失败:在重启或开启uwsgi时,有时候会出现各种各样的错误,很有可能是你上一个uwsgi进程占用端口搞的鬼,所以万能的办法就是先杀死所有uwsgi进程,然后再开启。
杀死uwsgi进程:

sudo killall -9 uwsgi   # 通过程序名强制杀死所有uwsgi进程。

再开启uwsgi:

uwsgi -d --ini uwsgi.ini

访问网页时报502错误:因为uwsgi服务器没有开启。502是网关错误。既然有返回错误代码,就表示nginx服务器没有问题,所以是nginx无法与uwsgi通信,那就是uwsgi的问题了,注意查看uwsgi的日志文件的错误提示。

7、网页显示正常,admin页面无法正常调用静态css等

在没有将网站部署到nginx之前,一切运行正常,将网站部署到nginx之后,网页可以打开,但admin登录样式全都没有加载,前端网页又能正常加载样式,浏览器里按下F12键,console有报错:

Resource interpreted as Stylesheet but transferred with MIME type text/plain

解决方法:
在Nginx的配置文件中指定默认的MIME type,从上面的引用中,我们得知一般指定为application/octet-stream即可,在CentOS7下,修改配置文件/etc/nginx/nginx.conf, 在http{ }中添加下面两行:

include /etc/nginx/mime.types;
default_type application/octet-stream;

重启nginx服务:

service nginx restart

清除浏览器缓存,再加载网站即可恢复正常了。

未经允许不得转载:知白博客 » Ubuntu中nginx+uwsgi部署Django项目方法及常见问题解决办法
分享到:
赞(0) 打赏

如果觉得文章有用就打赏一下文章作者吧

支付宝扫一扫打赏

微信扫一扫打赏