• API网关【gateway 】- 2


    最近在公司进行API网关重写,公司内采用serverMesh进行服务注册,调用,这里结合之前学习对API网关服务进行简单的总结与分析。

    由于采用了大量的nginx相关的东西,所以在此记录一下:

    配置连接数

    worker_processes:表示开启nginx的worker进程的个数,nginx启动会开两种进程,master进程用来管理调度,worker进程用来处理请求,

    优化手段,

    方法一:worker_processes auto;

      表示设置服务器cpu核数匹配开启nginx开启的worker进程数

      查看cpu核数:cat /proc/cpuinfo

    方法二:nginx设置cpu亲和力【进行手动设置】

      worker_processes 8;

      worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

      00000001表示启用第一个CPU内核,00000010表示启用第二个CPU内核,以此类推

    这种设置方法更高效,因将每个cpu核提供给固定的worker进程服务,减少cpu上下文切换带来的资源浪费

    比如,2核CPU,开启2个进程,设置如下

    worker_processes     2;
    
    worker_cpu_affinity 01 10;

    比如:4核CPU,开启4个进程,设置如下

    worker_processes     4;
    
    worker_cpu_affinity 0001 0010 0100 1000;

    网关功能之一 :日志 

    使用log_format指令进行配置文件格式

    nginx的log_format有很多可选的参数用于指示服务器的活动状态,默认的是:

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '    '$status $body_bytes_sent "$http_referer" '    '"$http_user_agent" "$http_x_forwarded_for"';

    192.168.31.247 - - [11/Apr/2019:16:26:43 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3350.0 Safari/537.36" "-"

    参数说明

    参数                      说明                                         示例
    $remote_addr             客户端地址                                    211.28.65.253
    $remote_user             客户端用户名称                                 --
    $time_local              访问时间和时区                                 11/Apr/2019:16:26:43 +0800
    $request                 请求的URI和HTTP协议                            "GET /article-10000.html HTTP/1.1"
    $http_host               请求地址,即浏览器中你输入的地址(IP或域名)       www.wang.com 192.168.100.100
    $status                  HTTP请求状态                                  200
    $upstream_status         upstream状态                                  200
    $body_bytes_sent         发送给客户端文件内容大小                         1547
    $http_referer            url跳转来源                                   https://www.baidu.com/
    $http_user_agent         用户终端浏览器等信息                           "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C;
    $ssl_protocol            SSL协议版本                                   TLSv1
    $ssl_cipher              交换数据中的算法                               RC4-SHA
    $upstream_addr           后台upstream的地址,即真正提供服务的主机地址      10.10.10.100:80
    $request_time            整个请求的总时间                               0.205
    $upstream_response_time  请求过程中,upstream响应时间                    0.002
    $http_x_forwarded_for    是反向代理服务器转发客户端地址的参数

    假设将Nginx服务器作为Web服务器,位于负载均衡设备、Squid、Nginx反向代理之后,不能获取到客户端的真实IP地址了。

    原因是经过反向代理后,由于在客户端和Web服务器之间增加了中间层,因此Web服务器无法直接拿到客户端的IP。

    通过$remote_addr变量拿到的将是反向代理服务器的IP地址。

    但是,反向代理服务器在转发请求的HTTP头信息中,可以增加X-Forwarded-For信息,用以记录原有的客户端IP地址和原来客户端请求的服务器地址。

    这时候,要用log_format指令设置日志格式,让日志记录X-Forearded-For信息中的IP地址,即客户的真实IP。

    日志文件路径配置

    access_log指令

    语法: access_log path [format [buffer=size [flush=time]]];

    access_log path format gzip[=level] [buffer=size] [flush=time];
    access_log off;

    默认值: access_log logs/access.log combined;

    配置段:

    gzip : 压缩等级。

    buffer : 设置内存缓存区大小。

    flush : 保存在缓存区中的最长时间。

    access_log off : 不记录日志:

    使用默认combined格式记录日志:access_log logs/access.log 或 access_log logs/access.log combined;

    值得注意的是,Nginx进程设置的用户和组必须对日志路径有创建文件的权限,否则,会报错。

    此外,对于每一条日志记录,都将是先打开文件,再写入日志,然后关闭。可以使用open_log_file_cache来设置日志文件缓存(默认是off)。


    3)日志文件切割

    server1.log

    ----> server1-2019-04-09.log

    ----> server1-2019-04-10.log

    ----> server1-2019-04-11.log

    通过mv命令 把当前log文件重命令

    再用信号控制指令 发送重读日志指令 产生了新的日志log文件

    可以利用sh脚本的方式执行日志分割,在每天凌晨执行一个计划任务 调用sh脚本,就完成的系统自动切割日志文件

    例如脚本:

    # touch cutlog.sh脚本
    # vi cutlog.sh 
    #!/bin/bash
    LOGS_PATH=/usr/local/nginx/logs
    YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
    mv ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log
    kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)   # 向 Nginx 主进程发送 USR1 信号。USR1 信号是重新打开日志文件

    设定定时任务:

    设置定时任务
    # vi  /etc/crontab
    0 0 * * * root /usr/local/nginx/logs/cutlog.sh  

    nginx模块安装

    查看nginx安装的现有模块指令

    /usr/local/nginx/sbin/nginx -V 
    nginx version: nginx/1.13.2
    built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) 
    configure arguments:

    下载需要的echo模块

    https://github.com/openresty/echo-nginx-module/tags
    # wget https://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gz
    # tar zxvf v0.61.tar.gz
    # mv echo-nginx-module-0.61 nginx-tools/

    重新编译nginx,安装echo-nginx模块

    进入nginx源文件,重新编译

    # ./configure --add-module=nginx安装目录下面/echo-nginx-module-0.61 #安装echo模块(文件夹名echo-nginx-module-0.61)
    # make 

    平滑升级 nginx

    备份一下旧的nginx

    # mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
    # cp -f objs/nginx /usr/local/nginx/sbin/nginx

    平滑升级:

    # make upgrade 
    # make clean (清除编译产生的文件)

    echo用法举例:

    location /module {
        echo 'hello world'; 
    }
    --------------------
    location /module {
                echo_exec /set;
    }
            
    location /set {
        set $foo 'hello world';     #自定义变量
        echo "$request_uri";      #显示nginx全局变量的内容
        echo $foo;
    }
  • 相关阅读:
    64位Windows2008下插入Oracle中文乱码问题解决
    .net自定义WebService WSDL
    IE8下调用Active控件
    IIS7.5下发布应用程序备忘
    在aws ec2上使用root用户登录
    win2008 服务器文件夹权限配置
    thinkphp3.1 多表联合查询代码
    并发 并行 同步 异步 多线程的区别
    学习ES6生成器(Generator)
    node.js+socket.io配置详解
  • 原文地址:https://www.cnblogs.com/zhenghongxin/p/10689392.html
Copyright © 2020-2023  润新知