1、nginx.conf 的文件结构
# 全局块
...
# events 块
events{
...
}
# http块
http{
#http全局块
...
#server 块
server{
#server全局块
...
#location块
location{
...
}
location{
...
}
}
}
- 全局快:
通常包含nginx服务器的用户(组)、允许生成的worker process数,nginx进程pid存放路径、日志存放路径和类型
# 例如: user nobody nobody; # 这个也是配置文件默认的 worker process 8; # 通常用cpu核数来定,如果不清楚也可以用auto来设置,worker process auto; pid /var/run/nginx.pid; # 也支持相对路径如:pid sbin/nginx.pid; error_log /var/log/nginx/error.log error; # error_log 日志文件 日志类型。日志类型可以为debug、info、notice、warn、error、crit、alert、emerg等
events 块: 通常包含是否开启对多worker process 下的网络连接进行序列化、是否允许同时接收多个网络连接、选取那种驱动模型处理连接请求、每个worker process 可以同时支持的最大连接数等。 这一部分对nginx服务器的性能影响比较大。
events { accept_mutex on; # 默认为on 状态,表示将会对多个ngiinx进程接收进行序列化,防止多个进程对连接进行争抢。 multi_accept on; #默认为off,off 表示每个worker process 一次只能接收一个新到的网络连接 use epoll; #其他驱动模型还包含:select、poll、kqueue、rtsig、/dev/poll、eventport。 worker_connections 512; # 默认为512,主要用来设置允许每个worker process同时开启的最大连接数。数值不能超过操作系统支持打开的最大文件句柄数。 }
http 块: http 块是最重要的块,nginx的所有功能都在这个块体现 http的全局块:包括文件引入如:include vhosts/*.conf; 、MIME-Type 定义、日志定义、是否使用sendfile传输文件、连接超时时间、连接请求数上限等
2、配置经验分享
- 解决惊群问题
所谓惊群问题就是当某一时刻只有一个网络连接到来时,多个睡眠进程会被同时唤醒,但是只有一个进程获得连接。如果每次唤醒的进程数目太多,无形中就会影响一部分系统性能。
若要解决惊群问题可以在events块中配置如下:
accept_mutex on; # 默认为on 状态,表示将会对多个ngiinx进程接收进行序列化,防止多个进程对连接进行争抢。
- 设置是否允许同时接收多个网络连接
multi_accept on; #默认为off,off 表示每个worker process 一次只能接收一个新到的网络连接 # 此配置只能在events块中
- 事件驱动模型的选择
use epoll; #其他驱动模型还包含:select、poll、kqueue、rtsig、/dev/poll、eventport。 # 此配置只能在events块中
- 最大连接数
worker_connections 512; # 默认为512,主要用来设置允许每个worker process同时开启的最大连接数。数值不能超过操作系统支持打开的最大文件句柄数。 # 此配置只能在evnets块中
- 自定义服务日志
access_log /var/log/nginx/access.log access; #后面的access 是log_format 中指定的名字 , #access_log 指令可以在http块,server块,location块中设置 log_format access "$http_x_forwarded_for | $http_host | $time_local | $request| $status | $body_bytes_sent | " "$request_body | $content_length | $http_referer| $http_user_agent |" "$remote_addr | $hostname | $upstream_addr | $upstream_response_time | $request_time"; # log_format 指令只能在http块设置 #默认的格式是 log_format combined '$remote_addr - $remote_user [$time_local] ' ' "$request" $status $body_bytes_sent ' ' "$http_referer" "$http_user_agent" ';
- 配置允许sendfile 方式传输文件
sendfile on;默认是off的。 sendfile_max_chunk 128k;如果设置0k表示不限制,这个指令指的是每个worker process 每次调用sendfile()传输的数据最大不能超过这个值。 #这个指令可以在http块,server块,location块中设置
- 配置连接超时时间
keepalive_timeout 120s 100s;# 120s表示服务器端保持连接的时间,100s表示发给哭护短的应答报文头部中Keep-Alive 的超时时间。 #这个指令可以在http块,server块,location快中设置
- 虚拟主机的配置
# 通配符 server_name *.mysqlserver.com www.myserver.*; # 正则 server_name ~^www\d+\.myserver\.com$; # 以~开头作为正则表达式字符串的开始标志。. 号在正则中有特殊意义,所以要用\进行转移。 # 正则中用()括起来的值可以传递到$1 $2 $3 ... 中,最为后面调用。 server_name ~^www\.(.+)\.com$; # www.myserver.com 进来的请求,myserver 就会被记录在$1中。 # 主机优先级: # 准确匹配-->通配符在前面-->通配符在最后-->正则表达式匹配
- 配置location块
location [ = | ~ | ~* | ^~ ] uri { ... }
[] 表示可选,就是里面的部分是可选的 = 表示精确匹配,后面跟着标准uri(相对于正则uri,如\.php$),要求字符串与uri严格匹配 ~ 用于表示uri包含正则表达式,并且区分大小写 ~* 用于表示uri包含正则表达式,并且不区分大小写 (如果uri包含正则表达式,就必须使用~ 或者 ~* 进行标示) ^~ 用于标准uri前,要求nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求而不再使用location块中的正则uri和请求字符串做匹配
- 配置请求的根目录
location /data/ { root /var/html; } # 当location 块接收到 “/data/index.html” 的请求时,就会在/var/html/data/ 目录下找到index.html 响应请求。
- 更改location的URI
location ~ ^/data/(.+\.(htm|html))$ { alias /var/html/other/$1; } # 当location块接收到“/data/index.htm”的请求时,匹配成功,之后根据alias指令,nginx将到/var/html/other 目录下找index.htm.