安装默认包

yum install   -y  gcc-c++   pcre pcre-devel  zlib zlib-devel  openssl openssl-devel

80跳 443  301跳转

以下这段需要写在service{}里面

#301跳转
if ($server_port = 80 ) {
return 301 https://$host$request_uri;
}

就是这样

cat  default.conf
server {
listen 80 default;
listen 443 ssl default;
server_name _;
ssl_certificate crt/......crt;
ssl_certificate_key crt/.......key;
access_log logs/default.log main;
#301跳转
if ($server_port = 80 ) {
return 301 https://$host$request_uri;
} location / {
return 403;
}
}

也可以写成这样

cat   default.conf
server {
listen 80 default_server;
server_name _;
access_log /home/log.log; location / {
return 301 https://$host$request_uri;
} }

default 配置
参考
https://www.cnblogs.com/kuku0223/p/10740735.html

设置了default     除了指定的域名,  如果是没有配置的域名解析过来。不会乱跳。  可以直接使没有配置的域名跳过来变 404

1、nginx 隐式的 default server

http {
# 如果没有显式声明 default server 则第一个 server 会被隐式的设为 default server
server {
listen 80;
server_name _; # _ 并不是重点 __ 也可以 ___也可以
return 403; # 403 forbidden
} server {
listen 80;
server_name www.a.com;
...
} server {
listen 80;
server_name www.b.com;
...
}
}

很多人复制粘贴广泛传播 server_name 要设为 '_',其实一毛钱的关系也没有。'_' 只是作为一个和业务域名无关的请求回收服务而已,如果我们线上的业务都是明确的业务域名访问,那泛解析造成的一些非业务域名或ip访问都会被这个 sever 回收处理。

2、显示的定义一个 default server

http {
server {
listen 80;
server_name www.a.com;
...
} server {
listen 80;
server_name www.b.com;
...
} # 显示的定义一个 default server
server {
listen 80 default_server;
server_name _;
return 403; # 403 forbidden
} }

3、直接指定server_name 为 ip(只能禁止ip访问)

http {
server {
listen 80;
server_name www.a.com;
...
} server {
listen 80;
server_name www.b.com;
...
} # 直接指定 ip server_name
server {
listen 80;
server_name xxx.xxx.xxx.xxx;
return 403; # 403 forbidden
} }

 测试:

可以使用本机的 host做测试,写三个server。 只配置 2个域名。

    server {
listen 80 ;
server_name aaa.com;
root /usr/share/nginx/html; location / {
} } server {
listen 80 ;
server_name bbb.com;
root /usr/share/nginx/html; location / {
} } server {
listen 80 default_server;
server_name _;
return 403; # 403 forbidden
}

本地host写死

访问  aaa.com  和 bbb.com 都没有问题。 但是访问ccc.com  会直接报403。因为 只配置aaa.com  和 bbb.com2个域名。  其他域名都访问不过来


限制非本机配置域名, 但是不限制ip访问

我们要再配置一段ip的server

[root@localhost vhost]# sudo  cat  default.conf 
# 配置2个域名
server {
        listen       80 ;
        server_name  aaa.com
                     bbb.com;    
        location / {
      root   html;
          index  index index.jsp index.htm index.html;
    } } # 将本机ip当做 servername 来配置 server {
        listen       80 ;
        server_name  192.168.144.174;
        location /  {
          root   html;
          index  index index.jsp index.htm index.html;
        } } server {
        listen 80 default_server;
        server_name _;
    return  403;
}

本地写host

本机只配置了

aaa.com  和 bbb.com

但是没有配置  ccc.com

然后查看

aaa 和 bbb 能正常访问

ip可以正常访问

但是 ccc 不行

然后将 ip那段注释掉,ip就不能访问了

[root@localhost vhost]# cat    default.conf
server {
listen 80 ;
server_name aaa.com
bbb.com;
location / {
root html;
index index index.jsp index.htm index.html;
} } # 注释掉这段
#server {
# listen 80 ;
# server_name 192.168.144.174;
# location / {
# root html;
# index index index.jsp index.htm index.html;
# }
#
#} server {
listen 80 default_server;
server_name _;
return 403;
}

然后reload  nginx后。

查看 。 ip访问 就被挡住了。


80 转 443

#301跳转
if ($server_port = 80 ) {
return 301 https://$host$request_uri;
}

如果找不到请求的页面,就返回首页

location / {
if (!-e $request_filename){
rewrite ^/(.*)$ /index.php?s=/$1 last;
}
}

支持  http2

nginx 配置支持http2

server {
listen ssl http2;
ssl_certificate xxxxx/xxxx.crt;
ssl_certificate_key xxxxx/xxxx.key;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
access_log xxx/aaa.log main;
location / { index index.jsp index.htm index.html;
proxy_redirect off;
proxy_set_header Host $host:$server_port;
proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

若出现报错:

ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY

是因为nginx默认是

ssl_ciphers HIGH:!aNULL:!MD5;

需要改成

EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

限制 ../的域名路径

这个需要注意, 这个if 需要现在server里面, 不能写在location里面。  因为  ../默认就是返回上级。  location里面会地址解析掉 。 server里面就是未解析的地址。

if ( $request ~ .*\.\..* ) {
return 403;
}

只能使用指令行 curl。 浏览器会自动解析的。

curl  https://xxxx.com/vim/Memberday/../../index.jsp -H 'User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16D57 unknown BingWeb/6.9.8.1'

限制ip访问频率的

参考

https://blog.csdn.net/hellow__world/article/details/78658041

http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

当有大量ip特殊刷域名或接口时,可以使用此证方法

使用

ngx_http_limit_req

基础配置

imit_req_zone $binary_remote_addr zone=one:10m rate=,10r/m;

server {

    location  /search/ {

        limit_req zone=one burst=5 nodelay;

    }

简单解释下。

第一段的zone配置,定义策略,注意此段如果是在nginx.conf的文件里面, 需要写在service的外层 , 就是http{} 里面定义就行了。   如果是配置的虚拟主机,需要另起一个文件。然后include里面,包含就可以了。

在nginx的配置中 http===> server===>location

$binary_remote_addr :表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量,是限制同一客户端ip地址
zone=one:10m:表示生成一个大小为10M,名字为one的内存区域,用来存储访问的频次信息
rate=10r/m:表示允许相同标识的客户端的访问频次,这里限制的是没分钟10次,即每分钟只处理十个请求,相当于6秒一次。还可以有比如30r/m的,即限制每2秒访问一次,即每2秒才处理一个请求。

第二段location配置, 配置限制的接口路径

zone=one :设置使用哪个配置区域来做限制,与上面limit_req_zone 里的name对应
burst=5:重点说明一下这个配置,burst爆发的意思,这个配置的意思是设置一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内等待,但是这个等待区里的位置只有5个,超过的请求会直接报503的错误然后返回。
nodelay:
- 如果设置,会在瞬时提供处理(burst + rate)个请求的能力,请求超过(burst + rate)的时候就会直接返回503,永远不存在请求需要等待的情况。(这里的rate的单位是:r/s)
- 如果没有设置,则所有请求会依次等待排队

实际演示下,查看下配置文件

[root@localhost vhost]# pwd
/opt/nginx/conf/vhost
[root@localhost vhost]# ls
include limit_req new1.conf
[root@localhost vhost]# cat include
# include vhost/upstream;
include vhost/*.conf;
include vhost/limit_req;
include vhost/*/*.conf;
[root@localhost vhost]# cat new1.conf
server {
listen 80;
server_name _;
access_log /opt/nginx/logs/new_access.log main;
location / {
root html;
index index index.jsp index.htm index.html;
proxy_redirect off;
proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /AAA/aaa.html { # 配置了一段location,来定义限制的路径
limit_req zone=one ;
root html;
index index index.jsp index.htm index.html;
proxy_redirect off;
proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } [root@localhost vhost]# cat limit_req # zone的文件要写在server的外层, 所以这边定义在另一个文件里面了
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/m;

第一种情况  不加  nodelay和 burst

这边先不配置 nodelay和 burst的

[root@localhost vhost]# cat  new1.conf
server {
listen 80;
server_name _;
access_log /opt/nginx/logs/new_access.log main;
location / {
root html;
index index index.jsp index.htm index.html;
proxy_redirect off;
proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /AAA/aaa.html {
limit_req zone=one ;
root html;
index index index.jsp index.htm index.html;
proxy_redirect off;
proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }

然后我们使用ab工具测试

ab工具参数,可以参考

https://blog.csdn.net/jianghulangzhongshen/article/details/99866873

ab -n 10 -c 10 http://127.0.0.1/AAA/aaa.html
请求数 并发数

查看,我们可以看到,成功了一次,失败了9次。  测试完成在0.1秒内。

查看日志,就是第一次成功了。后面都是503,因为大并发的时候,虽然是 1分钟10次。但是相当于6s一次。所以后面都失败了。

第二种情况, 加上 burst=5

这边加上 burst=5

server {
listen 80;
server_name _;
access_log /opt/nginx/logs/new_access.log main;
location / {
root html;
index index index.jsp index.htm index.html;
proxy_redirect off;
proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /AAA/aaa.html {
limit_req zone=one burst=5 ;
root html;
index index index.jsp index.htm index.html;
proxy_redirect off;
proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }

reload 之后测试,然后查看。

这次测试时间超过一分钟 , 然后成功了5次。  这是因为  burst 定义了一个缓存区域, 大并发是多的请求到缓存区等待。

我们看日志,当并发量大,超过缓存区的请求 会报503. 然后会有请求等待。 之后就会有成功。  499是客户端主动断开。

nginx的 报错代码 可以参考:

https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

https://www.nginx.com/resources/wiki/extending/api/http/

第三种情况, 我们加上 nodelay 

nodelay  就是只直接处理 burst 的内的请求。无需等待。

server {
listen 80;
server_name _;
access_log /opt/nginx/logs/new_access.log main;
location / {
root html;
index index index.jsp index.htm index.html;
proxy_redirect off;
proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /AAA/aaa.html {
limit_req zone=one burst=5 nodelay;
root html;
index index index.jsp index.htm index.html;
proxy_redirect off;
proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }

reload  后 ,使用ab工具查看

看时间,瞬间完成。 然后失败了6次。

查看日志,前面4次都是成功的, 之后才是失败的。 是因为无需等待,直接就处理 brust的内容, 之后的请求都是超出限制的,直接就503了。

第四种情况 只加nodeplay

直加nodelay ,没有burst。

[root@localhost vhost]# cat  new1.conf
server {
listen 80;
server_name _;
access_log /opt/nginx/logs/new_access.log main;
location / {
root html;
index index index.jsp index.htm index.html;
proxy_redirect off;
proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /AAA/aaa.html {
limit_req zone=one nodelay;
root html;
index index index.jsp index.htm index.html;
proxy_redirect off;
proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }

reload 之后测试。查看接口,和第一种情况是一样的结果。

查看日志,和第一种情况 一样。

以上是主要的测试结果。

nginx 的 一些配置说明的更多相关文章

  1. Nginx location相关配置说明

    Nginx location相关配置说明       基于不同的IP.不同的端口以及不用得域名实现不同的虚拟主机,依赖于核心模块ngx_http_core_module实现. 新建PC web站点 [ ...

  2. Nginx负载均衡配置说明

    WEB服务做负载均衡的方法有很多种,但使用Nginx做负载均衡部署毫无疑问是非常高效也是非常流行的一种. 本人大多数做.NET开发,但部署负载却一直用Nginx,对其他的负载方式研究不多,只测试过一次 ...

  3. Nginx模块开发与架构解析(nginx安装、配置说明)

    第一章 研究nginx前的准备工作 Linux操作系统需要2.6及其以上的内核(支持epoll) 使用nginx的必备软件 Linux内核参数优化方案 安装nginx 控制nginx 第二章 ngin ...

  4. 【nginx】详细配置说明

    ———————————————————————相关文章———————————————————————————— Centos之安装Nginx及注意事项 [Linux]nginx常用命令 ——————— ...

  5. nginx 超时时间配置说明

    做excel文件导入时 报 504 错误 是nginx网关超时导致 下面几个参数貌似没效果,反正我配置不起作用 这是有问题的配置属性 ,注意   于是我换了配置 ,放在http块里 ,配置生效了 #读 ...

  6. Nginx代理功能与负载均衡详解

    序言 Nginx的代理功能与负载均衡功能是最常被用到的,关于nginx的基本语法常识与配置已在上篇文章中有说明,这篇就开门见山,先描述一些关于代理功能的配置,再说明负载均衡详细. Nginx代理服务的 ...

  7. nginx正向代理,反向代理,透明代理(总结)

    1正向代理 正向代理,也就是传说中的代理,他的工作原理就像一个跳板, 简单的说, 我是一个用户,我访问不了某网站,但是我能访问一个代理服务器 这个代理服务器呢,他能访问那个我不能访问的网站 于是我先连 ...

  8. 【转载】nginx 并发数问题思考:worker_connections,worker_processes与 max clients

    注:这个文章主要是作者一直在研究nginx作为http server和反向代理服务器时候所谓最大的max_clients和 worker_connections的计算公式, 其实最后的结论也没有卡上公 ...

  9. Setup a private http/nginx based GIT server

    原文:http://aaba.me/blog/2014/03/setup-a-private-http-nginx-based-git-server.html https://doomzhou.git ...

随机推荐

  1. [C1W1] Neural Networks and Deep Learning - Introduction to Deep Learning

    第一周:深度学习引言(Introduction to Deep Learning) 欢迎(Welcome) 深度学习改变了传统互联网业务,例如如网络搜索和广告.但是深度学习同时也使得许多新产品和企业以 ...

  2. CSS中的选择器(一)

    API文档:http://css.cuishifeng.cn/all.html 1. 通配选择符(*) 语法: * { sRules } 说明: 通常不建议使用通配选择符,因为它会遍历并命中文档中所有 ...

  3. Matlab各种拟合

    作者:Z-HE链接:https://zhuanlan.zhihu.com/p/36103034来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 1) polyfit 代码 ...

  4. hdu 6495 dp

    http://acm.hdu.edu.cn/showproblem.php?pid=6495 题意 有n个挑战(1e3),假如接受,在挑战之前体力x会变成min(x,\(b[i]\)),然后会减去a[ ...

  5. python实现异步调用函数执行

    在实现异步调用之前我们先进行什么是同步调用和异步调用 同步:是指完成事务的逻辑,先执行第一个事务,如果阻塞了,会一直等待,直到这个事务完成,再执行第二个事务,顺序执行 异步:是和同步相对的,异步是指在 ...

  6. fiddler 抓取winform wcf包

    修改客户端配置 <system.net> <defaultProxy> <proxy bypassonlocal="false" usesystemd ...

  7. Python 文件readlines()方法

    原文连接:https://www.runoob.com/python/file-readlines.html readlines()方法用于读取所有行(直到结束符EOF)并返回列表,该列表可以由pyt ...

  8. Flink,Storm,SparkStreaming性能对比

    Yahoo 的 Storm 团队曾发表了一篇博客文章 ,并在其中展示了 Storm.Flink 和 Spark Streaming 的性能测试结果.该测试对于业界而言极 具价值,因为它是流处理领域的第 ...

  9. 调用SqlCommand或SqlDataAdapter的Dispose方法,是否会关闭绑定的SqlConnection?(转载)

    1. Does SqlCommand.Dispose close the connection? 问 Can I use this approach efficiently? using(SqlCom ...

  10. SQLAlchemy--基本增删改查

    目录 简介 安装 组成部分 简单使用 执行原生sql(不常用) orm使用(重点) 常用数据类型 Column常用参数 常用操作(CURD) 创建映射类的实例 创建会话Session 增加add()/ ...