在本文中,我们将给您介绍关于python中的多线程Web服务器的详细内容,并且为您解答pythonweb多线程的相关问题,此外,我们还将为您提供关于Python的uwsgiweb服务器、Java实现基
在本文中,我们将给您介绍关于python中的多线程Web服务器的详细内容,并且为您解答python web 多线程的相关问题,此外,我们还将为您提供关于<5>Python的uwsgi web服务器、Java实现基于NIO的多线程Web服务器实例、PHP 54 内置Web服务器 web服务器排名 web服务器原理 简单的web服务器、Python 搭建Web站点之Web服务器与Web框架的知识。
本文目录一览:- python中的多线程Web服务器(python web 多线程)
- <5>Python的uwsgi web服务器
- Java实现基于NIO的多线程Web服务器实例
- PHP 54 内置Web服务器 web服务器排名 web服务器原理 简单的web服务器
- Python 搭建Web站点之Web服务器与Web框架
python中的多线程Web服务器(python web 多线程)
我正在尝试在python中创建多线程Web服务器,但是它一次只响应一个请求,我不知道为什么。你能帮我吗?
#!/usr/bin/env python2# -*- coding: utf-8 -*-from SocketServer import ThreadingMixInfrom BaseHTTPServer import HTTPServerfrom SimpleHTTPServer import SimpleHTTPRequestHandlerfrom time import sleepclass ThreadingServer(ThreadingMixIn, HTTPServer): passclass RequestHandler(SimpleHTTPRequestHandler): def do_GET(self): self.send_response(200) self.send_header(''Content-type'', ''text/plain'') sleep(5) response = ''Slept for 5 seconds..'' self.send_header(''Content-length'', len(response)) self.end_headers() self.wfile.write(response)ThreadingServer(('''', 8000), RequestHandler).serve_forever()
答案1
小编典典在Doug Hellmann的博客中查看此帖子。
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandlerfrom SocketServer import ThreadingMixInimport threadingclass Handler(BaseHTTPRequestHandler): def do_GET(self): self.send_response(200) self.end_headers() message = threading.currentThread().getName() self.wfile.write(message) self.wfile.write(''\n'') returnclass ThreadedHTTPServer(ThreadingMixIn, HTTPServer): """Handle requests in a separate thread."""if __name__ == ''__main__'': server = ThreadedHTTPServer((''localhost'', 8080), Handler) print ''Starting server, use <Ctrl-C> to stop'' server.serve_forever()
<5>Python的uwsgi web服务器
一、是什么?
uWSGI是web服务器,用来部署线上web应用到生产环境。uWSGI实现了WSGI协议、uwsgi协议、http协议。WSGI(Web Server Gateway Interface)是一种web服务器网关接口。它是一个web服务器与web应用通信的一种规范
WSGI是一种通信协议,不是服务器
uWSGI是web服务器
uwsgi协议是一种线路协议而不是通信协议,是fcgi协议的10倍
uwsgi协议常用于uWSGI服务器与其他网络服务器的数据通信。
uwsgi协议用于定义传输信息的类型。
二、怎么做?
uwsgi可以用命令行来运行,也可以用配置文件来运行。
命令行语法:
①,命令行参数: --<option>
因为在实际环境中使用配置文件来管理,所以这里只介绍用配置文件的方式.ini .xml .json .yaml
官方推荐使用.ini
.ini语法:
①,key = value
②,# 为注释符号
③,true false 为布尔值
④,运行配置文件命令uwsgi my.ini = uwsgi --ini my.ini
.ini可用配置参数:
# socket: 地址和端口号(需要和nginx搭配使用;http-socket是通过http协议运行[性能差]) socket = 127.0.0.1:5000
processes: 开启的进程数
chdir: 指定运行目录 before apps loading
wsgi-file: 载入wsgi-file
stats: 在指定地址上,开启状态服务
master: 允许主进程存在
daemonize: 使进程在后台运行,并将日志打印到指定的日志文件
pidfile: 指定pid文件的位置,记录进程的pid号
vacuum: 当服务器退出时自动清理环境(删除Unix socket文件和pid文件)
disable-logging: 不记录请求信息的日志,只记录错误以及uwsgi内部消息到日志中
uWSGI命令:
启动:uwsgi my.ini
重载:uwsgi --reload my.pid
重启:uwsgi --stop my.pid
工具:uwsgitop 配合status使用
Java实现基于NIO的多线程Web服务器实例
在本篇文章里小编给大家整理的是关于Java实现基于NIO的多线程Web服务器实例内容,需要的朋友们可以学习下。
代码地址:https://github.com/iyuanyb/webserver
实现了
静态、动态资源获取;
Cookie、Session、HTTP 长连接,及 Session 和 HTTP 长连接的定时清除;
类似 Spring MVC 的注解式编程,如 @RequestMapping @RequestParam 等,方法中可以根据参数名从前台获取数据,可以传递对象,也支持级联属性,如:
// GET /page?pageSize=10&pageNum=1 HTTP/1.1 @RequestMapping("/page") String page(@RequestParam(value="pageSize", defaultValue="10") Integer pageSize, Integer pageNum) {...} /** * POST /login HTTP/1.1 * ... * user.name=admin&user.passwd=admin&user.data.val=ok * ******* * User 类:String name; String passwd; Data data; * Data 类: String val; */ @RequestMapping("/login", method = HttpMethod.POST) String login(User user) {...}
方法可以返回一个字符串表示模板路径,模板使用正则实现,仅可以从 request 和 session 域中获取属性值,如 ${request.user.id};
日志记录(使用 java.util.logging 内置日志记录器,自定义了日志格式):服务器运行相关日志(server-n.log),HTTP 请求日志(access-n.log)。
API 汇总:
@Controller
@RequestMapping
@RequestParam
@RequestHeader
@CookieValue
HttpRequest
HttpResponse
HttpSession
Cookie
HttpMethod
使用方法
导入 jar 包(见 release)即可使用相关注解,还需要在 classpath 下创建一个 webapp 目录,表示静态 web 资源的根路径。然后在主类的 main 方法中调用 BootStrap.run(),由于扫描控制器是通过遍历目录实现的,所以项目不支持打包,必须以 class 文件的形式发布。参数配置需要在 classpath 中提供一个 server-config.properties 配置文件即可,包含如下配置项:
# 服务器端口 PORT=80 # 存储日志文件的路径 LOG_FILE_STORAGE_PATH=E:\ # 连接过期时间,单位毫秒 CONNECTION_EXPIRY_TIME=30000 # 清理过期连接的周期,单位毫秒 CONNECTION_CLEANING_CYCLE=30000 # Session 过期时间,单位毫秒 SESSION_EXPIRY_TIME=30000 # 清理过期 Session 的周期,单位毫秒 SESSION_CLEANING_CYCLE=30000 # 监听客户端读事件的线程数目 POLLER_THREAD_COUNT=2 # 处理具体请求的线程池的大小 REQUEST_PROCESSOR_THREAD_COUNT=4
演示
项目结构
EchoController.java
package com.test; // 导包省略... @Controller // 只有被 @Controller 标记的才会被认为是控制器 // 支持在类上使用 @RequestMapping 注解, public class EchoController { // 线程安全 private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); @RequestMapping("/echo") // 映射到 "/echo" public String echo(HttpRequest request, @RequestParam(value = "msg", defaultValue = "输入为空") String msg) { LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(request.getSession().getLastAccessedTime() / 1000, 0, ZoneOffset.ofHours(8)); request.setAttribute("lastAccessedTime", localDateTime.format(formatter)); request.setAttribute("msg", msg); return "test.html"; // 要渲染的的模板路径(classpath:webapp/test.html) } public static void main(String[] args) { BootStrap.run(); } }
test.html
TestEcho: ${request.msg}
Last Accessed Time: ${request.lastAccessedTime}
关于实例图片,GitHub暂时失效,后期小编小编会补充进去。
到此这篇关于Java实现基于NIO的多线程Web服务器实例的文章就介绍到这了,更多相关Java 实现一个的基于 NIO 的多线程Web服务器内容请搜索小编以前的文章或继续浏览下面的相关文章希望大家以后多多支持小编!
PHP 54 内置Web服务器 web服务器排名 web服务器原理 简单的web服务器
php是一种脚本语言,它需要php解释器来分析运行php文件。当把php做为cgi服务web请求时,它需要被嵌入到某种web服务器里,最常见的是集成到apache或iis里,这就是说,在使用php前,你需要安装apache或iis,并且正确的配置它们和php集成的参数。虽然这种配置已经很规范,文档非常丰富,但我们还是经常在安装apache和php集成时遇到问题,而且,有时候我们只想测试一个简单的php特征,不想就为此安装、启动apache服务。
但据官方文档上说,这个内置的Web服务器只是提供开发测试使用,不推荐使用中生产环境中。因为这个服务器接受处理请求时顺序执行的,不能并发处理。
这个内置的web服务器使用起来非常的方便,你只需要执行下面的命令:
<ol><li><span><span>$ php -S localhost:8000 </span></span></li></ol>
然后就可以访问了。这样启动后,默认的web服务目录是执行命令的当前目录,如果不想使用当前目录,你需要使用 -t 参数来指定。
例 #1 启动Web服务器
立即学习“PHP免费学习笔记(深入)”;
<ol> <li><span><span>$ cd ~/public_html </span></span></li> <li><span>$ php -S localhost:8000 </span></li> </ol>
终端输出信息:
<ol> <li><span><span>PHP 5.4.0 Development Server started at Thu Jul 21 10:43:28 2011 </span></span></li> <li><span>Listening on localhost:8000 </span></li> <li><span>Document root is /home/me/public_html </span></li> <li><span>Press Ctrl-C to quit </span></li> </ol>
当请求了 http://localhost:8000/ 和 http://localhost:8000/myscript.html 地址后,终端输出类似如下的信息:
<ol> <li><span><span>PHP 5.4.0 Development Server started at Thu Jul 21 10:43:28 2011 </span></span></li> <li><span>Listening on localhost:8000 </span></li> <li><span>Document root is /home/me/public_html </span></li> <li><span>Press Ctrl-C to quit. </span></li> <li><span>[Thu Jul 21 10:48:48 2011] ::1:39144 GET /favicon.ico - Request read </span></li> <li><span>[Thu Jul 21 10:48:50 2011] ::1:39146 GET / - Request read </span></li> <li><span>[Thu Jul 21 10:48:50 2011] ::1:39147 GET /favicon.ico - Request read </span></li> <li><span>[Thu Jul 21 10:48:52 2011] ::1:39148 GET /myscript.html - Request read </span></li> <li><span>[Thu Jul 21 10:48:52 2011] ::1:39149 GET /favicon.ico - Request read </span></li> </ol>
例 #2 启动web服务器时指定文档的根目录
<ol> <li><span><span>$ cd ~/public_html </span></span></li> <li><span>$ php -S localhost:8000 -t foo/ </span></li> </ol>
终端显示信息:
<ol> <li><span><span>PHP 5.4.0 Development Server started at Thu Jul 21 10:50:26 2011 </span></span></li> <li><span>Listening on localhost:8000 </span></li> <li><span>Document root is /home/me/public_html/foo </span></li> <li><span>Press Ctrl-C to quit </span></li> </ol>
如果你在启动命令行后面附加一个php脚本文件,那这个文件将会被当成一个“路由器”脚本。这个脚本将负责所有的HTTP请求,如果这个脚本执行时返回FALSE,则被请求的资源会正常的返回。如果不是FALSE,浏览里显示的将会是这个脚本产生的内容。
例 #3 使用路由器脚本
在这个例子中,对图片的请求会返回相应的图片,但对HTML文件的请求会显示“Welcome to PHP”:
<ol> <li><span><span><?php </span></span></span></li> <li> <span>// router.php </span><span> </span> </li> <li> <span>if</span><span> (preg_match(</span><span>''/\.(?:png|jpg|jpeg|gif)$/''</span><span>, </span><span>$_SERVER</span><span>[</span><span>"REQUEST_URI"</span><span>])) { </span> </li> <li> <span>return</span><span> false; </span><span>// serve the requested resource as-is. </span><span> </span> </li> <li> <span>} </span><span>else</span><span> { </span> </li> <li> <span>echo</span><span> </span><span>"<p>Welcome to PHP</p>"</span><span>; </span> </li> <li><span>} </span></li> <li><span>?> </span></li> </ol>
<ol><li><span><span>$ php -S localhost:8000 router.php </span></span></li></ol>
例 #4 判断是否是在使用内置web服务器
通过程序判断来调整同一个PHP路由器脚本在内置Web服务器中和在生产服务器中的不同行为:
<ol> <li><span><span><?php </span></span></span></li> <li> <span>// router.php </span><span> </span> </li> <li> <span>if</span><span> (php_sapi_name() == </span><span>''cli-server''</span><span>) { </span> </li> <li> <span>/* route static assets and return false */</span><span> </span> </li> <li><span>} </span></li> <li> <span>/* go on with normal index.php operations */</span><span> </span> </li> <li><span>?> </span></li> </ol>
<ol><li><span><span>$ php -S localhost:8000 router.php </span></span></li></ol>
这个内置的web服务器能识别一些标准的MIME类型资源,它们的扩展有:.css, .gif, .htm, .html, .jpe, .jpeg, .jpg, .js, .png, .svg, and .txt。对.htm 和 .svg 扩展到支持是在PHP 5.4.4之后才支持的。
例 #5 处理不支持的文件类型
如果你希望这个Web服务器能够正确的处理不被支持的MIME文件类型,这样做:
<ol> <li><span><span><?php </span></span></span></li> <li> <span>// router.php </span><span> </span> </li> <li> <span>$path</span><span> = </span><span>pathinfo</span><span>(</span><span>$_SERVER</span><span>[</span><span>"SCRIPT_FILENAME"</span><span>]); </span> </li> <li> <span>if</span><span> (</span><span>$path</span><span>[</span><span>"extension"</span><span>] == </span><span>"ogg"</span><span>) { </span> </li> <li> <span>header(</span><span>"Content-Type: video/ogg"</span><span>); </span> </li> <li> <span>readfile(</span><span>$_SERVER</span><span>[</span><span>"SCRIPT_FILENAME"</span><span>]); </span> </li> <li><span>} </span></li> <li> <span>else</span><span> { </span> </li> <li> <span>return</span><span> FALSE; </span> </li> <li><span>} </span></li> <li><span>?> </span></li> </ol>
<ol><li><span><span>$ php -S localhost:8000 router.php </span></span></li></ol>
如果你希望能远程的访问这个内置的web服务器,你的启动命令需要改成下面这样:
例 #6 远程访问这个内置Web服务器
<ol><li><span><span>$ php -S 0.0.0.0:8000 </span></span></li></ol>
这样你就可以通过 8000 端口远程的访问这个内置的web服务器了
以上就介绍了PHP 54 内置Web服务器,包括了Web服务器方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
Python 搭建Web站点之Web服务器与Web框架
之前用 Django 做过一个小的站点,感觉Django太过笨重,于是就准备换一个比较轻量级的 Web 框架来玩玩。Web.py 作者已经挂掉,项目好久没有更新,所以不准备用它。而 Flask 也是一个成熟的轻量级 Web 框架,在 github 上有众多的 Star 和 Fork,文档和扩展也很丰富,值得学习。
学习一个框架最好的方式就是用框架做一个项目,在实战中理解掌握框架。这里我用 Flask 框架,使用 MysqL 数据库做了一个 论坛系统 。麻雀虽小,五脏俱全,论坛效果图如下:
论坛系统截图
下面是论坛的基本功能:
完整的用户模块(注册、登录,更改、找回密码、信息修改、站内消息通知); 丰富的论坛模块(创建、回复话题,站内搜索,markdown支持,@user 提醒); 强大的后台管理,支持屏蔽用户、话题、评论,支持各种条件搜索话题、评论;
本博客将会用一系列文章,记录论坛系统搭建的过程,希望对刚入门Web开发的同学有所帮助。
我们经常听说 Django,Flask 这些 python 语言的Web 框架,那么框架到底是什么,Web框架和Web服务器(Nginx,Apache等)有什么区别?离开框架还能用 Python 搭建Web站点吗?要解决这些疑问,我们有必要来理解下 Web 服务器的工作原理,以及 Web 框架的本质。
Web 服务器
当我们在浏览器输入URL后,浏览器会先请求 DNS服务器,获得请求站点的 IP 地址 。然后发送一个HTTP Request(请求)给拥有该 IP 的主机,接着就会接收到服务器给我们的 HTTP Response(响应),浏览器经过渲染后,以一种较好的效果呈现给我们。这个过程中,正是Web服务器在幕后默默做贡献。
简单来说,Web服务器是在运行在物理服务器上的一个程序,它永久地等待客户端(主要是浏览器,比如Chrome,Firefox等)发送请求。当收到请求之后,它会生成相应的响应并将其返回至客户端。Web服务器通过HTTP协议与客户端通信,因此也被称为HTTP服务器。
Web 服务器
Web服务器的工作原理并不复杂,一般可分成如下4个步骤:建立连接、请求过程、应答过程以及关闭连接。
建立连接:客户机通过TCP/IP协议建立到服务器的TCP连接。 请求过程:客户端向服务器发送HTTP协议请求包,请求服务器里的资源文档。 应答过程:服务器向客户机发送HTTP协议应答包,如果请求的资源包含有动态语言的内容,那么服务器会调用动态语言的解释引擎负责处理“动态内容”,并将处理得到的数据返回给客户端。由客户端解释HTML文档,在客户端屏幕上渲染图形结果。 关闭连接:客户机与服务器断开。
下面我们实现一个简单的 Web 服务器。运行示例程序后,会监听本地端口 8000,在浏览器访问 http://localhost:8000 就能看到响应内容。而我们的程序也能够打印出客户端发来的请求内容,如下图:
简单Web服务器
这里Request 和 Response 都需要遵守 HTTP 协议,关于 HTTP 协议的详细内容,可以读读《HTTP 权威指南》,或者看我整理的HTTP 部分内容。
虽然说web服务器的主要工作是根据request返回response,但是实际中的 Web 服务器远远比上面示例的复杂的多,因为要考虑的因素实在是太多了,比如:
缓存机制:讲一些经常被访问的页面缓存起来,提高响应速度; 安全:防止黑客的各种攻击,比如 SYN Flood 攻击; 并发处理:如何响应不同客户端同时发起的请求; 日志:记录访问日至,方便做一些分析。
目前在UNIX和LINUX平台下使用最广泛的免费 Web 服务器有Apache和 Nginx 。
Web 应用程序
Web 服务器接受 Http Request,返回 Response,很多时候 Response 并不是静态文件,因此需要有一个应用程序根据 Request 生成相应的 Response。这里的应用程序主要用来处理相关业务逻辑,读取或者更新数据库,根据不同 Request 返回相应的 Response。注意这里并不是 Web 服务器本身来做这件事,它只负责 Http 协议层面和一些诸如并发处理,安全,日志等相关的事情。
应用程序可以用各种语言编写(Java,PHP,Python,Ruby等),这个应用程序会从Web服务器接收客户端的请求,处理完成后,再返回响应给Web服务器,最后由Web服务器返回给客户端。整个架构如下:
Web应用程序
以 Python 为例,使用Python开发Web,最原始和直接的办法是使用CGI标准,在1998年这种方式很流行。首先确保 Web 服务器支持CGI及已经配置了CGI的处理程序,然后设置好CGI目录,在目录里面添加相应的 python 文件,每一个 python 文件处理相应输入,生成一个 html 文件即可,如下例:
# !/usr/bin/python # -*- coding: UTF-8 -*- print "Content-type:text/html" print # 空行,告诉服务器结束头部 print '<html>' print '<head>' print '<Meta charset="utf-8">' print '</head>' print '<body>' print '<h2>Hello Word! 我是一个CGI程序</h2>' print '</body>' print '</html>'
这样在浏览器访问该文件就可以得到一个简单的 Hello World 网页内容。直接通过 CGI 写 Web 应用程序看起来很简单,每一个文件处理输入,生成html。但是实际开发中,可能会遇到许多不方便的地方。比如:
每个独立的CGI脚本可能会重复写数据库连接,关闭的代码; 后端开发者会看到一堆 Content-Type 等和自己无关的 html 页面元素; Web 框架
早期开发站点确做了许多重复性劳动,后来为了减少重复,避免写出庞杂,混乱的代码,人们将 Web 开发的关键性过程提取出来,开发出了各种 Web 框架。有了框架,就可以专注于编写清晰、易维护的代码,无需关心数据库连接之类的重复性工作。
其中一种比较经典的Web框架采用了 MVC 架构,如下图所示:
MVC 架构
用户输入 URL,客户端发送请求,控制器(Controller)首先会拿到请求,然后用模型(Models)从数据库取出所有需要的数据,进行必要的处理,将处理后的结果发送给 视图(View),视图利用获取到的数据,进行渲染生成 Html Response返回给客户端。
以 python web 框架 flask 为例,框架本身并不限定我们用哪种架构来组织我们的应用,不过 flask 可以很好地支持以 MVC 方式组织应用。
控制器:flask 可以用装饰器来添加路由项,如下:
@app.route('/') def main_page(): pass
模型:主要用来取出需要的数据,如下面函数中操作:
@app.route('/') def main_page(): """Searches the database for entries,then displays them.""" db = get_db() cur = db.execute('select * from entries order by id desc') entries = cur.fetchall() return render_template('index.html',entries=entries)
视图:flask 利用 jinja2 来渲染页面,下面的模版文件指定了页面的样式:
{% for entry in entries %} <li> <h2>{{ entry.title }}</h2> <div>{{ entry.text|safe }}</div> </li> {% else %} <li><em>No entries yet. Add some!</em></li> {% endfor %}
我们知道Python有着许多的 Web 框架,而同时又有着许多的 Web 服务器(Apache,Nginx,Gunicorn等),框架和Web服务器之间需要进行通信,如果在设计时它们之间不可以相互匹配的,那么选择了一个框架就会限制对 Web 服务器的选择,这显然是不合理的。
那么,怎样确保可以在不修改Web服务器代码或网络框架代码的前提下,使用自己选择的服务器,并且匹配多个不同的网络框架呢?答案是接口,设计一套双方都遵守的接口就可以了。对python来说,就是Wsgi(Web Server Gateway Interface,Web服务器网关接口)。其他编程语言也拥有类似的接口:例如Java的Servlet API和Ruby的Rack。
Python Wsgi的出现,让开发者可以将 Web 框架与 Web 服务器的选择分隔开来,不再相互限制。现在,你可以真正地将不同的 Web 服务器与Web框架进行混合搭配,选择满足自己需求的组合。例如,可以使用 Gunicorn 或Nginx/uWsgi来运行Django、Flask或web.py应用。
Wsgi 适配
下一篇我们将会仔细分析 Wsgi 接口标准,然后一起来写一个简单的 Wsgi Web 服务器。
关于python中的多线程Web服务器和python web 多线程的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于<5>Python的uwsgi web服务器、Java实现基于NIO的多线程Web服务器实例、PHP 54 内置Web服务器 web服务器排名 web服务器原理 简单的web服务器、Python 搭建Web站点之Web服务器与Web框架的相关知识,请在本站寻找。
本文标签: