nginx,tornado,websocket,supervisord配置成型

简介: 因为要上生产环境,所以配置还是专业一些比较好。 nginx.conf upstream websocket_host { server 127.0.0.1:9527; } location /ws_log { proxy_redirect ...

因为要上生产环境,所以配置还是专业一些比较好。

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>

 

目录
相关文章
|
17天前
|
运维 前端开发 应用服务中间件
LNMP详解(八)——Nginx动静分离实战配置
LNMP详解(八)——Nginx动静分离实战配置
23 0
|
28天前
|
缓存 Kubernetes Docker
容器服务ACK常见问题之容器服务ACK ingress websocket配置失败如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
28天前
|
应用服务中间件 nginx
Nginx中如何配置中文域名?
Nginx中如何配置中文域名?
38 0
|
2月前
|
负载均衡 Ubuntu 应用服务中间件
|
2月前
|
前端开发 应用服务中间件 Linux
nginx解决springcloud前后端跨域问题,同时配置ssl
nginx解决springcloud前后端跨域问题,同时配置ssl
|
16天前
|
前端开发 应用服务中间件 nginx
Nginx配置详解Docker部署Nginx使用Nginx部署vue前端项目
Nginx配置详解Docker部署Nginx使用Nginx部署vue前端项目
78 0
|
1月前
|
PHP
百度虚拟机 bcloud_nginx_user.conf配置
百度虚拟机 bcloud_nginx_user.conf配置
22 0
|
11天前
|
应用服务中间件 网络安全 nginx
nginx配置https访问
nginx配置https访问
24 0
|
21天前
|
应用服务中间件 nginx
nginx配置https和直接访问静态文件的方式
nginx配置https和直接访问静态文件的方式
27 3
|
26天前
|
数据可视化 应用服务中间件 网络安全
简单易用的Nginx代理管理工具:体验便捷配置、高效管理
Nginx Proxy Manager是一款强大的代理服务器管理工具,提供简单直观的界面来配置和管理Nginx代理服务器,帮助用户轻松提升配置的简洁性和便捷性。
44 0
简单易用的Nginx代理管理工具:体验便捷配置、高效管理