type
status
date
slug
summary
tags
category
icon
password
nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,其特点是占用内存少,并发能力强。nginx目前主要用于反向代理、负载均衡、web缓存等。

nginx反向代理

说到反向代理,就不得不提正向代理。正向代理其实就是通过代理服务器代替用户访问资源并传递内容给用户的过程。例如,一个用户S为了获取服务器A的内容,就通过服务器B向服务器A发送请求,然后服务器B将获得的内容转交给用户S
又比如,在境内的我们由于无法访问谷歌,因此,我们可以设置一个境外服务器用于正向代理,当我们需要访问谷歌时就向代理服务器发送请求,由代理服务器将我们的请求发送给谷歌,然后返回信息给我们。
而反向代理,可以理解为一个中转服务器。当用户向服务器发送请求时,其实是将请求发送给了反向代理代理服务器,然后反向代理服务器根据设置的转发策略,转发给实际web资源所在的服务器,之后,反向代理服务器将web服务器返回的信息转发给用户。
notion image

负载均衡

由于反向代理服务器根据设置的负载均衡策略(轮询、加权轮询、ip hash),将用户请求有规则的传递给各web服务器。

web缓存

nginx可以对不同的文件做不同的缓存处理,配置灵活,并且支持FastCGI_Cache,主要用于对FastCGI的动态程序进行缓存。

nginx文件结构

nginx文件结构主要分为以下三块。
  • 全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
  • events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
  • http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置,是nginx服务器配置中最频繁的部分。
注意1:http块又可以分为http全局块和server块。
  • http全局块:包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
  • server块:配置虚拟主机的相关参数,一个http中可以有多个server,每个server块相当于一个虚拟主机。
注意2: 关于server
  • 如果所有的配置全部在nginx.conf中配置,那么内容比较多,不便于管理,因此,一般都会将配置文件拆开,将server块移到其他文件。
  • http块最后一行指令include /etc/nginx/conf.d/*.conf;就是其实将server块移到conf.d文件夹下,conf.d文件夹下的所有.conf文件都将起作用。
  • server块不必都在一个.conf文件内,可以依据应用功能放在多个.conf文件内(例如web.confpicture.conf)。
  • server块分为server全局块和location块。
  • server全局块配置本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
  • location块配置请求的路由,以及各种页面的处理情况。
nginx文件结构如下:
nginx简要设置图如下:

配置文件结构详解

全局快

event块

http全局块

server 全局块

listen指令,三种写法,只能在这里配置。
例如:
server_name指令:
对于name来说,可以只有一个名称,也可以由多个名称并列,之间用空格隔开。每个名字就是一个域名,第一个名称作为此虚拟主机的主要名称。。比如:
name中可以使用通配符*,但通配符只能用在由三段字符串组成的名称的首段或尾段,或者由两段字符串组成的名称的尾段,如:

location块

location语法结构为:
  • url变量是待匹配的请求字符串,可以是不含正则表达的字符串,如/myserver.php等;也可以是包含有正则表达的字符串,如 .php$(表示以.php结尾的URL)等。下文中,不含正则表达的url称为标准url,使用正则表达式的url称为正则url
  • 方括号里的部分,是可选项,用来改变请求字符串与url的匹配方式。
  • 在不加可选项时,nginx服务器首先在server块的多个location块中搜索是否有不含正则表达的url和请求字符串匹配,如果有多个可以匹配,就记录匹配度最高的一个。然后,服务器再用location块中的含正则正则uri和请求字符串匹配,当第一个正则url匹配成功,结束搜索,并使用这个location块处理此请求;如果正则匹配全部失败,就使用刚才记录的匹配度最高的location块处理此请求。
  • =,用于不含正则表达的url前,要求请求字符串与url严格匹配。如果已经匹配成功,就停止继续向下搜索并立即处理此请求。
  • ^~
  • 用于标准url前,要求nginx服务器找到标识url和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则url和请求字符串做匹配。
  • ~:用于表示url包含正则表达式,并且区分大小写。
  • ~*:用于表示url包含正则表达式,并且不区分大小写。注意如果url包含正则表达式,就必须要使用或者~*标识。
我们知道,在浏览器传送URL时对一部分字符进行URL编码,比如空格被编码为“%20”,问号被编码为“%3f”等。“~”有一个特点是,它对url中的这些符号将会进行编码处理。比如,如果location块收到的URL为“/html/%20/data”,则当nginx服务器搜索到配置为“~ /html/ /data”的location时,可以匹配成功。
root指令:
用于设置请求寻找资源的跟目录,此指令可以在http块、server块或者location块中配置。由于使用nginx服务器多数情况下要配置多个location块对不同的请求分别做出处理,因此该指令通常在location块中进行设置。

nginx代理服务

设置404页面导向地址:
如果我们代理只允许接受getpost方法的一种:
设置支持的http协议版本:
如果nginx服务器给2web服务器做代理,负载均衡算法采用轮询,那么当一台机器web程序iis关闭,也就是说web不能访问,那么nginx服务器分发请求还是会给这台不能访问的web服务器,如果这里的响应连接时间过长,就会导致客户端的页面一直在等待响应,对用户来说体验就打打折扣。
可以这么配置:
如果有两台web服务器,当负载均衡中其中web2发生上述情况,nginx首先会去web1请求,但是nginx在配置不当的情况下会继续分发请求到web2,然后等待web2响应,直到我们的响应时间超时,才会把请求重新分发给web1,这里的响应时间如果过长,用户等待的时间就会越长。
如果使用upstream指令配置了一组服务器作为被代理服务器,服务器中的访问算法遵循配置的负载均衡规则,同时可以使用该指令配置在发生哪些异常情况时,将请求顺次交由下一组服务器处理。
  • error:建立连接或向被代理的服务器发送请求或读取响应信息时服务器发生错误。
  • timeout:建立连接,想被代理服务器发送请求或读取响应信息时服务器发生超时。
  • invalid_header:被代理服务器返回的响应头异常。
  • off:无法将请求分发给被代理的服务器。
  • http_400,....:被代理服务器返回的状态码为400500502,等。
如果想通过http获取客户的真实ip而不是获取代理服务器的ip地址,那么要做如下的设置。
关于代理配置的配置文件部分的参考:

nginx负载均衡

基本配置:
热备:如果有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。
轮询:nginx默认就是轮询其权重都默认为1,服务器处理请求的顺序:ABABABABAB....
加权轮询:跟据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。下面服务器的请求顺序为:ABBABBABBABBABB....
ip_hashnginx会让相同的客户端ip请求相同的服务器。
更多配置方法:
  • down,表示当前的server暂时不参与负载均衡。
  • backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
  • max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
  • fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。

整合并拓展(很杂,结合上面内容一起食用)

不同域名/ip指向不同项目

比如,访问192.168.1.31又虚拟主机1处理,访问192.168.1.32由虚拟主机2处理。

docker 多容器通过nginx连接

同一域名下不同路径指向不同的容器:
不同域名指向不同的容器:
  • *注意:**如果nginx是通过docker容器部署的,那么上述ip地址不能写127.0.0.1或者localhost,因为填这个实际访问的是nginx容器内部的端口,容器相当于自成一个虚拟机,没用。应填写宿主机公网ip及宿主机端口。(宿主机端口与应用容器端口已做好映射。)

SSL配置

SSL证书文件:
.crt:证书文件,crtpem文件的扩展名。
.key:证书的私钥文件(申请证书时如果没有选择自动创建CSR,则没有该文件)
.pem:证书文件,采用Base64-encodedPEM格式文本文件,可根据需要修改扩展名。

nginx 1.23.3配置文件默认设置

nginx下载后默认的设置,没改过的,备份用。
nginx.conf文件:
conf.d文件夹内的default.conf文件:
2025年1月25日随笔基于docker安装nginx
Loading...