CharlesXiao‘s Blog

  • 首页

  • 归档

  • 分类

  • 标签

  • 关于

  • 搜索

Nginx配置教程

发表于 2016-02-19 | 更新于 2017-12-21 | 字数统计975字 | 阅读时长3分钟

nginx反向代理/负载均衡

nginx是一个网页服务器,它能反向代理HTTP, HTTPS, SMTP, POP3, IMAP的协议链接,以及负载均衡和HTTP缓存

  1. 代理,就是在客户端和服务端之间强行添加了一层,用来实现流量转发的功能
  2. 正向代理,是用于代理客户端的。举个很简单的例子:你直接在大陆地区访问google.com肯定是访问不了的,但是现在假如你有一台在美国的主机A,并且能够正常访问,那么你可以将浏览器对google.com的请求先转发给服务器A,服务器A收到请求后,扮演客户端的角色,发起对google.com的请求,服务器A收到响应后,又扮演服务端,将此响应原封不动的返回给你,自此,一次正向代理顺利完成。
  3. 反向代理顾名思义是用来代理服务端的多台机器,访问同一个域名可以分流到不同的服务器。也就是负载均衡,用来分流流量压力到不同的服务器

nginx的多进程并发模型

nginx配置文件

  1. 配置文件所在的常见目录: (可用nginx -t 测试配置文件是否正确)

    /etc/nginx/nginx.conf
    /opt/nginx/conf/nginx.conf
    /usr/local/nginx/nginx.conf
    /usr/local/etc/nginx/nginx.cnf(Mac系统)
    
  2. Nginx配置文件主要分成6部分:main(全局设置)、server(主机设置/指定虚拟主机域名、IP和端口)、upstream(上游服务器设置,主要为反向代理、负载均衡相关配置)和 location(URL匹配特定位置后的设置/用于匹配网页位置)、events(nginx工作模式)、http(http设置)

  3. 他们之间的关系式:server继承main,location继承server,upstream既不会继承指令也不会被继承,它有自己的特殊指令,不需要在其他地方的应用
  4. 参考链接
Nginx限速和超时配置
  1. nginx可以通过
    两个模块都能够对客户端访问进行限制。
    1
    2
    3
    4
    5
    6
    7
    2. [nginx访问限制模块limit_conn_zone 和limit_req_zone配置使用详解](http://blog.51cto.com/michaelkang/1257476)
    3. [nginx超时设置](http://blog.csdn.net/liujiyong7/article/details/18228915)
    4. **限速配置实例**

    > * ```limit_req_log_level```: 设置日志级别,默认值为error级别,当服务器因为频率过高拒绝或者延迟处理请求时可以记下相应级别的日志。延迟记录的日志级别比拒绝的低一个级别,如果设置“limit_req_log_level notice”, 则延迟的日志就是info级别

    > * ```limit_req_status```: 设置拒绝请求的响应状态码,例如```limit_req_status 503
> * 
zone
1
>> 设置内存限制域为10M(1M存储区可以保存32000个32字节或16000个64字节的状态。如果存储区满,服务器将对其他请求相应503状态码),限制平均每秒不超过1个请求,同时允许超过频率限制的请求数不多于5个
limit_req_zone $binary_remote_addr zone=ttlsa_com:10m rate=1r/s; server
{ location /www.ttlsa.com/ { limit_req zone=ttlsa_com burst=5; } } ```
Nginx日志配置
  1. error.log日志配置,主要用于排查错误。

    配置语法:error_log /path/file level;

    默认配置:error_log logs/error.log error;

    • level是日志的输出等级,取值范围从小到大为(debug,info,notice,warn,error,crit,alert,emerg)。当设定为一个级别时,大于或者等于该级别的日志都会被输出到/path/file文件中,小于该级别的日志则不会输出。例如:当设定为error级别时,error,crit,alert,emerg级别的日志都会输出;如果设定的日志级别是debug,则会输出所有的日志。

    • /path/file也可以是/dev/null,这样就不会输出任何日志,这也是关闭error日志的唯一手段。

    • /path/file也可以是stderr,这样日志会输出到标准错误文件中。

  2. access.log: nginx请求日志

依道-wifi室内定位的实现原理

发表于 2016-02-18 | 更新于 2016-10-24 | 字数统计1.1k字 | 阅读时长3分钟 | 分类于 算法

技术背景和原理

  1. 每一个无线AP都有一个全球唯一的MAC地址,并且一般来说无线AP在一段时间内是不会移动的; 然后每一个移动设备在开启Wi-Fi的情况下,即可扫描并收集周围的AP信号,无论是否加密,是否已连接,甚至信号强度不足以显示在无线信号列表中,都可以获取到AP广播出来的MAC地址
  2. 基于RSSI(信号接收强度)模型方法是一种基于MAC层的通过接收到的信号强弱测定信号点与接收点的距离,进而根据相应数据进行定位计算的方法。因为室内WIFI信号强度会随着传播距离的增加而降低(当然随着距离的增加同理定位的精度也会降低。)我们根据移动终端测量接收到的信号强度和已知的无线信号衰落模型,可以估算出收发方之间的距离,根据多个估算的距离值,可以计算出移动终端的位置
  3. 位置服务商不断更新、补充自己的数据库,以保证数据的准确性,毕竟无线AP不像基站塔那样基本100%不会移动

两种算法

  1. 三角定位:
    如果我们已经知道了所有AP的位置,我们可以利用信号衰减模型RSSI估算出移动设备距离各个AP的距离,然后根据移动设备到周围AP距离作为直径画圆,其交点就是该设备的位置,如果三者两两相交而不是交于一点,可以采用近似估计法找出位置。很容易发现,三角定位算法需要我们提前知道AP的位置,因此对于环境变化较快的场合不适合使用。
  2. 指纹数据匹配算法:指纹算法类似于机器学习算法,分为两个阶段:
    • 离线训练阶段: 第一步,将需要室内定位区域划分网格,建立采样点(间距1~2m);第二步,使用移动设备打开wifi逐个采样点采样,记录该点位置、所获取的RSSI及AP地址,保存到指纹数据库。采样过程对每个点每隔5s采样一次,共100次,然后对这些数据去除噪点,并对这些采样数据求均值
    • 在线定位阶段: 用户持移动设备在定位区域移动,实时获取当前信号接收强度及AP地址,将该信息上传到服务器进行匹配(匹配算法有KNN、神经网络等),得到估算位置返还给手机app。匹配具体过程:例如该手机获取到10个ap信号及其对应的信号接收强度,那么就去指纹数据库寻找对应的数据进行匹配,怎么寻找呢?通过每个ap及其信号接受强度都可以在数据库找到多个位置信息(也就是在数据库找到K个信息最近的数据,最近的度量方法是通过RSSI和AP—-数据库中相同AP的RSSI和该RSSI差值小于某一阀值),假设每个找到10个,那就是一共100个位置信息,那么最后100个里边出现频率最高的就是位置就是该移动设备的定位结果

定位过程常见问题及解决方法

  1. 怎么解决定位过程中路由器信号遇到障碍物反射影响精度的问题
    • 对RSSI模型要进行环境参数拟合,添加高斯随机变量来对不同的环境进行模型优化
    • 路由器数目要足够多,这样可以减少部分路由器遇到墙壁反射带来的误差
    • 一个移动设备会同时接收到多个路由器信号来确定位置,如果该位置得到的某个路由器及其信号接受强度和原数据库信息差异过大,就应该修改数据库数据

参考图

参考链接

  1. Wi-Fi 定位的原理
  2. 基于余弦相似性的指纹匹配算法

Html5、React Native和Native应用开发方式的对比分析

发表于 2016-01-17 | 字数统计347字 | 阅读时长1分钟 | 分类于 转载

React Native的出现

React Native的出现,似乎是扛起的反H5的旗子。就像当年Facebook放弃H5,全部转向Native一样。这一点,我们需要认同和保持高度的清醒。那么,React Native是否又是在吞食Native的领地呢?技术的发展,是用户风向标的导向起的作用。任何一门技术的出现,都是当时用户需求的体现。

我们应该从以下几点看待React Native的出现。

“鉴往知来”——从过去的教训中总结经验,从用户的角度开拓未来,用户更希望产品迭代和稳定寻求一种平衡
“HTML5差强人意,但是与原生应用相比还是有些差距”——为了更高的追求! 用户体验!
“人才宝贵,快速迭代”——Web开发者相对较多,寻找平衡点
“跨平台!跨平台!跨平台!”——单一技术栈,开发者的福音
“xx是世界上最好的语言” ——工程学的范畴,没有最好,只有最适合,我还是补充一句,JS还是很好很好的。

HTML5 vs React Native ? HTML5 : React Native
结论(React Native):

  1. 原生应用的用户体验

  2. 跨平台特性

  3. 开发人员单一技术栈

  4. 上手快,入门容易

  5. 社区繁荣

3种方式开发应用效果对比(IOS平台)

工程方案对比

详细参考链接

Palindrome && Reverse Integer问题

发表于 2016-01-14 | 更新于 2016-01-15 | 字数统计476字 | 阅读时长1分钟 | 分类于 Leetcode

Palindrome Number问题

题目链接

解题思路:首先需要注意两点,①负数和小数都不是回文数 ②Integer有32位的范围限制,所以反转之后可能溢出. 对该整数循环除以10,取余数和商,余数则为从尾到头依次的digit number,并利用该digit number计算反转之后的结果,直到商为0结束循环;最终判断反转结构是否与原数相等。

public class Solution {
    public boolean isPalindrome(int x) {
        if (x < 0)
            return false;
        int reverse = 0;
        int quotient = x;
        while (quotient != 0) {
            reverse = reverse*10 + quotient%10;
            quotient = quotient/10;
        }
        if (reverse == x)
            return true;
        else
            return false; 
    }
}

优化解法: 分别从整数的首尾开始比对,第一位和最后一位比较,第二位和倒数第二位比较,一直比较到中间位置,如果发现全部都相等则说明是回文数,此方法可以避免溢出,例如对于:121,第一次比较1和1,剩下2;再比较2和2,发现它是回文数.

Reverse Integer问题

题目链接

解题思路:这道题与上一题类似,也是个反转整数的题,在java中Integer占据4个bytes, 有32位的范围限制,对于正数,它的最高位是0,所以它最大能表示的数是01111….(后面共31个1),数化成十进制即是2147483647,Integer.MAX_VALUE = 2147483647[0x7fffffff]; 负数能表示的最小数的二进制数为1000..(后面共31个0),化为十进制数即为-int 类型的范围是 -2147483648,即为Integer.MIN_VALUE.当一个整数溢出时,变成一个与原数不相等的在int范围内的数,所以可以通过reverse/10 != tmp来判断是否溢出.

public class Solution {
    public int reverse(int x) {
        // Consider the case: reverse overflow int
        int reverse = 0;
        int quotient = x;
        while (quotient != 0) {
            int tmp = reverse;
            // if (reverse > Integer.MAX_VALUE || reverse < Integer.MIN_VALUE)
            //    return 0;
            reverse = reverse * 10 + quotient % 10;
            quotient = quotient / 10;
            // deal with overflow
            if (reverse/10 != tmp) {
                return 0;
            }

        }

        return reverse;
    }
}

Remove element问题的简单优化

发表于 2016-01-13 | 字数统计303字 | 阅读时长1分钟 | 分类于 Leetcode

原题链接: Remove Element. 这是一道easy的水题,之所以拿出来讲,主要是其中有一个巧妙的小优化,可以因小见大体会到代码效率优化的无处不在,激励自己写出最优的代码.

最初解法

public class Solution {
    public int removeElement(int[] nums, int val) {
        int length = nums.length;
        int res = 0;
        for(int i=0; i<length; ++i) {
            if (nums[i] != val) {
                 nums[res] = nums[i];
                 res++;
            }
        }
        return res;
    }
}

思路讲解: 从头开始遍历数组元素length次,当元素nums[i]与val不相等,重新赋值, 相等则跳过,最终数组中前res个元素都是不等于val的元素

效率:

改进解法

public class Solution {
    public int removeElement(int[] nums, int val) {
        int length = nums.length;
        int res = 0;
        // 减少i++操作引发70%的效率提升
        for(int i=0; i<length-res;) {
            if (nums[i] == val) {
                 nums[i] = nums[length-res-1];
                 res++;
            } else {
                i++;
            }
        }
        return length-res;
    }
}

思路讲解: 从头开始遍历数组元素length-res次,当元素nums[i]与val相等,i不改变, 从末尾取出一个对应的将不再被循环遍历到的元素赋值到当前的nums[i], 再次与val比较;如果nums[i]与val不相等则i++,比较下一元素

效率:

1…111213…18
CharlesXiao

CharlesXiao

在码农炼成之路不断挣扎……stay hungry……keep learning……

87 日志
18 分类
78 标签
github weibo Daijiale的个人站点
推荐阅读
  • RocksDB
  • Google FE
© 2015.05.16 – 2019 CharlesXiao
本站总访问量:
|
总访客数:
|
博客全站共169.6k字