user vagrant [group];
指定可以运行的NGINX服务器的用户。指定可以运行nginx服务器的用户组。
注意:只有被设置的用户或者组成员才有权限启动Nginx进程,如果是其他用户尝试启动nginx进程就会报错。
worker_processes 4;
指定nginx进程最多可以产生多少个worker process数。
如果设置为auto nginx将自动检测。
设置进程cpu的亲和性
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu
pid /run/nginx.pid;
Nginx进程作为系统的守护进程运行,我们需要在某个文件中保存当前运行程序的主进程号,Nginx支持定义pid的存放路径。
# events 模块
events {
worker_connections 768; //单个进程理论最大连接数
multi_accept on;
设置是否允许同时接受多个网络连接:
只能在events模块设置,Nginx服务器的每个工作进程可以同时接受多个新的网络连接,但是需要在配置文件中配置,
此指令默认为关闭,即默认为一个工作进程只能一次接受一个新的网络连接,打开后几个同时接受多个。
use epoll 表明使用epoll模型。
}
#http 模块
sendfile on;
#sendfile的机制
# 一般来说当用户的请求过来,先由网卡设备接收到,通过注册监听在80端口的内核捕获到,然后使向用户空间的web服务进行转发。
web服务器收到请求,接下来向内核发起(IO)请求。接下来内核负责把文件从磁盘加载到内核内存,然后从内核内存复制一份到进程内存、然后web服务器构建响应报文,
把内容从进程内存拷贝到内核内存,然后通过网卡发送出去。
而sendfile会在当内核获取到资源后,直接构建响应报文,通过网卡响应给客户端。
tcp_nopush on;
# 当有数据时,先别着急发送, 确保数据包已经装满数据, 避免了网络拥塞。
这个参数要配合sendfile使用。它可以做到把http response header 和响应数据文件的开始部分放一个文件里发布。
他的积极作用是减少网络报文段的数量。
tcp_nodelay on;
# 有时要抓紧发货, 确保数据尽快发送, 提高可数据传输效率和tcp_nopush正好相反 只能开启一个。
这个开启之后就禁用了nagle算法。
keepalive_timeout 65; # 长连接超时时间,单位是秒。
指定了与客户端的 keep-alive 链接的超时时间。
服务器会在这个时间后关闭链接。我们可以降低这个值,以避免让 worker 过长时间的忙碌。(可以改的低点,比如15)
types_hash_max_size 2048;
为了快速处理静态数据集,例如服务器名称, 映射指令的值,MIME类型,请求头字符串的名称,nginx使用哈希表
types_hash_max_size影响散列表的冲突率。
types_hash_max_size越大,就会消耗更多的内存,但散列key的冲突率会降低,检索速度就更快。
types_hash_max_size越小,消耗的内存就越小,但散列key的冲突率可能上升。
server_tokens off; 隐藏版本号,这样在客户端就看不到nginx-1.10.6 这个版本号了。
server_names_hash_bucket_size 64; 为了快速寻找到相应MIME type,Nginx使用散列表来存储MIME type与文件扩展名。types_hash_bucket_size 设置了每个散列桶占用的内存大小。
server_name_in_redirect off;
如果server_name_in_redirect为off时,那么将会以当前服务器的IP地址进行拼接URL;如果该命令为on,那么首先查找server_name,如果没有找到,查找请求头的HOST字段,如果没有,则以当前服务器的IP进行拼接。
include /etc/nginx/mime.types;
引入文件扩展名与文件类型映射表
MIME——Multipurpose Internet Mail Extension(多用途因特网邮件扩展)https://my.oschina.net/plutonji/blog/527797 具体看这里。
default_type application/octet-stream; 默认的文件类型
默认的是octet-stream, 意思是如果一个文件的MIME类型不存在就会使用默认的类型。 通常是这个导致了文件的下载。
application 表明是某种二进制数据 octet-stream 表明他就是一个字节流,浏览器默认处理字节流的方式就是下载。
Logging Settings 【日志配置】
配置记录nginx启动及运行过程中所产生的错误,是调试Nginx服务的重要手段,属于核心模块
access_log /var/log/nginx/access.log;
nginx的访问日志文件地址。
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
说明:
path: 配置服务日志的文件存放的路径和名称
format,可选项,自定义服务日志的格式字符串
size:配置临时存放日志的内存缓存区大小
该指令可以配置在http块,server块,location块,默认如下
#access_log logs/access.log main; 这里的main是个名字
是log_format 定义格式的名字。见下文log_main
设置刷盘策略:把数据从缓冲区刷到硬盘
access_log logs/access.log main buffer=32k flush=5s
buffer 满 32k 才刷盘;假如 buffer 不满 5s 钟强制刷盘。
error_log /var/log/nginx/error.log;
相关的nginx的错误日志地址
log_format # 用来定义记录日志的格式
log_format指令
语法如下:
log_format name [escape=default|json] string ...
说明:
name:格式字符串的名字,默认为combined
string: 服务日志的格式字符串,在定义过程中,nginx配置预设一些变量获取相关内容
#log_format main[只是个name]
$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
10.2.1.2 -
-
[07/Dec/2017:16:39:09 +0800]
"GET / HTTP/1.1"
200
612
"-"
"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"
"-"
参数具体说明如下:
$remote_addr 客户端地址 10.2.1.2
$remote_user 客户端用户名称 - -
$time_local 访问时间和时区 07/Dec/2017:16:39:09 +0800
$request 请求的URI和HTTP协议 "GET / HTTP/1.1"
$http_host 请求的地址 www.bigmom.com
$status HTTP响应状态码 200
$body_bytes_sent 发送给客户端文件内容大小 612
$http_referer url跳转来源 -
$http_user_agent 用户终端浏览器等信息 "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"
$upstream_addr 后台upstream的地址
$request_time 整个请求的时间。请求处理时间(以秒为单位,分辨率为毫秒);从客户机读取第一个字节到将最后一个字节发送到客户机后写入日志之间的时间
$upstream_response_time 请求过程中,upstream响应时间
$connection_requests
the current number of requests made through a connection (1.1.18)
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
Default:
open_log_file_cache off;
对于每一条日志记录,都将是先打开文件,再写入日志,然后关闭。
这样就会导致文件被频繁的打开关闭
功能: 定义一个缓存,存储常用日志的文件描述符,这些日志的名称包含变量
max: 设置缓存描述符的最大数量
inactive: 设置在此期间没有访问的缓存描述符
min_uses: 设置在inactive时间内,日志文件最少使用多少次后,该日志文件描述符记录缓存中,默认为1次
valid:设置检查频率 默认60s 检查文件是否仍然以相同名称存在的时间;
案例:
缓存最大1000个文件描述符(fd), 在20s内使用最少2次该日志,就把该日志的fd放入到缓存中。
open_log_file_cache max=1000 inactive=20s min_uses=2 valid=1m;
Gzip Settings Gzip 设置
使用gzip压缩功能,可能为我们节约带宽,加快传输速度,有更好的体验,也为我们节约成本。
Nginx启用压缩功能需要你来ngx_http_gzip_module模块。
apache使用的是mod_deflate。
一般我们需要压缩的内容有:文本,js,html,css。
对于图片,视频,flash什么的不压缩,同时也要注意,
我们使用gzip的功能是需要消耗CPU的!
gzip on; #开启压缩功能
gzip_disable "msie6"; 这里是禁用IE6的gzip压缩,IE6某些版本对gzip的压缩支持很不好,会造成页面的假死。
gzip_vary on;
如果指令gzip、gzip_static或gunzip处于激活状态,则启用或禁用插入“Vary: Accept-Encoding”响应头字段。
varyheader支持,该选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用Squid缓存经过nginx压缩的数据。
gzip_proxied any; 根据请求和响应启用或禁用代理请求的响应gzipping。 any 为所有代理请求启用压缩
# gzip_min_length 1k;#设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取,默认值是0,不管页面多大都进行压缩,建议设置成大于1K,如果小于1K可能会越压越大。
gzip_comp_level 6;
#gzip_buffers 4 32k; #压缩缓冲区大小,表示申请4个单位为32K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。
gzip_http_version 1.1; #压缩版本,用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
用来指定压缩的类型,‘text/html’类型总是会被压缩。
gzip_comp_level 6; #压缩比例,用来指定GZIP压缩比,允许范围在【1-9】,1压缩比最小,处理速度最快,9压缩比最大,传输速度快,但是处理慢,也比较消耗CPU资源。
连接超时时间
client_header_buffer_size 客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过 1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小4k
client_header_buffer_size 4k;
client_header_timeout设置请求头的超时时间。我们也可以把这个设置低些,如果超过这个时间没有发送任何数据,nginx将返回request time out的错误
client_body_timeout设置请求体的超时时间。我们也可以把这个设置低些,超过这个时间没有发送任何数据,和上面一样的错误提示
send_timeout响应客户端超时时间,这个超时时间仅限于两个活动之间的时间,如果超过这个时间,客户端没有任何活动,nginx关闭连接
client_max_body_size 上传文件大小限制 默认是1M
NGINX 安全配置:
1)禁用autoindex模块。这个可能在你使用的Nginx版本中已经更改了,如果没有的话只需在配置文件的location块中增加autoindex off;声明即可。
2)禁用服务器上的ssi (服务器端引用)。这个可以通过在location块中添加ssi off; 。
3)关闭服务器标记。如果开启的话(默认情况下)所有的错误页面都会显示服务器的版本和信息。将server_tokens off;声明添加到Nginx配置文件来解决这个问题。
4)在配置文件中设置自定义缓存以限制缓冲区溢出攻击的可能性。
client_body_buffer_size 1K;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
5)将timeout设低来防止DOS攻击。所有这些声明都可以放到主配置文件中。
client_body_timeout 10;
client_header_timeout 10;
keepalive_timeout 65;
send_timeout 10;
6)限制用户连接数来预防DOS攻击。
limit_zone slimits $binary_remote_addr 5m;
limit_conn slimits 5;
7)试着避免使用HTTP认证。HTTP认证默认使用crypt,它的哈希并不安全。如果你要用的话就用MD5(这也不是个好选择但负载方面比crypt好) 。