nginx:配置文件(nginx.conf)各项说明

发布时间 2023-08-07 11:30:40作者: ShineLe

一、配置文件结构

worker_processes  1;
 
events {
    worker_connections  1024;
}
 
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

 
    server {
         ...
      location{
           ...
      }
  }
}

nginx配置文件由三部分组成:1、全局块(events之前的部分);2、events块(events{...});3、http块(http{...})。

1、全局块(events之前的部分)

从配置文件开始到events块之间的内容,主要设置一些影响nginx服务器整体运行的配置指令,主要包括:1)运行Nginx服务器的用户(组);2)允许生成的Worker Process数;3)进程PID存放路径;4)日志存放路径和类型;5)配置文件的引入……

上文第一行配置的:

  worker_processes  1;

这是Nginx并发处理服务的关键配置,worker_processes值越大,可以支持的并发处理量越多,但是会受到硬件、软件等设备的制约

2、events块(events{...})

涉及的是Nginx服务器与用户的网络连接,常用的设置包括1)是否开启对多work process下的网络连接进行序列化;2)是否允许同时接收多个网络连接;3)选取哪种事件驱动模型来处理连接请求;4)每个work process可以同时支持的最大连接数(即上文的worker_connections);5)...

上文中events块为

events {
    worker_connections  1024;
}

代表每个work process支持的最大连接数为1024。

该部分对Nginx性能影响较大,在实际中应该灵活配置。

3、http块(http{...})

这部分是nginx服务器配置中最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块配置都放在这里。

需要注意的是,http块也可以包括http全局块、server块

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;


 
    server {
         ...
      location{
           ...
      }
}

1)http全局块(除了server和location外的其他部分)

全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限。

2)server块(server{...})

该块与虚拟主机有密切联系,从逻辑上看,虚拟主机与一台独立的硬件主机没什么区别。

每个http块可以包括多个server块,而每个server块就相当于一个虚拟主机。每个server块也分为全局server块location块

①全局server块

最常见的配置是1)本虚拟机的监听配置;2)本虚拟机的名称或IP配置。

②location块

一个server块可以配置多个location块。

这块的主要作用是基于Nginx服务器收到的请求字符串(如server_name/url-string),对虚拟机名称(或IP别名)之外的字符串(如url-string)进行匹配,特定的请求进行处理地址定向、数据缓存、应答控制等功能。

还有许多第三方模块的配置也在该处进行。

二、详细配置

1、全局块(events之前的部分)

#user nobody;
worker_processes 1;
 
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
 
#pid logs/nginx.pid;
#worker_rlimit_nofile 204800

 

1)user

写法:user nginx nginx
说明:user 用户 用户组(windows下不指定)
上文:

#user nobody

 

 

2)worker_processes

写法:worker_processes 数字
说明:工作进程 数目。根据硬件调整,通常为CPU数量或2倍。
上文:

worker_processes 1;

 

 

3)pid logs/nginx.pid

说明:pid(进程标识符) 存放路径(上文的logs/nginx.pid)

 

 

4)worker_rlimit_nofile 204800

说明:进程可以打开的最大描述符 数目

1)该指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是 最多打开文件数(ulimit -n)÷ nginx进程数 ,但是nginx分配请求并不是那么均匀,因此最好和ulimit -n的值保持一值;
2)Linux 2.6内核下文件打开数为65535,worker_rlimit_nofile的值就该填写65535。这是因为nginx调度时分配请求到进程时并非那么均匀,所以如果填写10240,那么当总并发量达到3-4W时就有进程会超过10240,此时返回502错误

 

2、events块

use epoll;
worker_connections 204800;
keepalive_timeout 
client_header_buffer_size 4k;
open_file_cache max=65535 inactive=60s;
open_file_cache_valid 80s;
open_file_cache_min_uses 1;

1)use epoll

使用epoll的IO模型。Linux下建议epollFreeBSD建议kqueue,windows下不指定。

2)worker_connections 204800

每个工作进程的最大连接数量

根据硬件调整,和前面工作进程(全局块中的worker_processes变量)配合起来用,尽量,但是不要让CPU跑到100

理论上每台nginx服务器的最大连接数为 worker_processes × worker_connections

3)keepalive_timeout 60

keepalive超时时间。

4)client_header_buffer_size 4K

客户端请求头部的缓冲区大小

可以根据你地系统分页大小来设置,一般一个请求头大小不超过1K,不过由于一般系统分页都要>1K,因此这里设置为分页大小

分页大小可以用getconf PAGESIZE获取:

也有client_header_buffer_size>4K的情况,但是其值必须为PAGESIZE的整数倍

5)open_file_cache max=65535 inactive=60s

打开文件指定缓存默认不启用

max:缓存数量,建议和打开文件数一致

inactive:经过多长时间文件未被请求后删除缓存。

6)open_file_cache_valid 80s

多久检查一次缓存的有效信息

7)open_file_cache_min_uses 1

与参数5)open_file_cache的inactive选项相关,该选项指定了在inactive时间内文件的最少使用次数,上文所说,如果1次未被使用,那它将被移除;否则文件描述符一直在缓存中打开。

3、http块

1)include mime.types;

设定mime类型,类型由mime.type文件定义

2)default_type application/octet-stream;

3)log_format

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format log404 '$status [$time_local] $remote_addr $host$request_uri $sent_http_location'; 

日志格式设置:

$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地址原来客户端的请求的服务器地址

4)access_log:日志文件的存放路径

access_log  logs/host.access.log  main;
access_log  logs/host.access.404.log  log404;
用了log_format指令设置了日志格式之后,需要用access_log指令指定日志文件的存放路径;

5)server_names_hash_bucket_size 128;

保存服务器名字hash表是由指令server_names_hash_max_sizeserver_names_hash_bucket_size所控制的。hash bucket size = hash表的大小,并且是一路处理器缓存大小的倍数

在减少了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能。如果hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为2。第一次是确定存储单元的地址,第二次是在存储单元中查找键-值。因此,如果Nginx给出需要增大hash max size 或 hash bucket size的提示,那么首要的是增大前一个参数的大小.

6)client_header_buffer_size 4k;

默认客户端请求头部的缓冲区大小。

这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。

分页大小可以用命令getconf PAGESIZE取得。

7)large_client_header_buffers 8 128k;

超过默认值时客户请求头缓冲大小。

nginx默认会用client_header_buffer_size这个buffer来读取header值,如果header过大,它会使用large_client_header_buffers来读取。

8)open_file_cache max=102400 inactive=20s;

缓存是否启用。

 

9)10)11)用于http、location、server

open_file_cache_valid 30; 
open_file_cache_min_uses 2; 
open_file_cache_errors on;

9)open_file_cache_valid

写法:open_file_cache_valid time

默认值:60

说明:何时需要检查open_file_cache中缓存项目的有效信息.

10)open_file_cache_min_uses

写法:open_file_cache_min_uses number

默认值:1

说明:在open_file_cache指令无效的参数中一定的时间范围内可以使用的最小文件数,如果使用更大的值,文件描述符在cache中总是打开状态.

11)open_file_cache_errors

写法:open_file_cache_errors on | off

默认值:off

说明:是否在搜索一个文件是记录cache错误.

12)client_max_body_size 300m

通过nginx上传文件的大小

13)sendfile on;

sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on

如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。

14)tcp_nopush on;

允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用

15)proxy_connect_timeout 90;

后端服务器连接的超时时间_发起握手等候响应超时时间。

16)proxy_read_timeout 180;

连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)

17)proxy_send_timeout 180;

后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据

18)proxy_buffer_size 256k;

设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头,默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小

19)proxy_buffers 4 256k;

设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8k

20)proxy_busy_buffers_size 256k;

21)proxy_temp_file_write_size 256k;

设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长

22)proxy_temp_path proxy_cache_path

proxy_temp_path /data0/proxy_temp_dir;
proxy_cache_path /data0/proxy_cache_dir levels=1:2 
proxy_temp_path和proxy_cache_path指定的路径必须在同一分区

23)keys_zone=cache_one:200m inactive=1d max_size=30g;

设置内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。

24)keepalive_timeout 120;

keepalive超时时间。

25)tcp_nodelay on;

26)client_body_buffer_size 512k;

如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器,来提交任意小于256k的图片,都很正常。

如果注释该指令,使用默认的client_body_buffer_size设置,也就是操作系统页面大小的两倍,8k或者16k,问题就出现了。 无论使用firefox4.0还是IE8.0,提交一个比较大,200k左右的图片,都返回500 Internal Server Error错误

27)proxy_intercept_errors on;

表示使nginx阻止HTTP应答代码为400或者更高的应答。

28)upstream:负载方式

upstream backend {
server 127.0.0.1:8027;
server 127.0.0.1:8028;
server 127.0.0.1:8029;
hash $request_uri;

目前支持4种负载方式:

①轮询(默认)

每个请求按照时间顺序,逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除

②weight

指定权重,权重weight和访问比率成正比,用于后端服务器性能不均的情况。

upstream backend {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}

③ip_hash

每个请求按ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream backend {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}

④fair(第三方)

后端服务器的响应时间分配请求响应时间短优先分配。

upstream backend {
server server1;
server server2;
fair; 
}

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

 

在需要使用服务负载均衡server块中增加 proxy_pass http://backend/;

每个设备的状态设置为:

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进行匹配.可以进行重定向或者进行新的代理 负载均衡

4、server块

1)listen 80

监听端口

2)server_name www.xxx.com

访问域名

3)location ~* \.(mp3|exe)$

对以mp3或exe结尾的地址进行负载均衡

4)proxy_pass http://img_relay$request_uri;

设置被代理服务器的端口或套接字,以及URL

5)

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

将代理服务器收到的用户的信息传到真实服务器上

6)


location /face {
if ($http_user_agent ~* "xnp") {
rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;
}
 
proxy_pass http://img_relay$request_uri;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
error_page 404 502 = @fetch;
 
}
 
location @fetch {
access_log /data/logs/face.log log404;
rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;
}
 
location /image {
if ($http_user_agent ~* "xnp") {
rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;
}
 
proxy_pass http://img_relay$request_uri;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
error_page 404 502 = @fetch;
}
 
location @fetch {
access_log /data/logs/image.log log404;
rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;
 
}
 
}