前言:
在搭建开始前,我们先来梳理下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应用之间加一层支持WSGI协议的web服务器。以后静态文件由nginx进行处理,动态文件丢给WSGI服务器,然后WSGI服务器再丢给web框架处理。最理想的支持WSGI协议的web服务器就是uWSGI。
下面来详细介绍下搭建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网站了
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍基于Docker的MySQL主从复制环境搭建的实现步骤,包括了基于Docker的MySQL主从复制环境搭建的实现步骤的使用技巧和注意事项,需要的朋友参考一下 1. 前言 之前的程序架构可能是这样的一种形式: 当程序体量扩大后,我们进行扩展,可能会扩展多个后台服务实例,但数据库还是只有一个,所以系统的瓶颈还是在数据库上面,所以这次的主要任务就是对数据库进行扩展,主要形式为:扩展多台数据
本文向大家介绍Python+Selenium实现自动化的环境搭建的步骤(图文),包括了Python+Selenium实现自动化的环境搭建的步骤(图文)的使用技巧和注意事项,需要的朋友参考一下 1.在浏览器下载与浏览器相对于的驱动并放到python的安装根目录下 驱动的两个下载地址: http://chromedriver.storage.googleapis.com/index.html http
本文向大家介绍python搭建虚拟环境的步骤详解,包括了python搭建虚拟环境的步骤详解的使用技巧和注意事项,需要的朋友参考一下 前言 相信对于python开发人员来说,机器上有不同的python版本是很正常的,因为开发的项目有的用2.6或2.7,有的就要用3.0+版本,如何把这些不同的版本管理好,保持每个环境的干净和独立,方便不同版本之间的切换,这时候就要用到我们的虚拟环境了,所以今天我们就来
本文向大家介绍SpringBoot + SpringSecurity 环境搭建的步骤,包括了SpringBoot + SpringSecurity 环境搭建的步骤的使用技巧和注意事项,需要的朋友参考一下 一、使用SpringBoot+Maven搭建一个多模块项目(可以参考这篇文章 --> 这里) 二、删除父工程的src文件,删除app、browser、core下的.java文件 依赖关系: dem
本文向大家介绍基于CentOS搭建Python Django环境过程解析,包括了基于CentOS搭建Python Django环境过程解析的使用技巧和注意事项,需要的朋友参考一下 安装 setuptools 工具 任务时间:1min ~ 5min 安装 yum install python-setuptools -y 因为之后我们需要安装 Django ,而 Django 需要用这个工具,所以我们
本文向大家介绍PHP环境搭建的详细步骤,包括了PHP环境搭建的详细步骤的使用技巧和注意事项,需要的朋友参考一下 接着上篇继续学习,谈谈IIS支持php怎么配置: 1、去php官网下载php:http://windows.php.net/download/ 。IIS7我们需要选择php 5.3 以上的VC9包,下载zip文件。如图: 2、将 zip 包解压缩到自己选择的目录,例如 C:\PHP\。解
解压下列压缩包至/tmp/redis目录,以符合上述目录结构: 部署相关组件: cd /tmp/redis/deploy ./deploy.sh 修改Master配置文件redis.conf,注释掉包含slaveof的语句。 修改Slave配置文件redis.conf,添加slaveof masterIP port,指定主从 修改三台机器的sentinel配置文件,指定主服务器的IP和端口: se
本文向大家介绍win7下搭建nginx+php的开发环境,包括了win7下搭建nginx+php的开发环境的使用技巧和注意事项,需要的朋友参考一下 一、下载相关软件 nginx下载:http://nginx.org/en/download.html nginx常见异常:http://feiger.cn/?p=2719 php下载:http://windows.php.net/download#ph