Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强。
主要功能
nginx主要有三大功能:反向代理、负载均衡、动静分离。
反向代理
反向代理(reverse proxy):是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
与反向代理对应的是正向代理:
正向代理(forward proxy)
正向代理:是一个位于客户端和目标服务器之间的服务器(代理服务器),为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端。
负载均衡
负载均衡(Load Balance),意思是将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行。是解决高性能,单点故障(高可用),扩展性(水平伸缩)的终极解决方案。
动静分离
动静分离是将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。
配置
Nginx的主配置文件是nginx.conf,这个配置文件一共由三部分组成,分别为全局块、events块和http块。在http块中,又包含http全局块、多个server块。每个server块中,可以包含server全局块和多个location块。在同一配置块中嵌套的配置块,各个之间不存在次序关系。
配置文件支持大量可配置的指令,绝大多数指令不是特定属于某一个块的。同一个指令放在不同层级的块中,其作用域也不同,一般情况下,高一级块中的指令可以作用于自身所在的块和此块包含的所有低层级块。如果某个指令在两个不同层级的块中同时出现,则采用“就近原则”,即以较低层级块中的配置为准。比如,某指令同时出现在http全局块中和server块中,并且配置不同,则应该以server块中的配置为准。
整个配置文件的结构大致如下:
#全局块
#user nobody;
worker_processes 1;
#event块
events {
worker_connections 1024;
}
#http块
http {
#http全局块
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#server块
server {
#server全局块
listen 8000;
server_name localhost;
#location块
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#这边可以有多个server块
server {
...
}
}
全局块
全局块是默认配置文件从开始到events块之间的一部分内容,主要设置一些影响Nginx服务器整体运行的配置指令,因此,这些指令的作用域是Nginx服务器全局。
通常包括配置运行Nginx服务器的用户(组)、允许生成的worker process数、Nginx进程PID存放路径、日志的存放路径和类型以及配置文件引入等。
# 指定可以运行nginx服务的用户和用户组,只能在全局块配置
# user [user] [group]
# 将user指令注释掉,或者配置成nobody的话所有用户都可以运行
# user nobody nobody;
# user指令在Windows上不生效,如果你制定具体用户和用户组会报小面警告
# nginx: [warn] "user" is not supported, ignored in D:\software\nginx-1.18.0/conf/nginx.conf:2
# 指定工作线程数,可以制定具体的进程数,也可使用自动模式,这个指令只能在全局块配置
# worker_processes number | auto;
# 列子:指定4个工作线程,这种情况下会生成一个master进程和4个worker进程
# worker_processes 4;
# 指定pid文件存放的路径,这个指令只能在全局块配置
# pid logs/nginx.pid;
# 指定错误日志的路径和日志级别,此指令可以在全局块、http块、server块以及location块中配置。(在不同的块配置有啥区别??)
# 其中debug级别的日志需要编译时使用--with-debug开启debug开关
# error_log [path] [debug | info | notice | warn | error | crit | alert | emerg]
# error_log logs/error.log notice;
# error_log logs/error.log info;
events块
events块涉及的指令主要影响Nginx服务器与用户的网络连接。常用到的设置包括是否开启对多worker process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型处理连接请求,每个worker process可以同时支持的最大连接数等。
这一部分的指令对Nginx服务器的性能影响较大,在实际配置中应该根据实际情况灵活调整。
# 当某一时刻只有一个网络连接到来时,多个睡眠进程会被同时叫醒,但只有一个进程可获得连接。如果每次唤醒的进程数目太多,会影响一部分系统性能。在Nginx服务器的多进程下,就有可能出现这样的问题。
# 开启的时候,将会对多个Nginx进程接收连接进行序列化,防止多个进程对连接的争抢
# 默认是开启状态,只能在events块中进行配置
# accept_mutex on | off;
# 如果multi_accept被禁止了,nginx一个工作进程只能同时接受一个新的连接。否则,一个工作进程可以同时接受所有的新连接。
# 如果nginx使用kqueue连接方法,那么这条指令会被忽略,因为这个方法会报告在等待被接受的新连接的数量。
# 默认是off状态,只能在event块配置
# multi_accept on | off;
# 指定使用哪种网络IO模型,method可选择的内容有:select、poll、kqueue、epoll、rtsig、/dev/poll以及eventport,一般操作系统不是支持上面所有模型的。
# 只能在events块中进行配置
# use method
# use epoll
# 设置允许每一个worker process同时开启的最大连接数,当每个工作进程接受的连接数超过这个值时将不再接收连接
# 当所有的工作进程都接收满时,连接进入logback,logback满后连接被拒绝
# 只能在events块中进行配置
# 注意:这个值不能超过超过系统支持打开的最大文件数,也不能超过单个进程支持打开的最大文件数,具体可以参考这篇文章:https://cloud.tencent.com/developer/article/1114773
# worker_connections 1024;
http块
http块是Nginx服务器配置中的重要部分,代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都可以放在这个模块中。
前面已经提到,http块中可以包含自己的全局块,也可以包含server块,server块中又可以进一步包含location块,在本书中我们使用“http全局块”来表示http中自己的全局块,即http块中不包含在server块中的部分。
可以在http全局块中配置的指令包括文件引入、MIME-Type定义、日志自定义、是否使用sendfile传输文件、连接超时时间、单连接请求数上限等。
# 常用的浏览器中,可以显示的内容有HTML、XML、GIF及Flash等种类繁多的文本、媒体等资源,浏览器为区分这些资源,需要使用MIME Type。换言之,MIME Type是网络资源的媒体类型。Nginx服务器作为Web服务器,必须能够识别前端请求的资源类型。
# include指令,用于包含其他的配置文件,可以放在配置文件的任何地方,但是要注意你包含进来的配置文件一定符合配置规范,比如说你include进来的配置是worker_processes指令的配置,而你将这个指令包含到了http块中,着肯定是不行的,上面已经介绍过worker_processes指令只能在全局块中。
# 下面的指令将mime.types包含进来,mime.types和ngin.cfg同级目录,不同级的话需要指定具体路径
# include mime.types;
# 配置默认类型,如果不加此指令,默认值为text/plain。
# 此指令还可以在http块、server块或者location块中进行配置。
# default_type application/octet-stream;
# access_log配置,此指令可以在http块、server块或者location块中进行设置
# 在全局块中,我们介绍过errer_log指令,其用于配置Nginx进程运行时的日志存放和级别,此处所指的日志与常规的不同,它是指记录Nginx服务器提供服务过程应答前端请求的日志
# access_log path [format [buffer=size]]
# 如果你要关闭access_log,你可以使用下面的命令
# access_log off;
# log_format指令,用于定义日志格式,此指令只能在http块中进行配置
# log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
# 定义了上面的日志格式后,可以以下面的形式使用日志
# access_log logs/access.log main;
# 开启关闭sendfile方式传输文件,可以在http块、server块或者location块中进行配置
# sendfile on | off;
# 设置sendfile最大数据量,此指令可以在http块、server块或location块中配置
# sendfile_max_chunk size;
# 其中,size值如果大于0,Nginx进程的每个worker process每次调用sendfile()传输的数据量最大不能超过这个值(这里是128k,所以每次不能超过128k);如果设置为0,则无限制。默认值为0。
# sendfile_max_chunk 128k;
# 配置连接超时时间,此指令可以在http块、server块或location块中配置。
# 与用户建立会话连接后,Nginx服务器可以保持这些连接打开一段时间
# timeout,服务器端对连接的保持时间。默认值为75s;header_timeout,可选项,在应答报文头部的Keep-Alive域设置超时时间:“Keep-Alive:timeout= header_timeout”。报文中的这个指令可以被Mozilla或者Konqueror识别。
# keepalive_timeout timeout [header_timeout]
# 下面配置的含义是,在服务器端保持连接的时间设置为120 s,发给用户端的应答报文头部中Keep-Alive域的超时时间设置为100 s。
# keepalive_timeout 120s 100s
# 配置单连接请求数上限,此指令可以在http块、server块或location块中配置。
# Nginx服务器端和用户端建立会话连接后,用户端通过此连接发送请求。指令keepalive_requests用于限制用户通过某一连接向Nginx服务器发送请求的次数。默认是100
# keepalive_requests number;
server块
server块和“虚拟主机”的概念有密切联系。
虚拟主机,又称虚拟服务器、主机空间或是网页空间,它是一种技术。该技术是为了节省互联网服务器硬件成本而出现的。这里的“主机”或“空间”是由实体的服务器延伸而来,硬件系统可以基于服务器群,或者单个服务器等。虚拟主机技术主要应用于HTTP、FTP及EMAIL等多项服务,将一台服务器的某项或者全部服务内容逻辑划分为多个服务单位,对外表现为多个服务器,从而充分利用服务器硬件资源。从用户角度来看,一台虚拟主机和一台独立的硬件主机是完全一样的。
在使用Nginx服务器提供Web服务时,利用虚拟主机的技术就可以避免为每一个要运行的网站提供单独的Nginx服务器,也无需为每个网站对应运行一组Nginx进程。虚拟主机技术使得Nginx服务器可以在同一台服务器上只运行一组Nginx进程,就可以运行多个网站。
在前面提到过,每一个http块都可以包含多个server块,而每个server块就相当于一台虚拟主机,它内部可有多台主机联合提供服务,一起对外提供在逻辑上关系密切的一组服务(或网站)。
和http块相同,server块也可以包含自己的全局块,同时可以包含多个location块。在server全局块中,最常见的两个配置项是本虚拟主机的监听配置和本虚拟主机的名称或IP配置。
listen指令
server块中最重要的指令就是listen指令,这个指令有三种配置语法。这个指令默认的配置值是:listen *:80 | *:8000;只能在server块种配置这个指令。
//第一种
listen address[:port] [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
//第二种
listen port [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
//第三种(可以不用重点关注)
listen unix:path [default_server] [ssl] [http2 | spdy] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
listen 127.0.0.1:8000; #只监听来自127.0.0.1这个IP,请求8000端口的请求
listen 127.0.0.1; #只监听来自127.0.0.1这个IP,请求80端口的请求(不指定端口,默认80)
listen 8000; #监听来自所有IP,请求8000端口的请求
listen *:8000; #和上面效果一样
listen localhost:8000; #和第一种效果一致
关于上面的一些重要参数做如下说明:
- address:监听的IP地址(请求来源的IP地址),如果是IPv6的地址,需要使用中括号“[]”括起来,比如[fe80::1]等。
- port:端口号,如果只定义了IP地址没有定义端口号,就使用80端口。这边需要做个说明:要是你压根没配置listen指令,那么那么如果nginx以超级用户权限运行,则使用*:80,否则使用*:8000。多个虚拟主机可以同时监听同一个端口,但是server_name需要设置成不一样;
- default_server:假如通过Host没匹配到对应的虚拟主机,则通过这台虚拟主机处理。具体的可以参考这篇文章,写的不错。
- backlog=number:设置监听函数listen()最多允许多少网络连接同时处于挂起状态,在FreeBSD中默认为-1,其他平台默认为511。
- accept_filter=filter,设置监听端口对请求的过滤,被过滤的内容不能被接收和处理。本指令只在FreeBSD和NetBSD 5.0+平台下有效。filter可以设置为dataready或httpready,感兴趣的读者可以参阅Nginx的官方文档。
- bind:标识符,使用独立的bind()处理此address:port;一般情况下,对于端口相同而IP地址不同的多个连接,Nginx服务器将只使用一个监听命令,并使用bind()处理端口相同的所有连接。
- ssl:标识符,设置会话连接使用SSL模式进行,此标识符和Nginx服务器提供的HTTPS服务有关。
listen指令的使用看起来比较复杂,但其实在一般的使用过程中,相对来说比较简单,并不会进行太复杂的配置。
server_name指令
用于配置虚拟主机的名称。语法是:
Syntax: server_name name ...;
Default:
server_name "";
Context: server
对于name 来说,可以只有一个名称,也可以由多个名称并列,之间用空格隔开。每个名字就是一个域名,由两段或者三段组成,之间由点号“.”隔开。比如
server_name myserver.com www.myserver.com
在该例中,此虚拟主机的名称设置为myserver.com或www. myserver.com。Nginx服务器规定,第一个名称作为此虚拟主机的主要名称。
在name 中可以使用通配符“*”,但通配符只能用在由三段字符串组成的名称的首段或尾段,或者由两段字符串组成的名称的尾段,如:
server_name myserver.* *.myserver.com
另外name还支持正则表达式的形式。这边就不详细展开了。
由于server_name指令支持使用通配符和正则表达式两种配置名称的方式,因此在包含有多个虚拟主机的配置文件中,可能会出现一个名称被多个虚拟主机的server_name匹配成功。那么,来自这个名称的请求到底要交给哪个虚拟主机处理呢?Nginx服务器做出如下规定:
a. 对于匹配方式不同的,按照以下的优先级选择虚拟主机,排在前面的优先处理请求。
① 准确匹配server_name
② 通配符在开始时匹配server_name成功
③ 通配符在结尾时匹配server_name成功
④ 正则表达式匹配server_name成功
b. 在以上四种匹配方式中,如果server_name被处于同一优先级的匹配方式多次匹配成功,则首次匹配成功的虚拟主机处理请求。
有时候我们希望使用基于IP地址的虚拟主机配置,比如访问192.168.1.31有虚拟主机1处理,访问192.168.1.32由虚拟主机2处理。
这时我们要先网卡绑定别名,比如说网卡之前绑定的IP是192.168.1.30,现
在将192.168.1.31和192.168.1.32这两个IP都绑定到这个网卡上,那么请求这个两个IP的请求才会到达这台机器。
绑定别名后进行以下配置即可:
http
{
{
listen: 80;
server_name: 192.168.1.31;
...
}
{
listen: 80;
server_name: 192.168.1.32;
...
}
}
location块
每个server块中可以包含多个location块。在整个Nginx配置文档中起着重要的作用,而且Nginx服务器在许多功能上的灵活性往往在location指令的配置中体现出来。
location块的主要作用是,基于Nginx服务器接收到的请求字符串(例如, server_name/uri-string),对除虚拟主机名称(也可以是IP别名,后文有详细阐述)之外的字符串(前例中“/uri-string”部分)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能都是在这部分实现。许多第三方模块的配置也是在location块中提供功能。
在Nginx的官方文档中定义的location的语法结构为:
location [ = | ~ | ~* | ^~ ] uri { ... }
其中,uri变量是待匹配的请求字符串,可以是不含正则表达的字符串,如/myserver.php等;也可以是包含有正则表达的字符串,如 .php$(表示以.php结尾的URL)等。为了下文叙述方便,我们约定,不含正则表达的uri称为“标准uri”,使用正则表达式的uri称为“正则uri”。
其中方括号里的部分,是可选项,用来改变请求字符串与 uri 的匹配方式。在介绍四种标识的含义之前,我们需要先了解不添加此选项时,Nginx服务器是如何在server块中搜索并使用location块的uri和请求字符串匹配的。
在不添加此选项时,Nginx服务器首先在server块的多个location块中搜索是否有标准uri和请求字符串匹配,如果有多个可以匹配,就记录匹配度最高的一个。然后,服务器再用location块中的正则uri和请求字符串匹配,当第一个正则uri匹配成功,结束搜索,并使用这个location块处理此请求;如果正则匹配全部失败,就使用刚才记录的匹配度最高的location块处理此请求。
了解了上面的内容,就可以解释可选项中各个标识的含义了:
-
“=”,用于标准uri前,要求请求字符串与uri严格匹配。如果已经匹配成功,就停止继续向下搜索并立即处理此请求。
-
“^~”,用于标准uri前,要求Nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。
-
“~”,用于表示uri包含正则表达式,并且区分大小写。
-
“~*”,用于表示uri包含正则表达式,并且不区分大小写。注意如果uri包含正则表达式,就必须要使用“~”或者“~*”标识。
我们知道,在浏览器传送URI时对一部分字符进行URL编码,比如空格被编码为“%20”,问号被编码为“%3f”等。“~”有一个特点是,它对uri中的这些符号将会进行编码处理。比如,如果location块收到的URI为“/html/%20/data”,则当Nginx服务器搜索到配置为“~ /html/ /data”的location时,可以匹配成功。
基础使用
目录结构
进入Nginx的主目录我们可以看到这些文件夹
client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp
其中这几个文件夹在刚安装后是没有的,主要用来存放运行过程中的临时文件:
client_body_temp fastcgi_temp proxy_temp scgi_temp
conf
用来存放配置文件相关
html
用来存放静态文件的默认目录 html、css等
sbin
nginx的主程序
基本运行原理
Nginx配置与应用场景
最小配置
-
worker_processes
worker_processes 1; 默认为1,表示开启一个业务进程 -
worker_connections
worker_connections 1024; 单个业务进程可接受连接数 -
include mime.types;
include mime.types; 引入http mime类型 -
default_type application/octet-stream;
default_type application/octet-stream; 如果mime类型没匹配上,默认使用二进制流的方式传输。 -
sendfile on;
sendfile on; 使用linux的 sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝。未开启sendfile
开启后 -
keepalive_timeout 65;
keepalive_timeout 65; -
server
虚拟主机配置
server {
listen 80;
监听端口号
server_name localhost;
主机名
location / {
匹配路径
root html;
文件根目录
index index.html index.htm;
默认页名称
}
error_page 500 502 503 504 /50x.html;
报错编码对应页面
location = /50x.html {
root html;
}
}
虚拟主机
原本一台服务器只能对应一个站点,通过虚拟主机技术可以虚拟化成多个站点同时对外提供服务。
servername匹配规则:需要注意的是servername匹配分先后顺序,写在前面的匹配上就不会继续往下匹配了。
完整匹配
们可以在同一servername中匹配多个域名
server_name vod.mmban.com www1.mmban.com;
通配符匹配
server_name *.mmban.com
通配符结束匹配
server_name vod.*;
正则匹配
server_name ~^[0-9]+\.mmban\.com$;
反向代理
proxy_pass http://baidu.com;
location / {
proxy_pass http://atguigu.com/;
}
基于反向代理的负载均衡
upstream httpd {
server 192.168.44.102:80;
server 192.168.43.103:80;
}
负载均衡策略
Nginx 是一个流行的反向代理服务器,可以用于实现负载均衡,将传入的请求分发给多个后端服务器,以提高系统的性能和可用性。Nginx 提供了几种负载均衡策略,用于决定将请求发送到哪个后端服务器。以下是一些常见的 Nginx 负载均衡策略:
-
轮询(Round Robin): 这是默认的负载均衡策略。Nginx 按照后端服务器的顺序逐个将请求发送给不同的服务器。当请求很均匀地分布在多个服务器之间时,这是一个简单有效的策略。
-
加权轮询(Weighted Round Robin): 在这种策略中,你可以为每个后端服务器分配不同的权重。权重越高的服务器将接收到更多的请求。这对于处理不同性能的服务器很有用,以便充分利用资源。
-
IP 哈希(IP Hash): 这种策略基于客户端的 IP 地址,将请求分发给后端服务器。相同 IP 地址的请求始终会被发送到同一个后端服务器,这对于确保会话一致性很有用。
-
最少连接(Least Connections): Nginx 会将请求发送到当前连接数最少的后端服务器。这有助于确保服务器负载相对平衡,以避免某些服务器过载。
-
通用哈希(Generic Hash): 这是一种更灵活的策略,允许你基于自定义的键(如请求的特定标头或参数)来进行负载均衡决策。这可以根据应用的需求来定制分发策略。
以下是一个简单的 Nginx 配置示例,展示了如何实现加权轮询负载均衡策略:
http {
upstream backend {
server backend1.example.com weight=3;
server backend2.example.com weight=2;
server backend3.example.com;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
}
在上面的示例中,backend1.example.com
的权重为3,backend2.example.com
的权重为2,而 backend3.example.com
没有指定权重,因此默认为1。这意味着 backend1.example.com
会接收更多的请求。
轮询
当你配置 Nginx 的负载均衡时,你需要编辑 Nginx 的配置文件,通常是位于 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/ 目录下的一个 .conf 文件。
默认情况下使用轮询方式,逐一转发,这种方式适用于无状态请求。
http {
upstream backend {
server backend1.example.com;
server backend2.example.com;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
}
weight(权重)
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream httpd {
server 127.0.0.1:8050 weight=10 down;
server 127.0.0.1:8060 weight=1;
server 127.0.0.1:8060 weight=1 backup;
}
down:表示当前的server暂时不参与负载
weight:默认为1.weight越大,负载的权重就越大。
backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。
http {
upstream backend {
server backend1.example.com weight=3;
server backend2.example.com weight=2;
server backend3.example.com;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
}
ip_hash
根据客户端的ip地址转发同一台服务器,可以保持回话。
http {
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
}
least_conn
最少连接访问
http {
upstream backend {
least_conn;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
}
url_hash
根据用户访问的url定向转发请求
http {
upstream backend {
hash $request_uri consistent;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
}
fair
根据后端服务器响应时间转发请求。
Nginx 默认情况下不支持名为 “fair” 的负载均衡策略。然而,有一个名为 “ngx_http_upstream_fair_module” 的第三方模块,可以为 Nginx 提供基于请求处理时间的动态负载均衡机制。该模块会尝试根据后端服务器的请求处理速度来分配请求,以实现更公平的负载分配。
以下是一个简单的示例,展示了如何使用 “ngx_http_upstream_fair_module” 模块来配置基于请求处理时间的 fair 负载均衡:
-
首先,你需要安装 “ngx_http_upstream_fair_module” 模块。你可以在编译 Nginx 时添加该模块,或者使用预编译的版本。
-
在 Nginx 的配置文件中添加以下配置:
http {
upstream backend {
fair;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
}
在上面的配置中,我们在 upstream
块中添加了 fair
关键字来启用 fair 负载均衡。然后列出了你的后端服务器地址。
请注意,这个 “ngx_http_upstream_fair_module” 模块可能不是 Nginx 的默认模块,需要进行额外的配置和编译步骤。模块的可用性可能会因 Nginx 版本和操作系统而异,因此在使用之前,请查阅模块的文档和适用于你的环境的配置指南。
如果你找不到适用于最新版本的模块或遇到问题,你还可以考虑使用其他负载均衡策略,如轮询、加权轮询、IP 哈希等。这些策略在大多数情况下都能很好地满足负载均衡的需求。
动静分离
配置反向代理
location / {
proxy_pass http://127.0.0.1:8080;
root html;
index index.html index.htm;
}
增加每一个location
location /css {
root /usr/local/nginx/static;
index index.html index.htm;
}
location /images {
root /usr/local/nginx/static;
index index.html index.htm;
}
location /js {
root /usr/local/nginx/static;
index index.html index.htm;
}
使用一个location
使用正则,location 前缀:
- / 通用匹配,任何请求都会匹配到。
- = 精准匹配,不是以指定模式开头
- ~ 正则匹配,区分大小写
- ~* 正则匹配,不区分大小写
- ^~ 非正则匹配,匹配以指定模式开头的location
location匹配顺序:
- 多个正则location直接按书写顺序匹配,成功后就不会继续往后面匹配
- 普通(非正则)location会一直往下,直到找到匹配度最高的(最大前缀匹配)
- 当普通location与正则location同时存在,如果正则匹配成功,则不会再执行普通匹配
- 所有类型location存在时,“=”匹配 > “^~”匹配 > 正则匹配 > 普通(最大前缀匹配)
alias与root
location /css {
alias /usr/local/nginx/static/css;
index index.html index.htm;
}
root用来设置根目录,而alias在接受请求的时候在路径上不会加上location。
1)alias指定的目录是准确的,即location匹配访问的path目录下的文件直接是在alias目录下查找的;
2)root指定的目录是location匹配访问的path目录的上一级目录,这个path目录一定要是真实存在root指定目录下的;
3)使用alias标签的目录块中不能使用rewrite的break(具体原因不明);另外,alias指定的目录后面必须要加上"/"符号!!
4)alias虚拟目录配置中,location匹配的path目录如果后面不带"/“,那么访问的url地址中这个path目录后面加不加”/“不影响访问,访问时它会自动加上”/“; 但是如果location匹配的path目录后面加上”/“,那么访问的url地址中这个path目录必须要加上”/“,访问时它不会自动加上”/“。如果不加上”/",访问就会失败!
5)root目录配置中,location匹配的path目录后面带不带"/",都不会影响访问。
UrlRewrite
在 Nginx 中,rewrite 是一种用于修改 URL 或请求的指令,它允许你对传入的请求的 URL 进行重写或重定向。这对于实现 URL 重写、重定向、规范化 URL、处理特定的请求等非常有用。以下是一些使用 Nginx 的 rewrite 指令的常见用途:
-
URL 重写: 当你需要将传入的请求的 URL 重写为另一种格式时,可以使用 rewrite。这在处理带有特定格式的 URL 或路径时很有用,以便更好地匹配后端处理程序。
-
URL 重定向: Rewrite 可以用于将传入的请求重定向到不同的 URL。这在你想要更改用户请求的目标位置时非常有用,比如将旧的 URL 重定向到新的 URL。
-
URL 规范化: 有时用户可能会输入各种不同的 URL 格式,而你希望将它们规范化为特定的格式。Rewrite 可以帮助你实现 URL 规范化,确保所有请求都按照你的要求进行处理。
-
处理特定请求: Rewrite 还可以根据请求的特定属性或条件,将请求发送到不同的处理程序。这对于根据用户代理、请求方法或其他请求属性来路由请求非常有用。
-
防止敏感信息泄露: 你可以使用 rewrite 来阻止特定文件或路径的直接访问,从而防止敏感信息泄露。
-
域名重写: Rewrite 可以用于处理域名重写,将用户访问的一个域名映射到另一个域名,或者强制使用特定的域名。
下面是一个简单的 Nginx 配置示例,展示了如何使用 rewrite 实现 URL 重写和重定向:
server {
listen 80;
server_name example.com;
location /old-url {
rewrite ^/old-url(.*)$ /new-url$1 permanent;
}
location /new-url {
# Handle the request for the new URL
}
location / {
# Default location block
}
}
在上面的示例中,当用户访问 http://example.com/old-url
时,请求会被重定向到 http://example.com/new-url
。
请注意,rewrite 指令可能会涉及正则表达式等复杂的语法,因此在配置时需要小心确保它们的正确性,以免导致不正确的行为。
rewrite语法格式及参数语法
rewrite是实现URL重写的关键指令,根据regex (正则表达式)部分内容,重定向到replacement,结尾是flag标记。
实例:
rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 break;
应用服务器防火墙配置
指定端口和ip访问
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.44.101"
port protocol="tcp" port="8080" accept"
移除规则
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source
address="192.168.44.101" port port="8080" protocol="tcp" accept"
查看已配置规则
firewall-cmd --list-all
网关配置
upstream httpds {
server 192.168.44.102 weight=8 down;
server 192.168.44.103:8080 weight=2;
server 192.168.44.104:8080 weight=1 backup;
}
location / {
rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 redirect;
proxy_pass http://httpds ;
}
防盗链配置
valid_referers none | blocked | server_names | strings ....;
- none, 检测 Referer 头域不存在的情况。
- blocked,检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以“http://” 或 “https://” 开头。
- server_names ,设置一个或多个 URL ,检测 Referer 头域的值是否是这些 URL 中的某一个。
在需要防盗链的location中配置:
valid_referers 192.168.44.101;
if ($invalid_referer) {
return 403;
}
防止盗链(Hotlinking)是一种保护你的网站资源不被其他网站直接链接和使用的措施。Nginx 提供了一些配置选项,可以帮助你有效地防止盗链行为。下面是一种基本的 Nginx 防盗链配置示例:
server {
listen 80;
server_name yourdomain.com;
location /images/ {
valid_referers none blocked yourdomain.com;
if ($invalid_referer) {
return 403;
}
}
}
在上面的示例中,假设你要保护位于 /images/
目录下的图片资源,以下是配置的解释:
-
valid_referers
: 这里指定了允许的合法引用者。none
表示不允许任何引用者,blocked
表示不允许从被阻止的引用者(即通过空 Referer 或 Referrer 为 “-” 的请求)进行访问,yourdomain.com
表示允许来自你的域名的请求。 -
$invalid_referer
: 这是一个内置变量,如果请求的 Referer 不在valid_referers
列表中,则此变量为 true。 -
if ($invalid_referer)
: 这是一个条件语句,用于检查请求的 Referer 是否在允许的列表中。 -
return 403;
: 如果 Referer 不在允许的列表中,返回 HTTP 403 Forbidden 错误。
请注意,使用 if
来处理 Nginx 配置中的条件逻辑可能会导致一些问题,特别是在高流量和复杂配置的情况下。这是因为 Nginx 在使用 if
时可能会出现一些不直观的行为。如果可能的话,最好考虑使用其他方法,如 Map 模块或 Lua 脚本来实现更复杂的条件逻辑。
另外,这只是一个简单的防盗链配置示例。实际上,有些盗链行为可能会使用伪造的 Referer 请求头,因此单纯的 Referer 验证可能并不足够。在特定情况下,可能需要更复杂的防盗链策略,例如使用 Token、Cookie、共享密钥等方式。
配置复杂的防盗链可能需要更高级的技术和方法。以下是一个示例,展示了如何使用 Nginx 的 Lua 模块来实现带有 Token 的防盗链机制。这种方式相对安全,可以更好地防止伪造请求。
-
首先,确保你的 Nginx 已启用 Lua 模块。你需要在编译 Nginx 时添加 Lua 模块,或者使用支持 Lua 的预编译版本。
-
在 Nginx 配置文件中,添加以下配置:
http {
lua_shared_dict token_dict 10m;
server {
listen 80;
server_name yourdomain.com;
location /images/ {
access_by_lua_block {
local token = ngx.md5(ngx.var.uri .. ngx.var.remote_addr .. "your_secret_key");
local token_dict = ngx.shared.token_dict;
local cached_token = token_dict:get(ngx.var.uri);
if cached_token == token then
return;
else
ngx.log(ngx.ERR, "Invalid token: " .. token)
ngx.exit(ngx.HTTP_FORBIDDEN)
end
}
}
}
}
在上面的示例中:
-
lua_shared_dict
: 这是一个共享内存区域,用于在多个 Nginx 工作进程之间共享数据。我们将使用它来缓存生成的 Token。 -
access_by_lua_block
: 这是 Lua 模块的一个指令块,允许你在每个请求之前执行 Lua 脚本。 -
ngx.md5
: 这是 Lua 模块提供的一个函数,用于计算 MD5 哈希值,我们将 URI、客户端 IP 和秘密密钥结合起来生成 Token。 -
ngx.shared.token_dict
: 这是我们之前定义的共享内存字典。 -
ngx.var.uri
和ngx.var.remote_addr
: 这些是内置变量,分别代表请求的 URI 和客户端 IP 地址。 -
ngx.exit(ngx.HTTP_FORBIDDEN)
: 这会返回 HTTP 403 Forbidden 错误,如果 Token 无效。
请注意,上述示例中的 “your_secret_key” 部分是你自己设置的秘密密钥,用于生成 Token。你需要确保密钥保密且不易被猜测。此外,虽然这种方法较安全,但仍然需要注意保护服务器免受其他攻击,如 DoS 攻击等。如果需要更高级的防盗链策略,可能需要深入研究和开发。
高可用配置(Keepalived)
安装依赖和keepalived
yum install openssl-devel
yum install keepalived
使用yum安装后配置文件在
/etc/keepalived/keepalived.conf
最小配置
第一台机器
! Configuration File for keepalived
global_defs {
router_id lb111
}
vrrp_instance atguigu {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.44.200
}
}
第二台机器
! Configuration File for keepalived
global_defs {
router_id lb110
}
vrrp_instance atguigu {
state BACKUP
interface ens33
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.44.200
}
}
启动服务:
systemctl start keepalived
限流
Nginx 可以通过配置来实现请求限流,以控制每个客户端或每个 IP 地址的请求频率,从而防止过多的请求对服务器造成压力。下面是一些常见的 Nginx 请求限流的配置示例:
- 基于限制请求数量:
以下示例将每个客户端每秒最多允许处理 10 个请求。超过限制的请求将返回 HTTP 503 状态码。
http {
limit_req_zone $binary_remote_addr zone=limit_zone:10m rate=10r/s;
server {
listen 80;
server_name yourdomain.com;
location / {
limit_req zone=limit_zone burst=5 nodelay;
proxy_pass http://backend;
}
}
}
在这个示例中:
-
limit_req_zone
: 这是一个指令,用于定义请求限制的区域(内存区域)。$binary_remote_addr
是用于唯一标识客户端 IP 地址的变量。 -
rate
: 这指定了每秒的请求数量限制。 -
burst
: 这是允许在超过限制之前允许的瞬时请求数。在这个示例中,允许在达到每秒 10 个请求的限制之前,最多有 5 个请求可以被处理。 -
nodelay
: 这将立即拒绝超过限制的请求,而不是等待。
- 基于连接速率限制:
以下示例将每个客户端的连接速率限制在每秒 10 个连接。超过限制的连接将被拒绝。
http {
limit_conn_zone $binary_remote_addr zone=conn_limit_zone:10m;
server {
listen 80;
server_name yourdomain.com;
location / {
limit_conn conn_limit_zone 10;
proxy_pass http://backend;
}
}
}
在这个示例中:
-
limit_conn_zone
: 这是一个指令,用于定义连接速率限制的区域。$binary_remote_addr
是用于唯一标识客户端 IP 地址的变量。 -
limit_conn
: 这是一个指令,用于限制每个客户端的并发连接数。
上述配置示例是基本的请求限流配置,请求限流是一种保护服务器免受过多请求的有效手段,但要确保的配置不会误伤正常的请求。
在 Nginx 的配置中,zone
指令用于定义共享内存区域,以供后续的模块配置使用。在这个上下文中,my_limit_zone
是你给这个共享内存区域起的名字,它是一个标识符。而 10m
是用来定义内存区域的大小,表示为 10 兆字节(MB)。
具体来说,my_limit_zone
用于存储请求限制或连接限制的状态信息,以及相关的计数、时间戳等。而 10m
则指定了这个内存区域的大小,告诉 Nginx 分配多少内存用于存储这些信息。
在 Nginx 中,你可以使用不同的标识符来定义不同的内存区域,以适应不同的需求和配置。内存区域的大小应该根据你的实际需求进行调整,以确保足够存储状态信息并避免浪费资源。
以下是一个示例,更清楚地说明了 limit_req_zone
和 limit_conn_zone
中 zone
指令的使用:
http {
limit_req_zone $binary_remote_addr zone=my_limit_zone:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=my_conn_limit_zone:10m;
server {
listen 80;
server_name example.com;
location / {
limit_req zone=my_limit_zone burst=5;
limit_conn my_conn_limit_zone 10;
proxy_pass http://backend;
}
}
}
在这个示例中,my_limit_zone
和 my_conn_limit_zone
都是共享内存区域的名称,10m
表示每个内存区域的大小为 10MB。
实例
######Nginx配置文件nginx.conf中文详解#####
#定义Nginx运行的用户和用户组
user www www;
#nginx进程数,建议设置为等于CPU总核心数。
worker_processes 8;
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /usr/local/nginx/logs/error.log info;
#进程pid文件
pid /usr/local/nginx/logs/nginx.pid;
#指定进程可以打开的最大描述符:数目
#工作模式与连接数上限
#这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。
#现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。
#这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。
worker_rlimit_nofile 65535;
events
{
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型
#是Linux 2.6以上版本内核中的高性能网络I/O模型,linux建议epoll,如果跑在FreeBSD上面,就用kqueue模型。
#补充说明:
#与apache相类,nginx针对不同的操作系统,有不同的事件模型
#A)标准事件模型
#Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll
#B)高效事件模型
#Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。
#Epoll:使用于Linux内核2.6版本及以后的系统。
#/dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。
#Eventport:使用于Solaris 10。 为了防止出现内核崩溃的问题, 有必要安装安全补丁。
use epoll;
#单个进程最大连接数(最大连接数=连接数*进程数)
#根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为。
worker_connections 65535;
#keepalive超时时间。
keepalive_timeout 60;
#客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。
#分页大小可以用命令getconf PAGESIZE 取得。
#[root@web001 ~]# getconf PAGESIZE
#4096
#但也有client_header_buffer_size超过4k的情况,但是client_header_buffer_size该值必须设置为“系统分页大小”的整倍数。
client_header_buffer_size 4k;
#这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。
open_file_cache max=65535 inactive=60s;
#这个是指多长时间检查一次缓存的有效信息。
#语法:open_file_cache_valid time 默认值:open_file_cache_valid 60 使用字段:http, server, location 这个指令指定了何时需要检查open_file_cache中缓存项目的有效信息.
open_file_cache_valid 80s;
#open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。
#语法:open_file_cache_min_uses number 默认值:open_file_cache_min_uses 1 使用字段:http, server, location 这个指令指定了在open_file_cache指令无效的参数中一定的时间范围内可以使用的最小文件数,如果使用更大的值,文件描述符在cache中总是打开状态.
open_file_cache_min_uses 1;
#语法:open_file_cache_errors on | off 默认值:open_file_cache_errors off 使用字段:http, server, location 这个指令指定是否在搜索一个文件时记录cache错误.
open_file_cache_errors on;
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http
{
#文件扩展名与文件类型映射表
include mime.types;
#默认文件类型
default_type application/octet-stream;
#默认编码
#charset utf-8;
#服务器名字的hash表大小
#保存服务器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的。参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。在减少了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能。如果hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为2。第一次是确定存储单元的地址,第二次是在存储单元中查找键 值。因此,如果Nginx给出需要增大hash max size 或 hash bucket size的提示,那么首要的是增大前一个参数的大小.
server_names_hash_bucket_size 128;
#客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。
client_header_buffer_size 32k;
#客户请求头缓冲大小。nginx默认会用client_header_buffer_size这个buffer来读取header值,如果header过大,它会使用large_client_header_buffers来读取。
large_client_header_buffers 4 64k;
#设定通过nginx上传文件的大小
client_max_body_size 8m;
#开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
#sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。
sendfile on;
#开启目录列表访问,合适下载服务器,默认关闭。
autoindex on;
#此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用
tcp_nopush on;
tcp_nodelay on;
#长连接超时时间,单位是秒
keepalive_timeout 120;
#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#gzip模块设置
gzip on; #开启gzip压缩输出
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区
gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 2; #压缩等级
gzip_types text/plain application/x-javascript text/css application/xml; #压缩类型,默认就已经包含textml,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
gzip_vary on;
#开启限制IP连接数的时候需要使用
#limit_zone crawler $binary_remote_addr 10m;
#负载均衡配置
upstream jh.w3cschool.cn {
#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
server 192.168.80.121:80 weight=3;
server 192.168.80.122:80 weight=2;
server 192.168.80.123:80 weight=3;
#nginx的upstream目前支持4种方式的分配
#1、轮询(默认)
#每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
#2、weight
#指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
#例如:
#upstream bakend {
# server 192.168.0.14 weight=10;
# server 192.168.0.15 weight=10;
#}
#2、ip_hash
#每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
#例如:
#upstream bakend {
# ip_hash;
# server 192.168.0.14:88;
# server 192.168.0.15:80;
#}
#3、fair(第三方)
#按后端服务器的响应时间来分配请求,响应时间短的优先分配。
#upstream backend {
# server server1;
# server server2;
# fair;
#}
#4、url_hash(第三方)
#按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
#例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法
#upstream backend {
# server squid1:3128;
# server squid2:3128;
# hash $request_uri;
# hash_method crc32;
#}
#tips:
#upstream bakend{#定义负载均衡设备的Ip及设备状态}{
# ip_hash;
# server 127.0.0.1:9090 down;
# server 127.0.0.1:8080 weight=2;
# server 127.0.0.1:6060;
# server 127.0.0.1:7070 backup;
#}
#在需要使用负载均衡的server中增加 proxy_pass http://bakend/;
#每个设备的状态设置为:
#1.down表示单前的server暂时不参与负载
#2.weight为weight越大,负载的权重就越大。
#3.max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误
#4.fail_timeout:max_fails次失败后,暂停的时间。
#5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
#nginx支持同时设置多组的负载均衡,用来给不用的server来使用。
#client_body_in_file_only设置为On 可以讲client post过来的数据记录到文件中用来做debug
#client_body_temp_path设置记录文件的目录 可以设置最多3层目录
#location对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡
}
#虚拟主机的配置
server
{
#监听端口
listen 80;
#域名可以有多个,用空格隔开
server_name www.w3cschool.cn w3cschool.cn;
index index.html index.htm index.php;
root /data/www/w3cschool;
#对******进行负载均衡
location ~ .*.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
#图片缓存时间设置
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 10d;
}
#JS和CSS缓存时间设置
location ~ .*.(js|css)?$
{
expires 1h;
}
#日志格式设定
#$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
#$remote_user:用来记录客户端用户名称;
#$time_local: 用来记录访问时间与时区;
#$request: 用来记录请求的url与http协议;
#$status: 用来记录请求状态;成功是200,
#$body_bytes_sent :记录发送给客户端文件主体内容大小;
#$http_referer:用来记录从那个页面链接访问过来的;
#$http_user_agent:记录客户浏览器的相关信息;
#通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
#定义本虚拟主机的访问日志
access_log /usr/local/nginx/logs/host.access.log main;
access_log /usr/local/nginx/logs/host.access.404.log log404;
#对 "/" 启用反向代理
location / {
proxy_pass http://127.0.0.1:88;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#以下是一些反向代理的配置,可选。
proxy_set_header Host $host;
#允许客户端请求的最大单文件字节数
client_max_body_size 10m;
#缓冲区代理缓冲用户端请求的最大字节数,
#如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器,来提交任意小于256k的图片,都很正常。如果注释该指令,使用默认的client_body_buffer_size设置,也就是操作系统页面大小的两倍,8k或者16k,问题就出现了。
#无论使用firefox4.0还是IE8.0,提交一个比较大,200k左右的图片,都返回500 Internal Server Error错误
client_body_buffer_size 128k;
#表示使nginx阻止HTTP应答代码为400或者更高的应答。
proxy_intercept_errors on;
#后端服务器连接的超时时间_发起握手等候响应超时时间
#nginx跟后端服务器连接超时时间(代理连接超时)
proxy_connect_timeout 90;
#后端服务器数据回传时间(代理发送超时)
#后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
proxy_send_timeout 90;
#连接成功后,后端服务器响应时间(代理接收超时)
#连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)
proxy_read_timeout 90;
#设置代理服务器(nginx)保存用户头信息的缓冲区大小
#设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头,默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小
proxy_buffer_size 4k;
#proxy_buffers缓冲区,网页平均在32k以下的设置
#设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8k
proxy_buffers 4 32k;
#高负荷下缓冲大小(proxy_buffers*2)
proxy_busy_buffers_size 64k;
#设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长
#设定缓存文件夹大小,大于这个值,将从upstream服务器传
proxy_temp_file_write_size 64k;
}
#设定查看Nginx状态的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file confpasswd;
#htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
}
#本地动静分离反向代理配置
#所有jsp的页面均交由tomcat或resin处理
location ~ .(jsp|jspx|do)?$ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
#所有静态文件由nginx直接读取不经过tomcat或resin
location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|
pdf|xls|mp3|wma)$
{
expires 15d;
}
location ~ .*.(js|css)?$
{
expires 1h;
}
}
}
######Nginx配置文件nginx.conf中文详解#####
nginx多配置文件,共用80端口
- 在
conf.d
下面创建多个project.conf
-
两个服务都监听了80端⼝,对应不同server_name,根据域名转发到不同的端⼝服务⼀server配置 server { listen 80; server_name missbe.cn; root /usr/share/nginx/html; error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } 服务⼆server配置 server { listen 80; server_name doc.missbe.cn; root /usr/share/nginx/html; # Load configuration files for the default server block. error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
FQA
alias和root的区别
在 Nginx 配置中,alias 和 root 是两个常用的指令,用于指定文件系统路径,但它们的行为有所不同。理解这两者的区别对于正确配置 Nginx 非常重要。
alias 指令用于将一个 URL 路径映射到文件系统中的另一个路径。它通常用于将请求的路径重定向到一个不同的目录。
nginx
location /file {
alias /var/www/html/file;
}
当客户端请求 http://your_domain/file/somefile.txt 时,Nginx 会将其映射到 /var/www/html/file/somefile.txt。
注意事项
- alias 指令后面的路径必须是一个目录或文件的完整路径。
- alias 指令通常用于 location 块中,并且路径匹配是精确的。
root 指令用于设置请求的根目录。它通常用于定义一个基本目录,所有相对路径都会基于这个根目录进行解析。
nginx
location /file {
root /var/www/html;
}
当客户端请求 http://your_domain/file/somefile.txt 时,Nginx 会将其映射到 /var/www/html/file/somefile.txt。
注意事项
- root 指令后面的路径是一个基本目录,Nginx 会将请求的 URI 附加到这个基本目录后面。
- root 指令可以在 server 块或 location 块中使用。
关键区别
路径拼接方式:
- alias:直接替换匹配的路径部分。
- root:将请求的 URI 附加到根目录后面。
使用场景: - alias:适用于需要将请求路径映射到不同目录的情况。
- root:适用于定义一个基本目录,所有相对路径基于这个目录进行解析。
使用 alias
nginx
location /file {
alias /var/www/html/file;
}
请求 http://your_domain/file/somefile.txt 会被映射到 /var/www/html/file/somefile.txt。
使用 root
nginx
location /file {
root /var/www/html;
}
请求 http://your_domain/file/somefile.txt 会被映射到 /var/www/html/file/somefile.txt。
具体配置示例
假设你要将 /file 路由映射到 /var/www/html/file 目录,推荐使用 alias 指令:
server {
listen 80;
server_name your_domain_or_ip;
location /file {
alias /var/www/html/file;
autoindex on; # 可选:启用目录列表
}
# 其他 location 块...
}
通过以上配置,当客户端请求 http://your_domain/file/somefile.txt 时,Nginx 会将其映射到 /var/www/html/file/somefile.txt。
总结
- 使用 alias 指令时,路径是直接替换的,适用于将请求路径映射到不同目录的情况。
- 使用 root 指令时,路径是附加的,适用于定义一个基本目录,所有相对路径基于这个目录进行解析。
根据你的需求选择合适的指令来配置 Nginx。