Nginx配置文件主要分成四部分:main(全局设置)、server(主机设置)、upstream(上游服务器设置,主要为反向代理、负载均衡相关配置)和 location(URL匹配特定位置后的设置),每部分包含若干个指令。
main 部分设置的指令将影响其它所有部分的设置;
server 部分的指令主要用于指定虚拟主机域名、IP和端口;
虚拟主机,在Web服务里就是一个独立的网站站点,这个站点对应独立的域名(也可以是IP或端口);
Nginx中使用一个 server { } 标签来标示一个虚拟主机;
一个Web服务里可以有多个虚拟主机标签对,即可以同时支持多可虚拟主机站点;
有基于域名的虚拟主机、基于端口的虚拟主机、基于IP的虚拟主机;
虚拟主机还可有多个别名;
upstream 的指令用于设置一系列的后端服务器,设置反向代理及后端服务器的负载均衡;
location 部分用于匹配网页位置(比如,根目录“/”,“/images”,等等)。
他们之间的关系式:server继承main,location继承server;upstream既不会继承指令也不会被继承。它有自己的特殊指令,不需要在其他地方的应用。
...... #全局块
events { #events块
}
http { #http块
server { #server块
location { #location块
}
location {
}
}
upstream {
}
server {
}
}
全局块:配置影响Nginx全局的指令。一般有运行Nginx服务器的用户组,Nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成Worker Process数等。
events块:配置影响Nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网络连接,开启多个网络连接序列化等。
http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,链接超时时间,单连接请求数等。
server块:配置虚拟主机的相关参数,一个http中可以有多个server。
location块:配置请求的路由,以及各种页面的处理情况。
我的虚拟机上面的默认配置如下如所示:
main全局配置:
nginx在运行时与具体业务功能(比如http服务或者email服务代理)无关的一些参数,比如工作进程数,运行的身份等。
user nginx; #配置用户或者组
worker_processes; #允许生成的进程数
error_log; #日志文件目录
pid; #指定Nginx进程文件的存放位置
events块:
配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
worker_connections; #最大连接数
use epoll; #事件驱动模型
http块:
与提供http服务相关的一些配置参数。例如:是否使用keepalive啊,是否使用gzip进行压缩等。
default_type; #默认文件类型
log_format; #自定义格式
1.$remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址;
2.$remote_user :用来记录客户端用户名称;
3.$time_local : 用来记录访问时间与时区;
4.$request : 用来记录请求的url与http协议;
5.$status : 用来记录请求状态;成功是200;
6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;
7.$http_referer :用来记录从那个页面链接访问过来的;
8.$http_user_agent :记录客户端浏览器的相关信息;
所有日志段以空格分割,一行可以纪录多个;
Nginx访问日志轮询切割:
默认情况Nginx会把所有的访问日志生成到一个指定的访问日志文件access.log里,但这样一来,时间长了就会导致日志个头很大,不利用日志的分析和处理。因此,有必要对Nginx日志,按天或小时进行切割,使其分成不同的文件保存;
现在Nginx是自动切割日志;
sendfile on;
开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,减少用户空间到内核空间的上下文切换。对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。
keepalive_timeout 65;
长连接超时时间,单位是秒,这个参数很敏感,涉及浏览器的种类、后端服务器的超时设置、操作系统的设置,可以另外起一片文章了。长连接请求大量小文件的时候,可以减少重建连接的开销,但假如有大文件上传,65s内没上传完成会导致失败。如果设置时间过长,用户又多,长时间保持连接会占用大量资源。
send_timeout;
用于指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。
client_max_body_size 10m;
允许客户端请求的最大单文件字节数。如果有上传较大文件,请设置它的限制值
client_body_buffer_size 128k;
缓冲区代理缓冲用户端请求的最大字节数
gzip on; #开启gzip压缩输出,减少网络传输。
include 文件映射
server块:
http服务上支持若干虚拟主机。每个虚拟主机一个对应的server配置项,配置项里面包含该虚拟主机相关的配置。在提供mail服务的代理时,也可以建立若干server。每个server通过监听地址或端口来区分。
listen; #监听端口,默认80
server_name; #服务器名,如localhost、www.xxxxx.com,可以通过正则匹配
location块:
http服务中,某些特定的URL对应的一系列配置项。
root /dir/path/file; #定义服务器的默认网站根目录位置,如果location的url匹配的是子目录或文件,root 没什么作用,一般放在server指令里面或 / 下
index index.html index.html; #定义路径下默认访问的文件名,一般跟着root放
proxy_pass http://127.0.0.1; #请求转向127.0.0.1定义的服务器列表,即反向代理,对应upstream负载均衡器,还可以是 http://ip:port
其他:
访问控制 allow/deny
allow 111.111.111.111;
allow 192.168.1.0/24;
deny all;
提示:在启动或重启服务前检查Nginx语法非常重要,可以防止因配置错误导致网站重启或重新加载配置等对用户的影响。
nginx -t
每次更改Nginx的配置都需要管理员重新加载,是配置生效,这是因为Nginx在启动时已经把所有的配置信息都加在到内存中了,若更改了磁盘上的 .conf 配置文件,需要把新的配置重新加载到内存中,使其生效。这样设计的目的是大服务提升Nginx服务的访问性能。