Nginx 配置详解

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
}
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页