Web服务器系列相关文章编写如下:
Tornado 是一个python web框架和异步网络库,最初开发于 FriendFeed . 通过使用非阻塞网络I/O,Tornado可以扩展到数万个开放连接,使其非常适合 long polling , WebSockets 以及其他需要与每个用户建立长期连接的应用程序。
pip install tornado
Tornado是为类Unix平台设计的,在系统支持方面具有最佳的性能和可扩展性。 epoll (Linux) kqueue (BSD/MACOS),或 /dev/poll (索拉里斯)
Tornado也将在Windows上运行,尽管该配置没有正式支持或推荐用于生产。Windows上缺少一些功能(包括多进程模式),并且扩展性有限(即使Tornado是建立在 asyncio 支持Windows的Tornado不使用Windows上可扩展网络所需的API)。
(1)OpenSSL*下载地址:https://oomake.com/download/openssl
这个链接有Windows版和源码版最新版下载地址,可以满足Windows、LInux、Mac OS系统使用。
(2)或者在https://slproweb.com/products/Win32OpenSSL.html
安装目录截图如下:
openssl genrsa -des3 -out test.key 1024
注意:这里会让你给私钥设置一个密码,随便设置一个,比如:123456
需要输入两次。
openssl rsa -in test_old.key -out test.key
openssl req -new -key test.key -out test.csr
openssl x509 -req -days 365 -in test.csr -signkey test.key -out test.crt
浏览器访问相关https网址时会先显示提示信息,这是由于浏览器还没有相关证书的原因。
进入浏览器设置找到「证书管理」,在「受信任的根证书颁发机构」添加之前生成的CA证书(不是server证书)。
https://nginx.org/en/
nginx [engine x] 是 HTTP 和反向代理服务器、邮件代理服务器和通用 TCP/UDP 代理服务器,最初由Igor Sysoev编写。很长一段时间以来,它一直在许多负载重的俄罗斯网站上运行,包括 Yandex、 Mail.Ru、 VK和 Rambler。根据 Netcraft 的数据, 2022 年 5 月,nginx 服务或代理了 21.67% 最繁忙的站点。
https://nginx.org/en/download.html
下载之后直接解压就可以使用了。
worker_processes 1;
error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info;
pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#HTTPS server
server {
listen 443 ssl;
server_name localhost;
ssl_certificate ./ssl/test.crt;
ssl_certificate_key ./ssl/test.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
}
详细内容请参考本人的另外几篇文章:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tornado.ioloop
import tornado.web
import tornado.options
from tornado.options import options, define, parse_command_line
import platform
if platform.system() == "Windows":
import asyncio
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
define('port', type=int, default=8888)
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello World,爱看书的小沐(tornado),2022!" + "
port: " + str(options.port))
if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application([(r"/", MainHandler)])
server = tornado.httpserver.HTTPServer(app)
server.listen(options.port)
tornado.ioloop.IOLoop.current().start()
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
from tornado.httpserver import HTTPServer
from tornado.web import Application, RequestHandler
from tornado.ioloop import IOLoop
import time
import platform
if platform.system() == "Windows":
import asyncio
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
class TestHandler(RequestHandler):
def get(self):
self.write("Hello World,爱看书的小沐!
" + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) )
settings = {
"static_path" : os.path.join(os.path.dirname(__file__), "static"),
}
application = Application([
(r"/", TestHandler),
], **settings)
if __name__ == "__main__":
server = HTTPServer(application,ssl_options={
"certfile": os.path.join(os.path.abspath("."), "./static/ssl/test.crt"),
"keyfile": os.path.join(os.path.abspath("."), "./static/ssl/test.key"),
})
server.listen(8888)
IOLoop.instance().start()
基于上面“5.1 Tornado”的基础上,在最外面加一个nginx。可以通过修改nginx配置文件:
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
proxy_pass http://localhost:8888;
}
或者
server {
listen 80;
server_name localhost;
#charset koi8-r;
charset utf-8;
#access_log logs/host.access.log main;
location / {
root d:/myflask/src;
#index index.html index.htm;
proxy_pass http://localhost:8888;
}
}
添加proxy_pass行,其用途为将localhost:80请求全部转发到localhost:8888,也就是tornado监听的端口。
有时候采用nginx + 多个tornado方案。
这里也是基于上面“5.1 Tornado”的基础上,增加nginx,主要是修改nginx的配置文件。
worker_processes 1;
events {
worker_connections 1024;
}
http {
upstream frontends {
server 127.0.0.1:8000;
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
}
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location ^~ /static/ {
root D:\PythonProject\django_web;
if ($query_string) {
expires max;
}
}
location ^~ /media/ {
root D:\PythonProject\django_web;
if ($query_string) {
expires max;
}
}
location = /favicon.ico {
rewrite (.*) /static/favicon.ico;
}
location = /robots.txt {
rewrite (.*) /static/robots.txt;
}
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://frontends;
}
}
}
python test_tornado.py --port=8000
python test_tornado.py --port=8001
python test_tornado.py --port=8002
python test_tornado.py --port=8003
cd ..
cd ..
cd nginx
start nginx
nginx.exe -s quit #停止服务
nginx.exe -s stop #停止服务
nginx.exe -s reload #重启服务
运行结果如下:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World,爱看书的小沐(flask),2022!
' + "花间一壶酒,独酌无相亲。举杯邀明月,对影成三人。"
if __name__ == '__main__':
app.run(debug=True)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World,爱看书的小沐(flask),2022!
' + "云想衣裳花想容,春风拂槛露华浓。若非群玉山头见,会向瑶台月下逢。"
# if __name__ == '__main__':
# app.run(debug=True)
if __name__ == '__main__':
app.run(debug=True, ssl_context=(
"static/ssl/test.crt",
"static/ssl/test.key")
)
Tornado 是一个开源的可伸缩的、非阻塞式的 web 服务器和工具集,它驱动了 FriendFeed 。因为它使用了 epoll 模型且是非阻塞的,它可以处理数以千计的并发固定连接,这意味着它对实时 web 服务是理想的。把 Flask 集成这个服务是直截了当的:
pip install tornado
pip install flask
如果flask安装不成功,可升级pip。其命令为python -m pip install -U pip
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from yourapplication import app
http_server = HTTPServer(WSGIContainer(app))
http_server.listen(5000)
IOLoop.instance().start()
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World,爱看书的小沐,2022!'
if __name__ == '__main__':
app.run(debug=True)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
import platform
if platform.system() == "Windows":
import asyncio
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
#导入flask项目
from test_flask import app
# (1)listen:简单的单进程:
http_server = HTTPServer(WSGIContainer(app))
http_server.listen(5000)#对应flask的端口
IOLoop.instance().start()
#(2)bind/ start:简单的多进程:
# 如果要开启多进程模式用下面的代码,不过仅在linux下
# http_server = HTTPServer(WSGIContainer(app))
# http_server.bind(8888)
# http_server.start(0)
# IOLoop.instance().start()
或者
# coding=utf-8
from tornado.httpserver import HTTPServer
from tornado.wsgi import WSGIContainer
#from src.app import app
from test_flask import app
from tornado.ioloop import IOLoop
s = HTTPServer(WSGIContainer(app))
s.listen(5000)
IOLoop.current().start()
使用nginx web服务器,tornado充当wsgi,tornado负责监听5000端口,转发flask应用。
基于上面“5.3 Tornado+nginx”和“5.7 Tornado+flask”的基础上实现。
这里写上完整的代码如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World,爱看书的小沐(flask),2022!
' + "云想衣裳花想容,春风拂槛露华浓。若非群玉山头见,会向瑶台月下逢。"
if __name__ == '__main__':
app.run(debug=True)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
import platform
if platform.system() == "Windows":
import asyncio
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
#导入flask项目
from test_flask import app
server = HTTPServer(WSGIContainer(app))
server.listen(5000)#对应flask的端口
IOLoop.instance().start()
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
proxy_pass http://localhost:5000;
}
http://localhost
server {
listen 443 ssl;
server_name localhost;
ssl_certificate ./ssl/test.crt;
ssl_certificate_key ./ssl/test.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
#root html;
#index index.html index.htm;
proxy_pass http://localhost:5000;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
}
}
https://localhost
如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;
╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;
o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;
(✿◡‿◡)
感谢各位童鞋们的支持!
( ´ ▽´ )ノ ( ´ ▽´)っ!!!