GVKun编程网logo

nginx 限流,以及nginx直接返回json格式数据(nginx如何实现限流)

24

在本文中,我们将给您介绍关于nginx限流,以及nginx直接返回json格式数据的详细内容,并且为您解答nginx如何实现限流的相关问题,此外,我们还将为您提供关于Centos7yum源安装ngin

在本文中,我们将给您介绍关于nginx 限流,以及nginx直接返回json格式数据的详细内容,并且为您解答nginx如何实现限流的相关问题,此外,我们还将为您提供关于Centos7 yum 源安装nginx以及nginx配置介绍、Django 1.8.11 查询数据库返回JSON格式数据、Go语言gin框架返回json格式里,怎么把某个int属性转成string返回?、nginx log以JSON格式记录的知识。

本文目录一览:

nginx 限流,以及nginx直接返回json格式数据(nginx如何实现限流)

nginx 限流,以及nginx直接返回json格式数据(nginx如何实现限流)

高并发系统有三把利器用来保护系统:缓存、降级和限流

今天我们这里说说限流。一般会在应用层配合redis做限流策略,这里我们聊聊nginx层限流。

限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务,以防止非预期的请求对系统压力过大而引起的系统瘫痪(友好点比如直接返回相应的json或则页面提示用户访问高峰,稍后再试)

限流一般有三种: 计数器 、漏桶算法、令牌桶算

关于限流算法不是本文讨论范围,定义网上有大把介绍

1.先说下nginx里面配置直接返回json如何操作。

	location /json/ {
	    default_type application/json;
	    add_header Content-Type ''text/html; charset=utf-8'';
	    return 200 ''{"code":"6666,"msg":"访问高峰期..."}'';
        }

Nginx限流配置

#限流
limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=2r/s;

location / { 
            #限流
            limit_req zone=myRateLimit burst=2 nodelay;
            root   html;
            index  index.html index.htm;
        }

名词解释:

第1个参数:limit_req_zone定义在http块中,$binary_remote_addr表示保存客户端IP地址的二进制形式。
第2个参数:Zone定义IP状态及URL访问频率的共享内存区域。zone=keyword标识区域的名字,以及冒号后面跟区域大小。16000个IP地址的状态信息约1MB,所以示例中区域可以存储160000个IP地址。
第3个参数:Rate定义最大请求速率。示例中速率不能超过每秒2个请求。

超过限流,默认返回503状态

然后我们在503错误页面配置返回相应json或者html页面即可。这里我们返回json

error_page 503 /503;
	location = /503 {
            default_type application/json;
	        add_header Content-Type ''text/html; charset=utf-8'';
	        return 200 ''{"code":"6666,"msg":"访问高峰期..."}'';
        }

展示结果如下

正常返回结果

限流后返回结果

至此nginx限流搞定

Centos7 yum 源安装nginx以及nginx配置介绍

Centos7 yum 源安装nginx以及nginx配置介绍

Centos7 yum 源安装Nginx以及Nginx配置介绍

(1)安装

1.1添加Nginx存储库
yum install epel-release
1.2开始安装Nginx
yum install Nginx

中途这两个命令会提示你是否继续 你只需要一路 yyyyyyyyyyy

到这里 Nginx已经安装好了

1.3Nginx启动需要注意的地方

1.Nginx端口是否被占用 ,Nginx默认端口为80端口

2.服务器是否开启80端口防护墙以及开放对应安全组

下方命令为开启80端口防火墙,云服务器的话设置安全组需要登录阿里云或者腾讯云开放安全组

firewall-cmd --zone=public --add-port=80/tcp --permanent

启动试一试!!

附带Nginx常用命令

#启动Nginx  两种命令都可以启动
systemctl start Nginx   
Nginx

#设置Nginx开机启动
systemctl enable Nginx

#卸载Nginx命令
yum remove Nginx

#停止Nginx
Nginx -s stop

#重启Nginx
Nginx -s reload

如果没有修改Nginx默认端口 Nginx启动后直接访问服务器Ip(80可默认不写) 即可,如果修改了默认端口,访问方式为服务器 ip:Nginx端口

访问后网页出现一下提示则说明Nginx已成功安装并启动了

Welcome to CentOS
The Community ENTerprise Operating System

(2) Nginx配置

使用yum源安装的Nginx配置默认位置在

/etc/Nginx/Nginx.conf
# For more information on configuration, see:
#   * Official English Documentation: http://Nginx.org/en/docs/
#   * Official Russian Documentation: http://Nginx.org/ru/docs/
#运行用户
user Nginx;
#启动进程,每个Nginx进程平均耗费10M~12M内存。建议指定和cpu的数量一致即可
worker_processes auto;
#全局错误日志及PID文件
error_log /var/log/Nginx/error.log;
pid /run/Nginx.pid;

# Load dynamic modules. See /usr/share/doc/Nginx/README.dynamic.
include /usr/share/Nginx/modules/*.conf;
#工作模式
events {
	#单个后台worker process进程的最大并发链接数
    worker_connections 1024;
}
#http服务器,负载均衡以及反向代理都是使用它
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/Nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    
	#设定mime类型,类型由mime.type文件定义
    include             /etc/Nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/Nginx/conf.d directory.
    # See http://Nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/Nginx/conf.d/*.conf;
    
    #server 块是对虚拟主机的配置,server标志定义虚拟主机开始
    server {
    	#listen用于指定虚拟主机的服务端口,启动后就是虚拟机ip+此指定的端口进行访问
        listen       80 default_server;
        listen       [::]:80 default_server;
        #server_name 用来指定IP地址或域名,多个域名之间用空格分开
        server_name  _;
        #root指令用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径
        root         /usr/share/Nginx/html;

        #加载默认服务器组的配置文件.
        include /etc/Nginx/default.d/*.conf;
		#location块
		#URL地址匹配 /a  访问就ip:端口/a 
		#下方location是我自己目前的配置
		#在一个server中 可以配置多个location ,但是“/“必须有一个
        location / {
        #ftp文件主目录,只允许有一个
        root /var/ftp/pub/;
        #此访问的首页
        index index.html index.htm index.PHP index.jpg index.mp4 index.txt;
        }
        #404页
        error_page 404 /404.html;
            location = /40x.html {
        }
		#500页
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
        #第二个location
        location /chexuan/ {
        alias /ftp/chexuan/;
        index index.html index.htm index.PHP index.jpg index.mp4 index.txt;
        }

        #举例
        #访根目录/, 比如http://localhost/ 就会匹配 /var/ftp/pub/下的index文件
        #访问目录/chexuan/  比如http://localhost/chexuan/ 就会匹配 /ftp/chexuan/下的index文件
    }

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2 default_server;
#        listen       [::]:443 ssl http2 default_server;
#        server_name  _;
#        root         /usr/share/Nginx/html;
#
#        ssl_certificate "/etc/pki/Nginx/server.crt";
#        ssl_certificate_key "/etc/pki/Nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers HIGH:!aNULL:!MD5;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/Nginx/default.d/*.conf;
#
#        location / {
#        }
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

}


其中location代码块中 root 和alias的区别

root实例:

location /t/ {
     root /www/root/html/;
}
如果一个请求的URI是/t/a.html时,web服务器将会返回服务器上的/www/root/html/t/a.html的文件。

alias实例:

location /t/ {
 alias /www/root/html/leilei/;
}
如果一个请求的URI是/t/a.html时,web服务器将会返回服务器上的/www/root/html/leilei/a.html的文件。注意这里是leilei,因为alias会把location后面配置的路径丢弃掉,把当前匹配到的目录指向到指定的目录。


注意

  1. 使用alias时,目录名后面一定要加"/"。
  2. alias在使用正则匹配时,必须捕捉要匹配的内容并在指定的内容处使用。
  3. alias只能位于location块中。(root可以不放在location中)

目前Nginx的学习到这就结束了,,后续深入的时候继续更新

你是胖虎? 发布了29 篇原创文章 · 获赞 22 · 访问量 3465 私信 关注

Django 1.8.11 查询数据库返回JSON格式数据

Django 1.8.11 查询数据库返回JSON格式数据

Django 1.8.11 查询数据库返回JSON格式数据

和前端交互全部使用JSON,如何将数据库查询结果转换成JSON格式

环境

Win10 Python2.7 Django 1.8.11

返回多条数据

示例

import json
from django.http import HttpResponse
from django.core import serializers
def db_to_json(request):
    scripts = Scripts.objects.all()[0:1]
    json_data = serializers.serialize(''json'', scripts)
    return HttpResponse(json_data, content_type="application/json")

返回结果

[{
	"fields": {
		"script_content": "abc",
		"script_type": "1"
	},
	"model": "home_application.scripts",
	"pk": "03a0a7cf-567a-11e9-8566-9828a60543bb"
}]

功能实现了,但是我需要返回一个约定好的JSON格式,查询结果放在 data 中

 {"message": ''success'', "code": ''0'', "data": []}

代码如下:

import json
from django.http import HttpResponse
from django.core import serializers
def db_to_json2(request):
    # 和前端约定的返回格式
    result = {"message": ''success'', "code": ''0'', "data": []}
    scripts = Scripts.objects.all()[0:1]
    # 序列化为 Python 对象
    result["data"] = serializers.serialize(''python'', scripts)
    # 转换为 JSON 字符串并返回
    return HttpResponse(json.dumps(result), content_type="application/json")

调用结果

{
	"message": "success",
	"code": "0",
	"data": [{
		"fields": {
			"script_content": "abc",
			"script_type": "1"
		},
		"model": "home_application.scripts",
		"pk": "03a0a7cf-567a-11e9-8566-9828a60543bb"
	}]
}

有点难受的是,每条数据对象包含 fields,model,pk三个对象,分别代表字段、模型、主键,我更想要一个只包含所有字段的字典对象。虽然也可以处理,但还是省点性能,交给前端解析吧。

返回单个对象

代码:

from django.forms.models import model_to_dict
from django.http import HttpResponse
import json
def obj_json(request):
    pk = request.GET.get(''script_id'')

    script = Scripts.objects.get(pk=pk)
    # 转为字典类型
    script = model_to_dict(script)

    return HttpResponse(json.dumps(script), content_type="application/json")

返回JSON:

{
	"script_id": "1534d8f0-59ad-11e9-a310-9828a60543bb",
	"script_content": "3",
	"script_name": "3",
	"script_type": "1"
}

Go语言gin框架返回json格式里,怎么把某个int属性转成string返回?

Go语言gin框架返回json格式里,怎么把某个int属性转成string返回?

Go语言gin框架返回json格式里,怎么把某个int属性转成string返回?

nginx log以JSON格式记录

nginx log以JSON格式记录

nginx的日志配置可以参见《nginx日志配置》一文。如果要想以json格式记录nginx日志以便logstash分析,该如何指定日志格式呢?可以按照下面的格式来实现。

定义nginx日志格式:

log_format logstash_json ''{ "@timestamp": "$time_local", ''
                         ''"@fields": { ''
                         ''"remote_addr": "$remote_addr", ''
                         ''"remote_user": "$remote_user", ''
                         ''"body_bytes_sent": "$body_bytes_sent", ''
                         ''"request_time": "$request_time", ''
                         ''"status": "$status", ''
                         ''"request": "$request", ''
                         ''"request_method": "$request_method", ''
                         ''"http_referrer": "$http_referer", ''
                         ''"body_bytes_sent":"$body_bytes_sent", ''
                         ''"http_x_forwarded_for": "$http_x_forwarded_for", ''
                         ''"http_user_agent": "$http_user_agent" } }'';

指定记录日志格式:

access_log  /data/logs/nginx/www.ttlsa.com.access.log  logstash_json;

日志输出如下:

json

不利于阅读。复制到http://jsonlint.com/美化下格式。

json

关于nginx 限流,以及nginx直接返回json格式数据nginx如何实现限流的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于Centos7 yum 源安装nginx以及nginx配置介绍、Django 1.8.11 查询数据库返回JSON格式数据、Go语言gin框架返回json格式里,怎么把某个int属性转成string返回?、nginx log以JSON格式记录等相关内容,可以在本站寻找。

本文标签: