nginx配置详解(一)


nginx简介

Nginx的核心模块为Main和Events,此外还包括标准HTTP模块、可选HTTP模块和邮件模块,其还可以支持诸多第三方模块。Main用于配置错误日志、进程及权限等相关的参数,Events用于配置IO模型,如epoll、kqueue、select或poll等,它们是必备模块。
Nginx的主配置文件由几个段组成,这个段通常也被称为nginx的上下文,每个段的定义格式如下所示。需要注意的是,其每一个指令都必须使用分号(;)结束,否则为语法错误。

<section> {
		<directive> <parameters>;
	}

常用main模块配置参数

  1. 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;
  1. timer_resolution 用于降低gettimeofday()系统调用的次数。默认情况下,每次从kevent()、epoll、/dev/poll、select()或poll()返回时都会执行此系统调用
语法格式:
 timer_resolution interval

 例如:
 timer_resolution  100ms;
  1. worker_cpu_affinity 通过sched_setaffinity()将worker绑定至CPU上,只能用于main上下文
语法格式:
 worker_cpu_affinity cpumask ...
 例如:
 worker_processes     2;
 worker_cpu_affinity 0001 0010 ;
  1. worker_priority 为worker进程设定优先值,默认为0
语法格式:
 worker_priority number
  1. worker_processes worker进程是单线程进程。如果Nginx用于CPU密集型的场景中,如SSL或gzip,且主机上的CPU个数至少有2个,那么应该将此参数值设定为与CPU核心数相同;如果Nginx用于大量静态文件访问的场景中,且所有文件的总大小大于可用内存时,应该将此参数的值设定得足够大以充分利用磁盘带宽。

此参数与Events上下文中的work_connections变量一起决定了maxclient的值:
maxclients = work_processes * work_connections

  1. worker_rlimit_nofile 设定worker进程所能够打开的文件描述符个数的最大值
语法格式:
 worker_rlimit_nofile number

常用events模块配置

  1. worker_connections 设定每个worker所处理的最大连接数,它与来自main上下文的worker_processes一起决定了maxclients的值
  2. use 在有着多于一个的事件模型IO的应用场景中,可以使用此指令设定nginx所使用的IO机制,默认为./configure脚本选定的各机制中最适用当前OS的版本
语法格式:
 use [ kqueue | rtsig | epoll | /dev/poll | select | poll | eventport ]
  1. 配置实例
user nginx;
 worder_processes 8;
 error_log /var/log/nginx/error.log
 pid /var/run/nginx.pid
 events {
 	use epoll;
 	worker_connections 2048;
 }

http服务的相关配置

  1. 主要可以分为如下几个类别
客户端类指令:如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模块

  1. 常用指令
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:手动标记其不再处理任何请求;
  1. 实例
upstream backend {
   server www.wyx.com weight=5;
   server www2.wyx.com:8081      max_fails=3  fail_timeout=30s;
 }