目录
一、Nginx的文件内容
二、去除注释之后的文件
三、配置文件详解
1、全局块
(1)user 指令:
(2)worker_processes:
(3)daemon
(4)pid
(5)error_log
(6)include
2、events 块
(1)accept_mutex
(2)multi_accept
(3)worker_connections
(4)use
3、http 块(部分详解)
(1)默认有两行配置
(2)自定义服务日志
(3)sendfile
(4)tcp_nopush
(5)keepalive_timeout
(6)keep alive_requests
(7)tcp_nodelay
(8)gzip 模块设置
(9)FastCGI相关参数
(10)upstream 负载均衡模块和 server 虚拟主机模块 会单独拿出一篇文章解释,再次不做详解
(11)浏览器缓存的执行流程
(12)add_header
一、Nginx的文件内容
在Nginx的配置文件中可以使用 # 来注释。
[root@localhost conf]# vim nginx.conf
#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;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#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 on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset utf-8;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
二、去除注释之后的文件
[root@localhost conf]# vim nginx.conf
#工作节点进程数
worker_processes 1;
#evens块,主要设置Nginx服务器与用户的网络连接。
events {
worker_connections 1024;
}
#http 块,是Nginx服务器配置中的重要部分,代理、缓存、日志记录、第三方模块 等等
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# server 块,是Nginx配置和虚拟主机相关的内容,一个server就是一个虚拟机
server {
listen 80;
server_name localhost;
# location块,是Nginx服务器接受请求字符串与location后面的值进行匹配,对特定请求进行处理。
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
- nginx.conf配置文件中默认有三大块:全局块、events块、http块。
- http块中可以配置多个server块,每个server块又可以配置多个location块。
三、配置文件详解
【】里的内容表示可选
1、全局块
(1)user 指令:
用于配置运行Nginx服务器的worker进程的用户和用户组。
语法 | user 用户名【group:用户所在的组,若不指定和用户名一样】 |
默认值 | nbody |
位置 | 全局块 |
(2)worker_processes:
用于配置Nginx生成工作进程的数量,默认是1,这个是Nginx服务器实现并发处理服务的关键。
理论上来说这个参数值越大,可以支持的并发处理量越多,但事实上这个值受到服务器自身的限制,建议该值和服务器的CPU的内核保持一致。
如果将这个参数改成2,就可以看到有两个工作进程
(3)daemon
用于设定Nginx是否以守护进程的方式启动。
语法 | daemon on|off |
默认值 | on |
(4)pid
用于配置Nginx当前master进程的进程ID存储路径
语法 | pid file |
默认值 | /usr/local/nginx/logs/nginx.pid |
(5)error_log
用来配置Nginx错误日志的存放路径
语法 | error_log file [日志级别] |
默认值 | error_log logs/error.log error |
位置 | 全局块、http、server、location |
其中日志级别的值有:debug | info | notice | warn | error | crit | alert | emerg,
调试 | 信息| 通知 | 警告 | 错误 | 临界 | 警报 | 紧急,这块建议大家设置的时候不要设置成info以下的等级,因为会带来大量的磁盘I/O消耗,影响Nginx的性能。
(6)include
用来引入其他配置文件,使Nginx更加灵活。
语法 | include file |
默认值 | 无 |
例如:创建一个/usr/local/nginx/conf/a.conf
在nginx.conf 中引入
include a.conf
2、events 块
(1)accept_mutex
用来设置Nginx网络连接序列化
语法 | accept_mutex on|off |
默认值 | on |
这个配置主要是可以用来解决“惊群”的问题。比如,客户端发来一个请求,Nginx后台是多进程工作模式,同时多个worker进程会被唤醒,但是只有一个进程可以获取到连接,因此唤醒太多,会造成Nginx性能的影响。如果设置成 on 就会对Nginx进程接受连接进行序列号,一个一个唤醒。防止了相互争抢。
(2)multi_accept
用来设置是否同时接受多个网络连接
语法 | multi_accept on|off |
默认值 | off |
如果该值为off, Nginx 只会接受一个连接,然后处理它,再接受下一个连接。当设置为 on 时,Nginx 会尝试接受尽可能多的连接,直到达到 worker_connections 的限制。建议设置为on
(3)worker_connections
用来配置单个worker进程可以同时打开的最大连接数。
语法 | worker_connections number |
默认是 | 1024 |
这里的连接数不仅仅包括前端用户建立的连接,而是所有可能的连接数。另外,number 数不能大于系统支持打开的最大文件数。
(4)use
用来设置Nginx服务器选择哪种事件驱动来处理网络消息
语法 | use method |
默认值 | 根据操作系统定 |
method的可选值有select / poll / epoll / kqueue等,建议设置为epoll
3、http 块(部分详解)
用于定义 HTTP 服务器相关的配置指令的容器
Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。http 块也可以包括 http全局块、server 块。
http全局块:http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
server 块:这块和虚拟主机有密切关系,每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。 而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
(1)默认有两行配置
default_type:用来配置Nginx响应前端请求默认的MIME类型。如果mime.types 文件中找不到对应类型,则以此二进制流进行下载。
include mime.types:MIMT类型与相关类型文件的文件后缀名的对应关系加入到当前的配置文件中。
(2)自定义服务日志
Nginx中日志的类型分为 access.log、error.log。
access.log:用来记录用户所有的访问请求。
Nginx服务器支持对服务日志的格式、大小、输出等进行设置,需要使用到两个指令,分别是
access_log和log_format指令。
access_log:用来设置用户访问日志的相关属性。
语法 | access_log path[format[buffer=size]] |
默认值 | access_log logs/access.log combined; |
位置 | http,server,location |
log_format:用来指定日志的输出格式。
语法 | log_format name [escape=default|json|none] string…; |
默认值 | log_format combined “…”; |
位置 | http |
#日志相关定义
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#定义日志的格式。后面定义要输出的内容。
#1.$remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址;
#2.$remote_user :用来记录客户端用户名称;
#3.$time_local :用来记录访问时间与时区;
#4.$request :用来记录请求的url与http协议;
#5.$status :用来记录请求状态;
#6.$body_bytes_sent :记录发送给客户端文件主体内容大小;
#7.$http_referer :用来记录从那个页面链接访问过来的;
#8.$http_user_agent :记录客户端浏览器的相关信息
#连接日志的路径,指定的日志格式放在最后。
access_log logs/access.log main;
#关闭日志
#access_log off;
(3)sendfile
用来设置Nginx服务器是否使用 sendfile()传输文件,该属性大大提高Nginx处理静态资源的性能。建议开启
语法 | sendfile on|off; |
默认值 | sendfile off; |
位置 | http、server、location |
#开启高效文件传输模式。 #sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
#sendfile()在磁盘和TCP端口(或者任意两个文件描述符)之间复制数据。
#sendfile()直接从磁盘上读取数据到操作系统缓冲,因此会更有效率。
sendfile on;
(4)tcp_nopush
该指令必须在sendfile打开的状态下才会生效,主要是用来提升网络包的传输’效率’
(5)keepalive_timeout
用来设置长连接的超时时间,单位是秒
为什么要使用keepalive?
:HTTP是一种无状态协议,客户端向服务端发送一个TCP请求,服务端响应完毕后断开连接。如果客户端向服务端发送多个请求,每个请求都需要重新创建一次连接,效率相对来说比较低,使用keepalive模式,可以告诉服务器端在处理完一个请求后保持这个TCP连接的打开状态,若接收到来自这个客户端的其他请求,服务端就会利用这个未被关闭的连接,而不需要重新创建一个新连接,提升效率,但是这个连接也不能一直保持,这样的话,连接如果过多,也会是服务端的性能下降,这个时候就需要我们进行设置其的超时时间。
语法 | keepalive_timeout time; |
默认值 | keepalive_timeout 65s; |
位置 | http、server、location |
(6)keep alive_requests
用来设置一个keep-alive 连接使用的次数
语法 | keepalive_requests number; |
默认值 | keepalive_requests 100; |
位置 | http、server、location |
(7)tcp_nodelay
该指令必须在keep-alive连接开启的情况下才生效,来提高网络包传输的’实时性’
(8)gzip 模块设置
用于设置开启或者关闭gzip模块,“gzip on”表示开启GZIP压缩,实时压缩输出数据流;
常用模块:ngx_http_gzip_module模块、ngx_http_gzip_static_module模块、ngx_http_gunzip_module模块
# 以下指令均来自ngx_http_gzip_module模块
#开启gzip压缩输出,默认值:off
gzip on;
#该指令用于设置使用Gzip进行压缩发送是否携带“Vary:Accept-Encoding”头域的响应头部。主要是告诉接收方,所发送的数据经过了Gzip压缩处理
gzip_vary on;
#不启用压缩的条件,IE6对Gzip不友好,所以不压缩
gzip_disable "msie6"
# 该指令在nginx使用反向代理的时候起作用,是否压缩取决于请求头中的“Via”字段,指令中可以同时指定多个不同的参数。根据请求和响应来决定启用或禁用对代理请求的响应的压缩
# (1)off:禁用对所有代理请求的压缩
# (2)expired:当响应头中包含过期时间时,启用压缩
# (3)no-cache:当响应头的Cache-Control字段为no-cache时,启用压缩
# (4)no-store:当响应头的Cache-Control字段为no-store时,启用压缩
# (5)private:当响应头的Cache-Control字段为no-store时,启用压缩
# (6)no_last_modified:当响应头不包含响应最后修改时间字段时,启用压缩。
# (7)no_etag:当想用头中不包含被请求变量的实体值时,启用压缩
# (8)auth:当响应头包含用于授权http证书的Authorization字段时,启用压缩
# (9)any:所有代理请求开启压缩。
gzip_proxied any;
#该指令针对传输数据的大小,可以选择性地开启和关闭Gzip功能
gzip_min_length 1k;
#用于处理请求压缩的缓冲区数量和大小
#语法 gzip_buffers number size;
#默认值:gzip_buffers 32 4k|16 8k;
#其中number:指定Nginx服务器向系统申请缓存空间个数,
#size指的是每个缓存空间的大小。
#主要实现的是申请number个每个大小为size的内存空间。这个值的设定一般会和服务器的操作系统有关,所以建议此项不设置,使用默认值即可。
gzip_buffers 4 64k;
#压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_http_version 1.0;
#压缩等级 1-9 等级越高,压缩效果越好,节约宽带,但CPU消耗大,1表示程度最低,但效率最高。9刚好相反,压缩程度最高,但是效率最低浪费时间。
gzip_comp_level 6;
#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。所选择的值可以从mime.types文件中进行查找,也可以使用"*"代表所有。
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
示例:
gzip on; # 开启gizp功能
gzip_comp_level 6; # gzip压缩级别(不建议设置过大,过大值,不会对文件压缩有太大提升,但是会浪费cpu资源)
gzip_buffers 4 64k;
gzip_min_length 1K; # 缓存空间大小
gzip_vary on; # 网响应头信息中添加压缩标识
gzip_disable "MSIE [1-6]\." ; # 对IE6以下的版本都不进行压缩(低版本浏览器肯能不支持压缩,会造成乱码,使用该指令进行排除)
gzip_proxied any; # nginx作为反向代理压缩服务端返回数据的条件
gzip_types text/plain application/javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/pdf;
(9)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;
(10)upstream 负载均衡模块和 server 虚拟主机模块 会单独拿出一篇文章解释,再次不做详解
(11)浏览器缓存的执行流程
HTTP协议中和页面缓存相关的字段
header | 说明 |
Expires | 缓存过期的日期和时间 |
Cache-Control | 设置和缓存相关的配置信息 |
Last-Modified | 请求资源最后修改时间 |
ETag | 请求变量的实体标签的当前值,比如文件的MD5值 |
(1)用户首次通过浏览器发送请求到服务端获取数据,客户端是没有对应的缓存,所以需要发送request请求来获取数据;
(2)服务端接收到请求后,获取服务端的数据及服务端缓存的允许后,返回200的成功状态码并且在响应头上附上对应资源以及缓存信息;
(3)当用户再次访问相同资源的时候,客户端会在浏览器的缓存目录中查找是否存在响应的缓存文件
(4)如果没有找到对应的缓存文件,则走(2)步
(5)如果有缓存文件,接下来对缓存文件是否过期进行判断,过期的判断标准是(Expires)
(6)如果没有过期,则直接从本地缓存中返回数据进行展示
(7)如果Expires过期,接下来需要判断缓存文件是否发生过变化
(8)判断的标准有两个,一个是ETag(Entity Tag),一个是Last-Modified
(9)判断结果是未发生变化,则服务端返回304,直接从缓存文件中获取数据
(10)如果判断是发生了变化,重新从服务端获取数据,并根据缓存协商(服务端所设置的是否需要进行缓存数据的设置)来进行数据缓存。
expires 指令 指定过期时间。使用较多
默认值:expires off;
示例:
#所有扩展名以.gif、.jpg、.jpeg、.png、.bmp、.swf结尾的静态文件都交给nginx处理,而expires用来指定静态文件的过期时间,这里是30天。
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
root /test/www.test.com;
expires 30d;
}
#以下这段设置是将upload和html下的所有文件都交给nginx来处理,当然,upload和html目录包含在/web/test/www.test.com目录中。
location ~ ^/(upload|html)/ {
root /web/test/www.test.com;
expires 30d;
}
(12)add_header
是用来添加指定的响应头和响应值
#允许跨域访问的域名,可以是一个域的列表,也可以是通配符*
add_header Access-Control-Allow-Origin *;
#是否允许请求带有验证信息
add_header Access-Control-Allow-Credentials true;
#允许使用的请求方法,以逗号隔开
add_header Access-Control-Allow-Methods 'POST,GET,OPTIONS,PUT,DELETE';
# 设置内容安全策略(CSP)
add_header Content-Security-Policy "default-src 'self'";
#允许脚本访问的返回头
add_header Access-Control-Allow-Headers 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With,Pragma,Date,x-timestamp';
#用来指定本次预检请求的有效期,单位为秒
#add_header 'Access-Control-Max-Age' 1728000;