nginx配置详解(一)
nginx简介
Nginx的核心模块为Main和Events,此外还包括标准HTTP模块、可选HTTP模块和邮件模块,其还可以支持诸多第三方模块。Main用于配置错误日志、进程及权限等相关的参数,Events用于配置IO模型,如epoll、kqueue、select或poll等,它们是必备模块。
Nginx的主配置文件由几个段组成,这个段通常也被称为nginx的上下文,每个段的定义格式如下所示。需要注意的是,其每一个指令都必须使用分号(;)结束,否则为语法错误。
<section> {
<directive> <parameters>;
}
常用main模块配置参数
- error_log 用于配置错误日志,可用于main、http、server及location上下文中
语法格式:
error_log file | stderr [ debug | info | notice | warn | error | crit | alert | emerg ]
备注:
要禁用错误日志,不能使用“error_log off;”,而要使用类似如下选项:
error_log /dev/null crit;
- timer_resolution 用于降低gettimeofday()系统调用的次数。默认情况下,每次从kevent()、epoll、/dev/poll、select()或poll()返回时都会执行此系统调用
语法格式:
timer_resolution interval
例如:
timer_resolution 100ms;
- worker_cpu_affinity 通过sched_setaffinity()将worker绑定至CPU上,只能用于main上下文
语法格式:
worker_cpu_affinity cpumask ...
例如:
worker_processes 2;
worker_cpu_affinity 0001 0010 ;
- worker_priority 为worker进程设定优先值,默认为0
语法格式:
worker_priority number
- worker_processes worker进程是单线程进程。如果Nginx用于CPU密集型的场景中,如SSL或gzip,且主机上的CPU个数至少有2个,那么应该将此参数值设定为与CPU核心数相同;如果Nginx用于大量静态文件访问的场景中,且所有文件的总大小大于可用内存时,应该将此参数的值设定得足够大以充分利用磁盘带宽。
此参数与Events上下文中的work_connections变量一起决定了maxclient的值:
maxclients = work_processes * work_connections
- worker_rlimit_nofile 设定worker进程所能够打开的文件描述符个数的最大值
语法格式:
worker_rlimit_nofile number
常用events模块配置
- worker_connections 设定每个worker所处理的最大连接数,它与来自main上下文的worker_processes一起决定了maxclients的值
- use 在有着多于一个的事件模型IO的应用场景中,可以使用此指令设定nginx所使用的IO机制,默认为./configure脚本选定的各机制中最适用当前OS的版本
语法格式:
use [ kqueue | rtsig | epoll | /dev/poll | select | poll | eventport ]
- 配置实例
user nginx;
worder_processes 8;
error_log /var/log/nginx/error.log
pid /var/run/nginx.pid
events {
use epoll;
worker_connections 2048;
}
http服务的相关配置
- 主要可以分为如下几个类别
客户端类指令:如client_body_buffer_size、client_header_buffer_size、
client_header_timeout和keepalive_timeout等;
文件IO类指令:如aio、directio、open_file_cache、open_file_cache_min_uses、
open_file_cache_valid和sendfile等;
hash类指令:用于定义Nginx为某特定的变量分配多大的内存空间,如types_hash_bucket_size、
server_names_hash_bucket_size和variables_hash_bucket_size等;
套接字类指令:用于定义Nginx如何处理tcp套接字相关的功能,如tcp_nodelay(用于keepalive功能启
用时)和tcp_nopush(用于sendfile启用时)等;
虚拟服务器相关配置
server {
<directive> <parameters>;
}
用于定义虚拟服务器相关的属性,常见的指令有backlog、rcvbuf、bind及sndbuf等。
location相关的配置
location [modifier] uri {…} 或 location @name {…}
通常用于server上下文中,用于设定某URI的访问属性。location可以嵌套。
反向代理配置
proxy_connect_timeout:nginx将一个请求发送至upstream server之前等待的最大时长;
proxy_cookie_domain:将upstream server通过Set-Cookie首部设定的domain属性修改为指定的
值,其值可以为一个字符串、正则表达式的模式或一个引用的变量;
proxy_cookie_path: 将upstream server通过Set-Cookie首部设定的path属性修改为指定的值,其
值可以为一个字符串、正则表达式的模式或一个引用的变量;
proxy_hide_header:设定发送给客户端的报文中需要隐藏的首部;
proxy_pass:指定将请求代理至upstream server的URL路径;
proxy_set_header:将发送至upsream server的报文的某首部进行重写;
proxy_redirect:重写location并刷新从upstream server收到的报文的首部;
proxy_send_timeout:在连接断开之前两次发送至upstream server的写操作的最大间隔时长;
proxy_read_timeout:在连接断开之前两次从接收upstream server接收读操作的最大间隔时长;
反向代理配置实例
proxy_redirect off; 不重写url
proxy_set_header Host $host; 将头部进行转发
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 30;
proxy_send_timeout 15;
proxy_read_timeout 15;
upstream模块
- 常用指令
ip_hash:基于客户端IP地址完成请求的分发,它可以保证来自于同一个客户端的请求始终被转发至同一
个upstream服务器;
upstream模块的负载均衡算法主要有三种,轮调(round-robin)、ip哈希(ip_hash)和最少连接(least_conn)三种
keepalive:每个worker进程为发送到upstream服务器的连接所缓存的个数;
least_conn:最少连接调度算法;
server:定义一个upstream服务器的地址,还可包括一系列可选参数,如:
weight:权重;
max_fails:最大失败连接次数,失败连接的超时时长由fail_timeout指定;
fail_timeout:等待请求的目标服务器发送响应的时长;
backup:用于fallback的目的,所有服务均故障时才启动此服务器;
down:手动标记其不再处理任何请求;
- 实例
upstream backend {
server www.wyx.com weight=5;
server www2.wyx.com:8081 max_fails=3 fail_timeout=30s;
}