抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

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
2
3
4
5
6
7
8
9
10
11

user nobody nobody;
worker_processes 2;
error_log logs/error.log notice;
pid logs/nginx.pid;
worker_rlimit_nofile 65535;
 
events{
use epoll;
worker_connections 65536;
}

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
http{
include conf/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
log_format download '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_range" "$sent_http_content_range"';
client_max_body_size 20m;
client_header_buffer_size 32K;
large_client_header_buffers 4 32k;
Sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 60;
client_header_timeout 10;
client_body_timeout 10;
send_timeout 10;
}

下面的代码实现对日志格式的设定:下面详细介绍下这段代码中每个配置选项的含义。

include

​ include是个主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度。类似于Apache中的include方法。

default_type

​ default_type属于HTTP核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置PHP环境时,Nginx是不予解析的,此时,用浏览器访问PHP文件就会出现下载窗口。

log_format

​ log_format是Nginx的HttpLog模块指令,用于指定Nginx日志的输出格式。main为此日志输出格式的名称,可以在下面的access_log指令中引用。

1
2
3
4
5
6
7
8
9
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';

log_format download '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_range" "$sent_http_content_range"';

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
2
3
4
built by gcc 8.2.1 20180905 (Red Hat 8.2.1-3) (GCC) 
built with OpenSSL 1.1.1 FIPS 11 Sep 2018 (running with OpenSSL 1.1.1c FIPS 28 May 2019)
TLS SNI support enabled
configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --with-http_gunzip_module --with-http_gzip_static_module .......

参数

1
2
3
4
5
6
7
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary 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
2
3
4
5
6
7
upstream cszhi.com{
ip_hash;
server 192.168.8.11:80;
server 192.168.8.12:80 down;
server 192.168.8.13:8009 max_fails=3 fail_timeout=20s;
server 192.168.8.146:8080;
}

负载均衡策略

​ 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
2
3
4
5
6
7
8
server{
listen 80;
server_name 192.168.8.18 cszhi.com;
index index.html index.htm index.php;
root /wwwroot/www.cszhi.com
charset gb2312;
access_log logs/www.ixdba.net.access.log main;
}

server

​ http服务上支持若干虚拟主机。每个虚拟主机一个对应的server配置项,配置项里面包含该虚拟主机相关的配置。在提供mail服务的代理时,也可以建立若干server。每个server通过监听地址或端口来区分。

root和alias

root的取值最好使用绝对路径。
root 指令可以放在 http、server 或 location 上下文的任何位置。

1
2
3
4
5
6
7
8
9
10
server {
root /www/data;
location / {
}
location /images/ {
}
location ~ \.(mp3|mp4) {
root /www/media;
}
}

​ 在此配置中,如果 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 *:80listen 127.0.0.1:80等形式。

default_server

设置默认主机,如果有这个参数,其他虚拟主机都不匹配将会匹配默认主机

1
2
3
4
5
server{
listen 80 default_server;
server_name 192.168.8.18 cszhi.com;
....
}

server_name

​ 服务器名,如localhost、www.example.com,可以通过正则匹配。

Charset

​ 用于 设置网页的默认编码格式。

access_log

​ 用来指定此虚拟主机的访问日志存放路径,最后的main用于指定访问日志的输出格式。

评论