Nginx配置及应用场景之基本配置

一、nginx.conf配置说明

主模块常用指令

  1. daemon
     含义:设置是否以守护进程模式运行
     语法:daemon on|off
     缺省:on
     示例:daemon off
     注意:生产环境(production mode)中不要使用daemon指令,这些选项仅
     用于开发测试(development mode)。
    
  2. debug_points
     含义:断点调试
     语法:debug_points [stop|abort]
     缺省:none
     示例:debug_points stop;
     注意:在Nginx内有一些assert断言,这些断言允许Nginx,配合调试器中断程序运行、
     停止或创建core文件。
    
  3. master_process
     含义:设置是否启用主进程
     语法:master_process on|off
     缺省:on
     示例:master_process off;
     注意:
     不要在生产环境(production mode)中使用master_process指令,
     这些选项仅用于开发测试(development mode)。
    
  4. error_log
     含义:指定错误日志文件
     语法:error_log file [debug|info|notice|warn|error|crit]
     缺省:${prefix}/logs/error.log
     示例:
     error_log /data/nginx/logs/error.log debug
     注意:	
     该命令并非只有在测试(或称为开发)模式下才可以使用,而是在编译时添加了--with-debug参数时,
     则可以使用error_log指令的额外参数,即:
     error_log file [debug_core|debug_alloc|debug_mutex|debug_event|
     debug_http|debug_imap];
    
  5. include
    含义:指定所要包含的Nginx配置文件
    
    语法:include <file|*>
    缺省:none
    示例:include vhosts/*.conf 或 include /home/michael/nginx/conf/nginx-main.conf
    注意:
    (1)include命令可以指定包含一个文件,比如第二个示例。也可以指定包含一个目录下的所有文件,
        比如第一个示例。	
    (2)指定的文件路径的基路径,由编译选项--prefix决定,如果编译时没有指定,
        则默认的路径是/usr/local/nginx。
    
  6. pid
     含义:指定存储进程ID(即PID)的文件。
     语法:pid <file>
     缺省:compile-time option Example
     示例:pid /var/log/nginx.pid;
     注意:可以使用命令kill -HUP cat /var/log/nginx.pid\ 对Nginx进行进程ID文件的重新加载。
    
  7. user
     含义:指定可以使用Nginx的用户	
     语法:user <user> [group]	
     缺省:nobody nobody(第一个nobody是user,第二个nobody是group)	
     示例:user spd spdev;
    
  8. worker_processes
     含义:指定worker进程数
     语法:worker_processes <number>	
     缺省:1		
     示例:worker_processes 4;	
     注意:最大用户连接数=worker进程数×worker连接数,
          即max_clients=worker_processes*worker_connections。
    
  9. worker_cpu_affinity
     含义:为worker进程绑定CPU。		
     语法:worker_cpu_affinity cpumask [cpumask...]		
     缺省:none
     示例:
     (1)如果有4个CPU,并且指定4个worker进程,则:
         worker_processes 4;
         worker_cpu_affinity 0001 0010 0100 1000;
     (2)如果有4个CPU,并且指定2个worker进程,则:
         worker_processes 2;
         worker_cpu_affinity 0101 1010;
    

    注意:只有Linux平台上才可以使用该指令。

  10. worker_rlimit_nofile
    含义:worker进程的file descriptor可以打开的最大文件数,最好与与ulimit -n的值保持一致。
    语法:worker_rlimit_nofile <number>;
    

事件模块(events)常用指令

  1. use
    语法:use [kqueue | rtsig | epoll | /dev/poll | select | poll | eventport];
    注意:如果在./configure的时候指定了不止一种事件模型,那么可以设置其中一个,告诉Nginx使用
    哪种事件模型。默认情况下,Nginx会在./configure时找出最适合系统的事件模型。
    
  2. worker_connections
    语法:worker_connection <number>;
    最大连接数的计算公式如下:	
    max_clients = worker_processes * worker_connections;
    
  3. accept_mutex

    含义:设置是否使用连接互斥锁进行顺序的accept()系统调用。 语法:accept_mutex <on|off>; 缺省:on 示例:accept_mutex off;

  4. accept_mutex_delay
    含义:设置获得互斥锁的最少延迟时间。	
    语法:accpet_mutex_delay <number of millisecs>		
    缺省:500ms		
    示例:accpet_mutex_delay 1000ms;
    
  5. debug_connection
    含义:设置指定的clients产生debug日志。		
    语法:debug_connection [ip|CIDR];	
    缺省:none		
    示例:debug_connection 172.16.44.96;	
    一段较完整的事件模块代码如下:	
    error_log /data/nginx/log/error.log;
    events {	
        debug_connection172.16.44.96;	
    }
    

HTTP模块常用指令

  1. alias
    含义:指定location使用的路径,与root类似,但不改变文件的跟路径,仅适用文件系统的路径。
    语法:alias <file-path | directory-path>		
    缺省:N/A		
    作用域:http.server.location	
    示例:		
    location /i/ {
        alias /home/michael/web/i/;		
    }		
    则请求 /i/logo.png 则返回 /home/michael/web/i/logo.png。	
    注意:	
    (1)替换路径时,可以使用变量。	
    (2)alias无法在正则的location中使用。如果有这种需求,则必须使用rewrite和root。
    
  2. client_body_in_file_only
    含义:指定是否将用户请求体存储到一个文件里。	
    语法:client_body_in_file_only <on | off>	
    缺省:off	
    作用域:http.server.location		
    示例:client_body_in_file_only on;	
    注意:	
    (1)该指令为on时,用户的请求体会被存储到一个文件中,但是请求结束后,该文件也不会被删除;
    (2)该指令一般在调试的时候使用。
    
  3. client_body_buffer_size
    含义:指定用户请求体所使用的buffer的最大值
    语法:client_body_buffer_size <size>	
    缺省:两个page的大小,一般为8k或16k	
    作用域:http.server.location	
    示例:client_body_buffer_size 512k;	
    注意:如果用户请求体超过了buffer的大小,则将全部内容或部分内容存储到一个临时文件中。
    
  4. client_body_temp_path
    含义:设置存储用户请求体的文件的目录路径
    语法:client_body_temp_path <directory path> [level1 | level2 | level3]		
    作用域:http.server.location		
    示例:client_body_temp_path /spool/nginx/client_temp 1 2;
    
  5. client_body_timeout
    含义:设置用户请求体的超时时间。
    语法:client_body_timeout <time>	
    作用域:http.server.location		
    示例:client_body_timeout 120s;	
    注意:只有请求体需要被1次以上读取时,该超时时间才会被设置。且如果这个时间后用户什么都没发,
    nginx会返回requests time out 408.
    
  6. client_header_buffer_size
    含义:设置用户请求头所使用的buffer大小	
    语法:client_header_buffer_size <size>		
    缺省:1k		
    作用域:http.server		
    示例:client_header_buffer_size 2k;	
    注意:
    (1)对绝大多数请求来说,1k足以满足请求头所需的buffer;		
    (2)对于携带有较大cookie或来自于wap用户的请求头来说,1k的buffer一般不够,这时可以使用指令
        large_client_header_buffers。
    
  7. client_header_timeout
    含义:设置用户请求头的超时时间。
    语法:client_header_timeout <time>		
    缺省:1m		
    作用域:http.server.location		
    示例:client_header_timeout 3m;		
    注意:只有请求头需要被1次以上读取时,该超时时间才会被设置。且如果这个时间后用户什么都没发,
         nginx会返回requests time out 408.
    
  8. client_max_body_size
    含义:设置所能接收的最大请求体的大小
    语法:client_max_body_size <size>		
    缺省:1m	
    作用域:http.server.location	
    示例:client_max_body_size 2m;		
    注意:根据请求头中的Content-Length来判断请求体大小是否允许。如果大于设定值,则返回
    “ Request Entity Too Large”(413)错误。不过要注意的是,浏览器一般并不对这个错误进行特殊显示。
    
  9. send_timeout
    含义:指定响应客户端的超时时间,单位:秒,默认值为60
    语法:send_timeout <time>
    
  10. keepalive_timeout
    含义:保持连接时间,单位:秒,超过该时间,服务器会关闭连接
    
  11. tcp_nopush
    含义:用于控制TCP链接是否推送,默认值是on
    
  12. tcp_nodelay
    含义:用于控制TCP链接是否延迟,默认值是on,将tcp_nopush和tcp_nodelay两个
         指令设置为on用于防止网络阻塞	
    

HTTP模块Location相关指令

  1. 基本语法
    语法:location [= | ~ | ~* | ^~] </uri/> {...}	
    缺省:N/A
    作用域:server
    
  2. 匹配规则
    1. 四种匹配方式
       = 精确匹配	
       ~ 大小写敏感正则匹配
       ~* 大小写不敏感正则匹配	
       ^~ 前缀匹配
    
    2. location匹配指令的执行顺序	
       首先:= 精确匹配;	
       其次:^~ 前缀匹配;		
       再次:~* 和 ~ 正则匹配,顺序依据出现顺序;
       最后:如果出现正则匹配成功,则采用该正则匹配;如果无可匹配正则,
       则采用前缀匹配结果。
    

如:

		location  = / { # 只匹配"/".}
		location  / {# 匹配任何请求,因为所有请求都是以"/"开始
  				 # 但是更长字符匹配或者正则表达式匹配会优先匹配
					}
		
		location ^~ /images/ {
 					# 匹配任何以 /images/ 开始的请求,并停止匹配
				  其它location
			}

	     location ~* \.(gif|jpg|jpeg)$ {
		  # 匹配以 gif, jpg, or jpeg结尾的请求. 
		  # 但是所有 /images/ 目录的请求将由上面localtion处理.  
		}

压缩(gzip)模块相关指令

gzip(GNU-ZIP)是一种压缩技术。经过gzip压缩后页面大小可以变为原来的30%甚至更小,这样, 用户浏览页面的时候速度会块得多。gzip的压缩页面需要浏览器和服务器双方都支持,实际上就 是服务器端压缩,传到浏览器后浏览器解压并解析。浏览器那里不需要我们担心,因为目前的巨 大多数浏览器都支持解析gzip过的页面。Nginx的压缩输出有一组gzip压缩指令来实现。相关指 令位于http{….}两个大括号之间。

  1. gzip on
    该指令用于开启或关闭gzip模块(on/off)
    
  2. gzip_min_length 1k 设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。 默认值是0,不管页面多大都压缩。建议设置成大于1k的字节数,小于1k可能会越压越大。
  3. gzip_buffers 4 16k 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 16k代表以16k为单位, 安装原始数据大小以16k为单位的4倍申请内存。
  4. gzip_http_version 1.1
    识别http的协议版本(1.0/1.1)
    
  5. gzip_comp_level 2
    gzip压缩比,1压缩比最小处理速度最快,9压缩比最大但处理速度最慢(传输快但比较消耗cpu)
    
  6. gzip_types text/plain application/x-javascript text/css application/xml
    匹配mime类型进行压缩,无论是否指定,”text/html”类型总是会被压缩的。
    
  7. gzip_vary on
    和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持,
    所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩
    
  8. gzip_disable “MSIE [1-6].”
    指定版本浏览器不压缩 
    

二、实际应用中配置实例

nginx.conf部分配置

	#user  nobody;
	worker_processes  48;
	worker_rlimit_nofile 1024;                                  
	error_log  logs/error.log  notice;
	#pid        logs/nginx.pid;
	events {
	    use epoll;
	    worker_connections  1024;
	}

	# HTTP服务配置
	http {
	    
	  	include  common.conf;

此处nginx.conf中include了common.conf,其中common.conf中配置了http模块中公用信息

common.conf部分配置

	include       mime.types;
	default_type  application/octet-stream;		
	log_format  main  '|$remote_addr|- |$http_cookie| - |$remote_user| [$time_local]| '
	                  '"$request" |$status| $body_bytes_sent| "$http_referer"| '
	                  '|"$http_user_agent"| |"$http_x_forwarded_for"|';
	#access_log  off
	access_log  logs/access.log  main buffer=32K;	
	server_tokens off;
	client_max_body_size  20m;          												
	client_header_buffer_size    32K;   												
	large_client_header_buffers  4 32K;			            							
	sendfile        on;                 												
	tcp_nopush     on;                  												
	tcp_nodelay     on;  								
	client_header_timeout  30;  														
	client_body_timeout    30;  														
	send_timeout          30;
	keepalive_timeout  65;  															
	# HttpGzip模块配置
	include  gzip.conf;

此处common.conf中include了gzip.conf,其中gzip.conf中配置了HttpGzip模块中公用信息

其中gzip.conf部分配置

	# HttpGzip模块配置,这个模块支持在线实时压缩输出数据流
	gzip  on;
	gzip_min_length  1k;
	gzip_proxied     any;
	gzip_buffers     4    16k;
	gzip_http_version    1.1;
	gzip_comp_level    1;
	gzip_types   text/plain application/x-javascript text/css application/xml;
	gzip_vary    on;
	gzip_disable "MSIE [1-6]\.";  

Leave a Comment