在此之前笔者也是使用 python manage.py runserver 来运行服务器,这只适用测试环境中使用。正式发布的服务,我们需要一个可以稳定而持续的服务器,比如apache, Nginx, lighttpd等。

在开始安装部署之前,先弄清楚几个概念(注意大小写区别):

  • WSGI - 全称为Python Web Server Gateway Interface, 即Python服务器网关接口。是为Python语言定义的Web服务器Web应用程序Web应用框架之间的一种简单而通用的接口.。WSGI只是一种通信协议,更详细信息请查看维基百科WSGI.
    通俗一点说就是写Python程序时不想花费大量的时间去处理TCP连接、HTTP的请求和响应等等, 于是就把这些都统一成了一个接口(即WSGI)。然后由专门的Web服务器(uWSGI等)Web应用框架(Django等)去实现,既降低了开发门槛又节约了时间。

  • uWSGI - uWSGI是一个实现了WSGI协议的Web服务器。uWSGI处理了HTTP的响应解析等,并转成WSGI协议,这样我们编写的Web应用程序或Web应用框架才可以对传递过来的信息进行处理。

  • uwsgi - uwsgi是实现了WSGI协议的服务器的内部自有协议,它定义了传输信息的类型,用于实现了WSGI协议的服务器与其他网络服务器的数据通信。

uWSGI特点:

  • 超快的性能
  • 低内存占用(实测为apache2的mod_wsgi的一半左右)
  • 多app管理
  • 详尽的日志功能(可以用来分析app性能和瓶颈)
  • 高度可定制(内存大小限制,服务一定次数后重启等)

了解基本的概念之后,就知道了为什么要Django+uWSGI。Django是Python的Web应用框架,他帮我们做了很多基础工作, 让开发者可以专心的写业务代码。而uWSGI是实现了WSGI协议的Web服务器。只有这两者组合在一起,Python的应用程序才可以发挥作用。

理论上,有了这一套,就可以部署到服务器使用了。而我们还要加上Nginx的原因,当然是因为Nginx可以做一些uWSGI做不到的事情,或者把事情做得更好。

Nginx是一款面向性能设计的HTTP服务器,相较于Apache具有占有内存少,稳定性高等优势。可以被用作反向代理,负载平衡器 和 HTTP缓存。所以使用Nginx的最大原因之一就是性能问题。如果只是个小网站,不会有很大了流量,当然uWSGI可以满足要求,但是在高并发情况下就需要Nginx了,并且Nginx相比Apache有很大的高并发优势。

另外,Nginx能带来更好的安全性。并且可以直接处理静态内容,不需要通过uWSGI,让uWSGI专心处理动态内容,从而提高性能。

总结一下各自的任务以及工作原理:Nginx接收到客户端的请求,如果请求的是静态内容就直接返回静态内容,如果请求的是动态内容,就把请求转发给uWSGIuWSGI连接Django进入我们的Python程序进行处理。

知道Django, uWSGI, Nginx分别是什么,并且知道为什么要用Django+uWSGI+Nginx之后,就可以进行服务器的部署工作了。

本文基于: 腾讯云CentOS Linux release 7.2.1511 (Core), Python 3.7.3, Django 2.2.2, uWSGI 2.0.18, Nginx 1.16.0为例。

查看系统、Python、uwsgi、nginx版本的命令:

cat /etc/redhat-release #查看centos版本
python -V #查看Python版本
uwsgi --version #查看uwsgi版本
nginx -v #查看nginx版本

查看Django版本:进入Python环境,输入:

>>>import django
>>>django.VERSION

作用:

  • 第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程;
  • 在nginx上加上安全性或其他的限制,可以达到保护程序的作用;
  • uWSGI本身是内网接口,开启多个work和processes可能也不够用,而nginx可以代理多台uWSGI完成uWSGI的负载均衡;
  • django在debug=False下对静态文件的处理能力不是很好,而用nginx来处理更加高效。

【安装基础开发包】

Centos 下安装步骤如下:

yum groupinstall "Development tools"
yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel

CentOS 自带 Python 2.4.3,但我们最好安装最新版(目前是Python3.7.3),因为Python2在2020年年底就不支持了。

Python下载地址:https://www.python.org/ftp/python/

cd ~
wget http://python.org/ftp/python/3.7.3/Python-3.7.3.tar.bz2
tar xvf Python-3.7.3.tar.bz2
cd Python-3.7.3
./configure --prefix=/usr/local
make && make altinstall

1.1、安装Python包管理

easy_install 包: https://pypi.python.org/pypi/distribute

安装步骤:

cd ~
wget https://pypi.python.org/packages/source/d/distribute/distribute-0.6.49.tar.gz
tar xf distribute-0.6.49.tar.gz
cd distribute-0.6.49
python2.7 setup.py install
easy_install --version

pip 包: https://pypi.python.org/pypi/pip

安装 pip 的好处是可以用 pip list、pip uninstall 管理 Python 包, easy_install 没有这个功能,只有 uninstall。

1.2、安装 uwsgi

uwsgi:https://pypi.python.org/pypi/uWSGI

uwsgi 参数详解:http://uwsgi-docs.readthedocs.org/en/latest/Options.html

pip方式安装:

pip install uwsgi
uwsgi --version    # 查看 uwsgi 版本

wget方式安装:

使用wget方式安装,下载地址:https://uwsgi-docs.readthedocs.io/en/latest/Download.html

wget https://projects.unbit.it/downloads/uwsgi-2.0.18.tar.gz

1.2.1、检查uwsgi是否安装成功

安装完后,检查一下uwsgi命令是否可用,查看 uwsgi 版本号(查看版本号命令如下)

uwsgi --version    # 查看 uwsgi 版本

如果提示:[uwsgi: command not found],解决方案也很简单,建立软链接就行:

ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi

后记:在centos系统里面,使用的命令,都必须在 /usr/bin/ 目录下有链接,没有链接则建立软链接。

1.2.2、测试 uwsgi 是否工作正常:

在home文件夹下,新建 test.py 文件,内容如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-def application(self, start_response):start_response('200 OK', [('Content-Type','text/html')])#return "hello,world"return [b'hello,world!']

需要注意的是:return "hello,world",是Python2的写法!!

1.2.3、启动uwsgi服务器

两种方式:命令行方式,配置文件方式。

命令行方式:在终端运行下面的命令,来启动uwsgi服务。

uwsgi --http :9090 --wsgi-file /home/test.py

配置文件方式:在home文件夹下,新建 uwsgi9090.ini 文件:

[uwsgi]
#socket = 127.0.0.1:9090
#socket = 172.16.0.8:9090
#http-socket = 127.0.0.1:9090
#http-socket = 172.16.0.8:9090
http = 172.16.0.8:9090
#project dir
chdir = /home
wsgi-file = test.py
#wsgi-file = /home/test.py
plugins = python
master = true
vhost = true
no-site = true
workers = 2
reload-mercy = 10
vacuum = true
max-requests = 1000
limit-as = 512
buffer-size = 30000
pidfile = /home/uwsgi9090.pid
#daemonize = /home/uwsgi9090.log

注释:

socket = 127.0.0.1:9090  ##启动端口9090的服务,需用nginx代理,可以对外提供服务。

http = 127.0.0.1:9090  ##启动端口9090的服务,可以直接对外提供服务。

然后通过运行下面命令,来启动uwsgi服务:

uwsgi --ini /home/uwsgi9090.ini

1.2.4、检查一下成果

在浏览器内输入:http://127.0.0.1:9090,查看是否有"Hello World"输出。

这里需要注意,如果使用的是阿里云或腾讯云的服务器,请使用服务器内网的ip(ifconfig可以查看),而不是127.0.0.0。

1.2.5、可能会出现的问题

如果浏览器无返回,但是服务端有收到请求,那么很可能是因为服务端没有返回,或者返回的代码部分有错误。

这里留意一下 test.py 里面是:

return "hello,world" #python2

还是下面这个:

return [b'hello,world!'] #python3

1.2.6、uwsgi其他命令

#### 启动:
uwsgi --ini xxx.ini
#### 重启:
uwsgi --reload xxx.pid
#### 停止:
uwsgi --stop xxx.pid

2、安装 Django

2.1、pip命令安装

pip install django

2.2、测试 django 是否正常,运行:

django-admin.py startproject demosite
cd demosite
python manage.py runserver 0.0.0.0:8002

在浏览器内输入:http://127.0.0.1:8002,检查django是否运行正常。同样的,如果是使用阿里云或者腾讯云的服务器,这里的IP应该是外网的IP地址。

2.3、可能会出现的问题:

Django报错:” File “manage.py”, line 14 ) from exc ^ SyntaxError: invalid syntax”

原因:这是因为Django的项目是Python3写的,但是用的是python命令来启动,实际上是Python2的命令来启动Django项目,所以报错了!

解决方案:建立一个Python3的软连接,然后用Python3来启动Django项目。

3、安装 Nginx

首先安装必要的库(nginx 中gzip模块需要 zlib 库,rewrite模块需要 pcre 库,ssl 功能需要openssl库)。

选定/usr/local为安装目录,以下具体版本号根据实际改变。

3.1、gcc 安装
安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装:

yum install gcc-c++

3.2、PCRE pcre-devel 安装
PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令:

yum install -y pcre pcre-devel

3.3、zlib 安装
zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。

yum install -y zlib zlib-devel

3.4、OpenSSL 安装
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。
nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。

yum install -y openssl openssl-devel

3.5、Nginx 安装

Nginx下载地址:http://nginx.org/en/download.html,下载.tar.gz安装包。

安装命令如下(依次执行):

cd /usr/local
wget http://nginx.org/download/nginx-1.16.0.tar.gz
tar xf nginx-1.16.0.tar.gz
cd nginx-1.16.0
./configure --prefix=/usr/local/nginx-1.16.0 \
--with-http_stub_status_module \
--with-http_gzip_static_module
make && make install

测试配置文件是否正常:

nginx -t

可能会出现的问题:-bash: nginx: command not found

解决方案:在etc/profile文件末尾加上:

PATH=$PATH:/usr/local/nginx/sbin
export PATH

以后无论在哪个目录下,都可以直接使用Nginx命令了,注意:修改profile文件后,需要重启系统!!!

查找安装路径:

whereis nginx

启动、停止nginx

cd /usr/local/nginx/sbin/
./nginx
./nginx -s stop
./nginx -s quit
./nginx -s reload
./nginx -s quit:此方式停止步骤是待nginx进程处理任务完毕进行停止。
./nginx -s stop:此方式相当于先查出nginx进程id再使用kill命令强制杀掉进程。

查询nginx进程:

ps aux|grep nginx

重启 nginx

1.先停止再启动(推荐):
对 nginx 进行重启相当于先停止再启动,即先执行停止命令再执行启动命令。如下:

./nginx -s quit
./nginx

2.重新加载配置文件:
当 ngin x的配置文件 nginx.conf 修改后,要想让配置生效需要重启 nginx,使用-s reload不用先停止 ngin x再启动 nginx 即可将配置信息在 nginx 中生效,如下:

./nginx -s reload

开机自启动

即在rc.local增加启动代码就可以了。

vi /etc/rc.local

增加一行 /usr/local/nginx/sbin/nginx
设置执行权限:

chmod 755 rc.local

Nginx 的默认配置文件放置在 /usr/local/nginx/conf/内(nginx.conf),监听端口默认80,所有http访问127.0.0.1:80后,会显示nginx的欢迎界面。

Nginx需要两个配置文件:uwsgi_params 文件和 project_name.conf 文件。

uwsgi_params :nginx.conf 的同目录下有uwsgi_params文件,没有的话根据链接获取,后面要用到。

project_name.conf 通过复制 nginx.conf 配置文件并进行修改。


【uwsgi + nginx 配置】

4、uwsgi 配置

uwsgi支持ini、xml等多种配置方式,本文以 ini 为例, 在/home/project_name目录下新建uwsgi9090.ini,添加如下配置:

[uwsgi]
socket = 127.0.0.1:9090
master = true         //主进程
vhost = true          //多站模式
no-site = true        //多站模式时不设置入口模块和文件
workers = 2           //子进程数
reload-mercy = 10
vacuum = true         //退出、重启时清理文件
max-requests = 1000
limit-as = 512
buffer-size = 30000
pidfile = /var/run/uwsgi9090.pid    //pid文件,用于下面的脚本启动、停止该进程
daemonize = /website/uwsgi9090.log

5、Nginx 配置

首先确认自己准确知道nginx的默认配置文件目录(nginx.conf)的路径,如果不清楚,请使用如下命令获取:

nginx -t

大概会输出以下类似信息:

[root@VM_0_8_centos ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

找到nginx的安装目录(如:/usr/local/nginx/),打开conf/nginx.conf文件,添加一段sever配置,或者修改server配置。

server {listen       80;server_name  localhost;location / {            include  uwsgi_params;uwsgi_pass  127.0.0.1:9090;              //必须和uwsgi中的设置一致uwsgi_param UWSGI_SCRIPT demosite.wsgi;  //入口文件,即wsgi.py相对于项目根目录的位置,“.”相当于一层目录uwsgi_param UWSGI_CHDIR /demosite;       //项目根目录index  index.html index.htm;client_max_body_size 35m;}}

6、启动服务器

设置完成后,启动nginx:

nginx -c /usr/local/nginx/conf/nginx.conf

Nginx常用命令:

/usr/local/nginx/sbin/nginx                      # 启动 Nginx
/usr/local/nginx/sbin/nginx -s reload            # 重新载入配置文件
/usr/local/nginx/sbin/nginx -s reopen            # 重启 Nginx
/usr/local/nginx/sbin/nginx -s stop              # 停止 Nginx

如果把Nginx添加为系统服务,则可以使用下面命令:

service nginx start
service nginx stop
service nginx restart
service nginx reload 

启动uwsgi:

uwsgi --ini /home/project_name/uwsgi9090.ini

启动完成之后,可以查看一下网络端口的状态

netstat -nltp

正常情况下会打印出类似下列信息,显示uwsgi和Nginx是处于服务状态的:

在浏览器输入:http://127.0.0.1,你就可以看到 django 的 "It work" 了。

参考文献:

https://www.linuxidc.com/Linux/2017-03/141785.htm

http://www.runoob.com/python3/python-uwsgi.html

CentOS7.2 Django + uwsgi + Nginx 部(cǎi )署(kēng)指(zhī)南(lǜ)相关推荐

  1. 如何让nginx执行python代码_生产环境部署Python语言代码(django+uwsgi+nginx)

    本文主要向大家介绍了生产环境部署Python语言代码(django+uwsgi+nginx),通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 基础环境不做介绍,在django开发w ...

  2. django+uwsgi+nginx部署

    最近线上部署运维工单系统,使用django+uwsgi+nginx部署,发现这篇文章,很详细,觉得不错,转载一下: 写了那么长时间的django,一直没跟nginx结合一下,访问的时候老是得加端口号, ...

  3. [转]Docker部署Django由浅入深系列(下): 八步部署Django+Uwsgi+Nginx+MySQL+Redis

    在上篇教程中,我们手动构建了两个容器,一个容器放Django + Uwsgi,另一个容器放Nginx,成功部署了一个简单的Django项目.然而在实际的生产环境中,我们往往需要定义数量庞大的 dock ...

  4. Django + Uwsgi + Nginx 实现生产环境部署1

    项目开发完毕后,需要将代码放到服务器上,这样用户才能访问.接下来我们一步一步来进行一波部署操作. 1. 简单粗暴 项目开发完毕,在部署之前需要再配置文件中将 ALLOWED_HOSTS配置设置为:当前 ...

  5. Docker部署Django由浅入深系列(中): 双容器部署Django + Uwsgi + Nginx

    本文是使用Docker部署Django由浅入深系列的中篇,我们将构建两个容器,一个容器放Django + Uwsgi,另一个容器放Nginx.我们将了解不同容器间是如何通信的,并学会正确配置uwsgi ...

  6. 【django云服务器部署】django+uwsgi+nginx 部署的完整流程

    本篇博客完整地记录了我从购买服务器到完成部署的全过程,需要的朋友可以参考一下我的流程,看这一篇文章就能成功部署项目啦. 写这个的本意是为备忘( 保姆级步骤),同时由于我在最开始部署项目时,没有找到一个 ...

  7. Centos django+uwsgi+nginx部署

    Centos django+uwsgi+nginx部署 安装Python CentOS 7 Linux发行版默认包含Python 2.但是,Python 2将于2020年1月1日停产.尽管一些遗留应用 ...

  8. 瞬间心情愉悦,头发都少掉了几根!---Django+uwsgi+Nginx项目部署超详细步骤

    文章目录 瞬间心情愉悦,头发都少掉了几根!---Django+uwsgi+Nginx项目部署超详细步骤 先决条件 步骤 本地运行测试 上传服务器 环境安装 准备django程序 完美解决! 瞬间心情愉 ...

  9. Ubuntu下Django+uWSGI+nginx部署

    本文采用uwsgi+nginx来部署django 这种方式是将nginx作为服务端前端,将接受web所有的请求,统一管理,Nginx把所有的静态请求自己处理,然后把所有非静态请求通过uwsgi传递给D ...

最新文章

  1. 【Android 文件管理】分区存储 ( 修改与删除图片文件 )
  2. tableau可视化函数使用案例(六十七)-如何用Tableau获取数据并对数据进行操作?
  3. ITK:为图像中标记区域的边界上色
  4. css实现元素居中的常见方法
  5. php网站点击按钮更新程序,php页面 点击按钮执行更新操作
  6. 湖南(包括岳阳)的交通规划
  7. python vba 秒出结果_为什么公司每天用20个人手工处理数据出报告,也不用5个会vba,python的人来制作??...
  8. [oracle] Instant Client 即时客户端
  9. 零信任的终端安全闭环
  10. JAVA中成员变量和局部变量区别
  11. 思科痛失瑞士电信2.5亿法郎合同
  12. jk女孩被人偷拍知名企业代码泄露, 原来是属性注解模式(Attribute Annotation Pattern)兴风作浪
  13. 教程:实现WinUSB通信系统的最简单的方式
  14. 借助阿里云轻松部署企业网盘
  15. apmserv5.2.6 mysql启动失败_APMServ5.2.6win10系统Apache、MySQL5.1启动失败解决办法
  16. Linux防火墙放行gre隧道,防火墙 tunnel(GRE隧道)+×××配置过程分析
  17. 折叠屏:手机厂商的「续命良药」
  18. python显示图片不连续_python实现连续图文识别
  19. DHCP服务的配置与使用
  20. 出现`webpack-dev-server --inline --progress --config build/webpack.dev.conf.js`报错

热门文章

  1. 阿里四面之后才懂得如何更好的学Java
  2. 国网通信之数据通信网
  3. linux time 查看cp,Linux命令:cp、time、cut、awk 、獲取文件大小命令
  4. python爬取百度地图数据_百度地图POI数据爬取
  5. 中文的括号和英文的括号区别_小括号、中括号、大括号,英文怎么说?
  6. 与Ubuntu握手言和:goole输入法突然不见了
  7. Linux 学习笔记3 -- 常用 Linux 命令的基本使用
  8. 手机上的浏览器有几种内核
  9. windows关闭445、3389端口
  10. 书单|双十一必入的科普口碑好书