nginx+uwsgi部署Django项目到Ubuntu服务器全过程,以及那些坑!!!

时间:2022-09-08 10:11:38

前言:自己在windows上用PyCharm编写的Django项目,编写完后在windows上运行一点问题都没有,但是部署到服务器上时却Bug百出。百度,CSDN,sf,各种搜索寻求解决方案在历时3天后终于让它在服务器上与在windows的运行效果一样了。看了各种博客后得出的一个结论是:过期教程害死人!!!所以在写博客的时候一定要写上自己的开发环境(尤其是各种软件的版本)
 
我的环境:
                nginx 1.10.3
                uwsgi 2.0.18
                Django 2.0
                python 3.6
                部署服务器:阿里云轻量应用服务器 Ubuntu16.04
     注:Django1.8前后版本有很大差别;python2与python3有很大差别;Ubuntu系统与Centos系统命令行有些差别。
 
前提条件:Django项目能在windows上正常运行,有一个Ubuntu服务器(我的是云服务器)。
 
步骤:  1,在windows下迁移自己python虚拟环境的包
            2,把自己的项目以及备份的包发送到Ubuntu服务器上
            3,Ubuntu上Python环境的安装
            4,安装配置uwsgi
            5,安装配置nginx
            6,静态文件404问题
            7,图片能加载,但是CSS样式丢失问题
            8,可能出现的错误,以及解决方法和注意事项
 
1,在windows下迁移自己python虚拟环境的包
说明:这一步主要是可以一次性把你在windows下的python包安装到ubuntu上。
激活环境:如果你开发时使用了virtualenv虚拟环境(推荐使用),首先用命令行进入到虚拟环境下的 Scripts目录下,输入:activate;如果没有用虚拟环境则不需要激活。
备份python包:在命令行输入:pip freeze >myPackage.txt        # 这个操作会在你的python环境下生成一个myPackage.txt文件,里面记录了你这个环境的所有python包名和版本号。
 
2,把自己的项目以及备份的包发送到Ubuntu服务器上
说明:如果是用的xShell和xFTP会更方便,这里不使用。
迁移项目:把myPackage.txt从python环境目录下移到项目的根目录下。
在cmd下输入:scp -r <D://MyProject>  root@39.108.123.114:/usr/MyProject/            # <D://MyProject>是项目的根目录;root是服务器的用户名;39.108.123.114是你服务器的公网IP;/usr/MyProject/ 是ubuntu服务器上的文件位置;
会提示输入你的Ubuntu登录密码,密码正确后就会开始发送。
 
3,Ubuntu上Python环境的安装
说明:Ubuntu16.04上会自带Python2.7和Python3.5,千万不要把Python2.7删了,因为Ubuntu系统还会用到Python2.7。
安装Python3.6:   wget http://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz     # 下载Python3.6压缩包
                             tar -xvzf Python-3.6.4.tgz     # 解压
                             cd Python-3.6.4     # 进入到解压后的文件
                             ./configure --with-ssl    # 执行配置文件
                             make      
                             sudo make install    # 安装
                             python3      # 检验python版本。
 
使用virtualenv(强烈推荐):pip virtualenv    # 安装
                                          virtualenv  -p python3 MyEnv   # 创建虚拟环境,并指定python版本
激活虚拟环境: cd MyEnv/bin 
                         source activate   # 激活环境(注:以下步骤都是在这个虚拟环境下进行的
                         deactivate    # 退出环境
迁移包:先进入到myPackage.txt所在的目录,然后输入:pip instatll -r myPackage.txt     # 安装myPackage.txt中记录的所有包。
到这里你的Python环境就算安装好了!
验证:进入到项目的根目录下,输入:python manage.py runserver 0.0.0.0:80  # 运行你的项目。如果是阿里云服务器,一定要检查80端口是否处于开放状态。
          在你windows的浏览器中输入你服务器的公网IP就可以访问到你的项目了。
 
4,安装配置uwsgi
说明:uwsgi是一个服务器,用于部署你的Django项目。即:与Django项目进行通信。
安装:pip install uwsgi      # 会安装在你的虚拟python环境中。
验证是否安装成功:在你项目的同级目录下新建一个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 :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:
#如果使用nginx+uwsgi来部署Django项目时,就用这行。其中,8001端口用来跟nginx通信。也要在阿里云防火墙中添加8001端口。
# socket=0.0.0.0:
#你项目的完整路径。
chdir=/usr/DjangoProject/MyProject/
#给socket文件赋权限,这里不用管。
# chmod-socket=
#启用主线程。
master=true
processes=
threads=2
#指定日志文件(会自动创建)。这个很重要,如果uwsgi出现错误,可以通过日志文件来查错。
logto=uwsgi.log
#指定进程号文件(会自动创建)。这个也很重要,如果要重启和关闭uwsgi,则需要这个文件,里面记录了进程号。
pidfile=uwsgi.pid
#指定wsgi文件。在与settings.py同级目录中会有一个wsgi.py文件。
module=MyProject.wsgi:application
保存退出后,输入:uwsgi --ini uwsgi.ini    # 启动uwsgi,并指定配置文件。
验证:在windows的浏览器中输入服务器公网IP就可以访问到你的项目了。如果不能,一定要查看日志文件uwsgi.log中的错误信息,文章结尾会有几个简单操作。
 
5,安装配置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 ; # 不用管
} http{
server {
listen ; #这个端口用来监听浏览器的请求。
server_name 0.0.0.0; # 不用管,如果有域名可以填上域名。
charset UTF-;
#日志文件。如果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:; # 把浏览器发来的请求转发到8001端口,而uwsgi也正在监听8001端口,所以就实现了nginx与uwsgi的通信。
uwsgi_read_timeout ; #链接超时时间
}
location /static/{ # 处理静态文件,处理链接是以/static/开头的请求。即:如果是静态文件,就不用发给uwsgi了,nginx自己处理。
alias /usr/DjangoProject/MyProject/static/; # 项目静态文件的绝对路径。即:告诉nginx应该去哪里找静态文件。后面会介绍。
}
}
}
验证是否配置成功:
保存并退出,进入到项目根目录下:修改uwsgi.ini文件,把http=0.0.0.0:80注释掉,使用socket=0.0.0.0:8001   # 用来监听8001端口,与上面nginx对接。
保存并退出,输入: uwsgi -d --ini uwsgi.ini    # 启动uwsgi服务器。-d表示在后台运行。这样就不会占用当前窗口了。
                                server nginx start      # 启动nginx服务器。
在浏览器中输入服务器公网IP就可以访问了。如果出现错误,后面会介绍。
 
6,静态文件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。如果出现错误,文章结尾会有解决方法。
再次在windows浏览器中访问你的公网IP,应该就可以加载静态文件了。
 
7,图片能加载,但是CSS样式丢失问题
说明:在访问网页时,发现图片能加载,而CSS样式全部丢失;但是在浏览器中F12->网络(network)发现css文件已经发送过来了(状态码为200或304)。
解决:只需要把模板文件第一行的<!DOCTYPE html>改成<!DOCTYPE>,或者直接删掉就好了。
原因:在segmentfault上找到了解释。因为<!DOCTYPE html>会让浏览器用标准模式来解析你的这个文档,而不加的话就会用兼容模式。这是链接
 
8,可能出现的错误,以及解决方法和注意事项
说明:在重启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的问题了;
 
 
 
我也是刚刚接触Django和用nginx+uwsgi来部署Django,如有表述错误的地方,欢迎留言指正!
 
 
 
 

nginx+uwsgi部署Django项目到Ubuntu服务器全过程,以及那些坑!!!的更多相关文章

  1. 使用Nginx&plus;uWSGI部署Django项目

    1.linux安装python3环境 参考链接:https://www.cnblogs.com/zzqit/p/10087680.html 2.安装uwsgi pip3 install uwsgi l ...

  2. nginx &plus; uwsgi 部署django项目

    因项目需求,需要部署django项目,这里是基础的nginx配合uwsgi部署django,后续会采用docker部署的方式 环境: centos7 python3.5.4 django2.1.4 u ...

  3. Nginx &plus; uWSGI 部署Django 项目&comma;并实现负载均衡

    一.uWSGI服务器 uWSGI是一个Web服务器,它实现了WSGI协议.uwsgi.http等协议.Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换. 要注意 WSGI ...

  4. nginx&plus;uwsgi部署django项目

    1.django项目部署前需要生成admin的静态资源文件 (1)生成admin的静态资源文件 # 关闭debug模型 DEBUG = False # 允许所有域名访问 ALLOWED_HOSTS = ...

  5. CENTOS7 使用 Nginx &plus; Uwsgi 部署 Django 项目

    写在前面的话 最近总是见到有新学 Django 的朋友在部署自己的项目到 Linux 上面的时候运行不起来,所以就动手写了这篇博客. 对于不会搭建 Python 3 环境的朋友可以参考前面的博客[CE ...

  6. Python3&period;6&plus;nginx&plus;uwsgi部署Django程序到阿里云Ubuntu16&period;04系统

    Python3.6+nginx+uwsgi部署Django程序到阿里云Ubuntu16.04系统 这个是写好的Django程序在本地机运行的情况,一个查询接口. 准备工作 1.首先购买一台阿里云的EC ...

  7. nginx &plus; uwsgi 部署 Django&plus;Vue项目

    nginx + uwsgi 部署 Django+Vue项目 windows 本地 DNS 解析 文件路径 C:\Windows\System32\drivers\etc 单机本地测试运行方式,调用dj ...

  8. 填坑!!!virtualenv 中 nginx &plus; uwsgi 部署 django

    一.为什么会有这篇文章 第一次接触 uwsgi 和 nginx ,这个环境搭建,踩了太多坑,现在记录下来,让后来者少走弯路. 本来在 Ubuntu14.04 上 搭建好了环境,然后到 centos7. ...

  9. 使用uWSGI部署django项目

    先说说什么是uWSGI吧,他是实现了WSGI协议.uwsgi.http等协议的一个web服务器,那什么是WSGI呢? WSGI是一种Web服务器网关接口.它是一个Web服务器(如nginx)与应用服务 ...

随机推荐

  1. 嵌入式Linux驱动学习之路&lpar;二十&rpar;USB设备驱动

    USB在接入系统的时候,以0的设备ID和主机通信,然后由主机为其分配新的ID. 在主机端,D+和D-都是下拉接地的.而设备端的D-接上拉时,表明此设备为高速设备:12M/s. D+接上拉时则是全速设备 ...

  2. 程序员能力矩阵 Programmer Competency Matrix

    [译文]程序员能力矩阵 Programmer Competency Matrix [译文]程序员能力矩阵 Programmer Competency Matrix 注意:每个层次的知识都是渐增的,位于 ...

  3. Android init&period;rc文件格式解析

    /***************************************************************************** * Android init.rc文件格式 ...

  4. Java中&OpenCurlyDoubleQuote;&vert;”和&OpenCurlyDoubleQuote;&vert;&vert;”用法的区别

    例子: int a = 5; int b = 10; if(a > 4 | b++ > 10) { System.out.println("a:"+a+"\n ...

  5. Zabbix实战-简易教程--正则(Regxp)

    一.正则表达式(Regx) 1.概述 正则表达式概念就不解释了.请参考:https://en.wikipedia.org/wiki/Regular_expression#POSIX_extended ...

  6. &lbrack;Swift&rsqb;LeetCode526&period; 优美的排列 &vert; Beautiful Arrangement

    Suppose you have N integers from 1 to N. We define a beautiful arrangement as an array that is const ...

  7. shell编程基础&lpar;一&rpar;&colon; 基本变量和基本符号

    一.shell历史 Shell的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive),Shell还有一种执行命令的方式称为批处理(Batc ...

  8. WPF窗体の投影效果

    有时候我们需要给WPF窗体加上一个毛边(投影效果) 我们可以在窗体下加上如下代码 <Window.Effect> <DropShadowEffect BlurRadius=&quot ...

  9. 37&rpar;django-单例模式

    一:单例模式 单例模式,是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类. 通过单例模式可以保证系统中一个类只有一个实例.即一个类只有一个对象实例. 常用例子:数据库连接串,只保 ...

  10. Java 设计模式专栏

    Java 设计模式之工厂模式学习心得 转:Java 设计模式之单例模式 转:  Java设计模式之建造者模式 转:Java设计模式之代理模式