您当前的位置:首页 > 电脑百科 > 站长技术 > 服务器

都快2021了,还不来了解下nginx吗?

时间:2020-12-11 15:05:57  来源:  作者:
都快2021了,还不来了解下nginx吗?

 

--Nginx全局变量、rewrite实战、nginx的location配置

 

一、nginx全局变量

nginx 主配置文件中的log_format,常用全局变量:

https://github.com/aminglinux/nginx/blob/master/rewrite/variable.md

都快2021了,还不来了解下nginx吗?

 

变量

说明

$args

请求中的参数,如www.123.com/1.php?a=1&b=2的$args就是a=1&b=2

$body_bytes_sent

服务器发送给客户端的响应body字节数

$content_length

HTTP请求信息里的"Content-Length"

$conten_type

HTTP请求信息里的"Content-Type"

$document_root

nginx虚拟主机配置文件中的root参数对应的值

$document_uri

当前请求中不包含指令的URI,如www.123.com/1.php?a=1&b=2的$document_uri就是1.php,不包含后面的参数

$http_referer

记录此次请求是从哪个连接访问过来的,可以根据该参数进行防盗链设置

$host

主机头,也就是域名

$http_user_agent

客户端的详细信息,也就是浏览器的标识,用curl -A可以指定

$http_cookie

客户端的cookie信息

$http_x_forwarded_for

当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进行相关的x_forwarded_for设置

$limit_rate

如果nginx服务器使用limit_rate配置了显示网络速率,则会显示,如果没有设置, 则显示0

$remote_addr

客户端的公网ip

$remote_port

客户端的port

$remote_user

如果nginx有配置认证,该变量代表客户端认证的用户名

$request

请求的URI和HTTP协议,如“GET /article-10000.html HTTP/1.1”

$request_body_file

做反向代理时发给后端服务器的本地资源的名称

$request_method

请求资源的方式,GET/PUT/DELETE等

$request_filename

当前请求的资源文件的路径名称,相当于是$document_root/$document_uri的组合

$request_uri

请求的链接,包括$document_uri和$args

$scheme

请求的协议,如ftp,http,https

$server_protocol

客户端请求资源使用的协议的版本,如HTTP/1.0,HTTP/1.1,HTTP/2.0等

$server_addr

服务器IP地址

$server_name

服务器的主机名

$server_port

服务器的端口号

$status

http状态码,记录请求返回的状态码,例如:200、301、404等

$uri

和$document_uri相同

$http_referer

客户端请求时的referer,通俗讲就是该请求是通过哪个链接跳过来的,用curl -e可以指定

$time_local

记录访问时间与时区,如18/Jul/2014:17:00:01 +0800

二、rewrite实战

域名跳转(域名重定向)

示例1(不带条件的):

server{
    listen 80;
    server_name www.a.com;
    root /data/wwwroot/www.a.com;
    index index.html;
    rewrite /(.*) http://www.b.com/$1 permanent;
}

访问a.com跳转到b.com

都快2021了,还不来了解下nginx吗?

 

示例2(带条件的):

server{
    listen 80;
    server_name www.a.com a.com;
    root /data/wwwroot/www.a.com;
    index index.html;
    if ($host != 'www.a.com')
    {
        rewrite /(.*) http://www.a.com/$1 permanent;
    }
}

通过判断条件,如果$host不等于www.a.com的,跳转到www.a.com

都快2021了,还不来了解下nginx吗?

 

示例3(http跳转到https):

server{
    listen 80;
    server_name www.a.com;
    root /data/wwwroot/www.a.com;
    index index.html;
    rewrite /(.*) https://www.a.com/$1 permanent;
}
都快2021了,还不来了解下nginx吗?

 

示例4(域名访问二级目录)

server{
    listen 80;
    server_name blog.a.com;
    index index.html;
    rewrite /(.*) http://www.a.com/blog/$1 permanent;
}
都快2021了,还不来了解下nginx吗?

 

示例5(静态请求分离)

server{
    listen 80;
    server_name www.a.com;
    location ~* ^.+.(jpg|jpeg|gif|css|png|js)$
    {
        rewrite /(.*) http://img.a.com/$1 permanent;
    }
    
}

或者:
server{
    listen 80;
    server_name www.a.com;
    index index.html;
    if ( $uri ~* 'jpg|jpeg|gif|css|png|js$')
    {
        rewrite /(.*) http://img.a.com/$1 permanent;
    }
}
都快2021了,还不来了解下nginx吗?

 

防盗链

示例6

server{
    listen 80;
    server_name www.a.com;
    location ~* ^.+.(jpg|jpeg|gif|css|png|js|rar|zip|flv)$
    {
        valid_referers none blocked server_names *.a.com a.com *.tobe.com tobe.com;
        if ($invalid_referer)
        {
            rewrite /(.*) http://img.a.com/images/forbidden.png;
        }
    }

    .......
    
}

说明:这里是通配,跟正则里面的不是一个意思,valid_referers定义白名单,none指的是referer不存在、为空的情况(curl -e 测试),
blocked指的是referer头部的值被防火墙或者代理服务器删除或者伪装的情况,
该情况下,referer头部的值不以http://或者https://开头(curl -e 后面跟的referer不以http://或者https://开头)。
或者:

location ~* ^.+.(jpg|jpeg|gif|css|png|js|rar|zip|flv)$
    {
        valid_referers none blocked server_names *.a.com *.tobe.com a.com tobe.com;
        if ($invalid_referer)
        {
            return 403;
        }
    }

伪静态

示例7(discuz伪静态):

location /  {
    rewrite ^([^.]*)/topic-(.+).html$ $1/portal.php?mod=topic&topic=$2 last;
    rewrite ^([^.]*)/forum-(w+)-([0-9]+).html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;
    rewrite ^([^.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+).html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;
    rewrite ^([^.]*)/group-([0-9]+)-([0-9]+).html$ $1/forum.php?mod=group&fid=$2&page=$3 last;
    rewrite ^([^.]*)/space-(username|uid)-(.+).html$ $1/home.php?mod=space&$2=$3 last;
    rewrite ^([^.]*)/(fid|tid)-([0-9]+).html$ $1/index.php?action=$2&value=$3 last;
}

rewrite多个条件的并且

示例8:

location /{
    set $rule 0;  #值为0
    if ($document_uri !~ '^/abc')  #!~不匹配以abc开头的
    {
        set $rule "${rule}1";  #01
    }
    if ($http_user_agent ~* 'ie6|firefox')
    {
       set $rule "${rule}2";  #012
    }
    if ($rule = "012")
    {
        rewrite /(.*) /abc/$1 redirect;
    }
}

当满足两个条件不以abc开头,并且http_user_agent为ie6或firefox时,跳转到http://www.a.com/aaa/,不满足其中的一个条件时,返回了404

都快2021了,还不来了解下nginx吗?

 

三、nginx的location配置

安装第三方模块echo-nginx-module

cd /usr/local/src/
git clone https://github.com/openresty/echo-nginx-module.git

nginx编译安装后的操作:

cd /usr/local/src/nginx-1.16.1

重新编译

./configure --prefix=/usr/local/nginx --add-module=/usr/local/src/echo-nginx-module

make && make install

/usr/local/nginx/sbin/nginx -V

测试中使用,可以在虚拟主机配置文件中直接使用,如:echo 123;

都快2021了,还不来了解下nginx吗?

 

location语法:

nginx location语法规则:location [=|~|~*|^~] /uri/ { … }
nginx的location匹配的变量是$uri

符号说明=表示精确匹配^~表示uri以指定字符或字符串开头~表示区分大小写的正则匹配~*表示不区分大小写的正则匹配/通用匹配,任何请求都会匹配到

规则优先级:

=  高于  ^~  高于  ~* 等于 ~  高于  /

规则示例:

location = "/12.jpg" { ... }
如:
www.a.com/12.jpg 匹配
www.a.com/abc/12.jpg 不匹配

location ^~ "/abc/" { ... }
如:
www.a.com/abc/123.html 匹配
www.a.com/a/abc/123.jpg 不匹配

location ~ "png" { ... }
如:
www.a.com/aaa/bbb/ccc/123.png 匹配
www.a.com/aaa/png/123.html 匹配

location ~* "png" { ... }
如:
www.a.com/aaa/bbb/ccc/123.PNG 匹配
www.a.com/aaa/png/123.html 匹配

location /admin/ { ... }
如:
www.a.com/admin/aaa/1.php 匹配
www.a.com/123/admin/1.php 不匹配

小常识:

有些资料上介绍location支持不匹配 !~,
如: location !~ 'png'{ ... }
这是错误的,location不支持 !~

如果有这样的需求,可以通过if来实现,
如: if ($uri !~ 'png') { ... }

注意:location优先级小于if


Tags:nginx   点击:()  评论:()
声明:本站部分内容来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除,谢谢。
▌相关评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
▌相关推荐
--nginx全局变量、rewrite实战、nginx的location配置 一、nginx全局变量nginx 主配置文件中的log_format,常用全局变量:https://github.com/aminglinux/nginx/blob/master/r...【详细内容】
2020-12-11   nginx  点击:(0)  评论:(0)  加入收藏
作为一名程序员,特别是后端程序员,给你的项目配置Https是比较常见的事,特别是很多时候必须要使用https,比如微信小程序生产环境的接口地址就必须要https域名。那么如何给域名配...【详细内容】
2020-11-23   nginx  点击:(11)  评论:(0)  加入收藏
由于nginx功能强大,性能突出,越来越多的web应用采用nginx作为http和反向代理的web服务器。而nginx的访问日志不管是做用户行为分析还是安全分析都是非常重要的数据源之一。如...【详细内容】
2020-11-17   nginx  点击:(8)  评论:(0)  加入收藏
Nginx能做什么——反向代理——负载均衡——HTTP服务器(动静分离)——正向代理以上就是我了解到的Nginx在不依赖第三方模块能处理的...【详细内容】
2020-11-10   nginx  点击:(6)  评论:(0)  加入收藏
在最开始呢,咱们先说一下什么叫负载均衡,负载均衡呢,就是将一批请求,根据请求的内容,分发到不同的后端去进行相应的处理,从而提供负载分担,主备切换等功能。 对于不同的负载均衡软...【详细内容】
2020-10-30   nginx  点击:(5)  评论:(0)  加入收藏
  如果我们想通过 HTTP 访问 FastDFS 中保存的图片信息,需要借助其他工具实现,Nginx 就是一个不错的选择,它是一个高性能的 HTTP 和反向代理 Web 服务器。关于 Nginx 更多的...【详细内容】
2020-10-28   nginx  点击:(5)  评论:(0)  加入收藏
有时候我们需要将服务器上的某些目录共享出来,让其他人可以直接通过浏览器去访问、浏览或者下载这些目录里的一些文件。最近我就正好需要将一些静态的 HTML 页面部署到服务器...【详细内容】
2020-10-23   nginx  点击:(13)  评论:(0)  加入收藏
每次从github上拉东西,速度都奇慢无比,本地的时候可以设置代理,但是一些特殊场合并不是特别方便,所以就写了下面的反向代理。建议直接看这个 https://ghostcir.com/s/169.html,通...【详细内容】
2020-10-19   nginx  点击:(6)  评论:(0)  加入收藏
一般使用nginx的web网站,访问网站时,可以从请求头中看到使用了nginx以及nginx的版本号。暴露这些信息将给网站带来一定的风险,因此安装nginx时最好把这些信息隐藏。 隐藏nginx...【详细内容】
2020-10-16   nginx  点击:(2)  评论:(0)  加入收藏
最近在看一些 TLS 协议 1.3 版本的相关知识,所以想分享一些信息,本文是第一篇,没有太多的理论细节,主要说下如何在 Nginx 上快速部署一个支持 TLS 1.3 协议版本的网站。几个基本...【详细内容】
2020-10-12   nginx  点击:(6)  评论:(0)  加入收藏
有HTTP了,为什么需要HTTPS主要原因是HTTP数据传输时没有对数据进行加密,所以导致数据不安全。而HTTPS在HTTP上加了一层,对数据进行加密,这样就保证了数据的安全性。防止传输的数...【详细内容】
2020-09-27   nginx  点击:(7)  评论:(0)  加入收藏
前言: 先来说说为啥要写这篇文章,之前小编看了下nginx 的访问日志,发现每天有好多国外的IP地址来访问我的网站,并且访问的内容基本上都是恶意的。因此 我决定 禁止国外IP 来访...【详细内容】
2020-09-25   nginx  点击:(22)  评论:(0)  加入收藏
背景基于Springboot应用以war包的形式运行在tomcat容器中,当更新war包时会有一段时间服务返回404,这对于线上服务是不可接受的。4层的负载均衡可以自动将80端口关闭的节点下线...【详细内容】
2020-09-25   nginx  点击:(5)  评论:(0)  加入收藏
一直以为自己很懂nginx,不就是配置一些负载一些路由嘛,直到这次需要自己进行调试部署时才发现依然存在好多概念不清的情况,比如location匹配的几种优先级,rewrite 阶段、access...【详细内容】
2020-09-24   nginx  点击:(10)  评论:(0)  加入收藏
严格说Nginx并没有自带针对负载均衡后端节点的健康检查功能,但是可以通过默认自带的ngx_http_proxy_module 模块和ngx_http_upstream_module模块中的相关指令来完成当后端节...【详细内容】
2020-09-22   nginx  点击:(9)  评论:(0)  加入收藏
Nginx 限速使用的是漏桶算法,此算法图示如下,一个桶有一定的容量,水从桶的上方流入,如果桶中有水,水就会从下方按照一定的速率流出。当然如果桶的容量已满,流入的部分水就会溢出。...【详细内容】
2020-09-21   nginx  点击:(4)  评论:(0)  加入收藏
Nginx(engine x)是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现...【详细内容】
2020-09-21   nginx  点击:(6)  评论:(0)  加入收藏
不知道各位有没有被各类XSS攻击、点击劫持 (ClickJacking、 frame 恶意引用等等方式骚扰过,百度联盟被封就有这些攻击的功劳在里面。为此一直都在搜寻相关防御办法,...【详细内容】
2020-09-21   nginx  点击:(8)  评论:(0)  加入收藏
对于开发人员来说,要学习很多的容器、缓存、消息中间件、数据库等。比如:tomcat,jboss,websphere,redis,mongoDB,mq,mysql等。但是在自己项目中不一定都会用到,为了学习,经常会在自己...【详细内容】
2020-09-10   nginx  点击:(14)  评论:(0)  加入收藏
本文作者:何建辉(公众号:org_yijiaoqian)负载均衡的概念1.1 什么是负载均衡Load Balancing,即负载均衡,是一种计算机技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器...【详细内容】
2020-09-10   nginx  点击:(3)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条