Web server启动过程的关键代码如下几句:
self.pool = eventlet.GreenPool(1)
self._server = self._service.pool.spawn(self._service._run,self._application,dup_sock)
def _run(self, application, socket):"""Start a WSGI server in a new green thread."""eventlet.wsgi.server(socket, application,max_size=self.num_threads,log=LOG,keepalive=CONF.wsgi_keep_alive,log_format=CONF.wsgi_log_format,socket_timeout=self.client_socket_timeout)
这几句代码的含义是:
1 创建一个协程池
2 协程的启动函数就是_run
3 _run函数的本质是创建一个符号WSGI规范的Web Server
4 这个Web Server的WSGI Application就是传入的参数application
5 这个Web Server绑定的Socket就是传入的参数socket。
下面介绍这两个参数
一 Socket
对于一个Web Server来说,它对外首先体现的就是Server IP和Server 端口号。从编程角度来说,这两者都体现在Socket中,也就是前文所说的传入参数socket,这个传入的socket,其构造方法是如下函数:
def _get_socket(self, host, port, backlog):bind_addr = (host, port)# TODO(dims): eventlet's green dns/socket module does not actually# support IPv6 in getaddrinfo(). We need to get around this in the# future or monitor upstream for a fixtry:info = socket.getaddrinfo(bind_addr[0],bind_addr[1],socket.AF_UNSPEC,socket.SOCK_STREAM)[0]family = info[0]bind_addr = info[-1]except Exception:LOG.exception(_LE("Unable to listen on %(host)s:%(port)s"),{'host': host, 'port': port})sys.exit(1)sock = Noneretry_until = time.time() + CONF.retry_until_windowwhile not sock and time.time() < retry_until:try:sock = eventlet.listen(bind_addr,backlog=backlog,family=family)except socket.error as err:with excutils.save_and_reraise_exception() as ctxt:if err.errno == errno.EADDRINUSE:ctxt.reraise = Falseeventlet.sleep(0.1)if not sock:raise RuntimeError(_("Could not bind to %(host)s:%(port)s ""after trying for %(time)d seconds") %{'host': host,'port': port,'time': CONF.retry_until_window})sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# sockets can hang around forever without keepalivesock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)# This option isn't available in the OS X version of eventletif hasattr(socket, 'TCP_KEEPIDLE'):sock.setsockopt(socket.IPPROTO_TCP,socket.TCP_KEEPIDLE,CONF.tcp_keepidle)return sock
代码本身就是Socket编程。需要强调的一点是host、port这两个参数,它们是在配置文件(etc/neutron.conf)中配置的,比如:
#etc/neutron.conf
#绑定web server的IP地址
bind_host=0.0.0.0
#绑定到web Server的端口号
bind_port=9696
这个配置文件表明,Web Server的IP地址是本机(bind_host=0.0.0.0),web Server的端口号是9696(bind_port=9696)。
二 Application
对于一个符合WSGI规范的Web Server而言,除了server IP和端口外,最重要的参数就是WSGI Application了,因为WSGI Application才是真正处理HTTP请求的实体。_run函数的参数application,在Neutron启动的过程中,是靠如下函数加载的:
def _run_wsgi(app_name):app = config.load_paste_app(app_name)
短短一句话,涉及Neutron Server的RESTful API发布与处理,以及Neutron Plugins的加载。

Neutron的Web Server启动过程中的关键参数相关推荐

  1. Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析

    原文地址: http://blog.csdn.net/luoshengyang/article/details/6629298 在前面一篇文章浅谈Android系统进程间通信(IPC)机制Binder ...

  2. 嵌入式Linux启动过程中的问题积累

    嵌入式Linux启动过程中的问题积累 Dongas 07-12-19 1.Bad Magic Number ## Booting image at 33000000 ... Bad Magic Num ...

  3. 用Dockerfile构建MySQL镜像并实现容器启动过程中MySQL数据库系统的初始化

    前一段时间就在研究用Dockerfile构建MySQL镜像并实现容器启动过程中MySQL数据库系统的初始化,但被一些无关紧要的事儿给耽误了,经过查阅<dockerfile最佳实践>及MyS ...

  4. RabbitMQ系列之【启动过程中遇到问题及解决方案】

    RabbitMQ系列之[启动过程中遇到问题及解决方案] 参考文章: (1)RabbitMQ系列之[启动过程中遇到问题及解决方案] (2)https://www.cnblogs.com/feixiabl ...

  5. Tomcat启动过程中找不到JAVA_HOME解决方法

    在XP上明明已经安装了JDK1.5并设置好了JAVA_HOME,可偏偏Tomcat在启动过程中找不到. 报错信息如下:Neither the JAVA_HOME nor the JRE_HOME en ...

  6. spring中容器启动过程中初始化资源使用方法

    一.定义 在业务场景中,有时需要我们在容器启动过程中加载资源,完成数据的初始化或者配置,需要在调用前加载进spring容器过程中去,有以下一些方法来实现 1.定义静态常量,随着类的生命周期加载而提前加 ...

  7. linux启动过程中内核拷贝,轻松识破linux内核启动过程中的“”套路“”

    内核启动流程相关的内容让很多热爱linux的小伙伴既爱又恨,因为这是了解linux系统基本构造的良好过程同时由于其本身复杂且底层,脑子中的脉络不是很清晰,本文就总结了一些优秀博文,以自己的理解来解构一 ...

  8. JAVA项目中找不到tomcat_Tomcat启动过程中找不到JAVA_HOME解决方法

    在XP上明明已经安装了JDK1.5并设置好了JAVA_HOME,可偏偏Tomcat在启动过程中找不到. 报错信息如下:Neither the JAVA_HOME nor the JRE_HOME en ...

  9. linux运维故障报告,iis7报为应用程序池“xx”提供服务的进程在启动过程中尝试读取配置时报告故障(503错误)处理方法...

    亲爱的:若该文章解决了您的问题,可否收藏+评论+分享呢? 最近处理问题,遇到一个棘手的问题,其实也不算棘手,只是自己没认真看日志而已,现在整理下以防止下次忘记.做个深刻教训 现象:客户iis7 中所有 ...

最新文章

  1. OpenCV学习笔记(三十六)——Kalman滤波做运动目标跟踪 OpenCV学习笔记(三十七)——实用函数、系统函数、宏core OpenCV学习笔记(三十八)——显示当前FPS OpenC
  2. 数组list操作,切片
  3. 加密算法概念简介--MD5、SHA、DES、3DES、AES、RSA、ECC
  4. 某大学强制全员申报国自然,不提交就扣奖金!
  5. 程序代码移植和烧录需要注意什么_网站定制化开发需要注意什么?
  6. 输入课程信息的C语言代码,[源码和文档分享]基于C语言的课程信息管理系统
  7. mysql数据库电话号码类型,mySQL数据库一:数据类型
  8. 了解更多关于11gR2 diskmon
  9. 如何在数据库中查找和消除重复的数据?
  10. linux双网卡连不上网,linux 双网卡配置问题
  11. mac版 IGV(版本2.12.3)安装
  12. 低延时直播系统开发技术方案
  13. php 5.6.15漏洞,中国骇客云0day漏洞之蝉知 5.6 getshell
  14. 小菊的语义分割1——语义分割科普Semantic Segmentation
  15. 台式电脑耳机没有声音的解决办法
  16. HTTP1.1协议中文版-RFC2616
  17. 微信扫码登陆在chrome浏览器失败
  18. 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系
  19. BP神经网络南瓜价格相关性研究与价格预测模型设计
  20. python求三角形面积步骤_通过求三角形面积步入python程序世界.pdf

热门文章

  1. 川大锦江学院吧计算机学院答辩,川大锦江学院上演跨国网上毕业论文答辩
  2. ReactNative中国省-市-区WheelPicker组件
  3. 实现带附件格式的业务服务质量周报邮件
  4. Zcash中的signatures
  5. 说话人识别(声纹识别)综述
  6. 【敏捷开发每日一贴】用户故事Userstory
  7. w7设置双显示器_Win7系统双屏显示设置的方法
  8. 光学载波网络(SONET OC)的网络带宽
  9. Digital Asset与国际衍生品协会携手,布局智能合约在衍生品交易中的使用
  10. 店盈通:拼多多直通车推广怎么操作?技巧有哪些?