nginx.conf配置文件详解

485次阅读
没有评论

Nginx 主配置文件 nginx.conf 共由三部分组成:全局块 events 块http 块 。http 块又包含 http 全局块、多个 server 块。而每个 server 块中,可以包含 server 全局块 和多个 location 块。在同一配置块中嵌套的配置块,各个之间不存在次序关系。

同一个指令放在不同层级的块中,其作用域也不同,一般情况下,高一级块中的指令可以作用于自身所在的块和此块包含的所有低层级块。如果某个指令在两个不同层级的块中同时出现,则采用 就近原则,即以较低层级块中的配置为准。

比如,某指令同时出现在 http 全局块中和 server 块中,并且配置不同,则应该以 server 块中的配置为准。

 

配置文件结构

整个 Nginx 配置文件 nginx.conf 的结构大致如下:

# 全局块
#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 指令的配置非常灵活,可以单独制定 ip,单独指定端口或者同时指定 ip 和端口。

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。多个虚拟主机可以同时监听同一个端口。
  • 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 时,可以匹配成功。

root 指令 #

这个指令用于设置请求寻找资源的跟目录,此指令可以在 http 块、server 块或者 location 块中配置。由于使用 Nginx 服务器多数情况下要配置多个 location 块对不同的请求分别做出处理,因此该指令通常在 location 块中进行设置。

root path

path 变量中可以包含 Nginx 服务器预设的大多数变量,只有 $document_root 和 $realpath_root 不可以使用。

alisa 指令 #

index 指令 #

error_page 指令 #

一点说明 #

上面列举了 Nignx 中全局块、event 块和 http 块的一些配置指令,但是 Nginx 的指令远远不止这些。其实这边最主要的还是讲解整个配置文件的结构,如果大家要看比较全的指令介绍、模块介绍的话,建议去 Nginx 的官网。

一个配置文件的列子 #

######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;}
}
}

微信扫描下方的二维码阅读本文

正文完
 0
柹子丶
版权声明:本站原创文章,由 柹子丶 于2022-10-31发表,共计17577字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码