Nginx配置文件
配置文件结构
Nginx配置文件一般位于Nginx安装目录下的conf目录下。整个文件以block形式组合而成,每一个block都使用”{}”大括号来表示。block中可以嵌套其他block层级。其中main层是最高层次。
Nginx配置文件主要有4部分,main(全局设置)、server(主机设置)、upstream(上游服务器设置,主要为反向代理,负载均衡相关配置)和location(url匹配特定位置的设置),每部分包含若干指令。
Main部分的设置影响其他所有部分的设置;
Server部分主要用于指定虚拟机主机域名,ip和端口;
Upstream的指令用于设置一系列的后端服务器,设置反向代理及后端服务器的负载均衡;
Location部分用于匹配网页位置(如,跟目录“/”,”/images”等)。
它们之间的关系是,server继承main,location继承server,upstream既不会继承指令也不会被继承。
在这四个部分当中,每个部分都包含若干指令,这些指令主要包含Nginx的主模块指令、事件模块指令、HTTP核心模块指令,同时每个部分还可以使用其他HTTP模块指令,例如Http SSL模块、HttpGzip Static模块和Http Addition模块等。
配置文件
Nginx配置系统来自于Igor Sysoev使用Apache的经验。他认为可扩展的配置系统是web服务器的基础。当维护庞大复杂的包括大量的虚拟服务器、目录、位置和数据集等配置时,会遇到可伸缩性问题。对于一个相对大点的网站,系统管理员如果没有在应用层进行恰当的配置,那么这将会是一个噩梦。
所以,nginx配置为简化日常维护而设计,并且提供了简单的手段用于web服务器将来的扩展。
配置文件是一些文本文件,通常位于/usr/local/etc/nginx
或/etc/nginx
。主配置文件通常命名为nginx.conf
。为了保持整洁,部分配置可以放到单独的文件中,再自动地被包含到主配置文件。但应该注意的是,nginx目前不支持Apache风格的分布式配置文件(如.htaccess文件),所有和nginx行为相关的配置都应该位于一个集中的配置文件目录中。
Master进程启动时读取和校验这些配置文件。由于worker进程是从master进程派生的,所以可以使用一份编译好、只读的配置信息。配置信息结构通过常见的虚拟内存管理机制自动共享。
Nginx配置具有多个不同的上下文,如:main, http, server, upstream, location (以及用于邮件代理的 mail ) 等指令块。这些上下文不重叠,例如,一个location 指令块是不能放入main指令块中。并且,为了避免不必要的歧义,不存在一个类似于“全局web服务器”的配置。Nginx配置特意做的整洁和富有逻辑性,允许用户可以建立包含上千个指令的复杂的配置文件。在一次私人谈话中,Sysoev说:“全局服务器配置中的位置、目录和其他一些指令是Apache中我所不喜欢的特性,所以这就是不在nginx实现这些的原因。”
配置语法、格式和定义遵循一个所谓的C风格协定。这种构建配置文件的方法在开源软件和商业软件中有广泛的应用。通过设计,C风格配置很适合嵌套描述,富有逻辑性,易于创建、读取和维护,深受广大工程师喜欢。同时nginx的C风格配置也易于自动化。
虽然一些nginx配置指令看起来像Apahce配置的一部分,但是设置一个nginx实例是完全不同的体验。例如,虽然nginx支持重写规则,但是系统管理员要手工的转换Apache重写配置使之适合nginx风格。同样,重写引擎的实现也是不一样的。
通常来说,nginx设置也提供了几种原始机制的支持,对于高效的web服务器配置很有帮助。有必要简单了解下变量和try_files
指令,这些差不多是nginx所独有的。Nginx开发了变量用于提供附加的更强大的机制来控制运行时的web服务器配置。变量为快速赋值做了优化,并且在内部预编译为索引。赋值是按需计算的,例如,变量的值通常只在这个请求的生命周期中计算一次,而后缓存起来。变量可在不同的配置指令中使用,为描述条件请求处理行为提供了更多弹性。
try_files
指令对于用更适当的方式逐渐替换if 条件配置语句是很重要的,并且它设计用来快速高效的尝试不同的URI与内容之间的映射。总的来说,try_files
指令很好用,并且及其高效和有用。推荐读者完整的看看这个指令,并在任何能用的地方用上它。
nginx常见的配置文件及作用
配置文件 | 作用 |
---|---|
nginx.conf | nginx的基本配置文件 |
mime.types | MIME类型关联的扩展文件 |
fastcgi.conf | 与fastcgi相关的配置文件 |
proxy.conf | 与proxy相关的配置 |
sites.conf | 配置nginx提供的网站,包括虚拟主机 |
Nginx的全局配置
1 |
|
user
user是个主模块指令,指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行。
worker_processes
是个主模块指令,指定了Nginx要开启的进程数。每个Nginx进程平均耗费10M~12M内存。建议指定和CPU的数量一致即可。
error_log
是个主模块指令,用来定义全局错误日志文件。日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少。
pid
是个主模块指令,用来指定进程pid的存储文件位置。
worker_rlimit_nofile
用于绑定worker进程和CPU, Linux内核2.4以上可用。
events事件指令
events事件指令是设定Nginx的工作模式及连接数上限:
use
use是个事件模块指令,用来指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中。对于Linux系统,epoll工作模式是首选。
worker_connections
也是个事件模块指令,用于定义Nginx每个进程的最大连接数,默认是1024。最大客户端连接数由worker_processes和worker_connections决定,即Max_client=worker_processes*worker_connections。
在作为反向代理时,max_clients变为:max_clients = worker_processes * worker_connections/4。
进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -n 65536”后worker_connections的设置才能生效
HTTP服务器配置
Nginx对HTTP服务器相关属性的配置代码如下:
1 | http{ |
下面的代码实现对日志格式的设定:下面详细介绍下这段代码中每个配置选项的含义。
include
include是个主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度。类似于Apache中的include方法。
default_type
default_type属于HTTP核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置PHP环境时,Nginx是不予解析的,此时,用浏览器访问PHP文件就会出现下载窗口。
log_format
log_format是Nginx的HttpLog模块指令,用于指定Nginx日志的输出格式。main为此日志输出格式的名称,可以在下面的access_log指令中引用。
1 | log_format main '$remote_addr - $remote_user [$time_local] ' |
client_max_body_size
client_max_body_size用来设置允许客户端请求的最大的单个文件字节数;
client_header_buffer_size
client_header_buffer_size用于指定来自客户端请求头的headerbuffer大小。对于大多数请求,1K的缓冲区大小已经足够,如果自定义了消息头或有更大的Cookie,可以增加缓冲区大小。这里设置为32K;
large_client_header_buffers
large_client_header_buffers用来指定客户端请求中较大的消息头的缓存最大数量和大小, “4”为个数,“128K”为大小,最大缓存量为4个128K;
sendfile
sendfile参数用于开启高效文件传输模式。将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞;
keepalive_timeout
keepalive_timeout设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接;
client_header_timeout
client_header_timeout设置客户端请求头读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误;
client_body_timeout
client_body_timeout设置客户端请求主体读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误,默认值是60;
send_timeout
send_timeout指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。
HttpGzip模块配置
下面配置Nginx的HttpGzip模块。这个模块支持在线实时压缩输出数据流。
查看否安装了HttpGzip
1 | nginx -V |
通过nginx -V命令可以查看安装Nginx时的编译选项,由输出可知,我们已经安装了HttpGzip模块。
下面是HttpGzip模块在Nginx配置中的相关属性设置:
1 | built by gcc 8.2.1 20180905 (Red Hat 8.2.1-3) (GCC) |
参数
1 | gzip on; |
gzip
用于设置开启或者关闭gzip模块,“gzip on”表示开启GZIP压缩,实时压缩输出数据流;
gzip_min_length
设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值是0,不管页面多大都进行压缩。建议设置成大于1K的字节数,小于1K可能会越压越大;
gzip_buffers
表示申请4个单位为16K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果;
gzip_http_version
用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可;
gzip_comp_level
用来指定GZIP压缩比,1 压缩比最小,处理速度最快;9 压缩比最大,传输速度快,但处理最慢,也比较消耗cpu资源;
gzip_types
用来指定压缩的类型,无论是否指定,“text/html”类型总是会被压缩的;
gzip_vary
选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用Squid缓存经过Nginx压缩的数据。
负载均衡配置
下面设定负载均衡的服务器列表:
1 | upstream cszhi.com{ |
负载均衡策略
Nginx的负载均衡模块目前支持4种调度算法,下面进行分别介绍,其中后两项属于第三方的调度方法。upstream是Nginx的HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。
在上面的设定中,通过upstream指令指定了一个负载均衡器的名称cszhi.com。这个名称可以任意指定,在后面需要的地方直接调用即可。
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响;
Weight
指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下;
ip_hash
每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题;
fair
比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块;
url_hash
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。
负载均衡状态
在HTTP Upstream模块中,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:
注意,当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。
down
表示当前的server暂时不参与负载均衡;
backup
预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻;
max_fails
允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误;
fail_timeout
在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
server虚拟主机配置
建议将对虚拟主机进行配置的内容写进另外一个文件,然后通过include指令包含进来,这样更便于维护和管理。
1 | server{ |
server
http服务上支持若干虚拟主机。每个虚拟主机一个对应的server配置项,配置项里面包含该虚拟主机相关的配置。在提供mail服务的代理时,也可以建立若干server。每个server通过监听地址或端口来区分。
root和alias
root的取值最好使用绝对路径。
root 指令可以放在 http、server 或 location 上下文的任何位置。
1 | server { |
在此配置中,如果 URI 以 mp3 或 mp4 后缀结尾,Nginx 会在 /www/media/ 目录查找文件。否则在 /www/data 目录中查找。如果请求以 / 结尾,Nginx 会把这个请求当做一个目录请求,尝试找这个目录中的 index 文件。index 指令定义了 index 文件的文件名(默认使用 index.html 文件)。例如上面的配置,如果请求是 /images/some/path/,Nginx 会尝试寻找并返回文件 /www/data/images/some/path/index.html,如果文件不存在则返回 404。
index
默认文件
index表示默认的文件。index 指令中可以列出多个文件。Nginx 会按顺序查找文件并返回第一个找到的文件。
listen
监听端口,默认80,小于1024的要以root启动。可以为listen *:80
、listen 127.0.0.1:80
等形式。
default_server
设置默认主机,如果有这个参数,其他虚拟主机都不匹配将会匹配默认主机
1 | server{ |
server_name
服务器名,如localhost、www.example.com
,可以通过正则匹配。
Charset
用于 设置网页的默认编码格式。
access_log
用来指定此虚拟主机的访问日志存放路径,最后的main用于指定访问日志的输出格式。