循序渐进nginx(一):介绍、安装、hello world、Location匹配


前言:

  • 我为什么写这个呢?我就是感觉其他的文章或者视频都没有从最开始的location开始讲。
  • 有的直接从负载均衡讲起,而将location的url匹配规则之类的放到后面再讲。我就觉得缺少了前置知识。
  • 所以我就写下了这篇文章,尽量以一个零nginx基础的角度来讲述nginx。尽量循序渐进的讲述。如果你看的时候感觉还是不够循序渐进或许感觉有什么疏漏,希望能留下你的意见。

循序渐进Nginx将分成三节来讲
1.介绍、安装、hello world、Location匹配(已完成)✅
2.反向代理、负载均衡、缓存服务、静态资源访问(已完成)✅
3.日志管理、http限流、https配置,http_rewrite模块,第三方模块安装,结语。(已完成)✅


Nginx是什么

  • nginx读作(engine x),engine是引擎的意思,这寓意着他强大的动力。
  • nignx是一个高性能的http服务器代理服务器负载均衡服务器
  • nginx是开源的,由C语言编写,创始人为俄国人伊戈尔·赛索耶夫。
  • 如果要说最受欢迎的web服务器,莫过于nginx了吧,小厂大厂都在用 ,阿里自己都对nginx进行了自定义开发(Tengine)。除了一些非常小访问量的业务(能用tomcat就可以解决的那种)之外,应该大部分都使用上了nginx。
  • nginx基于事件驱动模型,nginx的并发能力都要高于其他的服务器(Apache:要素察觉❓)。
  • nginx基于开源和模块化设计,可以通过第三方模块来丰富自己的功能。

💡netcraft的数据统计显示nginx是目前最受欢迎的web服务器:
20200618094959


使用场景:

如果你不懂理解下面的场景,那你就把你学习的意图定为“学习最受欢迎的服务器”也行,一般来说你都会有机会去使用nginx。当然也有可能分工过于明确导致你没机会去碰部署相关的东西。

  • 代理服务:nginx支持反向代理,可以把发送给自己的请求代理给业务服务端来处理,类似于API网关的作用,可以把一个外网的请求代理给本地内网的服务端来处理,这样就某种程度上保护了内网的服务器。
  • 负载均衡:nginx可以实现负载均衡,比如tomcat的单个服务端并发能力不大,当我们水平扩充成多个tomcat的时候,使用nginx的负载均衡功能把请求分发给多个tomcat,可以达到多个tomcat服务端达到负载均衡的效果。
  • 缓存:nginx有客户端缓存的处理以及代理缓存的处理。客户端缓存:在传递一些静态资源的时候,如果浏览器能缓存下来,就避免了短时间内重复向nginx请求这个静态资源。(代理缓存:)在代理请求的时候,可能有些响应数据是短期内不会变更或者长期不会变更的,为了提高响应速度,我们可能会需要对这些数据进行缓存,比如你需要菜单栏数据,在很长期可能菜单栏数据都不会变,而如果你每次都代理请求到业务服务端来响应的话,查数据库就需要消耗不少资源,而使用nginx缓存之后,nginx就会直接返回,不需要查业务服务端了。
  • 其他。。。。。
    💡如果你学过一些微服务方面的知识的话,你会发现这三个场景其实也能在微服务方面见到,这就是nginx设计思想的优越性。

官方文档说明

💡有时候文档才是最有用的教程,我的教程并不会讲的很详尽,那么当你遇到问题的时候,参考文档也是不错的选择。比如说我讲了某个指令可以用在A上下文,但没说能不能用在B上下文的时候,你可以参考一下官方文档对于这个指令的上下文说明。
💡nginx中文文档没翻译什么,但在入门阶段,你可能更想看到一点中文的东西。指令虽然老旧,但部分还是有参考价值的
💡英文原始文档注意中文文档一般会比较旧,有些指令可能会没有,但入门初期还能用。
💡文档里面会分很多模块,每一块点进去可以看到类似如下的说明:
20200615170742
💡你点进去文档的话会看到很多模块,模块的话,你可以认为模块用于划分功能,比如HTTP Core模块提供了核心的Http功能,负载均衡依赖于模块HTTP Upstream,访问控制依赖于HttpAccess模块,Https依赖于HttpSSL模块。nginx默认会自动安装上不少模块,可以通过nginx -V来查看自己的nginx安装了什么模块,内置模块不会显示出来。
💡当你从我这里学到了一个指令,但有疑问的时候,可以考虑搜索一下官方文档。看官方文档是你应该学会的能力。




安装

windows下:

1.从下载地址下载到nginx/Windows-x.x.x,这个是面向win环境的。
2.下载到的是一个压缩包,解压出来,可以看到如下的目录结构,其中nginx.exe就是用来启动nginx的程序
20200521094657
3.你可以直接运行nginx.exe,然后访问http://localhost/,如果能看到下面的页面,那么代表安装和启动成功了。
20200521094350

linux(CentOS7)下:

.在linux下既可以通过源代码包来安装(这里不讲,有兴趣自行百度),也可以通过其他方式来安装,例如redhat/centos就支持yum安装,下面主要讲使用yum来安装nginx(💡yum方式安装的话,自定义可能没那么强,但胜在方便,适合初学者,你可以后面再学使用其他方式安装。yum模式安装默认会按照额外的一些第三方模块,但并没有提供很多的第三方模块安装方法,安装第三方模块的时候还行建议使用编译安装的方式。但由于我们这里没有怎么使用第三方模块,所以暂时以yum方式为例)。RHEL-CentOS nginx官方安装文档,我们这里只讲centos7下的安装,没有讲ubuntu下的安装,需要的可以自行看一下官方文档或者百度一下。


💡centos7下使用yum来安装
1.执行sudo yum install yum-utils


2.vim /etc/yum.repos.d/nginx.repo,填入以下内容,设置nginx的yum源:

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

3.执行一下yum repolist,更新一下yum源:
20200521102950


4.使用yum安装nginx,yum install nginx
5.启动nginx,systemctl start nginx
6.访问http://linux系统IP/,如果看到下面的图就是安装启动成功。
💡防火墙默认防护了80端口,可能你需要执行systemctl stop firewalld来临时关闭防火墙,这样才可以访问。
20200521094350


docker下:

1.docker pull nginx:1.18.0 【你也可以自行去dockerhub看看你想安装什么版本】
2.docker images,查看是否拉取镜像成功:
20200521101044
3.docker run --name nginx-8080 -p 8080:80 -d nginx:1.18.0 【运行nginx,如果你使用docker运行nginx,那么我默认当你有docker基础了,这些命令就不介绍了。】
4.docker ps查看nginx是否已经运行了:
20200521101632
5.访问http://docker宿主机IP:8080/,如果运行成功的话,会看到下图:
20200521094350




目录结构


🔵安装成功之后,我们简单介绍一下nginx的目录结构。
查看一下nginx安装相关目录:

[root@localhost ~]# whereis nginx
nginx: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/share/nginx /usr/share/man/man8/nginx.8.gz

🔵/etc/nginx/就是nginx安装的目录:
20200521104035

名字 类型 说明
conf.d 目录 nginx主配置文件存储位置
mime.types 文件 设置Content-Type与扩展名的关系,例如可以设置响应为html文件时,响应的Content-Type为text/html
fastcgi_params
scgi_params
uwsgi_params
文件 与fastcgi,scgi,uwsgi相关的配置文件
modules 目录 nginx模块目录,nginx的模块存储在这里,比如安装第三方模块的时候就存储在这里
nginx.conf 文件 nginx主配置文件
koi-utf
koi-win
win-utf
文件 编码转换映射文件,用于在输出内容到客户端时,将一种编码转换到另一种编码。
因为作者是俄国人,所以有koi这个编码转换。

🔵/usr/sbin/nginx是nginx启动程序

🔵/usr/lib64/nginx里面放了模块相关文件。

🔵/usr/share/nginx放了一些nginx的默认资源,比如index.html

🔵/usr/share/man/man8/nginx.8.gz存放了man语法帮助文件。

除了这些上面的文件/目录,其实还有一些其他的文件/目录,我们在后面教程中用到再讲,比如/var/log/nginx就是nginx默认的日志存储目录。




------------------- 分割线:下面介绍简单使用,由于nginx非常少用于window,所以下面的例子基于linux -----------


Hello World


下面我会简单介绍一下默认的配置文件,并做一个非常简单的修改,这将作为后面的介绍nginx的基础知识。


1.展示一下默认的核心配置:

下面的配置文件我都有打注释,如果你能看懂注释(😓应该都能稍微看懂吧),那就记一下,如果看不懂,那就记一下变量的名字吧,这样我后面介绍的时候你还记得这个变量写在哪里。
💡/etc/nginx/nginx.conf:

20200618103230


💡/etc/nginx/conf.d/default.conf:
20200612164314


nginx.conf中使用了include /etc/nginx/conf.d/*.conf;来将conf.d下的文件导入到http块中。
上面导入的server的效果等同于直接在http块中写server块:



2.介绍一下效果:

  • 我们首先启动nginx,执行命令systemctl start nginx
  • 然后访问机器的80端口,这个80端口由default.conf配置文件的listen指定。假设我的机器是192.168.48.128,那么此时访问一下http://192.168.48.128,你会看到一个welcome页面。
  • 其实http://192.168.48.128这个请求刚好匹配到了location /,而返回的资源页面其实刚好就是root+index得到的路径的内容,也就是/usr/share/nginx/html下的index.html
  • 我们把index.html里面的的Welcome to nginx!修改成Welcome to my nginx,然后刷新一下,会看到页面的效果变了。

  • 所以返回的确实是/usr/share/nginx/html下的index.html
    20200610233846

💡这个例子大概的给location匹配和资源返回开了个头。



3.修改一下配置:

💡我们尝试修改一下location来使得能够访问我们自己创建的文件。也相当于验证上面的例子的一些内容。

💡我们在/usr/share/nginx/helloworld下创建一个hello.html

<html>
<body>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<h1>我的第一个标题</h1>

<p>我的第一个段落。</p>

</body>
</html>

💡然后在conf.d/default.conf增加一个location(直接与第一个location同级),location用于定义url匹配,做后端开发的可能更熟悉一个词——路由分发,比如下面的location = /hello.html就用于定义访问nginx主机IP/hello.html

    location = /hello.html {
        #root用于定义资源根目录,比如访问/hello.html得到的是/usr/share/nginx/html/helloworld/hello.html
        root   /usr/share/nginx/html/helloworld;
    }


4.展示修改后的效果:

访问一下nginx主机IP/hello.html就可以看到我们的内容,root用于定义根路径,所以最终返回的文件的路径是/usr/share/nginx/html/helloworld/hello.html
响应的是我们定义的内容就说明我们这个location配置成功了。


🤣这个例子可能没什么营养。但举这个例子是为了先让读者有参与感,能自己简单地尝试对nginx进行更改,给下面的location匹配和资源返回开个头。



基础nginx命令


下面的内容介绍还是需要一些基础的nginx命令的,比如修改了配置信息之后需要检查配置文件语法和重启nginx之类的,所以这里举例一下基础的nginx命令。

  • systemctl start nginx:启动nginx
  • systemctl restart nginx:重启nginx,修改配置文件需要重启nginx,改资源文件不需要,
  • nginx -s stop: 关闭nginx程序,不保存相关信息
  • nginx -s quit:正常退出nginx,并保存相关信息。【quit的时候,Nginx在退出前会完成已经接受的连接请求,而stop不会。】
  • nginx -s reload:重启nginx。
  • nginx -V:查看编译参数。可以用来查看安装的模块(不全的),模块相关的事情,我们后面再介绍,你暂时只需要知道nginx的很多功能都是基于模块的,比如http_ssl模块就负责nginx的https配置。
  • nginx -v可以看到nginx的版本。
  • nginx –t检查配置文件是否有语法错误。在每次重启之前,都建议使用这个来检查一下配置文件。不然关闭nginx之后不能快速重启就糟糕了。
  • nginx -h查看简单的帮助命令。
  • nginx -c 主配置文件路径:以某个主配置文件为基础来运行nginx。


location的url匹配


💡我们这里介绍一下location的url匹配语法,从上面的helloworld的例子中,其实你可以把location理解成一个请求映射。比如上面HelloWorld中我们使用下面的这个location把nginx主机IP/hello.html的访问结果定义成/usr/share/nginx/html/helloworld/hello.html的结果。

    location = /hello.html {
        root   /usr/share/nginx/html/helloworld;
    }

💡location通过url匹配把location内部定义的结果返回给请求者。比如说可以使用return(直接返回,类似请求响应直接返回一个字符串),proxy_pass(代理服务器)等手段来定义返回的结果。如果不定义这些,就会基于路径来尝试访问静态的资源,所以上面的location才会得到/usr/share/nginx/html/helloworld/hello.html的结果。
💡上面这个引出了不少东西,比如说return,比如说proxy_pass,但他们都与location有关,而且大多是location内部的内容,所以这里先简单介绍一下location的url匹配语法,后面讲location内部才会讲到return,proxy_pass这些知识点。
💡资源拼接问题:这里先提前说一下免得看不懂下面的测试例子,有人疑惑只有root的话是怎么找到应该返回的资源的。 如果使用非正则的location的话,会把location部分拼接到root指定的目录后,比如上面的/usr/share/nginx/html/helloworld+匹配结果/hello.html就得到了/usr/share/nginx/html/helloworld/hello.html;如果是正则的,也会把匹配到的location部分拼接到root指定的目录后。



loaction格式是location [=|~|~*|^~] pattern,分成三部分就是location, [=|~|~*|^~]pattern,location当然是固定的写法了,所以不需要介绍,我们只介绍 [=|~|~*|^~]pattern


## URL匹配语法 URL语法匹配分成两部分, `[=|~|~*|^~]` 和`pattern`。

🔵[=|~|~*|^~]部分的用法如下,注意,这部分是可选的,可以没有,没有的话,此时情况会不同,此时pattern不一定是正则

  • = pattern 代表精确匹配pattern,此时pattern不是正则。*
    比如location = /error就只能匹配nginx主机IP/error,不能匹配nginx主机IP/Error,nginx主机IP/error01

  • ^~代表匹配以某个字符串开头的url,此时pattern不是正则表达式
    比如location ^~ /test可以匹配/test,/test001,/testAAA,/test/aaa

  • ~ pattern代表pattern这个正则匹配区分大小写,pattern是一个正则,正则的内容我们下面讲。

  • ~* pattern代表pattern这个正则不区分大小写,pattern是一个正则,正则的内容我们下面讲。
    💡记清楚,哪些是正则,哪些不是。使用=^~的不是正则,使用~~*的是正则。





🔵pattern部分语法遵循Linux正则表达式语法:

  • location = url代表精确匹配url,url此时不被认为是一个正则表达式,比如location = /hello.html只精确匹配nginx主机IP/hello.htmllocation = /代表只匹配主机根目录,也就是ip/

  • location ^~ /pattern代表匹配以某个字符串开头的url,此时pattern不是正则表达式

  • location /代表通用匹配,因为所有的路径都有/作为开头。【这时候pattern也不算正则表达式】

  • location /pattern代表匹配/pattern开头的请求,此时pattern也不算正则,比如location /api/匹配/api/开头的请求。但优先级比location [~|~*] pattern低。

  • location [~|~*|^~] pattern此时[~|~*|^~]只是对正则表达式的大小写区分的辅助标识,所以我们下面针对Pattern来讲解的时候可以先忽视大小写区分。pattern是一个正则表达式,我们讲一下它正则表达式的写法。【nginx的正则表达式使用的是Linux的正则表达式规则】

字符 说明 额外说明
$ 用于限定结尾,比如location ~* .(gif|jpg|jpeg)$就是匹配任何以.gif、.jpg 或 .jpeg 结尾的请求
^ 用于限定开头,比如^error可以匹配error404,error500,不能匹配500error
| 满足其中之一即可,例如A|B代表可以匹配A,也可以匹配B。
[] 代表范围,比如[0-9]代表匹配0-9的数字,[a-z]代表匹配a-z的字符。可以同时有多个范围,例如[a-zA-Z0-9].如果范围里面使用^,那么代表匹配除了范围内的字符,比如[^0-9]代表匹配0-9以外的字符。还可以是[abc],这代表匹配字符a、b、c。🔴注意,a-9是不合法的范围。
. 代表匹配任意的一个字符
? 匹配前面的字符零次或一次
+ 匹配前面的字符一次或多次
* 匹配前面的字符零次或多次 贪婪模式与懒惰模式:
比如abcdabcd,如果是贪婪模式a.*d,匹配的结果是abcdabcd;
如果是懒惰模式a.*?d,那么是abcd,abcd
{n} 匹配前面的字符n次,必须是n次
{n,} 匹配前面的字符至少n次
{n,m} 匹配前面的字符,最少n次,最多m次。
() 用于划分字符范围
划分字符范围,比如hello | hi Amy,只会匹配出hellohi Amy,而不是hello Amy,划分范围之后(hello|hi) Amy就可以匹配到hello Amy了。
\ 用于转义,比如.代表匹配任意的一个字符,\.就把.变成了一个.,这样才可以来匹配.html这样使用.来做扩展名
\d 代表匹配任意一个十进制数字,相当于[0-9]
\D 代表匹配任务一个非十进制数字
\w 代表匹配任意一个非符号字符,相当于[a-zA-Z0-9]
\W 代表匹配任意一个符号字符
\s 代表匹配任意一个空白字符。
\S 代表匹配任意一个非空白字符

学了上面的正则的意思,那你应该能够看懂下面的几个正则了吧:

  • location ~ \.php$:匹配以php结尾的请求。
  • location ~* \.(gif|jpg|jpeg)$匹配任何以.gif、.jpg 或 .jpeg 结尾的请求。
  • location /api/匹配/api/开头的请求。
  • location /aaa/.*\.html$代表匹配/aaa/下后缀为.html的请求。

  • location [=|~|~*|^~] @name,用于内部跳转,用于声明一个pattern,
    20200612104942
    比如上面的文件访问http://nginx主机IP/hello2.html如果发生找不到,那么会显示file not found,因为这进行了一个内部跳转,当发生404异常error_page 404 @file_err的时候,会返回location @file_err的响应,也就是上面定义的return 200 'file not found',return你可以理解成直接返回定义的数据,200是响应码。

😓考虑到篇幅问题,不能给详细例子,大家可以基于上面的正则教程来自行测试。





匹配顺序

当一个url可以匹配多个规则的时候,核心优先级思想是匹配最精确的,实在没有精确匹配的,再匹配模糊的,还有个最大前缀匹配的说法,在非正则表达式匹配的情况下,发起/data/log/2时,匹配的会是location /data/log,而不是location /data


优先级是【注意url和pattern有区别,pattern代表正则表达式】:

(精确匹配)location = url > (带完整精确路径的)location url > (带部分前缀路径的)location ^~ prefix_url >(模糊匹配的)location [~|~*] pattern > location /pattern > 通用匹配location /
举个例子:比如有个请求http://192.168.31.128/hello/a
那么下面的匹配顺序是:
1.location = /hello/a
2.location /hello/a
3.location ^~ /hello
4.location ~ /hellolocation ~* /hello
5.location /hello
6.location /
💡测试上面这个例子的时候请两两测试。不要同时定义多个location。

server {
    listen       80;
    server_name  localhost;

    default_type text/html;

    #location = /hello/a {
    #  default_type text/html ;
    #  return 200 'location = /hello/a';
    #}

    #location ^~ /hello {
    #  default_type text/html ;
    #  return 200 'location ^~ /hello';
    #}
    #location ~* ^/hello {
    #  default_type text/html ;
    #  return 200 'location ~* ^/hello';
    #}

    # 这个并不能与其他共存,会认为重复了。但可以与location /,location ~* ^/hello共存
    location /hello {
      default_type text/html ;
      return 200 'location /hello';
    }

    location / {
      default_type text/html ;
      return 200 'location /';
    }

    #location /hello/a {
    #  default_type text/html ;
    #  return 200 'location /hello/a';
    #}
}


那么有多个正则表达式`location [~|~*] pattern`都能够匹配的时候,他们的优先级是怎么样的呢?谁先配置就生效。 下面的两个location都可以对应`192.168.48.131/long/long/a.html`,你可以自己尝试一下修改他们的顺序,看结果会不会变化。 ![20200614034101](https://progor.oss-cn-shenzhen.aliyuncs.com/img/20200614034101.png)

😓就算这里给你介绍了匹配顺序,但其实还是不推荐搞那些容易混乱的匹配
比如下面这种情况:按上面的规则访问http://192.168.31.128/hello/a响应结果应该是location /hello/a,但实际上并不是,而是location ~* ^/hello,而当你去掉location /hello/a的时候,你又会发现结果变成了location ^~ /hello😀location /patternlocation [~|~*] pattern单独比较时,location [~|~*] pattern的优先级比较高。

    location ^~ /hello {
      default_type text/html ;
      return 200 'location ^~ /hello';
    }
    location ~* ^/hello {
      default_type text/html ;
      return 200 'location ~* ^/hello';
    }

    location /hello/a {
      default_type text/html ;
      return 200 'location /hello/a';
    }


location内部的事

location内部可以有很多指令,我这里只介绍常见的。

root和index

上面的例子中,我们大多都只定义了root、index和return ,我们先来讲root和index。

💡root用于指定网站的根目录。
💡index指令用于设置网站的默认首页。除了用在location,index还可以使用在http、server块中。起到在当前块的全局配置默认首页。

上面的测试,你可能会感到一种疑惑。
❓比如我定义了如下的location:

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

但请求nginx主机IP/helloworld/hello.html的时候返回/usr/share/nginx/html/helloworld/hello.html,那么是怎么返回的呢?
首先nginx主机IP/helloworld/hello.html在匹配了/之后,匹配的剩余部分helloworld/hello.html会基于root来查找资源位置。
所以root + location得到了最终的资源路由/usr/share/nginx/html/helloworld/hello.html

而直接访问nginx主机IP/时返回/usr/share/nginx/html/index.html的内容这是因为index指令用于设置网站的默认首页,root+index就是网站的默认首页的资源文件/usr/share/nginx/html/index.html

💡root与alias
root和alias都可以用来定义网站的根目录,但alias不会追加location匹配到的部分,比如下面的这个图中location是可以匹配http://192.168.48.131/helloworld/a.png的,那么使用root和alias时有什么区别呢?

20200614180101
不基于正则的时候,使用http://192.168.48.131/test/a.png来测试:

  • 使用root时,访问的资源路径是/usr/share/nginx/html/test/a.png,会把匹配到的/test/a.png追加到root指定的路径之后。
  • 使用alias时,访问的资源路径是/usr/share/nginx/htmltest/a.png,你会看到它并没有携带上匹配的/,而是把test/a.png追加到了alias路径之后。

在location是正则表达式的时候,使用http://192.168.48.131/helloworld/helloworld/a.png来测试:

  • 使用root时,访问的资源路径是/usr/share/nginx/html/helloworld/helloworld/a.png,会把pattern部分直接追加到root指定的路径之后。
  • 使用alias时,访问的资源路径是/usr/share/nginx/html/helloworld,没错,就是alias的绝对路径,它不会把正则表达式部分追加到alias指定的路径之后。


return

上面的时候有个例子我使用了return,return是可以直接返回数据的。
💡通常使用return的时候还需要指定default_type,它用来定义当前返回的数据的类型,不然会默认当成下载流。会加在响应的Content-Type中。
语法格式如下:

  • return 响应码 [响应的数据]
  • return 资源文件路径
  • 当return只有响应码的时候,如果抛出的响应码在error_page中有,那么会返回error_page的响应,比如return 500;
    20200614221053

default_type

上面的return的例子中,我们大多都定义了一个default_type指令,这是什么呢?因为上面我们是直接返回数据,与之前的返回html之类的资源文件不同,所以我们需要指定返回的数据的类型,比如我们返回的是一个json数据的时候,就指定default_type application/json;
默认的default_type类型会是application/octet-stream,如果我们上面不设置default_type,这将导致我们的响应变成下载流。【这个默认值是在nginx.conf中配置的】

❓为什么返回html之类的资源文件时不需要手动指定?
其实我之前也提过了(Helloworld的nginx.conf的注释中),可以参考nginx.confinclude /etc/nginx/mime.types;,这里把mime.types中的类型映射导入了,比如text/html html htm shtml;代表什么意思呢?就是如果返回的文件格式是htmlhtmshtml,那么default_type就是text/html


proxy_pass

🔵proxy_pass用于设置被代理服务器的地址,可以是主机名称(https://www.baidu.com这样的)、IP地址(域名加端口号)的形式。
🔵proxy_pass用于反向代理,参考下面的“反向代理”的内容。


location

location里面还可以放location,可以继续向下划分。


访问限制deny与allow

deny和allow可以用来限制用户访问,比如说某个内容,你只希望让IP为192.168.48.131的能够访问。而不让其他IP访问,那么可以使用deny和allow来限制。(当然了,用if也可以达到类似的效果,但可能会写的没那么方便)
💡allow用于允许访问
💡deny用于禁止访问,默认会返回403 Forbidden。
💡allow和deny支持IP,CIDR(也就是这种192.168.10.0/24)和all关键字,all代表全部。
💡当内部有多个规则时,💡自上而下判断是否有权限,如果是deny all在前,后面的allow都没用。有人会问,如果我配置了一个deny,不配置allow,那么其他的非deny的地址可以访问吗?答案是可以的,默认是放行的。
💡allow和deny可以用在httpserverlocationlimit_except(limit_except是Http Core模块的内容)中
❗测试deny和allow的时候不要和return一起使用(但加个if之类进行判断应该没问题,总之不要在同一层),这两个有点冲突,可以说return优先级比较高。

location / {
    root   /usr/share/nginx/html;
    deny    192.168.1.1;
    allow   192.168.1.0/24;
    allow   10.1.1.0/16;
    deny    all;
}

💡deny和allow是http_access模块的内容。

列出目录autoindex

💡你在访问一些页面的时候,你会发现他把整个文件目录给你返回了。在nginx中可以使用autoindex来达到这种效果。
💡如果设置了Index并且index文件存在(默认配置有Index,这代表你选定的root目录不能有index.html),那么默认首页的不会autoindex。
💡使用指令autoindex on;来开启列出目录的功能。
💡另外还可以加上这两个指令,autoindex_exact_size off;代表显示出文件的大小,单位是byte,默认是on,显示精确大小,off代表显示粗略大小,单位是kB/mB/GB(依文件大小而定);autoindex_localtime on;用于显示文件的创建时间,默认off是显示GMT时间,换成on之后就显示文件所在的服务器的时间。

20200617144227


补充

大部分的内容都是location里面的内容,这里只简单讲讲,后面根据需求再讲了。



posted @ 2020-07-21 10:25  随风行云  阅读(769)  评论(2编辑  收藏