本文将介绍如何在Linux系统上部署Django web项目,本次部署基于下面的架构:

Linux(CentOS7)+ Python3.5 + Django1.11 + Nginx + uWSGI

亲测可行!!按照本文步骤且根据实际情况灵活部署,相信大家也能很快部署成功。话不多说,现在开始吧!

首先,你得安装CentOS或Redhat等Linux系统,物理机和虚拟机都行,如果是阿里云ECS主机并且带有独立公网IP,那就更好。在这里,我选用的是CentOS7,敬请参考。

至于如何安装CentOS7、Python3及其虚拟环境)、Django1.11,以及如何导出并安装环境依赖库(requirements.txt),不是本节的内容,请自行解决。下面是基于假定已将安装好了上述三者。

将Django项目移植到Linux系统中,进入Python虚拟环境,测试项目能否正常启动:python manage.py runserver ServerIP:8000

可能出现的问题:No module named '_sqlite3'

解决办法:

1.首先安装sqlite-devel
yum install sqlite-devel

2.重新编译安装Python3(进入Python解压目录执行下面的命令即可)
make
make install

安装uWSGI

Django的主要部署平台就是uWSGI,它也是Python的标准web应用服务器。uWSGI不支持Windows。

强烈建议使用:pip3 install uwsgi    (一般都是最新版本!如在极少情况下不是最新版,则参考如下灰色部分内容)

到uWSGI官网下载之:https://uwsgi-docs.readthedocs.io/en/latest/Download.html,下载Stable/LTS最新稳定版本的源文件。

为什么要最新版?因为现在的官方教程和相关技术文章全是以新版编写的,很多参数名,用法有较大改变。用旧版,偶尔有可能跑不起来。

我这里下载的是uwsgi-2.0.17.1.tar.gz,等到你看到此文时,可能已经不是最新的了。

解压源码,然后指定安装位置,将uwsgi安装好:

# 解压文件
tar -zxvf uwsgi-2.0.17.1.tar.gz
# 进入解压目录
python3 setup.py install

安装完毕后,尝试运行一下uWSGI:

[root@localhost wcw]# uwsgi

*** Starting uWSGI 2.0.17.1 (64bit) on [Thu Jul 26 11:14:57 2018] ***
compiled with version: 4.8.5 20150623 (Red Hat 4.8.5-28) on 25 July 2018 15:13:10
os: Linux-3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018
nodename: localhost.localdomain
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 2
current working directory: /home/wcw
detected binary path: /pyvenv/bin/uwsgi
uWSGI running as root, you can use --uid/--gid/--chroot options
*** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** 
*** WARNING: you are running uWSGI without its master process manager ***
your processes number limit is 9592
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uWSGI running as root, you can use --uid/--gid/--chroot options
*** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** 
uWSGI running as root, you can use --uid/--gid/--chroot options
*** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** 
The -s/--socket option is missing and stdin is not a socket.

虽然运行有警告,但至少表明你的uwsgi在系统可执行命令路径中。

如果出现找不到命令的提示,那么建议创建一个指向/usr/local/bin目录的软链接。

需要提醒大家注意的是权限的问题,该sudo的时候要sudo。还有读写权限,看看当前用户是否具备相关文件的读写权限。

配置uWSGI

软件安装好了后,首先是要拷贝项目代码。

因为我这里是在Windows下使用Pycharm编写的代码,不是在CentOS虚拟机内编写的代码,所以需要将项目文件先整体移植到虚拟机中(我使用的是Xftp工具)。这个过程,各有奇招。OK,我现在把项目文件拷贝过去了。

在项目的根目录下,也就是manage.py同级目录下,新建一个" uwsgi.ini "文件。文件名可以随便,但扩展名必须是".ini"。

在里面写入下面的配置内容:

[uwsgi]
socket = 192.168.1.2:8000 #应用服务IP端口
chdir = /pyvenv/src/eduonline #项目根目录
module = eduonline.wsgi       #指定wsgi模块,与Nginx连接时用
#http = IP:Port #web服务IP端口,uWSGI做web服务器时用
master = true #进程
processes = 4 #进程数 #vhost = true #多站模式
#no-site = true #多站模式时不设置入口模块和文件
#workers = 2 #子进程数
#reload-mercy = 10
#vacuum = true #退出、重启时清理文件
#max-requests = 1000
#limit-as = 512
#buffer-size = 30000 #进程文件,新建空文件即可,用于服务重启、停止。如:
#重启指令:uwsgi --restart [pidfile路径]
#停止指令:uwsgi --stop [pidfile路径]
pidfile = /pyvenv/src/eduonline/uwsgi.pid
daemonize = /pyvenv/src/eduonline/uwsgi.log #日志文件,一般会自动创建
#disable-logging = true #不记录正常信息,只记录错误信息

详细说明:

  • 配置项中以"#"开头的都是被注释的项目;
  • chdir 是你的项目根目录,这里是eduonline;
  • module 是你的入口wsgi模块,将eduonline替换成你的项目名称;
  • socket 是通信IP和端口设置;
  • master=True 表示以主进程模式运行;
  • demonize 是你的日志文件,会自动创建;
  • disable-logging = true 表示只记录错误信息,否则你的日志可能很快就爆满了!

测试:

[root@localhost /]# uwsgi --http :8888 --module eduonline.wsgi    // 配置文件中的module,随便写个其他端口

如最后出现下面内容,则运行成功:

spawned uWSGI worker 1 (and the only) (pid: 5715, cores: 1)      // Ctrl+C结束

安装Nginx

其实安装Apache亦可,然而我选择的是目前最流行的Nginx(>>查看Nginx的安装部署?)。

若是Ubuntu,默认源里面的Nginx版本比较旧,需要先添加一个Nginx的源,再通过apt-get安装Nginx。

sudo add-apt-repository ppa:nginx/stable
  apt-get update
  apt-get install nginx

一般这个都没问题,Nginx是居家必备软件,各家Linux下都可以顺利安装。

然后,通过ifconfig,查看一下你的Ubuntu虚拟机的ip地址,我这里是192.168.1.2。使用同一局域网内的主机,通过浏览器访问192.168.1.2或127.0.0.1,如果能看到下面的界面,说明Nginx服务正常。

配置Nginx

uWSGI安装好了,就配置一下Nginx,编辑配置文件nginx.conf:

************************************************************************
关键是这一部分: listen 88;                # 区别于uwsgi设置的端口
server_name www.wcwnina.com;     # 记得在系统的/etc/hosts文件中添加IP与域名的映射! location / {
include uwsgi_params;       # 与nginx.conf同目录
uwsgi_pass 192.168.1.2:8000;   # 与uwsgi配置中的socket一致
} location /static {
alias /pyvenv/src/eduonline/collectstatic;
}
************************************************************************

重点关注:"include"路径一定要正确;"uwsgi_pass"的值必须与"uwsgi.ini"配置文件中的"socket"一致,且二者的端口务必和"listen"端口不一样!!

请将"server_name"改成你的实际域名,"location  /static"的alias改成你的实际情况。

修改完毕,保存退出,然后重启nginx服务:

nginx -s reload

# 其他指令
启动服务:nginx
退出服务:nginx -s quit
强制关闭服务:nginx -s stop
重启服务:nginx -s reload
验证配置文件:nginx -t
使用配置文件:nginx -c "配置文件路径"
使用帮助:nginx -h

启动服务

下面我们可以尝试启动uwsgi服务啦(参考使用systemctl管理服务[往下翻])! 进入有uwsgi.ini文件的目录,运行:

启动:uwsgi --ini uwsgi.ini

重启:uwsgi --restart uwsgi.pid  停止:uwsgi --stop uwsgi.pid
(修改过配置文件必须重启)

系统提示:

[uWSGI] getting INI configuration from uwsgi.ini

到主机浏览器中访问'192.168.1.2',却看见下面的错误提示页面:

DisallowedHost at /
Invalid HTTP_HOST header: '192.168.1.2'. You may need to add '192.168.1.2' to ALLOWED_HOSTS.
Request Method: GET
Request URL: http://192.168.1.2/
Django Version: 1.11.3
Exception Type: DisallowedHost
Exception Value:
Invalid HTTP_HOST header: '192.168.1.2'. You may need to add '192.168.1.2' to ALLOWED_HOSTS.
Exception Location: /usr/local/lib/python3.5/dist-packages/django/http/request.py in get_host, line 113
Python Executable: /usr/local/bin/uwsgi
Python Version: 3.5.4
......

不要被它们吓到!很多人都不愿意仔细看错误信息,其实解决办法,人家已经提示得非常清楚了,需要在ALLOWED_HOSTS配置项目中添加'192.168.1.2'。

进入相应目录,编辑settings.py文件:

DEBUG = False
ALLOWED_HOSTS = ['192.168.1.2']

同时将DEBUG设置为False。

在CentOS中,运行下面的命令:

killall -9 uwsgi

这会删除先前的uwsgi进程。 过几秒,一定要过几秒,数5下,然后:

uwsgi --ini uwsgi.ini

为什么要过几秒?因为端口释放有延迟啦。

再次在浏览器中访问域名"www.wcwnina.com:88"或"192.168.1.2",就会看到你部署的网站首页(下图是我本人亲自开发的网站,你看到的以你实际部署的网站为准):

OK,大功告成!至此一个Django web项目就在Linux系统上部署好了。但这还没有结束,还有静态文件配置、密钥文件处理、服务自启动(往下翻)等等,大家见谅,那我这里先不做赘述吧。

解决一个意外问题

除了"400 Bad Request",啥狗屁错误提示也没有!百度了很久,几乎全是说http请求头报文的格式有误或字长超出最大限制,按步骤处理后,仍然不能解决问题。因为虽然http状态码一致,但引发问题的原因很可能不一样。

问题截图:

原因:不小心将Nginx的监听端口Listen与uWSGI配置的端口写成一样了。处理办法:将它们设为不一样。

(附1) 一般Linux开启外网访问配置

在Linux系统中默认有防火墙Iptables管理者所有的端口,只启用默认远程连接22端口其他都关闭,咱们上面设置的80等等也是关闭的,所以我们需要先把应用的端口开启。

方法1

直接关闭防火墙,这样性能较好,但安全性较差,如果有前置防火墙可以采取这种方式。

关闭防火墙
[root@localhost ~]# service iptables stop
关闭开机自启动防火墙
[root@localhost ~]# chkconfig iptables off
[root@localhost ~]# chkconfig --list|grep ipt

方法2

将开启的端口加入防火墙白名单中,这种方式较安全但性能也相对较差。

编辑防火墙白名单
[root@localhost ~]# vim /etc/sysconfig/iptables
增加下面一行代码
-A INPUT -p tcp -m state -- state NEW -m tcp --dport 80 -j ACCEPT
保存退出,重启防火墙
[root@localhost ~]# service iptables restart

(附2) CentOS 7防火墙管理

CentOS 7.0默认使用的是firewall作为防火墙, 使用systemctl来管理服务和程序,包括了service和chkconfig。

1、查看防火墙状态

[root@localhost ~]# firewall-cmd --state
running

2、关闭防火墙

[root@localhost ~]# systemctl stop firewalld.service    //停止firewall,.service可省略
[root@localhost ~]# systemctl disable firewalld //禁止firewall开机启动

3、开启防火墙

[root@localhost ~]# systemctl start firewalld           //启动firewall
[root@localhost ~]# systemctl restart firewalld //重启firewall
[root@localhost ~]# systemctl enable firewalld //开机时启动firewall

4、在开启防火墙前提下,开放某个端口

查看所有打开的端口
[root@localhost ~]# firewall-cmd --list-port --permanent (查看永久的端口,后面加上"--permanent")

添加
[root@localhost ~]# firewall-cmd --add-port=80/tcp --permanent ("--permanent"永久生效,没有此参数重启后失效)

重新载入
[root@localhost ~]# firewall-cmd --reload

删除
[root@localhost ~]# firewall-cmd --remove-port=80/tcp --permanent

修改后需要重启防火墙服务。

  至此。转载请注明出处。

本站相关链接:>>Windows环境下部署Django ]

,与Nginx

Django Linux环境下部署CentOS7+Python3+Django+uWSGI+Nginx(含Nginx返回400问题处理、防火墙管理)的更多相关文章

  1. Django Windows环境下部署

    环境准备 本文将介绍如何在Windows系统上部署Django web项目,本次部署基于下面的架构: Windows10 64位+Python3.6+Django1.11+Apache2.4+mod_ ...

  2. linux 环境下部署 Asp.Net Core 项目 访问 oralce 数据库

    1.ASP.NET Core 是一个跨平台的高性能开源框架,可以部署到Linux上,那项目部署在Linux上有哪些好处呢? 1.linux硬件需求小,大部分版本免费,成本低. 2.linux的用户管理 ...

  3. Linux环境下部署完JDK后运行一个简单的Java程序

    前言 前一篇文章详细讲解了如何在Windows环境下安装虚拟机+Linux系统,并且成功部署了JDK. 不过部署完JDK之后,我们判断部署是否成功的依据是看"java -version&qu ...

  4. 在Linux环境下部署MySql服务

    之前有下载部署过几次,但是每次都会踩一些坑.特此记录在liunx下部署安装mysql的基本步骤: 1.卸载老版本的mysql find / -name mysql|xargs rm -rf     查 ...

  5. [学习笔记]Linux环境下部署 .Net5 程序

    ​公司的项目需要部署到一台公网的linux服务器,以便同事们测试小程序. 目标服务器是新搭建的CentOS 8虚拟机,以非docker的方式部署.现记录过程便于日后部署至项目甲方的服务器上,因为甲方的 ...

  6. linux环境下部署tomcat

    服务器环境:Red Hat Enterprise Linux Server release 6.5 安装部署包:apache-tomcat-8.0.30.tar.gz.jdk-8u66-linux-x ...

  7. .NetCore~Linux环境下部署

    NetCore正式版已经出现有段时候了,Windows下使用vs2015开发.netCore应用程序,然后通过dotnet程序开启WEB服务,用着很像node.js,当然我们不会于只局限于window ...

  8. 03_mysql-python模块, linux环境下python2,python3的

    ---恢复内容开始--- 1.Python2 正常 [root@IP ~]# pip install mysql-python DEPRECATION: Python 2.7 will reach t ...

  9. Linux环境下部署开源版“禅道”方法

    1.开源版安装包下载(Linux系统版本查看命令 uname -a) 32位 [root@iZbp~]# wget http://dl.cnezsoft.com/zentao/9.0.1/ZenTao ...

随机推荐

  1. [Swift]LeetCode945. 使数组唯一的最小增量 | Minimum Increment to Make Array Unique

    Given an array of integers A, a move consists of choosing any A[i], and incrementing it by 1. Return ...

  2. python高级-装饰器(19)

    一.什么是闭包 先看一个例子: #定义一个函数 def test(number): #在函数内部在定义一个函数,并且这个函数用到外围函数的变量 #那么将这个函数及用到的一些变量称之为闭包 def te ...

  3. JavaScript03-基本概念一

    js包括:语法.语句.类型.关键字.保留字.操作符和对象. 语法.关键字.保留字 1.js中一切区分大小写,包括变量.函数名.操作符: 2.标识符规则,第一个字符必须是字母.下划线_.或者美元符号,其 ...

  4. qt 坐标变换

    原文链接:Qt学习之路(28): 坐标变换   同很多坐标系统一样,QPainter的默认坐标的原点(0, 0)位于屏幕的左上角,X轴正方向是水平向右,Y轴正方向是竖直向下.在这个坐标系统中,每个像素 ...

  5. Flow 常用知识点整理

    Flow入门初识 Flow是facebook出品的JavaScript静态类型检查工具. 由于JavaScript是动态类型语言,它的灵活性也会造成一些代码隐患,使用Flow可以在编译期尽早发现由类型 ...

  6. Asp.Net SignalR 集群会遇到的问题

    SignalR集群 当客户端数量上来,一台server自然是吃不消的.多个server集群部署是必然的解决方案.再通过负载均衡,嗯 简直是完美.但是问题也接踵而来.每个server只能管理到当前ser ...

  7. Linux驱动模块编译模板

    hello.c文件: #include <linux/module.h> #include <linux/kernel.h> static int hello_init(voi ...

  8. QQ音乐的动效歌词是如何实践的?

    本文由云+社区发表 作者:QQ音乐技术团队 一. 背景 1. 现状 歌词浏览已经成为音乐app的标配,展示和动画效果也基本上大同小异,主要是单行的逐字染色的卡拉OK效果和多行的滚动效果.当然,我们也不 ...

  9. HTTP协议简介详解 HTTP协议发展 原理 请求方法 响应状态码 请求头 请求首部 java模拟浏览器客户端服务端

    协议简介 协议,自然语言里面就是契约,也是双方或者多方经过协商达成的一致意见; 契约也即类似于合同,自然有甲方123...,乙方123...,哪些能做,哪些不能做; 通信协议,也即是双方通过网络通信必 ...

  10. java内部类深入详解 内部类的分类 特点 定义方式 使用

    本文关键词: java内部类 内部类的分类 特点  定义方式 使用   外部类调用内部类 多层嵌套内部类  内部类访问外部类属性  接口中的内部类  内部类的继承  内部类的覆盖  局部内部类 成员内 ...