Nginx 配置详解

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/gongxifacai_believe/article/details/85573164

1、Nginx 简介

Nginx官网:http://nginx.org/ Nginx,即 engine X,是为了解决 C10k 问题出现的。 (1)Nginx 的特性 1)模块化设计、较好扩展性; 2)高可靠性,master/worker架构; 3)支持热部署,不停机更新配置文件、更换日志、更新服务器程序版本; 4)低内存消耗,10000 个 keep-alive 连接模式下的非活动连接仅消耗 2.5M 内存; 5)Nginx 是 event-driven 的,支持 AIO 异步 IO,mmap 内存映射。 (2)Nginx 的基本功能 1)静态资源的web服务器; 2)http协议的反向代理服务器; 3)pop3, smpt, imap4等邮件协议的反向代理; 4)能缓存打开的文件(元数据)、支持FastCGI(php-fpm),uWSGI(Python Web Framwork)等协议; 5)模块化(非DSO机制),过滤器zip,SSL; (3)web服务相关的功能: 虚拟主机(server)、keepalive、访问日志(支持基于日志缓冲提高其性能)、url rewirte、路径别名、基于IP及用户的访问控制、支持速率限制及并发数限制; (4)Nginx的基本架构:master/worker 1)一个master进程,可生成一个或多个worker进程; 2)事件驱动:epoll(Linux),kqueue(FreeBSD),/dev/poll(Solaris); 3)消息通知:select,poll,rt signals; 4)支持sendfile,sendfile64; 5)支持AIO,mmap。 master:加载配置文件、管理worker进程、平滑升级 worker:http服务,http代理,fastcgi代理 (5)Nginx 的模块类型 1)核心模块:core module; 2)Standard HTTP modules; 3)Optional HTTP modules; 4)Mail modules; 5)3rd party modules; (6)Nginx 的用途 1)静态资源的web服务器; 2)http服务器反向代理。

2、Nginx 的安装配置

(1)Nginx的安装 # ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-debug # make && make install (2)Nginx的配置文件 配置文件的组成部分: 主配置文件:nginx.conf(其中配置有include conf.d/* .conf),/etc/nginx/conf.d/*.conf; fastcgi的配置文件:fastcgi_params,uwsgi_params。 配置指令(必须以分号结尾):Directive value1 [value2...]; 支持使用变量: 内置变量:由模块引入; 自定义变量:set variable value; 引用变量:$variable 配置文件组织结构

main block
event {
	...
}
http {
	...
}

http配置段:

http {
	...
	server {
		...
		server_name 
		root 
		alias
		location /uri/ {
			...	
		}
		...
	}
	server {
		...
	}
}

(3)main配置段 类别:正常运行必备的配置;优化性能相关的配置;用于调试、定位问题的配置。 正常运行必备的配置: 1)user USERNAME [GROUPNAME]; 指定用于运行worker进程的用户和组; user nginx nginx; 2)pid /PATH/TO/PID_FILE; 指定nginx进程的pid文件路径; pid /var/run/nginx.pid; 3)worker_rlimit_nofile #; 指定一个worker进程所能够打开的最大文件描述符数量; 4)worker_rlimit_sigpending #; 指定每个用户能够发往worker进程的信号的数量; 性能优化相关的配置: 1)worker_processes #; worker进程的个数;通常应该为物理CPU核心数量减1;可以为"auto",实现自动设定; 2)worker_cpu_affinity CPUMASK CPUMASK ...; CPUMASK:0001,0010,0100,1000; worker_cpu_affinity 00000001 00000010 00000100; 3)worker_priority nice; nice 值的取值范围为:[-20, 19] 调试、定位问题的配置: 1)daemon off|on; 是否以守护进程方式启动nignx; 2)master_process on|off; 是否以master/worker模型运行nginx; 3)error_log /PATH/TO/ERROR_LOG level; 错误日志文件及其级别;出于调试的需要,可以设定为debug;但debug仅在编译时使用了“–with-debug”选项时才有效; (4)event 配置段 1)worker_connections #; 每个worker进程所能够响应的最大并发请求数量; worker_proceses * worker_connections 2)use [epoll|rgsig|select|poll]; 定义使用的事件模型;建议让nginx自动选择; 3)accept_mutex [on|off]; 各worker接收用户的请求的负载均衡锁,启用时,表示用于让多个worker轮流地、序列化地响应新请求; 4)lock_file /PATH/TO/LOCK_FILE; (5)http 配置段 套接字或主机相关的指令: 1)server {} 定义一个虚拟主机;

server {
		listen PORT;
		server_name NAME;
		root /PATH/TO/DOCUMENTROOT;
}

注意: (a) 基于port:listen指令监听在不同的端口; (b) 基于hostname:server_name指令指向不同的主机名; 2)listen

listen address[:port] [default_server] [ssl] [http2 | spdy] 
listen port [default_server] [ssl] [http2 | spdy]

default_server:设置默认虚拟主机;用于基于IP地址,或使用了任意不能对应于任何一个server的name时所返回站点; ssl:用于限制只能通过ssl连接提供服务; spdy:SPDY protocol(speedy),在编译了spdy模块的情况下,用于支持SPDY协议; http2:http version 2; 3)server_name NAME [...]; 后可跟一个或多个主机名;名称还可以使用通配符和正则表达式(~); (a) 首先做精确匹配;例如:www.magedu.com; (b) 左侧通配符;例如:* .magedu.com; © 右侧通配符,例如:www.magedu.* ; (d) 正则表达式,例如:~^.*.magedu.com$; (e) default_server; 4)tcp_nodelay on|off; 对keepalive模式下的连接是否使用TCP_NODELAY选项; 5)tcp_nopush on|off; 是否启用TCP_NOPUSH(FREEBSE)或TCP_CORK(Linux)选项,仅在sendfile为on时有用; 6)sendfile on|off; 是否启用sendfile功能; 路径相关的指令: 7)root 设置web资源的路径映射;用于指明请求的URL所对应的文档的目录路径;

server {
	...
	root  /data/www/vhost1;
}

http://www.magedu.com/images/logo.jpg --> /data/www/vhost1/images/logo.jpg

server {
	...
	server_name  www.magedu.com;
	location /images/ {
		root  /data/imgs/;
		...
	}
}

http://www.magedu.com/images/logo.jpg --> /data/imgs/images/logo.jpg 8)location [ = | ~ | ~* | ^~ ] uri { ... } location @name { ... } 功能:允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location块中的配置所处理;简言之,即用于为需要用到专用配置的uri提供特定配置;

server {
		...
		server_name www.magedu.com;
		root /data/www;
		location  /admin/  {
				...
		}
}

=:URI的精确匹配; ~:做正则表达式匹配,区分字符大小写; ~* :做正则表达式匹配,不区分字符大小写; ^~:URI的左半部分匹配,区分字符大小写; ^~* :URI的左半部分匹配,不区分字符大小写; 匹配优先级:精确匹配=、^、或~*、不带符号的URL; 9)alias 只能用于location配置段,定义路径别名;

location  /images/ {
		root /data/imgs/;
}
location  /images/  {
		alias /data/imgs/;
}

注意: root指令:给定的路径对应于location的“/”这个URL; /images/test.jpg --> /data/imgs/images/test.jpg alias指令:给定的路径对应于location的“/uri/"这个URL; /images/test.jpg --> /data/imgs/test.jpg 10)index index file ...;定义默认主页面; 11)error_page code ... [=[response]] uri; 根据http的状态码重定向错误页面;

error_page  404  /404.html
error_page  404  =200  /404.html  (以指定的响应状态码进行响应)

12)try_files file ... uri; try_files file ... =code; 尝试查找第1至第N-1个文件,第一个即为返回给请求者的资源;若1至N-1文件都不存在,则跳转至最后一个uri(必须不能匹配至当前location,而应该匹配至其它location,否则会导致死循环); 客户端请求相关的配置: 13)keepalive_timeout timeout [header_timeout]; 设定keepalive连接的超时时长;0表示禁止长连接;默认为75s; 14)keepalive_requests number; 在keepalived连接上所允许请求的最大资源数量;默认为100; 15)keepalive_disable none | browser ...; 指明禁止为何种浏览器使用keepalive功能; 16)send_timeout #; 发送响应报文的超时时长,默认为60s; 17)client_body_buffer_size size; 接收客户请求报文body的缓冲区大小;默认为16k;超出此指定大小时,其将被移存于磁盘上; 18)client_body_temp_path path [level1 [level2 [level3]]]; 设定用于存储客户端请求body的临时存储路径及子目录结构和数量; client_body_temp_path /var/tmp/client_body 2 2; 对客户端请求的进行限制: 19)limit_excpet METHOD {...} 对指定范围之外的其它的方法进行访问控制;

limit_except  GET {
		allow  172.16.0.0/16;
		deny all;
}

20)limit_rate speed; 限制客户端每秒钟所能够传输的字节数,默认为0表示无限制; 文件操作优化相关的配置: 21)aio on|off; 22)directio size|off; 23)open_file_cache off; open_file_cache max=N [inactive=time]; nginx可以缓存以下三种信息: (a) 文件描述符、文件大小和最近一次的修改时间; (b) 打开的目录的结构; © 没有找到的或者没有权限操作的文件的相关信息; max=N表示可缓存的最大条目上限;一旦达到上限,则会使用LRU算法从缓存中删除最近最少使用的缓存项; inactive=time:在此处指定的时长内没有被访问过的缓存项是为非活动缓存项,因此直接删除; 24)open_file_cache_errors on | off; 是否缓存找不到其路径的文件,或没有权限没有权限访问的文件相关信息; 25)open_file_cache_valid time; 每隔多久检查一次缓存中缓存项的有效性;默认为60s; 26)open_file_cache_min_uses number; 缓存项在非活动期限内最少应该被访问的次数; ngx_http_access_module模块的配置(基于IP的访问控制): 27)allow address | CIDR | unix: | all; 28)deny address | CIDR | unix: | all; ngx_http_auth_basic_module模块的配置(basic认证): 29)auth_basic string | off; 使用http basic认证协议对用户进行认证; 30)auth_basic_user_file file; 实现用户认证的账号文件; 文件格式: name1:password1 name2:password2:comment 密码格式: encrypted with the crypt() function; md5加密;

location /admin/ {
		auth_basic "Admin Area";
		auth_basic_user_file /etc/nginx/.ngxhtpasswd;
}

(6)ngx_http_log_module模块的配置(访问日志) 31)log_format name string ...; 定义日志格式及其名称;日志格式一般通过调用内置变量来定义; 32)access_log path [format [buffer=size [flush=time]]]; access_log off; 访问日志文件路径,格式名称以及缓存大小和刷写时间间隔;建议定义缓冲以提升性能; 33)open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time]; open_log_file_cache off; (7)ngx_http_stub_status_module模块配置 34)stub_status; 通过指定的uri输出stub status;

Active connections: 291 
server accepts handled requests
16630948 16630948 31070465 
Reading: 6 Writing: 179 Waiting: 106 				
					
Active connections:当前活动的客户端连接数;
accepts:已经接受的客户端连接总数量;
handled:已经处理过的客户端连接总数量;
requests:客户端的总的请求数量;
Readking:正在读取的客户端请求的数量;
Writing:正向其发送响应报文的连接数量;
Waiting:等待其发出请求的空闲连接数量;

(8)ngx_http_referer_module模块配置(基于请求报文中的Referer首部的值做访问控制) 35)valid_referers none | blocked | server_names | string ...; none:请求报文不存在referer首部; blocked:请求报文中存在referer首部,但其没有有效值,或其值非以http://或https://开头; server_names:其值为一个主机名; arbitrary string:直接字符串,可以使用*通配符; regular expression:以~起始的正则表达式; 内置变量:$invalid_referer(所有不能符合valid_referer指定定义的引用请求均为不合法引用):

valid_referers   none   blocked   server_names   *.example.com   example.*  www.example.org/galleries/   ~\.google\.;	
if ($invalid_referer) {
		return  403;
}

(9)ngx_http_ssl_module模块配置 ssl_certificate file; 证书文件路径; ssl_certificate_key file; 证书对应的私钥文件; ssl_ciphers ciphers; 指明由nginx使用的加密算法,可以是OpenSSL库中所支持各加密套件; ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]; 指明支持的ssl协议版本,默认为后三个; ssl_session_cache off | none | [builtin[:size]] [shared:name:size]; 指明ssl会话缓存机制; builtin:使用OpenSSL内置的ssl会话缓存,对机制为各worker私有; shared:在各worker之间使用一个共享的缓存; name:独有名称; size:缓存空间大小; ssl_session_timeout time; ssl会话超时时长;即ssl session cache中的缓存有效时长; (10)ngx_http_rewrite_module模块配置 将请求的url基于正则表达式进行重写: http --> https, domain1.tld --> domain2.tld, uri1 --> uri2, … 指令:rewrite regex replacement [flag]; regex:正则表达式,用于匹配用户请求的url; replacement:重写为的结果; [flag]: last:重写完成之后停止对当前uri的进一步处理,改为对新url的新一轮处理; break:重写完成之后停止当uri的处理,转向其后面的其它配置; redirect:重写完成之后会返回客户端一个临时的重定向,由客户端对新的url重新发起请求(302); permanent:重写完成之后会返回客户端一个永久的重定向,由客户端对新的url重新发起请求(301);

server {
		...
		rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
		rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra  last;
		return  403;
		...
}				

http://www.magedu.com/download/a/b/c/media/32.wmv --> /download/a/b/c/mp3/32.mp3 PCRE正则表达式元字符 字符匹配:., [ ], [^] 次数匹配:* , +, ?, {m}, {m,}, {m,n} 位置锚定:^, $ 或者:| 分组:(), 后向引用, $1, $2, … if (condition) { … } 条件判断,引用新的配置上下文; condition: 比较表达式: ==,!= ~:模式匹配,区分字符大小写; ~* :模式匹配,不区分字符大小写; !~:模式不匹配,区分字符大小写; !~*: 模式不匹配,不区分字符大小写; 文件及目录判断: -f, !-f:是否存在且为普通文件; -d, !-d: 是否存在且为目录; -e, !-e:是否存在; -x, !-x:是否存在且可执行; return code [text]; return code URL; return URL; 立即停止对请求的uri的处理,并返回指定的状态码; set $variable value; 变量赋值; rewrite_log on | off; 是否将重写日志记入error log中,默认为关闭; 调试方法:错误日志debug;开启rewrite_log; (11)ngx_http_gzip_module模块配置 gzip on | off; 启用或禁用gzip压缩响应报文; gzip_comp_level level; 压缩比,1-9,默认为1; gzip_disable regex ...; regex是为用于匹配客户端响应器类型的正则表达式;表示对何种浏览器禁止使用压缩功能; gzip_min_length length; 触发压缩功能的响应报文的最小长度; gzip_http_version 1.0 | 1.1; 设定启用压缩功能时,协议的最小版本; gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...; 定义对客户端请求的具有何种请求属性的资源启用压缩功能;如expired则表示对由于使用了expire首部而无法缓存的对象启用压缩功能; gzip_types mime-type ...; 指明仅对哪些类型的资源执行压缩操作;即压缩过滤器; 示例:

gzip  on;
gzip_http_version 1.0;
gzip_comp_level 6;
gzip_disable msie6;
gzip_min_length 2;
gzip_types text/plain text/css text/xml application/x-javascript application/xml application/json application/java-script;				

(12)ngx_http_fastcgi_module模块配置(fastcgi协议代理) LAMP: httpd+php(module (libphp5.so),cgi,fastcgi(后端提供cgi server process)) Client:fastcgi client; Server:fastcig Server; LNMP: nginx:ngx_http_fastcgi_module; php-fpm:fastcgi; php-mysql:mysql-server,mariadb-server; 编译php工作为fpm机制时: ./configure ... --enable-fpm ... php-fpm的工作方式:

listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
pm = dynamic|static 
		pm.start_servers:启动fpm进程时启动的工作进程数量;
		pm.min_spare_servers:最少空闲进程数;
		pm.max_spare_servers:最大空闲进程数;
		pm.max_children:最大工作进程数;
user = USERNAME
group = GROUPNAME

fastcgi模块指令: 1)fastcgi_pass address; address为fastcgi server监听的地址; 示例:fastcgi_pass 127.0.0.1:9000; 2)fastcgi_index name; 定义fastcgi应用的默认主页; 示例:fastcgi_index index.php; 3)fastcgi_param parameter value [if_not_empty]; 设定传递给后端fastcgi server参数及其值; 示例:fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; /index.php --> /scripts/index.php http://www.magedu.com/users.php?username=tom 4)fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size]; 定义缓存:缓存空间等;可应用的上下文 :http;缓存机制: 元数据:内存,即为keys_zone; 数据:磁盘,即为path;

levels=#[:#[:#]]
levels=2:1
keys_zone=name:size
name: cache的标识符;
size:元数据cache大小;
max_size:缓存空间上限;

5)fastcgi_cache zone | off; 调用定义过的缓存;zone即为通过fastcgi_cache_path定义缓存时其keys_zone参数中的name; 6)fastcgi_cache_key string; 定义如何使用缓存键; 使用示例:fastcgi_cache_key $request_uri; 7)fastcgi_cache_methods GET | HEAD | POST ...; 为何请求方法对应的请求进行缓存,默认为GET和HEAD; 8)fastcgi_cache_min_uses number; 缓存项的最少使用次数; 9)fastcgi_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_503 | http_403 | http_404 | off ...; 是否可使用stale缓存项响应用户请求; 10)fastcgi_cache_valid [code ...] time; 对不同响应码的响应设定其可缓存时长; 示例:

fastcgi_cache_valid 200 302 10m;
fastcgi_cache_valid 404      1m;					

注意:调用缓存时,至少应该指定三个参数

fastcgi_cache
fastcgi_cache_key
fastcgi_cache_valid 

(13)ngx_http_proxy_module模块配置(http或https协议代理) 1)proxy_pass URL; 应用上下文:location, if in location, limit_except; proxy_pass后面的路径不带uri时,其会将location的uri传递给后端的主机;下面的示例会将/uri/传递给backend服务器;

location  /uri/ {
		proxy_pass http://hostname;
}

proxy_pass后面的路径是一个uri时,其会将location的uri替换为后端主机自己的uri;

location  /uri/ {
		proxy_pass http://hostname/new_uri/;
}

如果location定义其uri时使用的正则表达式模式匹配,则proxy_pass后的路径不能够使用uri;

location  ~*  \.(jpg|gif|jpeg)$  {
		proxy_pass  http://HOSTNAME;
}

此处的http://HOSTNAME后面不能有任何uri,哪怕只有/也不可以; 2)proxy_set_header field value; 用于proxy server向backend server发请求报文时,将某请求首部重新赋值,或在原有值后面添加一个新的值; 也可以添加自定义首部; 示例:

proxy_set_header  X-Real-IP  $remote_addr;
proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;

原有请求报文中如果存在X-Forwared-For首部,则将remote_addr以逗号分隔补原有值后,否则则直接添加此首部; 缓存相关的选项(缓存要先定义,后调用): 3)proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] 定义缓存;可用上下文为http; 4)proxy_cache zone | off; 调用缓存;可用上下文 为http, server和location; 5)proxy_cache_key string; 定义缓存键; proxy_cache_key $scheme$proxy_host$request_uri; 6)proxy_cache_valid [code ...] time; 对不同响应码的响应设定其可缓存时长; 示例:

proxy_cache_valid 200 302 10m;
proxy_cache_valid 404      1m;	

proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...; 跟连接相关的选项: 7)proxy_connect_timeout time; 定义与后端服务器建立连接的超时时长;默认为60s,不建议超出75s; 8)proxy_send_timeout time; 把请求发送给后端服务器的超时时长;默认为60s; 9)proxy_read_timeout time; 等待后端服务器发送响应报文的超时时长; (14)ngx_http_headers_module模块配置 1)add_header name value [always]; 向响应报文添加自定义首部,并为其赋值; 2)expires [modified] time; expires epoch | max | off; 允许或禁止向响应报文的Cache-Control或Expires首部添加新值或修改其值; (15)ngx_http_upstream_module模块配置 用于将多个服务器定义成服务器组,而由proxy_pass, fastcgi_pass等指令进行引用; 1)upstream name { ... } 定义一个后端服务器组,name为组名称;仅能用于http上下文 ; 2)server address [parameters]; 在upstream中定义一个服务器及其相关参数;仅能用于upstream上下文; 常用参数: weight=number:定义服务器权重,默认为1; max_fails=number:最大失败连接尝试次数,失败连接超时时长由fail_timeout参数指定; fail_timeout=number:等待目标服务器发送响应的时长; backup:备用服务器,所有主服务器均故障时才启用此主机; down:手动标记其不再处理任何用户请求; 使用方法: (a) 定义upstream服务器组:

upstream websrvs {
		server 172.16.100.68 weight=2 max_fails=2 fail_timeout=6s;
		server 172.16.100.6  weight=1 max_fails=2 fail_timeout=6s;
}		

(b) 在反代场景中(proxy_pass, fastcgi_pass, …)进行调用:

location / {
		proxy_pass http://websrvs/;
}

3)ip_hash 源地址hash,把来自同一个ip地址的请求始终发往同一个backend server,除非此backend server不可用; 4)least_conn 最少连接;当各server权重不同时,即为加权最少连接; 5)health_check [parameters]; 健康状态检测机制;只能用于location上下文; 常用参数: interval=time检测的频率,默认为5秒; fails=number:判定服务器不可用的失败检测次数;默认为1次; passes=number:判定服务器可用的失败检测次数;默认为1次; uri=uri:做健康状态检测测试的目标uri;默认为/; match=NAME:健康状态检测的结果评估调用此处指定的match配置块; 6)match name { ... } 对backend server做健康状态检测时,定义其结果判断机制;只能用于http上下文; 常用的参数: status code[ code …]: 期望的响应状态码; header HEADER[operator value]:期望存在响应首部,也可对期望的响应首部的值基于比较操作符和值进行比较; body:期望响应报文的主体部分应该有的内容; 7)hash key [consistent]; 指明基于hash方式进行调度时,其hash key; hash $remote_addr相当于ip_hash; 常用的hash key: $cookie_name:将一个用户的请求始终发往同一个backend server,能实现会话绑定的功能;此处的name为cookie某些参数的名称,此处常用的有cookie_username; $request_uri: 将对同一个uri的请求始终发往同一个backend server,后端为cache server时特别有用; 8)session会话保持: session sticky:基于ip,nginx还可基于请求报文首部中的多种信息,例如cookie, uri; session cluster:每个server均把创建和维护session同步集群中的其它主机;仅适用于较小规模的环境; session server:使用一个共享的存储服务存储session信息;

location ~* \.php$ {
	proxy_pass
}
location / {
	proxy_pass
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券