一、课程目标
  • wsgi协议
  • wsgi部署
二、详情解读
2.1.wsgi协议

nginx, apache这些http服务器只能响应静态资源,比如请求图片,html网页,如果需要请求某个动态程序,必须调用cgi程序接口,pythoncgi接口规范为wsgi协议。

python 编写服务器安全巡检 脚本_wsgi


wsgi - Python Web Server Gateway Interface,即:web服务器网关接口。如果想调用 python编写的web程序,服务器只需要支持wsgi协议即可,该规范遵守文档:PEP3333 V1.0.1服务器方面:

当服务器接收到一个请求后,就会调用python所编写的web程序,并且需要向该app传递两个参数:environstart_response

python 编写服务器安全巡检 脚本_wsgi_02


web程序方面:

web程序需要从wsgi服务器传来的environ中获得request请求各项内容,通过start_response方法生成response响应内容。django、flask框架已经完成了这些内容,我们只要编写业务逻辑就可以。

python 编写服务器安全巡检 脚本_python 编写服务器安全巡检 脚本_03

示例:

# 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

python 编写服务器安全巡检 脚本_python 编写服务器安全巡检 脚本_04


python 编写服务器安全巡检 脚本_uwsgi_05

2.2.wsgi服务器

支持wsgi服务器的有uwsgi、gunicorn等。配置方法都差不多,我们以uwsgi服务器为例:

官方文档:https://uwsgi-docs.readthedocs.io/ 在pypi.org搜索uwsgi

python 编写服务器安全巡检 脚本_wsgi_06

2.2.1.wsgi部署

Step1: 上传项目文件到linux服务器:

创建服务器程序目录,并将程序上传到这个目录下:

mkdir /wwwroot/

Step2:创建虚拟环境
创建虚拟环境时,注意python版本
1.进入程序目录:

cd /wwwroot/flask-cms

2.修改Pipfilepython版本:

[requires]
python_version = "3.6.8" # 防止python检查报错

3.安装虚拟环境:

pipenv install --python 3.6.8

Step3: 检查虚拟环境:
1.激活虚拟环境:

pipenv shell

2.检查扩展安装:(检查插件是否都已经安装)

pip list

python 编写服务器安全巡检 脚本_部署_07


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

python 编写服务器安全巡检 脚本_运维_08


Step4:运行uWSGI服务器:

uwsgi --http 192.168.3.40:8000 --module app:app

python 编写服务器安全巡检 脚本_wsgi_09


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内容示例:

(运行前需要创建好所配置路径上的目录,不然会报错)

python 编写服务器安全巡检 脚本_wsgi_10


使用守护进程的方式启动后,可以查看一下进程:

ps aux | grep uwsgi

python 编写服务器安全巡检 脚本_wsgi_11

2.3.nginx + wsgi部署

为什么要采用nginx + uwsgi形式?

虽然我们通过uwsgi可以提供web服务,但是网页访问中含有大量的静态资源,比如html,js,css,图片等等,这些请求直接就可以通过静态web服务器提供就可以了。uwsgi提供静态资源并没有nginx这些服务器更有优势。

python 编写服务器安全巡检 脚本_python 编写服务器安全巡检 脚本_12


第一种方案使用proxy_pass代理

这种方案,uwsgi运行于http模式:

python 编写服务器安全巡检 脚本_运维_13


第二种方案使用uwsgi_pass代理

这种方案,uwsgi运行于AF_UNIX socket模式

python 编写服务器安全巡检 脚本_部署_14


nginx服务器配置:

location /{
	include uwsgi_params;
	uwsgi_pass unix:///tmp/uwsgi.sock;
}

uwsgi服务器配置:

socket=/tmp/uwsgi.sock

示例如下:

python 编写服务器安全巡检 脚本_wsgi_15

三、课程小结
  • 01 wsgi协议
  • 02 wsgi实现
  • 03 uwsgi配置