一、课程目标
-
wsgi
协议 -
wsgi
部署
二、详情解读
2.1.wsgi
协议
nginx, apache
这些http
服务器只能响应静态资源,比如请求图片,html
网页,如果需要请求某个动态程序,必须调用cgi
程序接口,python
的cgi
接口规范为wsgi
协议。
wsgi - Python Web Server Gateway Interface
,即:web
服务器网关接口。如果想调用 python
编写的web
程序,服务器只需要支持wsgi
协议即可,该规范遵守文档:PEP3333 V1.0.1
服务器方面:
当服务器接收到一个请求后,就会调用python
所编写的web
程序,并且需要向该app
传递两个参数:environ
与start_response
web
程序方面:
web
程序需要从wsgi
服务器传来的environ
中获得request
请求各项内容,通过start_response
方法生成response
响应内容。django、flask
框架已经完成了这些内容,我们只要编写业务逻辑就可以。
示例:
# application.py
def simple_app(environ, start_response):
status = "200 OK"
response_head = [{"Content-type", "text/plain;charset=utf-8"}]
result = "Hello World"
start_response(status, response_headers)
return [bytes(result, encoding="utf-8"), b'\n']
# wsgi_server.py
from wsgiref.simple_server import make_server
from application import simple_app
port = 8000
server = make_server('127.0.0.1', port, simple_app)
print('服务器启动,端口号:%d' % port)
server.serve_forever()
运行上面代码,浏览器访问:http://127.0.0.1:8000
2.2.wsgi
服务器
支持wsgi
服务器的有uwsgi、gunicorn
等。配置方法都差不多,我们以uwsgi
服务器为例:
官方文档:https://uwsgi-docs.readthedocs.io/ 在pypi.org
搜索uwsgi
2.2.1.wsgi
部署
Step1:
上传项目文件到linux
服务器:
创建服务器程序目录,并将程序上传到这个目录下:
mkdir /wwwroot/
Step2:
创建虚拟环境
创建虚拟环境时,注意python
版本
1.进入程序目录:
cd /wwwroot/flask-cms
2.修改Pipfile
中python
版本:
[requires]
python_version = "3.6.8" # 防止python检查报错
3.安装虚拟环境:
pipenv install --python 3.6.8
Step3:
检查虚拟环境:
1.激活虚拟环境:
pipenv shell
2.检查扩展安装:(检查插件是否都已经安装)
pip list
3.启动内置服务器,检查程序配置
flask run --host ip --port port # 这是flask的启动方式
python manage.py runserver # 这是django的启动方式
比如:
flask run --host 192.168.3.40 --port 5000
查看程序有没有配置上的错误,比如数据库配置。
关闭或者修改防火墙,使用其他电脑访问,是否正常。
Step4:
安装uWSGI
服务器:
1.安装c
编译器:
yum install gcc
2.安装python3
:
yum install python3 python3-devel.x86_64
3.安装uWSGI
:
pip install https://projects.unbit.it/donwloads/uwsgi-2.0.18.tar.gz
Step4:
运行uWSGI
服务器:
uwsgi --http 192.168.3.40:8000 --module app:app
Step5:
uWSGI
服务器配置 - wsgi.ini
[uwsgi]
http=192.168.3.40:5000 # 运行http模式
chdir=/wwwroot/flask/flask-cms # 项目目录
module=app:app
processes=4 # 启动进程的数量,实际进程数要比这个数多一个
threads=1000 # 每个进程创建的线程数量
pidfile=/tmp/uwsgi.pid # 进程的文件,这个文件会用于uwsgi服务器的重启与停止
Step6:
uWSGI
服务器管理
启动:
uwsgi -d --ini wsgi.ini # -d 表示守护进程
重启:
uwsgi --reload /tmp/uwsgi.pip
关闭:
uwsgi --stop /tmp/uwsgi.pid
uwsgi.ini
内容示例:
(运行前需要创建好所配置路径上的目录,不然会报错)
使用守护进程的方式启动后,可以查看一下进程:
ps aux | grep uwsgi
2.3.nginx + wsgi
部署
为什么要采用nginx + uwsgi
形式?
虽然我们通过uwsgi
可以提供web
服务,但是网页访问中含有大量的静态资源,比如html,js,css
,图片等等,这些请求直接就可以通过静态web
服务器提供就可以了。uwsgi
提供静态资源并没有nginx
这些服务器更有优势。
第一种方案使用proxy_pass
代理
这种方案,uwsgi
运行于http
模式:
第二种方案使用uwsgi_pass
代理
这种方案,uwsgi
运行于AF_UNIX socket
模式
nginx
服务器配置:
location /{
include uwsgi_params;
uwsgi_pass unix:///tmp/uwsgi.sock;
}
uwsgi
服务器配置:
socket=/tmp/uwsgi.sock
示例如下:
三、课程小结
- 01
wsgi
协议 - 02
wsgi
实现 - 03
uwsgi
配置