一、配置文件结构
#全局块
...
#events块
events {
...
}
#stream块,可以有多个upstream,server块
stream {
#upstream块,供负载均衡使用
upstream name{
...
}
#server块,不包含location块
server {
...
}
}
#http块,一个http块可以有多个upstream,server块
http {
#http全局块
...
#upstream块,供负载均衡使用
upstream name{
...
}
#server块,一个server块可以有多个location块
server {
#server全局块
...
#location块
location {
...
}
}
}
二、配置文件的基础配置指令
##运行nginx进程的用户及用户组,只有被设置的用户和用户组才有权限运行nging进程
##语法: user username[groupname], 默认: user nobody; worker 的用户为 nobody,Master 的用户为 root
##若用户在configure执行命令时,使用了参数--user=usergroup 和 --group=groupname,此时nginx.conf将使用参数中指定的用户和用户组
user nobody;
##工作进程数,默认1,通常是CPU数量或者CPU数量的2倍
##设置为auto时nginx进程自动检测,根据CPU数量调整
worker_processes auto;
##全局错误日志存放路径和名称,日志记录级别: [debug|info|notice|warn|error|crit|slter|emerg],默认error
##此处使用的是相对路径,相对nginx的安装目录
##可以在全局块、http块、server块、以及location块中配置
error_log logs/error.log info;
##PID文件位置
pid logs/nginx.pid;
##一个nginx work进程打开的最多文件描述符数目
##理论值为最多打开文件数(ulimit -n)与nginx进程数相除,建议与ulimit -n 的值保持一致
worker_rlimit_nofile 65535;
###events块设置###
events {
##单个worker进程的最大连接数
##nginx的最大连接数=worker_processes*worker_connections
worker_connections 1024;
##每个worker进程同时接收多个新连接
##默认off,每个worker进程每次只接受一个新连接
multi_accept on;
##use [kqueue|rtsig|epoll|/dev/poll|select|poll]
##Linux 2.6以上版本使用epoll,FreeBSD使用kqueue,window不指定
use epoll;
}
http {
##文件扩展名与文件类型映射表
include mime.types;
##默认文件类型
default_type application/octet-stream;
##日志格式设置,main为日志格式的名字,只能在http块配置
##$remote_addr: 客户端ip地址
##$http_x_forwarded_for: 记录客户端真实ip
##$remote_user: 客户端用户名称
##$time_local: 访问时间与时区
##$request: 请求的url与http协议
##$status: 请求状态
##$body_bytes_sent: 发送给客户端文件主体内容大小
##$http_referer: 从哪个页面链接访问过来的
##$http_user_agent: 客户端浏览器的相关信息
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
##nginx访问日志,main为log_format设置的日志格式名字
##与log_format配合使用,可以在http块,server块和location块中配置
access_log logs/access.log main;
##开启高效传输模式,将文件的回写过程交给数据缓冲,而不是放在应用中
##可以在http块,server块和location块中配置
sendfile on;
##一个数据包中发送所有头文件,而不是单独发,防止网络阻塞,需要开启sendfile
tcp_nopush on;
##不缓存数据,而是立即发送数据,防止网络阻塞,需要开启sendfile
tcp_nodelay on;
##与客户端建立连接后,保持连接(即长连接)的最长时间,单位是秒(默认75s)
keepalive_timeout 90;
##开启gzip压缩输出,默认off
gzip on;
##隐藏nginx版本号
server_tokens off;
###服务器主机配置,一个http中可以配置多个server###
server {
##监听的本机端口
listen 80;
##监听的主机名或IP或域名
##后面可以跟多个主机名称,处理HTTP请求时,nginx会取出header头中的Host,与每个server中的server_name进行匹配,以此决定到底由那一个server来处理这个请求
##有可能一个Host与多个server块中的server_name都匹配,这时会根据匹配优先级来选择实际处理的server块
server_name localhost;
#编码,默认koi8-r
charset koi8-r;
#日志
access_log /var/log/nginx/host.access.log main;
error_log logs/error.log;
#匹配规则
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#404 返回页面
error_page 404 /404.html;
#其他错误代码返回页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
三、配置文件其他常用的配置指令
一)客户端相关配置指令
属于ngx_http_core_module模块,可在http块、server块、location块中设置
更多详情请参考官网:http://nginx.org/en/docs/http/ngx_http_core_module.html
#指定客户端请求主体缓冲区的大小,若请求主体大于缓冲区,那么整个请求主体或某些部分都将写入临时文件中
#默认大小等于两个页面大小,具体取决于平台是8K还是16K
client_body_buffer_size 16k;
#客户端请求正文的临时文件的存放目录,默认client_body_temp
client_body_temp_path [level1 [level2 [level3]]];
#读取客户端请求主体的超时时间,单位s,默认60s
#仅在两次连续读取操作之间的一段时间内设置超时,而不是为整个请求主体的传输设置超时
#如果客户端在此时间内未传输任何内容,则nginx请求终止并返回408(即请求超时)错误
client_body_timeout 60;
#客户端请求头的缓冲区大小,默认1K
#请求头超过该值时,使用指令large_client_header_buffers设置更大缓冲区的大小
client_header_buffer_size 32k;
#大型客户端请求中请求头缓存区个数和每个区的大小,默认 4 8k
large_client_header_buffers 4 32k;
#读取客户端请求头超时时间,单位s,默认60s
##如果客户端在此时间内未传输请求头,则nginx请求终止并返回408(即请求超时)错误
client_header_timeout 60;
#客户端请求的最大主体大小,默认1MB
#如果请求中主体的大小超过配置的值,则会向客户端返回413(请求实体太大)错误
#为0时将禁用客户端请求主体大小的检查
client_max_body_size 1m;
#与客户端建立连接后,保持连接(即长连接)的最长时间,单位s,默认75s
keepalive_timeout 75s;
#与客户端建立连接后,客户端发送请求的最大次数,当最大请求次数达到时,连接被关闭,默认100
#使用过多的最大请求数可能会导致过多的内存使用
keepalive_requests 100;
#响应客户端时间,Nginx发送数据到客户端的超时时间,单位s,默认60s
#仅在两个连续的写操作之间设置,而不用于传输整个响应
#如果客户端在此时间内未收到任何信息,则连接将关闭
send_timeout 60;
二)gzip压缩相关配置指令
属于ngx_http_gzip_module模块,可在http块,server块,location块中设置,一般在http块中设置
更多详情请参考官网: http://nginx.org/en/docs/http/ngx_http_gzip_module.html
#开启gzip压缩输出,默认off
gzip on;
#压缩缓冲区的个数和每个区的大小
#默认情况下,缓冲区大小等于一个内存页。根据平台的不同,它可以是4K或8K
gzip_buffers 16 8k;
#压缩等级,1-9,等级越高,压缩效果越好,节约宽带,但CPU消耗大,默认为1
gzip_comp_level 1;
#压缩所需的最低HTTP版本请求
#默认1.1,前端如果是squid2.5请使用1.0
gzip_http_version 1.1;
#允许压缩的页面的最小字节数,默认20
gzip_min_length 1024;
#要压缩文件的类型,默认text/html
#无论是否指定,"text/html"类型总会被压缩
gzip_types text/plain application/x-javascript text/css application/xml;
#如果gzip,gzip_static,gunzip开启,是否启用 "Vary: Accept-Encoding" 响应头部字段,默认off
gzip_vary on;
三)FastCGI相关配置指令
属于ngx_http_fastcgi_module模块,允许将请求传递到FastCGI服务器
可在http块,server块,location块中设置
更多详情请参考官网: http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html
配置示例:
location / {
fastcgi_pass localhost: 9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
}
指令:
#读取从FastCGI服务器接收到的响应的第一部分的缓冲区的大小
#默认情况下,缓冲区大小等于一个内存页。根据平台的不同,它可以是4K或8K
fastcgi_buffer_size 4k;
#启用或禁用来自FastCGI服务器的响应缓冲,默认on
fastcgi_buffering on;
#从FastCGI服务端收到的响应信息的缓冲区大小以及缓冲区数量
#认情况下,一个缓冲区的大小相当于一个页面的大小。根据平台的不同设置为4K/8K
fastcgi_buffers 8 8k;
#系统很忙时可以使用的fastcgi_buffers大小
fastcgi_busy_buffers_size 16k;
#Nginx服务器和后端FastCGI服务器连接的超时时间,单位s,默认60s
fastcgi_connect_timeout 60s;
#从FastCGI服务端读取响应信息的超时时间,单位s,默认60s
#超时仅在两次连续的读取操作之间设置,而不用于传输整个响应
#如果FastCGI服务器在此时间内未传输任何内容,则连接将关闭
fastcgi_read_timeout 60s;
#传递给FastCGI服务器的参数
#parameter: 传递的参数
#value: 参数值,可以是字符串、变量及其它们的组合
fastcgi_param parameter value;
#请求传输到FastCGI服务端的超时时间,单位s,默认60s
#超时仅在两个连续的写操作之间设置,而不用于整个请求的传输
#如果FastCGI服务器在此时间内未收到任何信息,则连接将关闭
fastcgi_send_timeout 60s;
#整个响应都无法放入由fastcgi_buffer_size和fastcgi_buffers 伪指令设置的缓冲区中,则可以将一部分响应保存到临时文件中,默认1024m
#需要设置fastcgi_buffering on;
fastcgi_max_temp_file_size 1024m;
#限制每次写入临时文件的数据量的大小
#需要设置fastcgi_buffering on;
fastcgi_temp_file_write_size 6k;
#从FastCGI服务器接收到数据存放的临时文件,默认fastcgi_temp
fastcgi_temp_path fastcgi_temp;
四)upstream相关配置指令
属于ngx_http_upstream_module模块,仅可在stream模块中设置
更多详情请参考官网: http://nginx.org/en/docs/http/ngx_http_upstream_module.html
#负载均衡调度算法,轮询,默认,将请求传递到随机选择的服务器,同时考虑服务器的权重
random;
#负载均衡调度算法,key可以包含文本,变量,以及它们的组合
hash key [consistent];
#负载均衡调度算法,每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题
ip_hash;
#后端服务器组,address可以是ip:port,域名
#parameters支持如下参数:
#weight=number: 请求发送到后端服务器的权重比,默认1
#max_conns=number: 后端服务器的最大连接数量,默认值为零,表示没有限制
#max_fails: 与后端服务器连接失败的最大重连次数,默认1
#fail_timeout: 与后端服务器连接失败后重新发起请求的时间,默认10
#backup: 备份服务器,其它所有的非backup机器不可用时,请求backup机器,此台机器压力最轻
#down: 标记服务器为不可用
server address [parameters];
#定义共享zone的name和size,以保留在工作进程之间共享的组的配置和运行时状态
zone name size;
#设置后端服务器与nginx work进程之间保持连接的最大空闲数量
#当这个数量被突破时,使用最少的连接将被关闭
keepalive 1000;
五)反向代理相关配置指令
属于ngx_http_proxy_module模块,可在http块,server块,location块中设置
更多详情请参考官网: http://nginx.org/en/docs/http/ngx_http_proxy_module.html
1 proxy buffer(代理缓冲)相关配置指令
代理缓冲的作用以及过程:
实现了被代理服务器与客户端的异步响应
启用代理服务器缓冲后,nginx服务器首先会尽可能的从被代理服务器那里收取响应数据,将其保存到buffer中,buffer的大小由 proxy_buffer_size 指令和 proxy_buffers 指令决定;
如果在接收过程中,发现buffer没有足够大小来接收一次响应的数据,nginx服务器会将部分接收到的数据临时存放到磁盘的临时文件中;
磁盘上的临时文件路径由 proxy_temp_path 指令设置,临时文件每次写入大小和总大小由 proxy_max_temp_file_size 指令和 proxy_temp_file_write_size 指令决定;
一次响应数据被接收完成或者buffer已经装满,nginx服务器开始向客户端传输数据;
每个bufter装满数据后,在从开始向客户端发送一直到buffer中的数据全部传输给客户端的整个过程中,它都处于BUSY状态,期间对它进行的其他操作都会失败;
同时处于BUSY状态的buffer总大小由 proxy_busy_buffers_size 指令限制,不能超过该指令设置的大小
当代理缓冲关闭时,nginx服务器只要接收到响应数据就会同步地传递给客户端
指令:
#是否启用代理服务器响应缓冲,默认on
proxy_buffering on;
#从被代理服务器接收一次响应数据的缓冲区的个数和每个buffer的大小,总大小=num*size
#默认情况下,每个缓冲区大小等于一个内存页。根据平台的不同,它可以是4K或8K
proxy_buffers 8 8k;
#用于读取从代理服务器接收到的响应的第一部分的缓冲区的大小
#默认情况下,缓冲区大小等于一个内存页。根据平台的不同,它可以是4K或8K
proxy_buffer_size 8k;
#BUSY状态下的缓冲区的总大小,默认8K或16K
proxy_busy_buffers_size size;
#存放从被代理服务器接收到的数据的临时文件
#path: 临时文件路径
#level: 在path下的第几级目录下存放临时文件,level_1表示path目录下名字长度为level_1的一级目录,level_2表示path目录下名字长度为level_2的二级目录
proxy_temp_path path [level_1 [level_2]];
#每次写入临时文件的数据大小
proxy_temp_file_write_size 16k;
#临时文件的总大小,默认1024M
proxy_max_temp_file_size 1024m;
2 proxy cache(代理缓存)相关配置指令
代理缓存的作用以及过程:
实现了nginx服务器对客户端请求的快速响应,减少响应时间
nginx服务器一方面通过proxy buffer机制将数据异步传递给客户端,另一方面根据proxy cache机制将这些数据缓存到本地硬盘上;
当客户端下次重新访问相同的数据时,nginx服务器直接从硬盘检索到对应的数据返回给客户端,从而减少与被代理服务器的响应时间
proxy cache机制依赖于proxy buffer机制,只有在proxy buffer机制启用的时候proxy cache才会生效
指令:
#启动proxy cache,默认关闭,zone是使用的共享空间的名称,对应proxy_cache_path指令的keys_zone的值
proxy_cache zone(off);
#缓存时的密钥,支持nginx内置变量,默认$scheme $proxy_host $request_uri;
proxy_cache_key $scheme $proxy_host $request_uri;
#当客户端向被代理服务器发送相同请求到达number次后,nginx服务器才会对该请求的响应数据做缓存,number默认1
proxy_cache_min_uses 1;
#缓存存放目录
#path: 缓存存放路径,如/app/nginx_cachedata
#levels=1:2: 设置目录结构,表示path下还有两级目录
#keys_zone: 设置缓存空间的名称和大小,如keys_zone=cachedata: 500m
#inactive: 缓存内容的有效期,超过有效期自动清除缓存,如inactive=7d
#max_size: 缓存空间的最大值,达到最大值时,回一次删除访问量最少的缓存内容,如max_size=10g
#use_temp_path: 默认on,表示缓存数据会首先写入临时文件,写完后重命名并保存到缓存路径下。若为 off,则nginx会将缓存文件直接写入指定的缓存目录,而不使用proxy_temp_path指定的临时存储路径
proxy_cache_path path levels=1:2 keys_zone=name:size inactive=time max_size=size use_temp_path=on;
#根据返回的HTTP状态码设置缓存时间
proxy_cache_valid code time;
3 反向代理相关配置指令
#与被代理服务器建立连接的超时时间,单位s,默认60s
proxy_connect_timeout 60s;
#禁止指定请求头转发到被代理服务器
proxy_hide_header field;
#被代理服务器的HTTP协议版本,默认1.0
proxy_http_version 1.1;
#设置被代理服务器
proxy_pass URL;
#允许被禁止转发的请求头转发到被代理服务器
proxy_pass_header field;
#nginx向被代理服务器发送数据后,等待响应的超时时间,单位s,默认60s
#超时仅在两次连续的读取操作之间设置,而不用于传输整个响应
#如果代理服务器在此时间内未传输任何内容,则连接将关闭
proxy_read_timeout 60s;
#更改被代理服务器返回的响应头中的Location头域和Refresh头域
proxy_redirect off;
#nginx发送数据给被代理服务器的超时时间,默认60s
#超时仅在两个连续的写操作之间设置,而不用于整个请求的传输
#如果代理服务器在此时间内未收到任何信息,则连接将关闭
proxy_send_timeout 60s;
#重新定义传递给代理服务器的请求体
#value: 包含文本,变量,或者它们的组合
proxy_set_body value;
#在传递给代理服务器的请求标头中重新定义或附加字段
#field: 要传递的字段名
#value: 包含文本,变量,或者它们的组合
proxy_set_header field value;