nginx,tornado,websocket,supervisord配置成型
因为要上生产环境,所以配置还是专业一些比较好。
nginx.conf
upstream websocket_host {
server 127.0.0.1:9527;
}
location /ws_log {
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://websocket_host;
}
location /websocket {
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://websocket_host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
supervisord.conf
[program:tornado-9527] command=python /X/X/websocket/ws.py stdout_logfile=/var/log/tornado.log stderr_logfile=/var/log/tornado.log autostart=true autorestart=true startsecs=10 stopwaitsecs=600
wsapp.py
import tornado.ioloop
import tornado.web
import tornado.websocket
from tornado.ioloop import IOLoop
from datetime import timedelta
import time
import os
import sys
import tornado.httpserver
class WebSocketHandler(tornado.websocket.WebSocketHandler):
file_content = ""
filename = "test.log"
def check_origin(self, origin):
return True
def open(self):
pass
def update_client(self):
self.write_message(self._read_file(self.filename))
def on_message(self, message):
print message
self.filename = message.split('-')[1]
self.update_client()
def on_close(self):
pass
def _read_file(self, filename):
print filename, '================='
with open("/tmp/"+filename) as f:
content = f.read()
content_diff = content.replace(self.file_content, '')
self.file_content = content
return content_diff
class IndexPageHandler(tornado.web.RequestHandler):
def get(self):
self.render("websockets.html")
class Application(tornado.web.Application):
def __init__(self):
handlers = [
(r'/ws_log/', IndexPageHandler),
(r'/websocket/ws', WebSocketHandler)
]
settings = dict(
template_path=os.path.join(os.path.dirname(__file__), "templates"),
static_path=os.path.join(os.path.dirname(__file__), "static"),
debug=True
)
tornado.web.Application.__init__(self, handlers, **settings)
if __name__ == '__main__':
ws_app = Application()
server = tornado.httpserver.HTTPServer(ws_app)
server.listen(9527)
tornado.ioloop.IOLoop.instance().start()
websocket.html
<link rel="stylesheet" href="/static/uikit-2.22.0/css/uikit.min.css" />
<link rel="stylesheet" href="/static/uikit-2.22.0/css/components/progress.gradient.css"/>
<link rel="stylesheet" href="/static/css/radialindicator.css"/>
<script src="/static/js/jquery-1.11.2.js"></script>
<script src="/static/js/radialIndicator.min.js"></script>
<script src="/static/uikit-2.22.0/js/uikit.js"></script>
<script src="/static/uikit-2.22.0/js/components/sticky.min.js"></script>
html
<div id="procPer"></div>
<br>
<textarea id="logoutput" placeholder="日志输出" style="background:#000; color:#FFF; width:530;height:400" >...</textarea>
<br>
<a href="javascript:void(0);" onClick="wsFunc('stop', 'DEMO')"><span id="actionSpn" class="uk-button">停止刷新</span></a>
<script>
function GetRequest() {
var url = location.search;
var theRequest = new Object();
if (url.indexOf("?") != -1) {
var str = url.substr(1);
strs = str.split("&");
for(var i = 0; i < strs.length; i ++) {
theRequest[strs[i].split("=")[0]]=unescape(strs[i].split("=")[1]);
}
}
return theRequest;
}
var Request = new Object();
Request = GetRequest();
console.log(Request);
var dev_version = Request['dev_version'];
console.log(dev_version);
wsFunc("refresh", dev_version);
function wsFunc(msg, dev_version) {
var messageContainer = document.getElementById("logoutput");
var percentContainer = document.getElementById("procPer");
if ("WebSocket" in window) {
var ws = new WebSocket("ws://1.2.3.4/websocket/ws");
ws.onopen = function() {};
ws.onmessage = function (evt) {
messageContainer.innerHTML += evt.data;
var d = messageContainer.scrollHeight;
messageContainer.scrollTop = d;
var pattern = /progress/gi;
var ans = messageContainer.innerHTML.match(/\w+.\w+,\sdeploy\sprogress\s\d+/g);
var dic = new Array();
for (item in ans){
dic_key = ans[item].split(',')[0];
dic_value = ans[item].split(',')[1].split(" ")[3];
dic[dic_key] = dic_value;
}
for (key in dic) {
if(document.getElementById(key + "label") == undefined){
var span=document.createElement('span');
span.setAttribute("id", key + "label");
percentContainer.appendChild(span);
document.getElementById(key + "label").innerHTML = key
}
if(document.getElementById(key) == undefined){
var span=document.createElement('span');
span.setAttribute("id", key);
percentContainer.appendChild(span);
//document.getElementById(key).innerHTML =dic[key];
$(span).radialIndicator({
barColor: {
10: '#0000FF',
70: '#0000FF',
90: '#0000FF',
100: '#33CC33'
},
radius: 25,
barWidth: 3,
initValue: dic[key],
roundCorner : true,
percentage: true
});
radialObj =$(span).data('radialIndicator');
}
radialObj.animate(dic[key]);
console.log(key, dic[key]);
}
};
ws.onclose = function() {};
console.log(msg);
if (msg == "refresh") {
sh=setInterval(function(){
ws.send(msg+"-"+dev_version, function(){})}
,2000);
} else {
clearInterval(sh);
document.getElementById("actionSpn").innerText = 'OutPut';
}
} else {
messageContainer.innerHTML += "此浏览器不支持websocket!";
}
}
</script>
nginx,tornado,websocket,supervisord配置成型的更多相关文章
- Nginx 支持websocket的配置
Nginx 支持websocket的配置server { listen 80; server_name 域名; location / { proxy_pass http://127.0.0.1:808 ...
- 部署项目Nginx+Tornado+Supervisor
http://www.jianshu.com/p/9bebb99368ea Tornado Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻 ...
- Tornado WebSocket简单聊天
Tornado实现了对socket的封装:tornado.web.RequestHandler 工程目录: 1.主程序 manage.py import tornado.web import torn ...
- centos7 使用nginx + tornado + supervisor搭建服务
如何在Linux下部署一个简单的基于Nginx+Tornado+Supervisor的Python web服务. Tornado:官方介绍,是使用Python编写出来的一个极轻量级.高可伸缩性和非阻塞 ...
- Nginx反向代理的配置
Chapter: Nginx基本操作释疑 1. Nginx的端口修改问题 2. Nginx 301重定向的配置 3. Windows下配置Nginx使之支持PHP 4. Linux下配置Nginx使之 ...
- nginx上用fastcgi配置python环境
费了2天的功夫,翻阅了无数的中文.英文资料,终于搞定.写下此文留待以后翻阅用 本文环境,centOS 5.4 ,Nignx-0.8.49, Python 2.6.5 ========== ...
- 基于nginx的WebSocket反向代理
系统:windows 版本:nginx 1.4.5 配置内容: location ~ \.do$ { proxy_pass http://192.168.20.102:80 ...
- Nginx支持WebSocket反向代理-学习小结
WebSocket是目前比较成熟的技术了,WebSocket协议为创建客户端和服务器端需要实时双向通讯的webapp提供了一个选择.其为HTML5的一部分,WebSocket相较于原来开发这类app的 ...
- 解决nginx转发websocket报400错误
解决nginx转发websocket报400错误 说明 由于个人服务器上面有多个项目,配置了二级域名,需要对二级域名进行转发,在转发工作这快采取了大名鼎鼎的nginx.在这之前所有的项目运行转发都没问 ...
随机推荐
- 指向“”的 script 加载失败
今天遇到了一个非常奇怪的问题:在某个同时的电脑上,所有浏览器无法打开某个页面,F12查看控制台,发现有一个黄色的 指向“xxxx.js”的 <script> 加载失败 的提示.该外部js文 ...
- java大数轻松过
import java.util.Scanner; import java.math.BigInteger; public class Main { public static void main(S ...
- 278 First Bad Version 第一个错误的版本
你是产品经理,目前正在领导一个团队开发一个新产品.不幸的是,您的产品的最新版本没有通过质量检查.由于每个版本都是基于之前的版本开发的,所以错误版本之后的所有版本都是不好的.假设你有 n 个版本 [1, ...
- jQuery实现将div中滚动条滚动到指定位置的方法
1.JS代码: onload = function () { //初始化 scrollToLocation(); }; function scrollToLocation() { var mainCo ...
- VS2013使用单元测试
一.开发环境 开发工具:VS2013 二.开发流程 1.添加一个控制台项目UnitDemo namespace UnitDemo { public class Program { static voi ...
- Objective-C设计模式——桥接Bridge(接口适配)
桥接模式 桥接模式就是让抽象和实现分离的最好体现,符合面向对象的依赖倒转原则.Abstruct抽象类负责设计客户端接口,Implementor则负责具体的细节逻辑. 在桥接模式中,Abstruct类持 ...
- 盒子模型,top和margin-top
1. 标准盒子模型: width只是内容的宽度. 元素的总宽度=width + padding*2 +border*2 +margin*2. IE盒子模型: width=内容的宽度 + padding ...
- sublime 设置浏览器
方法一: 1.安装sidebarenhancements插件 ctrl+shift+p —> Install Package —> 找到SideBarEnhancements 2.配置预览 ...
- Angular——单页面与路由的使用
单页面 SPA(Single Page Application)指的是通单一页面展示所有功能,通过Ajax动态获取数据然后进行实时渲染,结合CSS3动画模仿原生App交互,然后再进行打包(使用工具把W ...
- 关于c++11中static类对象构造函数线程安全的验证
在c++11中,static静态类对象在执行构造函数进行初始化的过程是线程安全的,有了这个特征,我们可以自己动手轻松的实现单例类,关于如何实现线程安全的单例类,请查看c++:自己动手实现线程安全的c+ ...