本文将介绍如何在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. layui.table图片显示不全和404问题

    1.图片显示不全 在使用layui.table组件中,加载的图片显示不全,需重新定义CSS如下: .layui-table-cell{ height: auto!important; white-sp ...

  2. Unable to preventDefault inside passive event listener due to target being treated as passive

    Unable to preventDefault inside passive event listener due to target being treated as passive 今天在做项目 ...

  3. (转)iOS学习——UIlabel设置行间距和字间距

    在iOS开发中经常会用到UIlabel来展示一些文字性的内容,但是默认的文字排版会觉得有些挤,为了更美观也更易于阅读我们可以通过某些方法将UIlabel的行间距和字间距按照需要调节. 比如一个Labe ...

  4. 【spring】静态资源的访问受限解决方法

    前言 我们知道在整合spring mvc框架的时候需要在web.xml中配置一个servlet 代码如下 <!--spring mvc 的DispatcherServlet--> < ...

  5. ThinkPHP 数据库操作(六) : 查询事件、事务操作、监听SQL

    查询事件 查询事件(V5.0.4+) 从 5.0.4+ 版本开始,增加了数据库的CURD操作事件支持,包括: 查询事件仅支持 find . select . insert . update 和 del ...

  6. Scala安装教程

    首先去Java官网下载Java的安装包 jdk-8u121-windows-x64.exe 再去Scala官网下载Scala的安装包 Scala2.12.1 安装Java: 配置Java环境变量(系统 ...

  7. 【Spark篇】---SparkSQL初始和创建DataFrame的几种方式

    一.前述       1.SparkSQL介绍 Hive是Shark的前身,Shark是SparkSQL的前身,SparkSQL产生的根本原因是其完全脱离了Hive的限制. SparkSQL支持查询原 ...

  8. requirejs、vue、vuex、vue-route的结合使用,您认为可行吗?

    在五一节之前和一网友讨论前端技术时,对方提到vue.vue-route如果配合requirejs应用.当时的我没有想得很明白,也没能这位网友一个准确的回复,但我许诺于他五一研究后给他一个回复.本是一天 ...

  9. linux-centerOs6.8安装nginx与配置

    一:安装nginx 1.安装gcc(命令:yum install gcc)备注:可以输入gcc -v查询版本信息,查看是否自带安装 2.安装pcre(命令:yum install pcre-devel ...

  10. 【斐波那契数列】java探究

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 解析 (1)递归方式 对于公式f(n) = f(n-1) + f(n ...