导航菜单

nginx通讯原理及安全加固配置

陆兴东 2026-04-14 15 浏览 中间件
一.引言
在当今数字化的世界中,网络安全已成为每一个组织和个人不可忽视的重要议题。作为最流行的Web服务器之一,Nginx不仅因为其高性能而被广泛使用,还因为它能够提供强大的安全保障。然而,默认配置下的Nginx可能无法抵御所有潜在的安全威胁。为了确保您的网站和应用程序能够在互联网上稳健运行,对Nginx进行适当的安全加固显得尤为重要。一个默认配置的 Nginx 并不意味着它是绝对安全的。攻击者可能会利用信息泄露、配置不当等漏洞,发起DDoS攻击、XSS跨站脚本、SQL注入等多种攻击。因此,对 Nginx 进行全面的安全加固,是构建坚固网络防线的第一步,也是至关重要的一步,通过优化Nginx配置来提高您的网络环境的安全性吧。

二.Nginx 通讯原理:

1.web 请求处理机制:
①多进程方式:
服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直到用户关闭连接,这样的优势是处理速度快,各子进程之间相互独立,但是如果访问过大会导致服务器资源耗尽而无法提供请求。
②多线程方式:
与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程来与客户方进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了 web 服务器对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可以相互访问同样的内存地址空间,所以他们相互影响,另外一旦主进程挂掉则所有子线程都不能工作了,llS 服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。
(1)主进程(master process)的功能:
读取 Nginx 配置文件并验证其有效性和正确性建立、绑定和关闭 socket 连接:一个用户连接到 nginx 会有一个公网地址和端口
按照配置生成、管理和结束工作进程
接受外界指令,比如重启、升级及退出服务器等指令
不中断服务,实现平滑升级,重启服务并应用新的配置
改变配置文件,使之生效,一般不重启服务,直接是使用命令 nginx -s reload
开启日志文件,获取文件描述符:
访问日志 access.log :每天的访问量、向后端服务的转发时间、日志监控
错误日志 error.log
不中断服务,实现平滑升级,升级失败进行回滚处理编译和处理perl脚本 : 升级之前,输入指令 nginx -t 可以测试配置是否存在问题
(2)工作进程(woker process)的功能:
接受处理客户的请求
将请求依次送入各个功能模块进行处理
IO调用,获取响应数据
与后端服务器通信,接收后端服务器的处理结果
缓存数据,访问缓存索引,查询和调用缓存数据:一般公共存储中使用,在 nginx 中开辟一个小型空间,当用户第一次访问时,从 NAS 中下载数据到公共存储中,第二次访问相同资源时,直接从空间中返回,而不需要从 NAS 再返回,节省时间。
发送请求结果,响应客户的请求
接收主程序指令,比如重启、升级和退出等

image.png

一个 Master 进程派生出多个 Woker 工作进程,工作进程中会加载多个核心模块。用户发起 http 请求,进程根据 I/O 类型,转发到相应模块进行处理。
Master 和 woker 之间,升级不中断服务。Backend(后端服务):包括 Web Server、Application server、Memcached。
Woker 进程调用 I/O 服务,类型有 Advanced I/O,sendfile,AIO,mmap etc.
2. 进程间通信:
工作进程是由主进程生成的,主进程使用 fork() 函数,在 Nginx 服务器启动过程中主进程根据配置文件决定启动工作进程的数量,然后建立一张全局的工作表用于存放当前未退出的所有的工作进程,主进程生成工作进程后会将新生成的工作进程加入到工作进程表中,并建立一个单向的管道并将其传递给工作进程,该管道与普通的管道不同,它是由主进程指向工作进程的单向通道,包含了主进程向工作进程发出的指令、工作进程 ID、工作进程在工作进程表中的索引和必要的文件描述符等信息。
主进程与外界通过信号机制进行通信,当接收到需要处理的信号时,它通过管道向相关的工作进程发送正确的指令,每个工作进程都有能力捕获管道中的可读事件,当管道中有可读事件的时候,工作进程就会从管道中读取并解析指令,然后采取相应的执行动作,这样就完成了主进程与工作进程的交互。
工作进程之间的通信原理基本上和主进程与工作进程之间的通信是一样的,只要工作进程之间能够取得彼此的信息,建立管道即可通信,但是由于工作进程之间是完全隔离的,因此一个进程想要知道另外一个进程的状态信息就只能通过主进程来设置了。
为了实现工作进程之间的交互,主进程在生成工作进程只之后,在工作进程表中进行遍历,将该新进程的 ID 以及针对该进程建立的管道句柄传递给工作进程中的其他进程,为工作进程之间的通信做准备,当工作进程1向工作进程2发送指令的时候,首先在主进程给它的其他工作进程工作信息中找到2的进程 IO,然后将正确的指令写入指向进程2的管道,工作进程2捕获到管道中的事件后,解析指令并进行相关操作,这样就完成了工作进程之间的通信。
下图为 Nginx 主进程与工作进程的通信过程架构图:

image.png

三.nginx相关加固配置

1.隐藏或伪装nginx的版本及版本相关提示信息

在nginx新版本发布后,公布旧版本的漏洞,攻击者极容易获得这些信息,并针对更新不及时或者补丁未打的nginx进行攻击。通过修改配置文件nginx.conf,提供nginx安全。

打开nginx.conf,在http服务器中配置指令server_tokens为off。如下所示:

http { 

… 

server_tokens off; 

… 

}

 

2.禁用不必要的http方法:DELETE、PUT、TRACE、OPTIONS等

nginx的反向代理功能,有一部分请求转发到后端服务器上,并从后端服务器上读取响应,发回客户端。后端可能有Tomcat或者Apache服务器,默认http方法包括GET、HEAD、POST、PUT、DELETE、OPTIONS等方法。在这些方法中,虽然PUT、DELETE方法很少被使用到,但可能被利用来进行攻击。对于Web服务来讲标准的请求只使用GET,POST和HEAD,其它方法不使用的需要禁止掉。例外:如果确实是业务需要使用(例如Restful接口需要使用GET,POST,PUT,DELETE),则不强制要求。

方法一:在nginx.conf配置所允许的http。

语法:

limit_except method 

... {...}

配置块:location

例如:

http {  

…  

Server { 

… 

location / { 

#http请求方法在全目录“/”下,除了GET POST HEAD,均禁止 

#默认返回403错误 

limit_except GET POST HEAD 

{ 

deny all; 

} 

} 

}

}

方法二:在nginx.conf针对某一个http方法禁止,根据业务需求。

if ($request_method = PUT ) { 

return 403; 

} 

if ($request_method = DELETE ) { 

return 403; 

}

 

3.禁止开启nginx的目录列表功能

如果访问nginx下的一个Web应用,如果输入是一个目录名,而且该目录下没有一个默认访问文件,那么nginx会将该目录下的所有文件列出来,这种敏感信息泄露是严格禁止的。nginx默认的是关闭目录列表,但是为了程序调试方便,部分程序员也有可能开启这一功能。因此,要确认该项配置是否正确。

在配置文件nginx.conf中,修改autoindex参数的值为off。或者该参数没有出现(默认情况下是关闭目录列表功能):

在location server段或者http段,

http {  

...  

autoindex off;  

... 

}

 

4.限制允许访问的IP

nginx允许限制某些IP地址的客户端访问,限制IP访问可以保护nginx避免DDOS攻击。

具体配置以用户实际需求为准,举例如下所示:

location/ { 

deny 192.168.1.1;

allow 192.168.1.0/24; 

allow 10.1.1.0/16; 

allow 2001:0db8::/32; 

denyall;

}

 

5.配置超时时间

设置合理的超时参数,防止慢速攻击:

配置nginx的超时时间,提高服务器的性能,降低客户端的等待时间。同时,在受到DOS攻击时,可以起到缓解作用。特殊情况下,请根据具体性能需求进行调优。

在配置文件nginx.conf中的http段配置超时,单位秒(s):

http {

...    

# 客户端请求体超时时间,单位秒
client_body_timeout 10;
# 客户端请求头超时时间
client_header_timeout 10;
# 客户端保持连接超时时间# 第一个参数是客户端超时时间# 第二个参数是在响应头中的Keep-Alive超时时间
keepalive_timeout 5 5;
# 向客户端发送响应的超时时间
send_timeout 10;
# 读取代理服务器响应的超时时间
proxy_read_timeout 10;
# 连接代理服务器的超时时间
proxy_connect_timeout 10;

...

}

 

6.启用XSS保护

X-XSS-Protection这个响应头是用来防范XSS的。现在主流浏览器都支持,并且默认都开启了XSS保护,用这个header可以关闭它。它有几种配置:

0:禁用XSS保护;

1:启用XSS保护;

1; mode=block:启用XSS保护,并在检查到XSS攻击时,停止渲染页面(例如IE8中,检查到攻击时,整个页面会被一个#替换);

浏览器提供的XSS保护机制并不完美,但是开启后仍然可以提升攻击难度,总之没有特别的理由,不要关闭它。

推荐配置:

add_header X-XSS-Protection "1; mode=block";

 

7.减少点击劫持

X-Frame-Options这个功能主要为了减少了点击劫持(Clickjacking)的发生。X-Frame-Options,已经转正为Frame-Options,但现阶段使用最好还是带上X-。

这个响应头支持三种配置:

DENY:不允许被任何页面嵌入;

SAMEORIGIN:不允许被本域以外的页面嵌入;

ALLOW-FROM uri:不允许被指定的域名以外的页面嵌入(Chrome现阶段不支持);

如果某页面被不被允许的页面以<iframe>或<frame>的形式嵌入,IE会显示类似于“此内容无法在框架中显示”的提示信息,Chrome和Firefox都会在控制台打印信息。由于嵌入的页面不会加载,这就减少了点击劫持(Clickjacking)的发生。

推荐配置:

add_header X-frame-options SAMEORIGIN;

 

8.禁用浏览器的类型猜测

互联网上的资源有各种类型,通常浏览器会根据响应头的Content-Type字段来分辨它们的类型。例如:"text/html"代表html文档,"image/png"是PNG图片,"text/css"是CSS样式文档。然而,有些资源的Content-Type是错的或者未定义。这时,某些浏览器会启用MIME-sniffing来猜测该资源的类型,解析内容并执行。

例如,即使给一个html文档指定Content-Type为"text/plain",在IE8-中这个文档依然会被当做html来解析。利用浏览器的这个特性,攻击者甚至可以让应该解析为图片的请求被解析为JavaScript。通过X-Content-Type-Options这个响应头可以禁用浏览器的类型猜测行为:

这个响应头的值只能是nosniff,可用于IE8+和Chrome。另外,它还被Chrome用于扩展下载。

推荐配置:

add_header X-Content-Type-Options nosniff;

 

9.nginx 拦截非法字符,nginx禁止url访问特定字符,nginx过滤url访问

参考代码一

#前缀为无限,后面的精准屏蔽字符 123

if ($request_uri ~* "123"){

return 403 "I've recorded your ip Wait to check the water meter";

}

 

参考代码二

#前缀为index.php,后面的精准屏蔽字符 123

if($request_uri  ~* "/index.php\123"){

return 403 "I've recorded your ip Wait to check the water meter";

}

 

参考代码三

location /{
        # 当访问的url中含有/%#时返回404
if($request_uri ~*"/%#"){
return 404;
}
        #当访问url的后面带有?的链接 返回404
if($request_uri ~*^/a/m/(.*)\.html\?(.*)$){
return 404;
}
}

注释

过滤链接中的?在nginx的配置文件中写入

location / {

# 当访问的url中含有/%#时返回404

if ($request_uri ~* "/%#") {

return 404;

}

当访问url的后面带有?的链接 返回404

if ($request_uri ~*^/a/m/(.*)\.html\?(.*)$) {

return 404;

 

}

 

 

10.nginx 正则表达式

=开头表示精确匹配,如 A 中只匹配根目录结尾的请求,后面不能带任何字符串。

^~ 开头表示uri以某个常规字符串开头,不是正则匹配

~ 开头表示区分大小写的正则匹配;

~* 开头表示不区分大小写的正则匹配

.*   .匹配任意字符,*匹配数量0到正无穷;

\.   \转义,匹配. 

/ 通用匹配, 如果没有其它匹配,任何请求都会匹配到

 

    #前缀为无限,后面的是屏蔽字符
if($request_uri ~*"../../../../../../"){
return 403 "I've recorded your ip Wait to check the water meter";
}
    #前缀为无限,后面的是屏蔽字符
if($request_uri ~*";"){
return 403 "I've recorded your ip Wait to check the water meter";
}
    #前缀为无限,后面的是屏蔽字符
if($request_uri ~*"&amp"){
return 403 "I've recorded your ip Wait to check the water meter";
}
    #前缀为无限,后面的是屏蔽字符
if($request_uri ~*"base64"){
return 403 "I've recorded your ip Wait to check the water meter";
}
    #前缀为index.php屏蔽,后面的是屏蔽字符
if($request_uri  ~*"/index.php\&"){
return 403 "I've recorded your ip Wait to check the water meter";
}
    #前缀为index.php屏蔽,后面的是屏蔽字符
if($request_uri  ~*"/index.php\?"){
return 403 "I've recorded your ip Wait to check the water meter";
}
    #前缀为index.php屏蔽,后面的是屏蔽字符
if($request_uri  ~*"/index.php\;"){
return 403 "I've recorded your ip Wait to check the water meter";
}
    #前缀为index.php屏蔽,后面的是屏蔽字符
if($request_uri  ~*"/index.php\="){
return 403 "I've recorded your ip Wait to check the water meter";
}
    #前缀为index.php屏蔽,后面的是屏蔽字符
if($request_uri  ~*"/index.php\="){
return 403 "I've recorded your ip Wait to check the water meter";
}
    #前缀为index.php屏蔽,后面的是屏蔽字符
if($request_uri  ~*"/index.php\_"){
return403"I've recorded your ip Wait to check the water meter";
}
    #前缀为index.php屏蔽,后面的是屏蔽字符
if($request_uri  ~*"/index.php\./"){
return 403 "I've recorded your ip Wait to check the water meter";
}
    #前缀为index.php屏蔽,后面的是屏蔽字符
if($request_uri  ~*"/index.php\:"){
return 403 "I've recorded your ip Wait to check the water meter";
}
    #前缀为index.php屏蔽,后面的是屏蔽字符
if($request_uri  ~*"/index.php\base64"){
return 403 "I've recorded your ip Wait to check the water meter";
}
    #前缀为index.php屏蔽,后面的是屏蔽字符
if($request_uri  ~*"/index.php\%"){
return 403 "I've recorded your ip Wait to check the water meter";
}
    #前缀为index.php屏蔽,后面的是屏蔽字符
if($request_uri  ~*"/index.php\wp-content"){
return 403 "I've recorded your ip Wait to check the water meter";
}
    #前缀为index.php屏蔽,后面的是屏蔽字符
if($request_uri  ~*"/index.php\;amp"){
return 403 "I've recorded your ip Wait to check the water meter";
}

## 附带:nginx ql语句过滤、文件注入禁止、溢出攻击过滤、spam字段过滤、user-agents头过滤

 

11.sql语句过滤

配置特殊字符过滤:
location / { 
# 检查URL中是否包含特殊字符 
# 如果包含分号、单引号、尖括号等字符,返回444状态码 
# 444是Nginx特殊状态码,表示关闭连接而不发送响应头 
if (args ~* [;'<>] ) { return 444; 
} 
# 保护敏感URI 
location ~* /(admin|backup|config|db|src)/ { deny all; 
}}
if($request_uri ~*"(cost\()|(concat\()"){
return 444;
}
if($request_uri ~*"[+|(%20)]union[+|(%20)]"){
return 444;
}
if($request_uri ~*"[+|(%20)]and[+|(%20)]"){
return 444;
}
if($request_uri ~*"[+|(%20)]select[+|(%20)]"){
return 444;
}
12.文件注入禁止
set $block_file_injections 0;
if($query_string ~ “[a-zA-Z0-9_]=http://”){
set $block_file_injections 1;
}
if($query_string ~ “[a-zA-Z0-9_]=(\.\.//?)+”) {
set $block_file_injections 1;
}
if($query_string ~ “[a-zA-Z0-9_]=/([a-z0-9_.]//?)+”) {
set $block_file_injections 1;
}
if($block_file_injections =1){
return 444;
}
13.溢出攻击过滤
set $block_common_exploits 0;
if($query_string ~“(<|%3C).*script.*(>|%3E)”){
set $block_common_exploits 1;
}
if($query_string ~ “GLOBALS(=|\[|\%[0-9A-Z]{0,2})”){
set $block_common_exploits 1;
}
if($query_string ~“_REQUEST(=|\[|\%[0-9A-Z]{0,2})”){
set $block_common_exploits 1;
}
if($query_string ~ “proc/self/environ”){
set $block_common_exploits 1;
}
if($query_string ~ “mosConfig_[a-zA-Z_]{1,21}(=|\%3D)”){
set $block_common_exploits 1;
}
if($query_string ~“base64_(en|de)code\(.*\)”){
set $block_common_exploits 1;
}
if($block_common_exploits =1){
return 444;
}
14.spam字段过滤
set $block_spam 0;
if ($query_string ~ “\b(ultram|unicauca|valium|viagra|vicodin|xanax|ypxaieo)\b”) {
set $block_spam 1;
}
if ($query_string ~ “\b(erections|hoodia|huronriveracres|impotence|levitra|libido)\b”) {
set $block_spam 1;
}
if ($query_string ~ “\b(ambien|blue\spill|cialis|cocaine|ejaculation|erectile)\b”) {
set $block_spam 1;
}
if ($query_string ~ “\b(lipitor|phentermin|pro[sz]ac|sandyauer|tramadol|troyhamby)\b”) {
set $block_spam 1;
}
if ($block_spam = 1) {
return 444;
}
15.自动防护
if ($request_uri ~* \.(htm|do)\?(.*)$) {
           set $req $2;
        }
        if ($req ~* "(cost\()|(concat\()") {
                return 503;
        }
        if ($req ~* "union[+|(%20)]") {
                return 503;
        }
        if ($req ~* "and[+|(%20)]") {
                return 503;
        }
        if ($req ~* "select[+|(%20)]") {
                return 503;
        }
  
16.防止爬虫抓取
if ($http_user_agent ~* 
"360Spider|JikeSpider|Spider|spider|bot|Bot|2345Explorer|webZIP|qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot|NSPlayer|bingbot") {
     return 403;
   }
17.防止目录遍历

禁止访问隐藏文件和目录

# 禁止访问所有以点开头的隐藏文件和目录
location ~ /\. { 
   # 拒绝所有请求 
   deny all; 
       # 禁止记录访问日志 
   access_log off; 
       # 禁止记录404错误日志 
   log_not_found off;
}
# 禁止访问特定目录
location ~* ^/(uploads|images)/.*\.(php|php5|sh|pl|py|asp|aspx|jsp)$ { 
   deny all;
}
# 防止目录列表
location / { 
   autoindex off;
}
18.安全头部增强

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

add_header X-Frame-Options "SAMEORIGIN";

add_header X-Content-Type-Options "nosniff";

add_header X-XSS-Protection "1; mode=block";

add_header Referrer-Policy "no-referrer-when-downgrade";

 

19.用户权限最小化原则
Nginx进程应以非特权用户(如nginx或www-data)运行,避免使用root权限。配置示例:
# /etc/nginx/nginx.confuser nginx;
# 指定运行用户
worker_processes auto;
20.DDoS防护、连接数限制、请求速率限制和带宽限制
#定义一个用于限制连接数的共享内存区域

limit_conn_zone $binary_remote_addr zone=one1:50m;

#定义一个用于限制请求速率的共享内存区域,基于漏桶算法

 limit_req_zone $binary_remote_addr zone=one2:50m rate=500r/s;

#应用连接数限制规则

limit_conn one1 500;

#限制单个连接向客户端传输响应的速率,即带宽限速

limit_rate 300k;

#应用请求速率限制规则,并配置突发请求处理策略

 limit_req zone=one2 burst=15 nodelay;

 

四.nginx综合配置示例

将以上安全配置整合为完整示例,可根据需求调整配置:

user user;
worker_processes auto;
error_log logs/error.log;
worker_rlimit_nofile 204800;
events {
    worker_connections 102400;
    use epoll;
    multi_accept on;
}
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" "$request_time"'
                      '$status $body_bytes_sent "$http_referer" "$upstream_response_time"'
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  logs/access.log  main;
    underscores_in_headers on;
    server_tokens off;
    keepalive_timeout   240;
limit_conn_zone $binary_remote_addr zone=one1:50m;
limit_req_zone $binary_remote_addr zone=one2:50m rate=500r/s;
limit_conn one1 500;
limit_rate 300k;
limit_req zone=one2 burst=15 nodelay;
    gzip  on;
    gzip_comp_level  5;
    gzip_min_length  1024;
    gzip_types   text/plain application/x-javascript text/css application/xml text/javascript  image/jpeg image/gif image/png;
    client_max_body_size 100m;
    large_client_header_buffers 4 5m;
    client_body_buffer_size 128k;
    client_header_buffer_size  20m;
    include             mime.types;
    default_type        application/octet-stream;
}
server {
    listen 8083 ssl;
    server_name xm.ss.cn localhost;
charset  utf-8;

       ssl_certificate /usr/share/nginx/xm.ss.cn.pem;

       ssl_certificate_key /usr/share/nginx/xm.ss.cn.key;

       ssl_session_timeout  5m;

       ssl_ciphers   TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;

       ssl_protocols   TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

       ssl_session_cache    shared:SSL:1m;

       
    # 安全头部配置
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";
    add_header Referrer-Policy "strict-origin-when-cross-origin";
    add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';";
root /home/data/project/h5;
#H5
location ^~/ai/ {
alias /home/data/project/h5/ai/;
try_files $uri $uri/ /ai/index.html;
 index  index.html index.htm;
}

#接口

    
    
        location ^~/ {
            proxy_pass  http://ip:port/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $proxy_protocol_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            #关键配置:关闭缓冲
            proxy_buffering off;
            #可选:禁用缓存
            proxy_cache off;
            #提高实时性(可选)
            proxy_request_buffering off;
            tcp_nodelay on;
            #设置超时(SSE 通常是长连接)
            proxy_connect_timeout 3600s;
            proxy_read_timeout 3600s;
            proxy_send_timeout 3600s;
        }
    
    # 过滤敏感参数
    if ($sql_injection) {
        return 403;
    }
    if ($xss_attack) {
        return 403;
    }
    # 拦截非法 User-Agent
    if ($blockedagent) {
        return 403;
    }
    # URL 关键字过滤
    if ($request_uri ~* (select|union|script|iframe|object|onload|onclick)) {
        return 403;
    }
    location / {
        return 404;
    }
#当访问的url中含有feign时返回404
        if ($request_uri ~* "feign") {
            return 404 "I've recorded your ip Wait to check the water meter";
       }
   # 防止爬虫抓取
   if ($http_user_agent ~* "360Spider|JikeSpider|Spider|spider|bot|Bot|2345Explorer|webZIP|qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot|NSPlayer|bingbot") {
     return 403;
   }
}