nginx搭建基于python的web环境的实现步骤


Posted in Python onJanuary 03, 2020

前言:

在搭建开始前,我们先来梳理下web服务工作流程,先看下图:

nginx搭建基于python的web环境的实现步骤

1、用户(PC)向web服务器发起http请求

2、web服务器判断用户请求文件是否为静态文件,是则直接读取静态文件并返回给用户,不是则通过WSGI协议将请求丢给web框架(django)代码处理

3、看web框架是否启动django中间件,如果启用,则依据中间件对请求进行修改,如果不启用,则进入下一步

4、web框架中的路由程序将根据请求中的url文件名将请求路由至相应py文件

5、相应py文件收到请求后根据用户提交的参数进行计算(期间可能会调用数据库),然后返回计算后的结果和自定义头部信息以及状态码返回

6、web框架将返回的数据打上通用标识符(头部信息)后返回给web服务器

7、web服务器打上web服务器的通用标识符(头部信息)后返回给用户

8、用户收到返回的数据

通过上面可以看到django框架基于WSGI协议和web服务器进行交互,那么WSGI协议又是什么呢? 咱们用代码来说明(伪代码。写一个简易的遵循WSGI协议的web服务器软件和django程序):

WSGI服务器的程序:

class WSGI_WEB(object):
 def __init__(self):
 # 1. 创建套接字
 self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
 # 2. 绑定
 self.tcp_server_socket.bind(("", 7890))
 # 3. 变为监听套接字
 self.tcp_server_socket.listen(128)

 def set_response_header(self, status, headers):
 self.status = status
 self.headers = [("server", "WSGI_simple_web v1.0")]
 self.headers += headers

 def run(self):
 new_socket, client_addr = self.tcp_server_socket.accept()
 env = new_socket.recv(1024)
 body = application(env, set_response_header) # env是web服务器接收到浏览器发送来的数据包;set_response_header为web服务器的一个方法地址,目的是让django帮web服务器生成http头部(不是以return的形式给web服务器);此外还有这里调用django里的应用还有一个最核心的任务,就是获取返回数据的body!
 header = self.status + self.headers
 response = header + body  
 new_socket.send(response.encode("utf-8"))

django的app程序:

def application(env, start_response):
 start_response('200 OK', [('Content-Type','text/html')])
 return [b"Hello World"]

问题:

在生产环境中使用django提供的简易web服务器性能太差,一般只用于调试。强大的nginx又不支持WSGI,那么怎么办呢?

nginx搭建基于python的web环境的实现步骤

方案:

在nginx和python应用之间加一层支持WSGI协议的web服务器。以后静态文件由nginx进行处理,动态文件丢给WSGI服务器,然后WSGI服务器再丢给web框架处理。最理想的支持WSGI协议的web服务器就是uWSGI。

nginx搭建基于python的web环境的实现步骤

下面来详细介绍下搭建uWSGI服务器以及与nginx联动的方法:

1、安装uWSGI(支持WSGI的WEB服务器):

centos下python3.6安装uWSGI方法:

yum install -y gcc* pcre-devel openssl-devel python36-devel.x86_64

pip3.6 install uwsgi

2、开启uWSGI服务

方式一:

uwsgi --http 192.168.31.123:80 --file teacher/wsgi.py --static-map=/static=static

--http 监听IP端口

--file 项目wsgi.py文件路径

--static-map 静态文件路径

注意: 执行这条命令的时候:一定要在这个项目目录中~ 

方式二(使用配置文件):

vi uwsgi.ini:

[uwsgi]

# 监听端口(nginx采用反向代理模式时必填)

http = 0.0.0.0:8888


# 项目目录

chdir=/opt/test/test1/


# 启动uwsgi的用户名和用户组

uid=root

gid=root


# 指定项目的application(我猜是这里的“test1.wsgi”拼接上面的项目目录后,就将项目中的wsgi.py文件和uWSGI服务器关联起来了)

module=test1.wsgi:application

 
# 指定sock的文件路径(nginx采用本地模式时必填)

socket=/opt/test/script/uwsgi.sock

 
# 启用主进程

master=true


# 进程个数

workers=5

pidfile=/opt/test/script/uwsgi.pid


# 自动移除unix Socket和pid文件当服务停止的时候

vacuum=true


# 序列化接受的内容,如果可能的话

thunder-lock=true


# 启用线程

enable-threads=true

 
# 设置自中断时间

harakiri=30

 
# 设置缓冲

post-buffering=4096

 
# 设置日志目录

daemonize=/opt/test/script/uwsgi.log

 
# 设置隔多久加载一次项目代码

py-autoreload=1


执行配置文件(注意:这里用什么账户执行的,以后渗透进来获取到的就是什么账户。所以这一步切忌不要用root执行。):

uwsgi --ini uwsgi.ini

彩蛋:

重启uWSGI进程: uwsgi --reload uwsgi.pid  # 代码做变更后uWSGI进程不会立即加载,此时可以重启一下uWSGI进程让它生效。。。是不是感觉有点坑,没事,可以在配置文件中设置py-autoreload

关闭uWSGI进程: uwsgi --stop uwsgi.pid

3、配置nginx

方式一(反向代理模式):

upstream uwsgi{

 server 10.10.10.29:8888;

}

 

server {

 listen 80;

 server_name localhost;

 

 #charset koi8-r;

 #access_log /var/log/nginx/host.access.log main;

 

 location / {

 proxy_pass http://uwsgi; # 通过反向代理和uWSGI服务器关联

 }

}

方式二(本地模式):

server {

 listen 8080;

 server_name localhost;

 

 #charset koi8-r;

 #access_log /var/log/nginx/host.access.log main;

 

 location / {

 include uwsgi_params; # 指定nginx和uWSGI服务器的通信方式

 uwsgi_connect_timeout 30;

 uwsgi_pass unix:/opt/test/script/uwsgi.sock; # 通过sock文件和uWSGI服务器关联! 因为nginx会去读取.sock文件,所以需要关闭selinux才行!!!

 }

}

4、此时访问django的admin管理后台时,静态资源会调取失败。这时可以将该项目所有静态资源统一收集到一个文件夹下,然后由nginx统一去调取,真正做到动静分离(动的给uWSGI,静的由nginx直接调取):

在settings.py中加入:

TATIC_ROOT = os.path.join(BASE_DIR, 'static_file')

执行如下命令(搜集项目中所有静态文件至'static_file'目录):

python3.6 manage.py collectstatic --noinput

此时会在项目目录下生成一个'static_file'文件夹,内含admin和所有app涉及的静态文件 。

在nginx中配置静态文件路径(如果nginx和uWSGI不属同一台服务器可以使用反向代理的方式来调取静态文件):

location /static/ {

 alias /opt/test/test1/static_file/;

}

此时就可以访问基于python后台的web网站了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中dir函数用法分析
Apr 17 Python
在Linux系统上安装Python的Scrapy框架的教程
Jun 11 Python
一张图带我们入门Python基础教程
Feb 05 Python
Python实现多进程共享数据的方法分析
Dec 04 Python
Python科学计算包numpy用法实例详解
Feb 08 Python
Python爬虫将爬取的图片写入world文档的方法
Nov 07 Python
Python3删除排序数组中重复项的方法分析
Jan 31 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
Mar 16 Python
python判断正负数方式
Jun 03 Python
python类共享变量操作
Sep 03 Python
Python开发.exe小工具的详细步骤
Jan 27 Python
Python爬虫之爬取二手房信息
Apr 27 Python
Python如何使用字符打印照片
Jan 03 #Python
Pytorch.nn.conv2d 过程验证方式(单,多通道卷积过程)
Jan 03 #Python
如何基于python实现画不同品种的樱花树
Jan 03 #Python
Python基础之变量基本用法与进阶详解
Jan 03 #Python
PyTorch里面的torch.nn.Parameter()详解
Jan 03 #Python
Python实现银行账户资金交易管理系统
Jan 03 #Python
Pytorch提取模型特征向量保存至csv的例子
Jan 03 #Python
You might like
PHP新手上路(七)
2006/10/09 PHP
php 分库分表hash算法
2009/11/12 PHP
对PHP语言认识上需要避免的10大误区
2014/06/12 PHP
PHP递归遍历多维数组实现无限分类的方法
2016/05/06 PHP
Yii2实现多域名跨域同步登录退出
2017/02/04 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
2019/04/15 PHP
php中钩子(hook)的原理与简单应用demo示例
2019/09/03 PHP
js 学习笔记(三)
2009/12/29 Javascript
Javascript writable特性介绍
2015/02/27 Javascript
第一篇初识bootstrap
2016/06/21 Javascript
纯js实现悬浮按钮组件
2016/12/17 Javascript
Vue input控件通过value绑定动态属性及修饰符的方法
2017/05/03 Javascript
jQuery除指定区域外点击任何地方隐藏DIV功能
2017/11/13 jQuery
JavaScript实用代码小技巧
2018/08/23 Javascript
详解vue-cli中使用rem,vue自适应
2019/05/06 Javascript
详解基于mpvue微信小程序下载远程图片到本地解决思路
2019/05/16 Javascript
使用apifm-wxapi快速开发小程序过程详解
2019/08/05 Javascript
[00:58]他们到底在电话里听到了什么?
2017/11/21 DOTA
[59:35]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第一场 1月8日
2021/03/11 DOTA
Python 文件和输入输出小结
2013/10/09 Python
python实现斐波那契递归函数的方法
2014/09/08 Python
python搜索指定目录的方法
2015/04/29 Python
Saltstack快速入门简单汇总
2016/03/01 Python
python利用标准库如何获取本地IP示例详解
2017/11/01 Python
使用django-guardian实现django-admin的行级权限控制的方法
2018/10/30 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
2019/05/23 Python
Python 使用folium绘制leaflet地图的实现方法
2019/07/05 Python
Python中常用的高阶函数实例详解
2020/02/21 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
2020/04/30 Python
Python实现迪杰斯特拉算法并生成最短路径的示例代码
2020/12/01 Python
养殖行业的创业计划书
2014/01/05 职场文书
细节决定成败演讲稿
2014/05/12 职场文书
保护环境标语
2014/06/09 职场文书
幼师辞职信范文
2015/02/27 职场文书
在Spring-Boot中如何使用@Value注解注入集合类
2021/08/02 Java/Android
CentOS7设置ssh服务以及端口修改方式
2022/12/24 Servers