CentOS7.2 Django + uwsgi + Nginx 部(cǎi )署(kēng)指(zhī)南(lǜ)
在此之前笔者也是使用 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接收到客户端的请求,如果请求的是静态内容就直接返回静态内容,如果请求的是动态内容,就把请求转发给uWSGI,uWSGI连接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ǜ)相关推荐
- 如何让nginx执行python代码_生产环境部署Python语言代码(django+uwsgi+nginx)
本文主要向大家介绍了生产环境部署Python语言代码(django+uwsgi+nginx),通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 基础环境不做介绍,在django开发w ...
- django+uwsgi+nginx部署
最近线上部署运维工单系统,使用django+uwsgi+nginx部署,发现这篇文章,很详细,觉得不错,转载一下: 写了那么长时间的django,一直没跟nginx结合一下,访问的时候老是得加端口号, ...
- [转]Docker部署Django由浅入深系列(下): 八步部署Django+Uwsgi+Nginx+MySQL+Redis
在上篇教程中,我们手动构建了两个容器,一个容器放Django + Uwsgi,另一个容器放Nginx,成功部署了一个简单的Django项目.然而在实际的生产环境中,我们往往需要定义数量庞大的 dock ...
- Django + Uwsgi + Nginx 实现生产环境部署1
项目开发完毕后,需要将代码放到服务器上,这样用户才能访问.接下来我们一步一步来进行一波部署操作. 1. 简单粗暴 项目开发完毕,在部署之前需要再配置文件中将 ALLOWED_HOSTS配置设置为:当前 ...
- Docker部署Django由浅入深系列(中): 双容器部署Django + Uwsgi + Nginx
本文是使用Docker部署Django由浅入深系列的中篇,我们将构建两个容器,一个容器放Django + Uwsgi,另一个容器放Nginx.我们将了解不同容器间是如何通信的,并学会正确配置uwsgi ...
- 【django云服务器部署】django+uwsgi+nginx 部署的完整流程
本篇博客完整地记录了我从购买服务器到完成部署的全过程,需要的朋友可以参考一下我的流程,看这一篇文章就能成功部署项目啦. 写这个的本意是为备忘( 保姆级步骤),同时由于我在最开始部署项目时,没有找到一个 ...
- Centos django+uwsgi+nginx部署
Centos django+uwsgi+nginx部署 安装Python CentOS 7 Linux发行版默认包含Python 2.但是,Python 2将于2020年1月1日停产.尽管一些遗留应用 ...
- 瞬间心情愉悦,头发都少掉了几根!---Django+uwsgi+Nginx项目部署超详细步骤
文章目录 瞬间心情愉悦,头发都少掉了几根!---Django+uwsgi+Nginx项目部署超详细步骤 先决条件 步骤 本地运行测试 上传服务器 环境安装 准备django程序 完美解决! 瞬间心情愉 ...
- Ubuntu下Django+uWSGI+nginx部署
本文采用uwsgi+nginx来部署django 这种方式是将nginx作为服务端前端,将接受web所有的请求,统一管理,Nginx把所有的静态请求自己处理,然后把所有非静态请求通过uwsgi传递给D ...
最新文章
- 【Android 文件管理】分区存储 ( 修改与删除图片文件 )
- tableau可视化函数使用案例(六十七)-如何用Tableau获取数据并对数据进行操作?
- ITK:为图像中标记区域的边界上色
- css实现元素居中的常见方法
- php网站点击按钮更新程序,php页面 点击按钮执行更新操作
- 湖南(包括岳阳)的交通规划
- python vba 秒出结果_为什么公司每天用20个人手工处理数据出报告,也不用5个会vba,python的人来制作??...
- [oracle] Instant Client 即时客户端
- 零信任的终端安全闭环
- JAVA中成员变量和局部变量区别
- 思科痛失瑞士电信2.5亿法郎合同
- jk女孩被人偷拍知名企业代码泄露, 原来是属性注解模式(Attribute Annotation Pattern)兴风作浪
- 教程:实现WinUSB通信系统的最简单的方式
- 借助阿里云轻松部署企业网盘
- apmserv5.2.6 mysql启动失败_APMServ5.2.6win10系统Apache、MySQL5.1启动失败解决办法
- Linux防火墙放行gre隧道,防火墙 tunnel(GRE隧道)+×××配置过程分析
- 折叠屏:手机厂商的「续命良药」
- python显示图片不连续_python实现连续图文识别
- DHCP服务的配置与使用
- 出现`webpack-dev-server --inline --progress --config build/webpack.dev.conf.js`报错