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 相关文章推荐
使用Python3制作TCP端口扫描器
Apr 17 Python
numpy中的高维数组转置实例
Apr 17 Python
python字符串string的内置方法实例详解
May 14 Python
python+pyqt5实现24点小游戏
Jan 24 Python
解决python3.5 正常安装 却不能直接使用Tkinter包的问题
Feb 22 Python
Python利用matplotlib做图中图及次坐标轴的实例
Jul 08 Python
Django之提交表单与前后端交互的方法
Jul 19 Python
Python爬取豆瓣视频信息代码实例
Nov 16 Python
Python实现王者荣耀自动刷金币的完整步骤
Jan 22 Python
python 求两个向量的顺时针夹角操作
Mar 04 Python
PyQt 如何创建自定义QWidget
Mar 24 Python
C站最全Python标准库总结,你想要的都在这里
Jul 03 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/12/31 PHP
使用PHP求两个文件的相对路径
2013/06/20 PHP
使用 laravel sms 构建短信验证码发送校验功能
2017/11/06 PHP
php实现的rc4加密解密类定义与用法示例
2018/08/16 PHP
PHP基础之输出缓冲区基本概念、原理分析
2019/06/19 PHP
PHP使用HTML5 FormData对象提交表单操作示例
2019/07/02 PHP
jquery $.ajax入门应用一
2008/11/19 Javascript
JavaScript 基础知识 被自己遗忘的
2009/10/15 Javascript
基于jquery的一行代码轻松实现拖动效果
2010/12/28 Javascript
json的前台操作和后台操作实现代码
2012/01/20 Javascript
文字溢出实现溢出的部分再放入一个新生成的div中具体代码
2013/05/17 Javascript
原生js实现autocomplete插件
2016/04/14 Javascript
深入浅析JavaScript的API设计原则
2016/06/14 Javascript
学习Javascript闭包(Closure)知识
2016/08/07 Javascript
js enter键激发事件实例代码
2016/08/17 Javascript
jquery心形点赞关注效果的简单实现
2016/11/14 Javascript
使用原生js+canvas实现模拟心电图的实例
2017/09/20 Javascript
小程序测试后台服务的方法(ngrok)
2019/03/08 Javascript
Python中的下划线详解
2015/06/24 Python
使用python爬虫实现网络股票信息爬取的demo
2018/01/05 Python
python实现微信发送邮件关闭电脑功能
2018/02/22 Python
Python发送邮件功能示例【使用QQ邮箱】
2018/12/04 Python
使用Python操作FTP实现上传和下载的方法
2019/04/01 Python
pandas的排序和排名的具体使用
2019/07/31 Python
对YOLOv3模型调用时候的python接口详解
2019/08/26 Python
东方电视购物:东方CJ
2016/10/12 全球购物
英国天然有机美容护肤品:Neal’s Yard Remedies
2018/05/05 全球购物
Shell如何接收变量输入
2012/09/24 面试题
捐书寄语赠言
2014/01/18 职场文书
国旗下的讲话演讲稿
2014/05/08 职场文书
文明生主要事迹
2014/05/25 职场文书
民主评议政风行风整改方案
2014/09/17 职场文书
聘任协议书(挂靠)
2015/09/21 职场文书
九不准学习心得体会
2016/01/23 职场文书
vue如何实现关闭对话框后刷新列表
2022/04/08 Vue.js
我国拿下天问一号火星着陆区附近 22 个地理实体命名:平乐、西柏坡、古田、漠河等
2022/04/29 数码科技