Django 部署 CentOS7+Python3+Django+uWSGI+Nginx(含Nginx返回400问题处理、防火墙管理)

本节将介绍如何部署Django,基于下面的架构:

CentOS7+ Python3 + Django1.11 + uWSGI + Nginx。

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

至于如何安装CentOS、Python3(含虚拟环境)和Django1.11,不是本节的内容,请自行解决。下面我假定你已将安装好了这三者。

将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应用服务器。

强烈建议使用:pip3 install 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:

[[email protected] 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。还有读写权限,看看当前用户是否具备相关文件的读写能力。很多时候部署失败,都不是Python和Django层面的原因,而是你的Linux管理业务还不够熟练。

配置uWSGI

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

因为我这里是在Windows下使用Pycharm编写的代码,不是在CentOS虚拟机内编写的代码,所以需要将项目文件先整体移植到虚拟机中(我使用的是Xftp工具)。

这个过程,也是八仙过海,各有奇招,好了,项目文件拷贝过去了。

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

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

[uwsgi]

chdir = /pyvenv/src/eduonline              #项目根目录
module = eduonline.wsgi:application        #指定wsgi模块
socket = 192.168.1.102:8000                #外网IP:端口,与Nginx连接时用
#http = IP:Port                            #外网IP:端口,uWSGI做web服务器时用
master = true                              #进程

#vhost = true                              #多站模式
#no-site = true                            #多站模式时不设置入口模块和文件
#workers = 2                               #子进程数
#reload-mercy = 10
#vacuum = true                             #退出、重启时清理文件
#max-requests = 1000
#limit-as = 512
#buffer-size = 30000

#进程文件,新建空文件即可,用于服务重启、停止。如:
#重启:uwsgi --restart /pyvenv/src/eduonline/uwsgi.pid
#停止:uwsgi --stop /pyvenv/src/eduonline/uwsgi.pid
pidfile = /pyvenv/src/eduonline/uwsgi.pid
daemonize = /pyvenv/src/eduonline/uwsgi.log    #日志文件,新建空文件即可
disable-logging = true                         #不记录正常信息,只记录错误信息

详细说明:

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

测试:

[[email protected] /]# uwsgi --http :8001 --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.102。使用同一局域网内的主机,通过浏览器访问192.168.1.102或127.0.0.1,如果能看到下面的界面,说明nginx服务正常。

配置Nginx

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

******

关键是这一部分:

listen      80;server_name www.edu.com;    # 记得在/etc/hosts文件中添加IP与域名的映射!

location / {
    include  /usr/local/nginx/conf/uwsgi_params;
    uwsgi_pass  192.168.1.102:8000;
}
location /static {
    alias /pyvenv/src/eduonline/collectstatic;
}

******

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

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

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

nginx -s reload

启动服务

下面我们可以尝试启动uwsgi服务啦! 进入有uwsgi.ini文件的目录,运行:

启动: uwsgi --ini uwsgi.ini

重启: 1)查看uwsgi的pid:ps -ef|grep uwsgi;  2)杀死第一条进程:kill -9 pidnum;  3)再启动:uwsgi --ini uwsgi.ini(修改过配置文件必须重启)

系统提示:

[uWSGI] getting INI configuration from uwsgi.ini

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

DisallowedHost at /
Invalid HTTP_HOST header: ‘192.168.1.102‘. You may need to add ‘192.168.1.102‘ to ALLOWED_HOSTS.
Request Method: GET
Request URL:    http://192.168.1.102/
Django Version: 1.11.3
Exception Type: DisallowedHost
Exception Value:
Invalid HTTP_HOST header: ‘192.168.1.102‘. You may need to add ‘192.168.1.102‘ 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.102‘。

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

DEBUG = False
ALLOWED_HOSTS = [‘192.168.1.102‘]

同时将DEBUG设置为False。

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

killall -9 uwsgi

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

uwsgi --ini uwsgi.ini

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

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

到此一个基本的Django项目就部署好了。但这还没有结束,还有静态文件配置、密钥文件处理、服务自启动等等,以后再介绍吧。。。

解决一个常见问题

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

问题截图:

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

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

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

方法1

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

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

方法2

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

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

(附2) CentOS 7防火墙管理

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

1、查看防火墙状态

[[email protected] ~]# firewall-cmd --state
running

2、关闭防火墙

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

3、开启防火墙

[[email protected] ~]# systemctl start firewalld           //启动firewall[[email protected] ~]# systemctl restart firewalld         //重启firewall
[[email protected] ~]# systemctl enable firewalld          //开机时启动firewall

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

查看所有打开的端口
[[email protected] ~]# firewall-cmd --list-port --permanent    (查看永久的端口,后面加上"--permanent")
添加
[[email protected] ~]# firewall-cmd --add-port=80/tcp --permanent    ("--permanent"永久生效,没有此参数重启后失效)
重新载入
[[email protected] ~]# firewall-cmd --reload
删除
[[email protected] ~]# firewall-cmd --remove-port=80/tcp --permanent

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

  至此。转载请注明出处。

原文地址:https://www.cnblogs.com/wcwnina/p/9906081.html

时间: 2024-08-05 14:22:59

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

centos7下部署Django(nginx+uWSGI+Python3+Django)

部署代码后uWSGI需要重新启动,关闭系统防火墙或者开放端口 系统版本:CentOS7.0 Python版本:Python3.6.3 Django版本:2.0.5 uWSGI版本:2.0.17 nginx版本1.4.4 1.安装需要的依赖 ```shell yum install wget openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel yum install libxml* yum -y

CentOS7下部署Python3+Django+uwsgi+Nginx

1,首先在部署项目时,需要安装好系统的环境,那我们首先来安装依赖yum -y install gcc gcc-c++yum -y groupinstall "Development tools"yum -y install zlib zlib-devel openssl openssl-devel ncurses-devel sqlite sqlite-devel bzip2-deve readline-devel tk-devel gdbm-devel db4-devel libpc

Python3+django+nginx+uwsgi使用场景部署

1 环境介绍和准备Python3+django+nginx+uwsgi使用场景部署 当我们写完一套完整的网站功能,我们需要实时在生产环境上线,并需要容纳高并发的访问请求.所以我们需要部署以上来保证网站的服务质量. 1.1基本环境准备:echo 'LANG="en_GB.utf8"' > /etc/sysconfig/i18nLANG="en_GB.utf8" 1.2依赖环境:(env) [[email protected] nginx]# python -VP

Centos7.6下Nginx+Uwsgi+Django部署

本人服务器是使用腾讯云Centos7.6.以下配置均在Root权限下操作. 1. python3 1.1 安装依赖包 sudo yum -y groupinstall "Development tools" sudo yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-deve

CentOS 7 下Django项目部署教程(基于uwsgi和Nginx)

本文主要介绍如何在Linux平台上部署Django相关项目,关于Django项目的部署在互联网论坛上有很多的资料,笔者在查阅众多资料并经过实践后发现结果并不如意(或多或少总是遇到一些问题,往往与资料的预期不相符).在浏览了许多资料后笔者整理得出了部署Django项目的一般性方法,部署的方法有很多种,在此笔者选择了较为常用的基于uwsgi和Nginx的部署方案. 一.前提准备 部署前主要是需要做一些与服务器相关的准备工作,本次教程的服务器采用了阿里云的 CentOS 7.3 64位,当然作为资料学

Django部署——uwsgi+Nginx

Django部署——uwsgi+Nginx(超详细) 环境:python3.6centos 7Django1.11用Django写了个小网站,只能在自己本地跑一跑!这怎么行?听说可以部署在云服务器上,这样别人就可以访问了! biu~ 从哪儿开始?就从Django开始吧!老规矩,按步骤: 1.本地跑起来Django 这里不讲Django项目实施过程,假设你已经写了一个Django项目,并且在本地127.0.0.1:8000能够跑起来.喏,给你个参考,项目大概长这样: Django Project

nginx+uwsgi+django部署流程

当我们在用django开发的web项目时,开发测试过程中用到的是django自带的测试服务器,由于其安全及稳定等性能方面的局限性,django官方并不建议将测试服务器用在实际生产. nginx+uwsgi+django是我们常用的django部署方式.nginx作为最前端的服务器,他负责接收所有的客户端请求,对于请求的静态文件,由nginx服务器自己完成,因为它具有很好处理静态文件的能力,性能进行过优化,支持高并发量:uWSGI服务器作为支持服务器,是用来服务nginx的,nginx将请求的动态

Nginx+uWSGI+Django部署web服务器

目录 Nginx+uWSGI+Django部署web服务器 环境说明 前言 搭建项目 Django部署 编辑luffy/luffy/settings.py 编辑luffy/app01/views.py 编辑luffy/luffy/urls.py 运行并测试 uWSGI部署 测试运行uWSGI 使用uWSGI运行django项目 uWSGi热加载Djangoa项目 部署nginx nginx配置uwsgi和django django部署static文件 重新加载nginx进行测试 测试nginx

uWSGI + Nginx + Django 部署

1. uWSGI 服务器 Django 默认使用 WSGI(Python Web Server Gateway ) 作为 Web 服务器,一般仅用来作为测试使用,实际生产环境而是使用 uWSGI 和 Nginx 作为服务器. uWSGI 代码完全用C编写,效率高.性能稳定,但是处理 静态文件能力较弱,因此实际生产环境中,一般采用 uWSGI + Nginx 两者搭配使用: uWSGI:处理动态请求(css.js.图片文件等) Nginx:处理静态文件请求(提交表单.mysql.动态渲染 html