前言
Nginx作用
Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性:
作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.
作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。
Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器: Nginx 启动特别容易,并且几乎可以做到7x24不间断运行,即使运行数个月也不需要重新启动。你还能够在 不间断服务的情况下进行软件版本的升级。
Nginx版本选择
Nginx官方网站为: nginx.org
Nginx的版本有:
Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发版。
Stable version:最新稳定版,生产环境上建议使用的版本。
Legacy versions:遗留的老版本的稳定版。
一般就选最新版本,Stable version:最新稳定版。
Nginx安装、升级、卸载
windows server环境安装
下载解压后
修改配置文件
Nginx的配置文件在./conf/nginx.conf
具体的相关配置请查看后续内容
启动Nginx
注意不要直接双击nginx.exe,这样会导致修改配置后重启、停止nginx无效,需要手动关闭任务管理器内的所有nginx进程
在nginx.exe目录,打开命令行工具,用命令 启动/关闭/重启nginx
启动nginx:
nginx -s reload :修改配置后重新加载生效
nginx -s reopen :重新打开日志文件
nginx -t -c /path/to/nginx.conf 测试nginx配置文件是否正确
关闭nginx:
nginx -s stop :快速停止nginx
nginx -s quit :完整有序的停止nginx
linux server安装Nginx
Linux server环境以centos7作为环境示例,文档着重讲述linux server环境下Nginx的使用配置等操作。
yum安装方式
CentOS 7 中的 yum 没法直接使用 yum install nginx 这个指令去安装nginx,因为nginx这个服务不是yum库中自带的。首先添加yum源:1
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
可以通过yum search nginx查看yum源是否安装成功,如果安装成功,则可以使用以下命令安装nginx1
yum install -y nginx
启动Nginx并设置开机自动运行1
2systemctl start nginx.service
systemctl enable nginx.service
编译安装方式
安装编译环境、gcc1
2yum -y install gcc gcc-c++ automake autoconf libtool make
yum install gcc gcc-c++
一般我们都需要先装pcre, zlib,前者为了重写rewrite,后者为了gzip压缩。从ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ 下载最新的 PCRE 源码包,使用下面命令下载编译和安装 PCRE 包:1
2
3
4
5
6
7cd /data/backup
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.42.tar.gz
tar -zxvf pcre-8.42.tar.gz
cd pcre-8.42
./configure
make
make install
从http://zlib.net下载最新的 zlib 源码包,使用下面命令下载编译和安装 zlib包:1
2
3
4
5
6
7cd /data/backup
wget http://zlib.net/zlib-1.2.11.tar.gz
tar -zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure
make
make install
安装openssl1
2
3cd /data/backup
wget https://www.openssl.org/source/openssl-1.1.0h.tar.gz
tar -zxvf openssl-1.1.0h.tar.gz
安装Nginx1
2
3
4
5
6
7cd /data/backup
wget http://nginx.org/download/nginx-1.14.0.tar.gz
tar -zxvf nginx-1.14.0.tar.gz
cd nginx-1.14.0
./configure --prefix=/data/nginx/ --with-http_v2_module --with-http_ssl_module --with-http_sub_module --with-http_stub_status_module --with-http_gzip_static_module --without-http-cache --with-http_realip_module --with-pcre=/data/backup/pcre-8.42 --with-zlib=/data/backup/zlib-1.2.11 --with-openssl=/data/backup/openssl-1.1.0h
make
make install
创建Nginx软连接到环境变量1
ln -s /data/nginx/sbin/* /usr/sbin/
至此Nginx的安装已经结束。
Nginx升级、添加模块
如果要对当前的Nginx服务器进行版本升级,应用新模块,最简单的办法是停止当前Nginx服务,然后开启新的Nginx服务,但这样就会导致在一段时间内,用户无法访问服务器。为了解决这个问题,Nginx服务器提供平滑升级的功能。
平滑升级的过程是这样的,Nginx服务接收到USR2信号后首先将旧的nginx.pid文件(如果在配置文件中更改过这个文件的名字,也是相同的过程)添加.oldbin,变为nginx.pid.oldbin文件;然后执行新版本Nginx服务器的二进制文件启动服务。如果新的服务启动成功,系统中将由新旧两个Nginx服务公用提供Web服务。如果新的服务启动成功,系统中将有新旧两个Nginx服务共同提供Web服务。之后,需要向旧的Nginx服务进程发送WINCH信号,使旧的Nginx服务平滑停止,并删除nginx.pid.oldbin文件。在发送WINCH信号之前,可以随时停止新的Nginx服务。
注意:
为了实现Nginx服务器的平滑升级,新的服务器安装路径应该和旧的保持一致。因此建议用户在安装新服务器之前先备份旧服务器。
当前Nginx版本为1.12.2,官网提供最新版本为1.13.10(非稳定版本),本次升级到1.13.10。
和安装一样,首先下载解压,但是不要make install,编译参数中可以添加新的模块,以达到添加模块的目的,如下:1
2
3
4
5
6cd /data/backup
wget http://nginx.org/download/nginx-1.13.10.tar.gz
tar -zxvf nginx-1.13.10.tar.gz
cd nginx-1.13.10
./configure --prefix=/data/nginx/ --with-http_v2_module --with-http_ssl_module --with-http_sub_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre=/data/backup/pcre-8.42 --with-zlib=/data/backup/zlib-1.2.11 --with-openssl=/data/backup/openssl-1.1.0h
make
此时会在当前目录的objs文件夹内生成新版本的Nginx二进制文件。
平滑升级,先移走现有的Nginx二进制文件。1
mv /data/nginx/sbin/nginx /data/nginx/sbin/nginx.old
拷贝新生成的二进制文件到指定目录。1
cp objs/nginx /data/nginx/sbin
执行升级1
make upgrade
完成后再查看Nginx版本以及编译的参数1
2
3
4
5
6# nginx -V
nginx version: nginx/1.13.10
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
built with OpenSSL 1.1.0h 27 Mar 2018
TLS SNI support enabled
configure arguments: --prefix=/data/nginx/ --with-http_v2_module --with-http_ssl_module --with-http_sub_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre=/data/backup/pcre-8.42 --with-zlib=/data/backup/zlib-1.2.11 --with-openssl=/data/backup/openssl-1.1.0h
可以看到Nginx已升级完成,且模块也编译成功。
Nginx卸载
Nginx在windows server比较容易删除,直接删除文件即可。Nginx在linux server上卸载的话,如果编译时的路径如果指定了–prefix /xxx/nginx 直接rm -rf /xxx/nginx即可。如果没指定路径,那就到源码路径执行make uninstall。如果源码已经删除,安装时也没有指定路径,则需要到/usr/bin /etc /usr/sbin /usr/lib找到相关文件手动删除。
Nginx常用命令
1 | #检查配置文件 |
参数解释
-s stop 快速停止nginx
-s quit 平滑停止nginx
-s reopen 重新打开日志文件
-s reload 平滑重载所有配置
Nginx模块介绍
核心模块
主模块
包含一些Nginx的基本控制功能
指令1
2
3
4daemon
语法:daemon on | off
默认值:on
daemon off;
1 | env |
1 | debug_points |
1 | error_log |
1 | log_not_found |
1 | include |
1 | lock_file |
1 | master_process |
1 | pid |
1 | ssl_engine |
1 | timer_resolution |
1 | try_files |
1 | user |
1 | worker_cpu_affinity |
1 | worker_priority |
1 | worker_processes |
1 | worker_rlimit_core |
1 | worker_rlimit_nofile |
1 | worker_rlimit_sigpending |
1 | working_directory |
变量1
2
3$pid
进程ID号
$realpath_root
事件模块
控制Nginx处理连接的方式
指令1
2
3
4accept_mutex
语法:accept_mutex [ on | off ]
默认值:on
Nginx使用连接互斥锁进行顺序的accept()系统调用
1 | accept_mutex_delay |
1 | debug_connection |
1 | devpoll_changes |
1 | multi_accept |
1 | rtsig_signo |
标准HTTP模块
HTTP核心模块
Nginx处理HTTP的核心功能模块
指令1
2
3
4alias
语法:alias file-path|directory-path;
默认值:no
使用字段:location
这个指令指定一个路径使用某个某个,注意它可能类似于root,但是document root没有改变,请求只是使用了别名目录的文件。1
2
3location /i/ {
alias /spool/w3/images/;
}
上个例子中,请求”/i/top.gif”将返回这个文件: “/spool/w3/images/top.gif”。
Alias同样可以用于带正则表达式的location,如:1
2
3location ~ ^/download/(.*)$ {
alias /home/website/files/$1;
}
请求”/download/book.pdf”将返回”/home/website/files/book.pdf”。
同样,也可以在别名目录字段中使用变量。1
2
3
4client_body_in_file_only
语法:client_body_in_file_only on|off
默认值:off
使用字段:http, server, location
这个指令始终存储一个连接请求实体到一个文件即使它只有0字节。
注意:如果这个指令打开,那么一个连接请求完成后,所存储的文件并不会删除。
这个指令可以用于debug调试和嵌入式Perl模块中的$r->request_body_file。1
2
3
4client_body_in_single_buffer
语法:client_body_in_single_buffer
默认值:off
使用字段:http, server, location
1 | client_body_buffer_size |
这个指令可以指定连接请求实体的缓冲区大小。
如果连接请求超过缓存区指定的值,那么这些请求实体的整体或部分将尝试写入一个临时文件。
默认值为两个内存分页大小值,根据平台的不同,可能是8k或16k。1
2
3
4client_body_temp_path
语法:client_body_temp_path dir-path [ level1 [ level2 [ level3 ]
默认值:client_body_temp
使用字段:http, server, location
指令指定连接请求实体试图写入的临时文件路径。
可以指定三级目录结构,如:1
client_body_temp_path /spool/nginx/client_temp 1 2;
那么它的目录结构可能是这样:1
/spool/nginx/client_temp/7/45/00000123457
1 | client_body_timeout |
1 | client_header_buffer_size |
1 | client_header_timeout |
1 | client_max_body_size |
1 | default_type |
1 | directio |
1 | error_page |
1 | if_modified_since |
1 | internal |
1 | keepalive_timeout |
参数的这两个值可以不相同
下面列出了一些服务器如何处理包含Keep-Alive的应答头:
·MSIE和Opera将Keep-Alive: timeout=N头忽略。
·MSIE保持一个连接大约60-65秒,然后发送一个TCP RST。
·Opera将一直保持一个连接处于活动状态。
·Mozilla将一个连接在N的基础上增加大约1-10秒。
·Konqueror保持一个连接大约N秒。
1 | keepalive_requests |
1 | large_client_header_buffers |
1 | limit_except |
1 | limit_rate |
1 | limit_rate_after |
1 | location |
这个参数根据URI的不同需求来进行配置,可以使用字符串与正则表达式匹配,如果要使用正则表达式,你必须指定下列前缀:
1、~* 不区分大小写。
2、~ 区分大小写。
要确定该指令匹配特定的查询,程序将首先对字符串进行匹配,字符串匹配将作为查询的开始,最确切的匹配将被使用。然后,正则表达式的匹配查询开始,匹配查询的第一个正则表达式找到后会停止搜索,如果没有找到正则表达式,将使用字符串的搜索结果。
在一些操作系统,如Mac OS X和Cygwin,字符串将通过不区分大小写的方式完成匹配(0.7.7),但是,比较仅限于单字节的语言环境。
正则表达式可以包含捕获(0.7.40),并用于其它指令中。
可以使用“^~”标记禁止在字符串匹配后检查正则表达式,如果最确切的匹配location有这个标记,那么正则表达式不会被检查。
使用“=”标记可以在URI和location之间定义精确的匹配,在精确匹配完成后并不进行额外的搜索,例如有请求“/”发生,则可以使用“location = /”来加速这个处理。
即使没有“=”和“^~”标记,精确的匹配location在找到后同样会停止查询。
下面是各种查询方式的总结:
1、前缀“=”表示精确匹配查询,如果找到,立即停止查询。
2、指令仍然使用标准字符串,如果匹配使用“^~”前缀,停止查询。
3、正则表达式按照他们在配置文件中定义的顺序。
4、如果第三条产生一个匹配,这个匹配将被使用,否则将使用第二条的匹配。
1 | log_not_found |
指令指定是否将一些文件没有找到的错误信息写入error_log指定的文件中。1
2
3
4log_subrequest
语法:log_subrequest [on|off]
默认值:log_subrequest off
使用字段:http, server, location
指令指定是否将一些经过rewrite rules和/或SSI requests的子请求日志写入access_log指定的文件中。1
2
3
4msie_padding
语法:msie_padding [on|off]
默认值:msie_padding on
使用字段:http, server, location
指令指定开启或关闭MSIE浏览器和chrome浏览器(0.8.25+)的msie_padding特征,当这个功能开启,nginx将为响应实体分配最小512字节,以便响应大于或等于400的状态代码。
指令预防在MSIE和chrome浏览器中激活“友好的”HTTP错误页面,以便不在服务器端隐藏更多的错误信息。1
2
3
4msie_refresh
语法: msie_refresh [on|off]
默认值:msie_refresh off
使用字段:http, server, location
指令允许或拒绝为MSIE发布一个refresh而不是做一次redirect1
2
3
4open_file_cache
语法:open_file_cache max = N [inactive = time] | off
默认值:open_file_cache off
使用字段:http, server, location
这个指令指定缓存是否启用,如果启用,将记录文件以下信息:
·打开的文件描述符,大小信息和修改时间。
·存在的目录信息。
·在搜索文件过程中的错误信息 -- 没有这个文件、无法正确读取,参考open_file_cache_errors
指令选项:
·max - 指定缓存的最大数目,如果缓存溢出,最长使用过的文件(LRU)将被移除。
·inactive - 指定缓存文件被移除的时间,如果在这段时间内文件没被下载,默认为60秒。
·off - 禁止缓存。
例:1
2
3
4open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
1 | open_file_cache_errors |
这个指令指定是否在搜索一个文件是记录cache错误。1
2
3
4open_file_cache_min_uses
语法:open_file_cache_min_uses number
默认值:open_file_cache_min_uses 1
使用字段:http, server, location
这个指令指定了在open_file_cache指令无效的参数中一定的时间范围内可以使用的最小文件数,如果使用更大的值,文件描述符在cache中总是打开状态。1
2
3
4open_file_cache_valid
语法:open_file_cache_valid time
默认值:open_file_cache_valid 60
使用字段:http, server, location
这个指令指定了何时需要检查open_file_cache中缓存项目的有效信息。1
2
3
4optimize_server_names
语法:optimize_server_names [ on|off ]
默认值:optimize_server_names on
使用字段:http, server
这个指令指定是否在基于域名的虚拟主机中开启最优化的主机名检查。
尤其是检查影响到使用主机名的重定向,如果开启最优化,那么所有基于域名的虚拟主机监听的一个“地址:端口对”具有相同的配置,这样在请求执行的时候并不进行再次检查,重定向会使用第一个server name。
如果重定向必须使用主机名并且在客户端检查通过,那么这个参数必须设置为off。
注意:这个参数不建议在nginx 0.7.x版本中使用,请使用server_name_in_redirect。1
2
3
4port_in_redirect
语法:port_in_redirect [ on|off ]
默认值:port_in_redirect on
使用字段:http, server, location
这个指令指定是否在让nginx在重定向操作中对端口进行操作。
如果这个指令设置为off,在重定向的请求中nginx不会在url中添加端口。1
2
3
4recursive_error_pages
语法:recursive_error_pages [on|off]
默认值:recursive_error_pages off
使用字段:http, server, location
recursive_error_pages指定启用除第一条error_page指令以外其他的error_page。1
2
3
4resolver
语法:resolver address
默认值:no
使用字段:http, server, location
指定DNS服务器地址,如:
resolver 127.0.0.1;1
2
3
4resolver_timeout
语法:resolver_timeout time
默认值:30s
使用字段:http, server, location
解析超时时间。如:
resolver_timeout 5s;1
2
3
4root
语法:root path
默认值:root html
使用字段:http, server, location ,location中的if字段
请求到达后的文件根目录。
下例中:1
2
3location /i/ {
root /spool/w3;
}
如果请求”/i/top.gif”文件,nginx将转到”/spool/w3/i/top.gif”文件。你可以在参数中使用变量。
注意:在请求中root会添加这个location到它的值后面,即”/i/top.gif”并不会请求”/spool/w3/top.gif”文件,如果要实现上述类似于apache alias的功能,可以使用alias指令。1
2
3
4satisfy_any
语法:satisfy_any [ on|off ]
默认值:satisfy_any off
使用字段:location
指令可以检查至少一个成功的密码效验,它在NginxHttpAccessModule或NginxHttpAuthBasicModule这两个模块中执行。1
2
3
4
5
6
7location / {
satisfy_any on;
allow 192.168.1.0/32;
deny all;
auth_basic "closed site";
auth_basic_user_file conf/htpasswd;
}
1 | send_timeout |
指令指定了发送给客户端应答后的超时时间,Timeout是指没有进入完整established状态,只完成了两次握手,如果超过这个时间客户端没有任何响应,nginx将关闭连接。1
2
3sendfile
语法:sendfile [ on|off ]
默认值:sendfile off
使用字段:http, server, location
是否启用sendfile()函数。1
2
3
4server
语法:server {...}
默认值:no
使用字段:http
server字段包含虚拟主机的配置。
没有明确的机制来分开基于域名(请求中的主机头)和基于IP的虚拟主机。
可以通过listen指令来指定必须连接到这个server块的所有地址和端口,并且在server_name指令中可以指定所有的域名。1
2
3
4server_name
语法:server_name name [... ]
默认值:server_name hostname
使用字段:server
这个指令作用:
将HTTP请求的主机头与在nginx配置文件中的server{…}字段中指定的参数进行匹配,并且找出第一个匹配结果。这就是如何定义虚拟主机的方法,域名遵循下述优先级规则:
1、完整匹配的名称。
2、名称开始于一个文件通配符:*.example.com。
3、名称结束于一个文件通配符:www.example.*。
4、使用正则表达式的名称。
如果没有匹配的结果,nginx配置文件将安装以下优先级使用[#server server { … }]字段:
1、listen指令被标记为default的server字段。
2、第一个出现listen(或者默认的listen 80)的server字段。
如果server_name_in_redirect被设置,这个指令将用于设置HTTP重定向的服务器名。1
2
3
4server_name_in_redirect
语法:server_name_in_redirect on|off
默认值:server_name_in_redirect on
使用字段:http, server, location
如果这个指令打开,nginx将使用server_name指定的基本服务器名作为重定向地址,如果关闭,nginx将使用请求中的主机头。1
2
3
4server_names_hash_max_size
语法:server_names_hash_max_size number
默认值:server_names_hash_max_size 512
使用字段:http
服务器名称哈希表的最大值,更多信息请参考nginx Optimizations。1
2
3
4server_names_hash_bucket_size
语法:server_names_hash_bucket_size number
默认值:server_names_hash_bucket_size 32/64/128
使用字段:http
服务器名称哈希表每个页框的大小,这个指令的默认值依赖于cpu缓存。更多信息请参考nginx Optimizations。1
2
3
4server_tokens
语法:server_tokens on|off
默认值:server_tokens on
使用字段:http, server, location
是否在错误页面和服务器头中输出nginx版本信息。1
2
3
4tcp_nodelay
语法:tcp_nodelay [on|off]
默认值:tcp_nodelay on
使用字段:http, server, location
这个指令指定是否使用socket的TCP_NODELAY选项,这个选项只对keep-alive连接有效。
点击这里了解更多关于TCP_NODELAY选项的信息。1
2
3
4tcp_nopush
语法:tcp_nopush [on|off]
默认值:tcp_nopush off
使用字段:http, server, location
这个指令指定是否使用socket的TCP_NOPUSH(FreeBSD)或TCP_CORK(linux)选项,这个选项只在使用sendfile时有效。
设置这个选项的将导致nginx试图将它的HTTP应答头封装到一个包中。
点击这里查看关于TCP_NOPUSH和TCP_CORK选项的更多信息。1
2
3
4try_files
语法:try_files file1 [file2 ... filen] fallback
默认值:none
使用字段:location
这个指令告诉nginx将测试参数中每个文件的存在,并且URI将使用第一个找到的文件,如果没有找到文件,将请求名为fallback(可以使任何名称)的location字段,fallback是一个必须的参数,它可以是一个命名的location或者可靠的URI。1
2
3types
语法:types {...}
使用字段:http, server, location
这个字段指定一些扩展的文件对应方式与应答的MIME类型,一个MIME类型可以有一些与其类似的扩展。默认使用以下文件对应方式:1
2
3
4
5types {
text/html html;
image/gif gif;
image/jpeg jpg;
}
完整的对应视图文件为conf/mime.types,并且将被包含。
如果你想让某些特定的location的处理方式使用MIME类型:application/octet-stream,可以使用以下配置:1
2
3
4location /download/ {
types { }
default_type application/octet-stream;
}
变量
core module 支持一些内置的变量,与apache使用的变量相一致。
首先,一些变量代表了客户端请求头部的一些字段,如:$http_user_agent, $http_cookie等等。注意,由于这些变量会在请求中定义,所以可能无法保证他们是存在的或者说可以定义到一些别的地方(例如遵循一定的规范)。
一些其他变量:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55$arg_PARAMETER
这个变量包含在查询字符串时GET请求PARAMETER的值。
$args
这个变量等于请求行中的参数。
$binary_remote_addr
二进制码形式的客户端地址。
$content_length
请求头中的Content-length字段。
$content_type
请求头中的Content-Type字段。
$cookie_COOKIE
cookie COOKIE的值。
$document_root
当前请求在root指令中指定的值。
$document_uri
与$uri相同。
$host
请求中的主机头字段,如果请求中的主机头不可用,则为服务器处理请求的服务器名称。
$is_args
如果$args设置,值为"?",否则为""。
$limit_rate
这个变量可以限制连接速率。
$nginx_version
当前运行的nginx版本号。
$query_string
与$args相同。
$remote_addr
客户端的IP地址。
$remote_port
客户端的端口。
$remote_user
已经经过Auth Basic Module验证的用户名。
$request_filename
当前连接请求的文件路径,由root或alias指令与URI请求生成。
$request_body
这个变量包含请求的主要信息。在使用proxy_pass或fastcgi_pass指令的location中比较有意义。
$request_body_file
客户端请求主体信息的临时文件名。
$request_method
这个变量是客户端请求的动作,通常为GET或POST。
包括0.8.20及之前的版本中,这个变量总为main request中的动作,如果当前请求是一个子请求,并不使用这个当前请求的动作。
$request_uri
这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI。
$scheme
HTTP方法(如http,https)
$server_addr
服务器地址,在完成一次系统调用后可以确定这个值,如果要绕开系统调用,则必须在listen中指定地址并且使用bind参数。
$server_name
服务器名称
$server_port
请求到达服务器的端口号。
$server_protocol
请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$uri
请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改。
HTTP负载均衡模块
这个模块为后端的服务器提供简单的负载均衡(轮询(round-robin)和连接IP(client IP))
如下例:1
2
3
4
5
6
7
8
9
10
11upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
}
server {
location / {
proxy_pass http://backend;
}
}
指令1
2
3
4ip_hash
语法:ip_hash
默认值:none
使用字段:upstream
这个指令将基于客户端连接的IP地址来分发请求。
哈希的关键字是客户端的C类网络地址,这个功能将保证这个客户端请求总是被转发到一台服务器上,但是如果这台服务器不可用,那么请求将转发到另外的服务器上,这将保证某个客户端有很大概率总是连接到一台服务器。
无法将权重(weight)与ip_hash联合使用来分发连接。如果有某台服务器不可用,你必须标记其为“down”,如下例:1
2
3
4
5
6
7upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;
server backend4.example.com;
}
1 | server |
指定后端服务器的名称和一些参数,可以使用域名,IP,端口,或者unix socket。如果指定为域名,则首先将其解析为IP。
weight = NUMBER - 设置服务器权重,默认为1。
max_fails = NUMBER - 在一定时间内(这个时间在fail_timeout参数中设置)检查这个服务器是否可用时产生的最多失败请求数,默认为1,将其设置为0可以关闭检查,这些错误在proxy_next_upstream或fastcgi_next_upstream(404错误不会使max_fails增加)中定义。
fail_timeout = TIME - 在这个时间内产生了max_fails所设置大小的失败尝试连接请求后这个服务器可能不可用,同样它指定了服务器不可用的时间(在下一次尝试连接请求发起之前),默认为10秒,fail_timeout与前端响应时间没有直接关系,不过可以使用proxy_connect_timeout和proxy_read_timeout来控制。
down - 标记服务器处于离线状态,通常和ip_hash一起使用。
backup - (0.6.7或更高)如果所有的非备份服务器都宕机或繁忙,则使用本服务器(无法和ip_hash指令搭配使用)。
示例配置1
2
3
4
5upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}
注意:如果你只使用一台上游服务器,nginx将设置一个内置变量为1,即max_fails和fail_timeout参数不会被处理。
结果:如果nginx不能连接到上游,请求将丢失。
解决:使用多台上游服务器。1
2
3
4upstream
语法:upstream name { ... }
默认值:none
使用字段:http
这个字段设置一群服务器,可以将这个字段放在proxy_pass和fastcgi_pass指令中作为一个单独的实体,它们可以可以是监听不同端口的服务器,并且也可以是同时监听TCP和Unix socket的服务器。
服务器可以指定不同的权重,默认为1。
示例配置1
2
3
4
5upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}
请求将按照轮询的方式分发到后端服务器,但同时也会考虑权重。
在上面的例子中如果每次发生7个请求,5个请求将被发送到backend1.example.com,其他两台将分别得到一个请求,如果有一台服务器不可用,那么请求将被转发到下一台服务器,直到所有的服务器检查都通过。如果所有的服务器都无法通过检查,那么将返回给客户端最后一台工作的服务器产生的结果。
变量1
2
3
4
5
6
7
8$upstream_addr
前端服务器处理请求的服务器地址
$upstream_status
前端服务器的响应状态。
$upstream_response_time
前端服务器的应答时间,精确到毫秒,不同的应答以逗号和冒号分开。
$upstream_http_$HEADER
随意的HTTP协议头
HTTP访问控制模块
这个模块提供简单的基于主机的访问控制。
ngx_http_access_module这个模块可以详细的检查客户端IP,并且按顺序执行第一条匹配的规则。
如下例:1
2
3
4
5
6location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
deny all;
}
上面的例子中仅允许192.168.1.0/24和10.1.1.0/16网络段访问,但192.168.1.1是个例外。
如果要实施很多复杂的规则,那么最好使用GeoIP module模块。
指令1
2
3
4Allow
语法:allow [ address | CIDR | all ]
默认值:no
使用字段:http, server, location, limit_except
指令指定了允许访问的IP或网络段。1
2
3
4deny
语法:deny [ address | CIDR | all ]
默认值:no
使用字段:http, server, location, limit_except
指令指定了拒绝访问的IP或网络段。
提示和技巧:
HttpAccess模块可以和error_page指令搭配使用来重定向一个未经验证的访问请求。1
2
3
4
5
6
7error_page 403 http://example.com/forbidden.html;
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
deny all;
}
HTTP基本认证模块
这个模块提供基于用户名与密码的验证来保护你的站点或站点的一部分。
如下例:1
2
3
4location / {
auth_basic "Restricted";
auth_basic_user_file conf/htpasswd;
}
指令1
2
3
4auth_basic
语法:auth_basic [ text|off ]
默认值:auth_basic off
使用字段:http, server, location, limit_except
指令包含一个具有测试用户名和密码的HTTP基本认证,指定的参数将用于认证域。如果将值设置为“off”则忽略下级指令继承的动作。1
2
3
4auth_basic_user_file
语法:auth_basic_user_file the_file
默认值:no
使用字段:http, server, location, limit_except
HTTP目录清单生成模块
这个模块提供自动目录列表。
连接请求仅在ngx_http_index_module中没有找到主页文件时才会请求这个模块。
如下例:1
2
3location / {
autoindex on;
}
指令1
2
3
4autoindex
语法:autoindex [ on|off ]
默认值:autoindex off
使用字段:http, server, location
是否使用自动目录列表。1
2
3
4autoindex_exact_size
语法:autoindex_exact_size [ on|off ]
默认值:autoindex_exact_size on
使用字段:http, server, location
指定生成的自动目录文件大小,可以是精确到bytes或者使用KB, MB或GB。1
2
3
4autoindex_localtime
语法:autoindex_localtime [ on|off ]
默认值:autoindex_localtime off
使用字段:http, server, location
是否在目录列表文件中显示本地时间(GMT时间),默认为关。
浏览器相关模块
这个模块按照请求头中的“User-agent”来创建一些变量:
$modern_browser - 如果浏览器被识别为一个当前流行的浏览器,这个值等于指令modern_browser_value指定的值。
$ancient_browser - 如果浏览器被识别为一个比较旧的浏览器,这个值等于指令ancient_browser_value指定的值。
$msie - 如果浏览器被识别为MSIE,这个值为1。
如果不需要这个模块,可以在编译nginx时增加–without-http_browser_module参数。
指令1
2
3
4ancient_browser
语法:ancient_browser line [ line... ]
默认值:no
使用字段:http, server, location
在”User-agent”字段中的浏览器被识别为旧浏览器时,这个指令指定一些子链。
一个比较特殊的字段是”netscape4”,它对应正则表达式”^Mozilla/[1-4] “。1
2
3
4
5ancient_browser_value
语法:ancient_browser_value line
默认值:ancient_browser_value 1
使用字段:http, server, location
指定变量$ancient_browser的值。
1 | modern_browser |
指令将指定哪个版本的浏览器将被认为是目前流行的。
可以指定的浏览器为:msie, gecko (基于Mozilla的浏览器) opera, safari, konqueror。
可以使用的版本格式为X, X.X, X.X.X, 或X.X.X.X,每个的最大值为4000, 4000.99, 4000.99.99,和4000.99.99.99。
一个特殊的值”unlisted”在被认为是流行的浏览器中指定,而不是通过modern_browser或ancient_browser指令。
如果请求头中没有”User-agent”字段,那么这个浏览器被认为是古老的(除非指定“modern_browser unlisted”)。1
2
3
4modern_browser_value
语法:modern_browser_value line
默认值:modern_browser_value 1
使用字段:http, server, location
指定$modern_browser变量的值。
字符集设置模块
这个模块将在应答头中为”Content-Type”字段添加字符编码。
此外,这个模块可以将数据重新编码,只能在单向对其进行重新编码,即来自服务器到达客户端。
指令1
2
3
4charset
语法:charset encoding|off
默认值:charset off
使用字段:http, server, location, location中的if字段
这个指令使应答头中的”Content-Type”字段使用指定的编码集,如果这个字符集与source_charset指令设置的字符集不相同,将重新编码字符集,参数off表明不在应答头中添加”Content-Type”信息。1
2
3
4charset_map
语法:charset_map encoding1 encoding2 {...}
默认值:no
使用字段:http, server, location
charset_map指定了一个编码转换表,同时会创建一个反向转换表,代码均使用十六进制,如果在80-FF范围内没有被记录的代码,它们将被标记为”?”。1
2
3
4override_charset
语法:override_charset on|off
默认值:override_charset off
使用字段:http, server, location, if中的location字段
参数指定在代理服务器或者FastCGI服务器上取得的应答头中存在”Content-Type”字段,将为应答启用编码转换,如果允许编码转换,将使用应答头中指定的编码对其初始化。
注意如果是在一个子查询中取得的应答,会始终将应答中的编码转换为基础编码,并不依赖于override_charset指令。1
2
3
4source_charset
语法:source_charset encoding
默认值:no
使用字段:http, server, location, if中的location字段
参数指定了应答中的初始代码,如果这个参数与charset指令中的不同,将启用编码转换
Empty GIF模块
这个模块在内存中保存一个能够很快传递的1×1透明GIF。
简单用法:1
2
3location = /_.gif {
empty_gif;
}
指令1
2
3
4empty_gif
语法:empty_gif
默认值:n/a
使用字段:location
FastCGI模块
这个模块允许nginx同FastCGI协同工作,并且控制哪些参数将被安全传递。
指令1
2
3
4fastcgi_buffer_size
语法:fastcgi_buffer_size the_size ;
默认值:fastcgi_buffer_size 4k/8k ;
使用字段:http, server, location
这个参数指定将用多大的缓冲区来读取从FastCGI服务器到来应答的第一部分。
通常来说在这个部分中包含一个小的应答头。
默认的缓冲区大小为fastcgi_buffers指令中的每块大小,可以将这个值设置更小。1
2
3
4fastcgi_buffers
语法:fastcgi_buffers the_number is_size;
默认值:fastcgi_buffers 8 4k/8k;
使用字段:http, server, location
这个参数指定了从FastCGI服务器到来的应答,本地将用多少和多大的缓冲区读取,默认这个参数等于分页大小,根据环境的不同可能是4K, 8K或16K。1
2
3
4fastcgi_cache
语法:fastcgi_cache zone|off;
默认值:off
使用字段:http, server, location
为缓存实际使用的共享内存指定一个区域,相同的区域可以用在不同的地方。1
2
3
4fastcgi_cache_key
语法:fastcgi_cache_key line
默认值:none
使用字段:http, server, location
设置缓存的关键字,如:
fastcgi_cache_key localhost:9000$request_uri;1
2
3
4fastcgi_cache_path
语法:fastcgi_cache_path path [levels=m:n] keys_zone=name:size [inactive=time] [max_size=size]
默认值:none
使用字段:http
clean_time参数在0.7.45版本中已经移除。
这个指令指定FastCGI缓存的路径以及其他的一些参数,所有的数据以文件的形式存储,缓存的关键字(key)和文件名为代理的url计算出的MD5值。
Level参数设置缓存目录的目录分级以及子目录的数量,例如指令如果设置为:
fastcgi_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;
那么数据文件将存储为:
/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c
缓存中的文件首先被写入一个临时文件并且随后被移动到缓存目录的最后位置,0.8.9版本之后可以将临时文件和缓存文件存储在不同的文件系统,但是需要明白这种移动并不是简单的原子重命名系统调用,而是整个文件的拷贝,所以最好在fastcgi_temp_path和fastcgi_cache_path的值中使用相同的文件系统。
另外,所有活动的关键字及数据相关信息都存储于共享内存池,这个值的名称和大小通过key_zone参数指定,inactive参数指定了内存中的数据存储时间,默认为10分钟。
max_size参数设置缓存的最大值,一个指定的cache manager进程将周期性的删除旧的缓存数据。1
2
3
4fastcgi_cache_methods
语法:fastcgi_cache_methods [GET HEAD POST];
默认值:fastcgi_cache_methods GET HEAD;
使用字段:main,http,location
无法禁用GET/HEAD ,即使你只是这样设置:
fastcgi_cache_methods POST;1
2
3
4fastcgi_cache_min_uses
语法:fastcgi_cache_min_uses n
默认值:fastcgi_cache_min_uses 1
使用字段:http, server, location
指令指定了经过多少次请求的相同URL将被缓存。1
2
3
4fastcgi_cache_path
语法:fastcgi_cache_path /path/to/cache [levels=m:n keys_zone=name:time inactive=time]
默认值:none
使用字段:http
1 | fastcgi_cache_use_stale |
1 | fastcgi_cache_valid |
为指定的http返回代码指定缓存时间,例如:1
2fastcgi_cache_valid 200 302 10m;
fastcgi_cache_valid 404 1m;
将响应状态码为200和302缓存10分钟,404缓存1分钟。
默认情况下缓存只处理200,301,302的状态。
同样也可以在指令中使用any表示任何一个。1
2
3fastcgi_cache_valid 200 302 10m;
fastcgi_cache_valid 301 1h;
fastcgi_cache_valid any 1m;
1 | fastcgi_connect_timeout |
指定同FastCGI服务器的连接超时时间,这个值不能超过75秒。1
2
3
4fastcgi_index
语法:fastcgi_index file
默认值:none
使用字段:http, server, location
如果URI以斜线结尾,文件名将追加到URI后面,这个值将存储在变量$fastcgi_script_name中。例如:1
2fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;
请求”/page.php”的参数SCRIPT_FILENAME将被设置为”/home/www/scripts/php/page.php”,但是”/“为”/home/www/scripts/php/index.php”。1
2
3fastcgi_hide_header
语法:fastcgi_hide_header name
使用字段:http, server, location
默认情况下nginx不会将来自FastCGI服务器的”Status”和”X-Accel-…”头传送到客户端,这个参数也可以隐藏某些其它的头。
如果必须传递”Status”和”X-Accel-…”头,则必须使用fastcgi_pass_header强制其传送到客户端。1
2
3
4fastcgi_ignore_client_abort
语法:fastcgi_ignore_client_abort on|off
默认值:fastcgi_ignore_client_abort off
使用字段:http, server, location
如果当前连接请求FastCGI服务器失败,为防止其与nginx服务器断开连接,可以用这个指令。1
2
3fastcgi_ignore_headers
语法:fastcgi_ignore_headers name [name...]
使用字段:http, server, location
这个指令禁止处理一些FastCGI服务器应答的头部字段,比如可以指定像”X-Accel-Redirect”, “X-Accel-Expires”, “Expires”或”Cache-Control”等。1
2
3
4fastcgi_intercept_errors
语法:fastcgi_intercept_errors on|off
默认值:fastcgi_intercept_errors off
使用字段:http, server, location
这个指令指定是否传递4xx和5xx错误信息到客户端,或者允许nginx使用error_page处理错误信息。
你必须明确的在error_page中指定处理方法使这个参数有效,正如Igor所说“如果没有适当的处理方法,nginx不会拦截一个错误,这个错误不会显示自己的默认页面,这里允许通过某些方法拦截错误。1
2
3
4fastcgi_max_temp_file_size
语法:fastcgi_max_temp_file_size 0
默认值:fastcgi_max_temp_file_size 0
使用字段:http, server, location
根据源代码关闭FastCGI缓冲。1
2
3
4fastcgi_no_cache
语法:fastcgi_no_cache variable [...]
默认值:None
使用字段:http, server, location
确定在何种情况下缓存的应答将不会使用,示例:1
2fastcgi_no_cache $cookie_nocache $arg_nocache$arg_comment;
fastcgi_no_cache $http_pragma $http_authorization;
如果为空字符串或者等于0,表达式的值等于false,例如,在上述例子中,如果在请求中设置了cookie “nocache”,缓存将被绕过。1
2
3
4fastcgi_next_upstream
语法:fastcgi_next_upstream error|timeout|invalid_header|http_500|http_503|http_404|off
默认值:fastcgi_next_upstream error timeout
使用字段:http, server, location
指令指定哪种情况请求将被转发到下一个FastCGI服务器:
error — 传送中的请求或者正在读取应答头的请求在连接服务器的时候发生错误。
timeout — 传送中的请求或者正在读取应答头的请求在连接服务器的时候超时。
invalid_header — 服务器返回空的或者无效的应答。
http_500 — 服务器返回500应答代码。
http_503 — 服务器返回503应答代码。
http_404 — 服务器返回404应答代码。
off — 禁止请求传送到下一个FastCGI服务器。
注意传送请求在传送到下一个服务器之前可能已经将空的数据传送到了客户端,所以,如果在数据传送中有错误或者超时发生,这个指令可能无法修复一些传送错误。1
2
3
4fastcgi_param
语法:fastcgi_param parameter value
默认值:none
使用字段:http, server, location
指定一些传递到FastCGI服务器的参数。
可以使用字符串,变量,或者其组合,这里的设置不会继承到其他的字段,设置在当前字段会清除掉任何之前的定义。
下面是一个PHP需要使用的最少参数:1
2fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
PHP使用SCRIPT_FILENAME参数决定需要执行哪个脚本,QUERY_STRING包含请求中的某些参数。
如果要处理POST请求,则需要另外增加三个参数:1
2
3fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
如果PHP在编译时带有–enable-force-cgi-redirect,则必须传递值为200的REDIRECT_STATUS参数:
fastcgi_param REDIRECT_STATUS 200;1
2
3
4fastcgi_pass
语法:fastcgi_pass fastcgi-server
默认值:none
使用字段:http, server, location
1 | fastcgi_pass_header |
1 | fastcgi_read_timeout |
前端FastCGI服务器的响应超时时间,如果有一些直到它们运行完才有输出的长时间运行的FastCGI进程,或者在错误日志中出现前端服务器响应超时错误,可能需要调整这个值。1
2fastcgi_redirect_errors
语法:fastcgi_redirect_errors on|off
指令重命名为fastcgi_intercept_errors。1
2
3
4fastcgi_send_timeout
语法:fastcgi_send_timeout time
默认值:fastcgi_send_timeout 60
使用字段:http, server, location
指令为上游服务器设置等待一个FastCGI进程的传送数据时间,如果有一些直到它们运行完才有输出的长时间运行的FastCGI进程,那么可以修改这个值,如果你在上有服务器的error log里面发现一些超时错误,那么可以恰当的增加这个值。
指令指定请求服务器的超时时间,指完成了2次握手的连接,而不是完整的连接,如果在这期间客户端没有进行数据传递,那么服务器将关闭这个连接。1
2
3fastcgi_split_path_info
语法:fastcgi_split_path_info regex
使用字段:location
1 | fastcgi_store |
制定了存储前端文件的路径,参数on指定了将使用root和alias指令相同的路径,off禁止存储,此外,参数中可以使用变量使路径名更明确:
fastcgi_store /data/www$original_uri;
应答中的”Last-Modified”头将设置文件的最后修改时间,为了使这些文件更加安全,可以将其在一个目录中存为临时文件,使用fastcgi_temp_path指令。
这个指令可以用在为那些不是经常改变的后端动态输出创建本地拷贝的过程中。如:1
2
3
4
5
6
7
8
9
10
11
12
13
14location /images/ {
root /data/www;
error_page 404 = /fetch$uri;
}
location /fetch {
internal;
fastcgi_pass fastcgi://backend;
fastcgi_store on;
fastcgi_store_access user:rw group:rw all:r;
fastcgi_temp_path /data/temp;
alias /data/www;
}
fastcgi_store并不是缓存,某些需求下它更像是一个镜像。1
2
3
4fastcgi_store_access
语法:fastcgi_store_access users:permissions [users:permission ...]
默认值:fastcgi_store_access user:rw
使用字段:http, server, location
这个参数指定创建文件或目录的权限,例如:
fastcgi_store_access user:rw group:rw all:r;
如果要指定一个组的人的相关权限,可以不写用户,如:
fastcgi_store_access group:rw all:r;1
2
3
4fastcgi_temp_path
语法:fastcgi_temp_path path [level1 [level2 [level3]]]
默认值:fastcgi_temp_path fastcgi_temp
使用字段:http, server, location
变量1
2$fastcgi_script_name
这个变量等于一个以斜线结尾的请求URI加上fastcgi_index给定的参数。可以用这个变量代替SCRIPT_FILENAME 和PATH_TRANSLATED,以确定php脚本的名称。
Geo模块
geo指令使用ngx_http_geo_module模块提供的。默认情况下,nginx有加载这个模块,除非人为的 –without-http_geo_module。ngx_http_geo_module模块可以用来创建变量,其值依赖于客户端IP地址。
指令1
2
3
4geo
语法: geo [$address] $variable { ... }
默认值: —
配置段: http
定义从指定的变量获取客户端的IP地址。默认情况下,nginx从$remote_addr变量取得客户端IP地址,但也可以从其他变量获得。如1
2
3
4
5
6
7
8geo $remote_addr $geo {
default 0;
127.0.0.1 1;
}
geo $arg_ttlsa_com $geo {
default 0;
127.0.0.1 1;
}
如果该变量的值不能代表一个合法的IP地址,那么nginx将使用地址“255.255.255.255”。
nginx通过CIDR或者地址段来描述地址,支持下面几个参数:
delete:删除指定的网络
default:如果客户端地址不能匹配任意一个定义的地址,nginx将使用此值。 如果使用CIDR,可以用“0.0.0.0/0”代替default。
include: 包含一个定义地址和值的文件,可以包含多个。
proxy:定义可信地址。 如果请求来自可信地址,nginx将使用其“X-Forwarded-For”头来获得地址。 相对于普通地址,可信地址是顺序检测的。
proxy_recursive:开启递归查找地址。 如果关闭递归查找,在客户端地址与某个可信地址匹配时,nginx将使用“X-Forwarded-For”中的最后一个地址来代替原始客户端地址。如果开启递归查找,在客户端地址与某个可信地址匹配时,nginx将使用“X-Forwarded-For”中最后一个与所有可信地址都不匹配的地址来代替原始客户端地址。
ranges:使用以地址段的形式定义地址,这个参数必须放在首位。为了加速装载地址库,地址应按升序定义。
1 | geo $country { |
1 | vim conf/geo.conf |
地址段例子:1
2
3
4
5
6
7
8
9geo $country {
ranges;
default ZZ;
127.0.0.0-127.0.0.0 US;
127.0.0.1-127.0.0.1 RU;
127.0.0.1-127.0.0.255 US;
10.1.0.0-10.1.255.255 RU;
192.168.1.0-192.168.1.255 UK;
}
遵循最精确匹配原则,即nginx使用能最精确匹配客户端地址的值。
Gzip模块
这个模块允许在文件传输过程中使用gzip压缩。
指令1
2
3
4gzip
语法:gzip on|off
默认值:gzip off
使用字段:http, server, location, location中的if字段
指定是否启用gzip压缩。1
2
3
4gzip_buffers
语法:gzip_buffers number size
默认值:gzip_buffers 4 4k/8k
使用字段:http, server, location
指定缓存压缩应答的缓冲区数量和大小,如果不设置,一个缓存区的大小为分页大小,根据环境的不同可能是4k或8k。1
2
3
4gzip_comp_level
语法:gzip_comp_level 1..9
默认值:gzip_comp_level 1
使用字段:http, server, location
指定压缩等级,其值从1到9,1为最小化压缩(处理速度快),9为最大化压缩(处理速度慢)。1
2
3gzip_disable
语法:gzip_disable regex
使用字段:http, server, location
使用正则表达式来指定某些不需要gzip压缩的浏览器(将和User-Agents进行匹配)。依赖于PCRE库。在0.6.23版本中首次使用。1
2
3
4gzip_http_version
语法:gzip_http_version 1.0|1.1
默认值:gzip_http_version 1.1
使用字段:http, server, location
是否根据HTTP请求版本来启用gzip压缩。
当HTTP版本为1.0时,Vary: Accept-Encoding没有被设置,这将引起某些代理缓存失效,可以使用add_header,同样,在使用这个版本时Content-Length也没有设置,因此Keepalive不能在这个版本使用。1
2
3
4gzip_min_length
语法:gzip_min_length length
默认值:gzip_min_length 0
使用字段:http, server, location
设置被压缩的最小请求,单位为bytes。少于这个值大小的请求将不会被压缩,这个值由请求头中的Content-Length字段决定。1
2
3
4gzip_proxied
语法:gzip_proxied [off|expired|no-cache|no-store|private|no_last_modified|no_etag|auth|any] ...
默认值:gzip_proxied off
使用字段:http, server, location
根据某些请求和应答来决定是否在对代理请求的应答启用压缩,事实上,代理请求取决于请求头中的“Via”字段,指令中可以同时指定多个不同的参数:
off - 为所有代理请求禁用压缩。
expired - 当“Expires”头禁用缓存时启用压缩。
no-cache - 当“Cache-Control”头设置为no-cache时启用压缩。
no-store - 当“Cache-Control”头设置为no-store时启用压缩。
private - 当“Cache-Control”头设置为private时启用压缩。
no_last_modified - 当“Last-Modified”没有定义时启用压缩。
no_etag - 没有“ETag”头时启用压缩。
auth - 当有一个“Authorization”头时启用压缩。
any - 为所有请求启用压缩。
1 | gzip_types |
为除“text/html”之外的MIME类型启用压缩,“text/html”总是会被压缩。1
2
3
4gzip_vary
ggzip_vary on|off
默认值:gzip_vary off
使用字段:http, server, location
启用应答头“Vary: Accept-Encoding”,注意,由于一个bug将导致IE 4-6无法缓存内容。
HTTP头处理模块
这个模块允许设置任意的HTTP头。
指令1
2
3
4add_header
语法:add_header name value
默认值:none
使用字段:http, server, location
当服务器应答代码为200, 204, 301, 302或304时为HTTP应答添加头。
这个值可以使用变量
注意这个指令只会在输出的头部中增加某个新字段,而并不能对某些已经定义的头(如server)进行重写,如果要实现这个操作可以使用第三方模块headers_more。1
2
3
4expires
语法:expires [time|@time-of-day|epoch|max|off]
默认值:expires off
使用字段:http, server, location
这个指令控制是否在应答中标记一个过期时间,如果是,如何标记。
off 将禁止修改头部中的 Expires和Cache-Control字段。
epoch 将Expires头设置为1 January, 1970 00:00:01 GMT。
max 将Expires头设置为31 December 2037 23:59:59 GMT,将Cache-Control最大化到10 years。
如果将指令设置为一个不带@标记的值,那么过期时间将是应答时间的相对时间(如果这个时间在“modified”之前),或者是文件的修改时间(当"modified"存在,在版本0.7.0和0.6.32可用),并且可以指定一个负的时间,它将Cache-Control头设置为no-cache比较。
如果指令的值被设置为一个带@标记的值,那么将指定一个绝对的time-of-day过期时间,可以指定两种格式分别为Hh或Hh:Mm,其中H的大小范围为0到24,M的大小范围为0到59(在0.7.9和0.6.34可用)。
一个非负的时间值将Cache-Control头设置为 max-age = #,#将适当的换算为秒数。
注意:expires仅仅适用于200, 204, 301, 302,和304应答
默认主页设置模块
如果URL中没有指定文件,则设置一个默认主页。
如下例:1
index index.html;
可以指定多个文件,如果第一个文件没有找到,将会查找后面指定的文件:1
index index.html index.htm;
指令1
2
3
4index
语法:index file-path [file-path [ ... ] ];
默认值:no
使用字段:server, location
HTTP Referer模块
当一个请求头的Referer字段中包含一些非正确的字段,这个模块可以禁止这个请求访问站点。
这个头可以随意的伪造,因此,使用这个模块并不能100%的阻止这些请求,绝大多数拒绝的请求来自一些典型的浏览器,可以认为这些典型的浏览器并不能提供一个”Referer”头,甚至是那些正确的请求。
如下例:1
2
3
4
5
6
7location /photos/ {
valid_referers none blocked www.mydomain.com mydomain.com;
if ($invalid_referer) {
return 403;
}
}
指令1
2
3
4valid_referers
语法:valid_referers [none|blocked|server_names] ...
默认值:none
使用字段:server, location
这个指令在referer头的基础上为 $invalid_referer 变量赋值,其值为0或1。
可以使用这个指令来实现防盗链功能,如果valid_referers列表中没有Referer头的值, $invalid_referer将被设置为1(参照前例)。
HTTP Limit Zone模块
这个模块可以为一个地址指定的会话或者某些特殊情况限制同时连接数,
如下例:1
2
3
4
5
6
7
8
9http {
limit_zone one $binary_remote_addr 10m;
server {
location /download/ {
limit_conn one 1;
}
}
}
指令1
2
3
4limit_zone
语法:limit_zone zone_name $variable memory_max_size
默认值:no
使用字段:http
指令描述会话状态存储区域。
会话的数目按照指定的变量来决定,它依赖于使用的变量大小和memory_max_size的值。1
2
3
4limit_conn
语法:limit_conn zone_name max_clients_per_ip
默认值:no
使用字段:http, server, location
指令指定一个会话的最大同时连接数,超过这个数字的请求将被返回”Service unavailable” (503)代码。
HTTP Limit Requests模块
这个模块允许为一个指定的会话或者某个特殊情况限制请求数目。
示例配置1
2
3
4
5
6
7
8
9
10
11
12http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
...
server {
...
location /search/ {
limit_req zone=one burst=5;
}
指令1
2
3语法:limit_req_log_level info|notice|warn|error
默认值:warn
使用字段:http
指定记录日志的等级。1
2
3语法:limit_req_zone $session_variable zone=name_of_zone:size rate=rate
默认值:none
使用字段:http
指令描述会话状态存储区域。
指令描述会话状态存储的某个区域,会话的值根据给定的变量,如下例:1
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
在这种情况下,将为一个名为“one”的区域分配10MB,这个区域的平均查询速度为每秒最多1个请求。
会话将追踪每个用户,但是注意它替换了变量$remote_addr,我们使用的是$binary_remote_addr,减少会话的大小为64字节,一个1MB的区域可以包含大约16000个会话状态。
速度可以设置为每秒处理请求数和每分钟处理请求数,其值必须是整数,所以如果你需要指定每秒处理少于1个的请求,2秒处理一个请求,可以使用 “30r/m”。
当会话状态储存区域为1M时理论上可以处理32000个会话,每个会话大小为32字节。1
2
3语法: limit_req zone=zone burst=burst [nodelay]
默认值:none
使用字段:http, server, location
这个指令指定区域(zone)可能的最大请求爆发值(burst),如果其值超过这个数,请求被延时,以便查询按照给定的速度处理。多余的请求将被延迟直到他们的数目小于burst值,在这种情况下,请求将得到”Service unavailable” (503)代码,默认burst的值为0。
如下例:1
2
3
4
5
6limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
location /search/ {
limit_req zone=one burst=5;
}
允许一个用户平均每秒处理不超过1个请求,这个区域最多同时处理不超过5个查询,如果在burst值之外的额外请求不可用,可以使用nodelay参数:
limit_req zone=one burst=5 nodelay;
日志模块
控制nginx如何记录请求日志。
例如:1
2
3
4
5log_format gzip '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" "$gzip_ratio"';
access_log /spool/logs/nginx-access.log gzip buffer=32k;
关于记录nginx错误日志请参考HTTP核心模块。
指令1
2
3
4access_log
语法:access_log path [format [buffer=size | off]]
默认值:access_log log/access.log combined
使用字段:http, server, location
参数为连接日志指定了路径,格式和缓冲区大小。使用“off”将在当前的字段中清除access_log的所有参数,如果没有指定日志格式,默认为“combined”。缓冲区大小不能超过写入磁盘文件的最小大小。
日志文件路径可以包含变量(0.7.4以上版本),但是有一些限制:
nginx指定的用户必须有创建日志文件的权限。
缓冲区不会工作
每个到来的连接,日志文件将被打开并且在记录日志后迅速关闭,然而,频繁使用的文件描述符将被保存到open_log_file_cache中,关于日志的轮询记录,必须记住随着时间的过去(使用open_log_file_cache的valid参数设置),日志仍然在旧的文件中记录。
nginx支持为每个location指定强大的日志记录,同样的连接可以在同一时间输出到不止一个的日志中。1
2
3
4log_format
语法:log_format name format [format ...]
默认值:log_format combined "..."
使用字段:http server
描述记录日志的格式,格式中可以使用大多数变量,也包括一些在写入日志文件过程中定义的变量:
$body_bytes_sent,减去应答头后传送给客户端的字节数,这个变量兼容apache模块mod_log_config的%B参数(在0.3.10前这个变量为$apache_bytes_sent)。
$bytes_sent,传送给客户端的字节数。
$connection,连接数。
$msec,正在写入日志条目的当前时间(精确到百万分之一秒)
$pipe,如果请求为管道的。
$request_length,请求主体的长度。
$request_time,从一个请求发出到而使nginx工作的时间,单位为毫秒(0.5.19版本后可以使用秒为单位)。
$status,应答的状态(代码)。
$time_local,写入普通日志格式的当地时间(服务器时间)。
传送到客户端的头中的变量以”sent_http_”标记开头,如:$sent_http_content_range。
注意其他模块产生的变量同样可以写入日志,例如你可以记录前端负载均衡应答头使用“upstream_http_”开头的变量,具体请查看负载均衡模块。
nginx有一个预定的日志格式称为combined:1
2
3log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
1 | open_log_file_cache |
这个指令为频繁使用的日志文件描述符所在的路径变量设置缓存。
指令选项:
max - 缓存中存储的最大文件描述符数。
inactive - 设置缓存中在某个时间段内没有使用的文件描述符将被移除,默认为10秒。
min_uses - 在一定时间内(inactive指定),一个文件描述符最少使用多少次后被放入缓存,默认为1。
valid - 设置检查同名文件存在的时间,默认是60秒。
off - 关闭缓存。
Map模块
这个模块允许你分类或者同时映射多个值到多个不同值并储存到一个变量中。
如下例:1
2
3
4
5
6
7
8
9
10
11map $http_host $name {
hostnames;
default 0;
example.com 1;
*.example.com 1;
test.com 2;
*.test.com 2;
.site.com 3;
}
一个典型的使用映射的例子是代替一个含有很多服务器的/location或者重定向:1
2
3
4
5
6
7
8
9
10
11
12map $uri $new {
default http://www.domain.com/home/;
/aa http://aa.domain.com/;
/bb http://bb.domain.com/;
/john http://my.domain.com/users/john/;
}
server {
server_name www.domain.com;
rewrite ^ $new redirect;
}
指令1
2
3
4map
语法:map $var1 $var2 { ... }
默认值:none
使用字段:http
1 | map_hash_max_size |
这个指令设置映射表对应的哈希表的最大值。1
2
3
4map_hash_bucket_size
语法:map_hash_bucket_size n
默认值:map_hash_bucket_size 32/64/128
使用字段:http
这个指令指定一个映射表中的变量在哈希表中的最大值,这个值取决于处理器的缓存。
Memcached模块
使用这个模块简单的处理缓存,这个模块将不断的进行完善。
示例配置:1
2
3
4
5
6
7
8
9
10
11
12server {
location / {
set $memcached_key $uri;
memcached_pass name:11211;
default_type text/html;
error_page 404 = /fallback;
}
location = /fallback {
proxy_pass backend;
}
}
指令1
2
3
4memcached_pass
语法:memcached_pass [ name:port ]
默认值:none
使用字段:http, server, location
后端需要在memcached中设置一些数据,memcached key为“”/uri?args”。1
2
3
4memcached_connect_timeout
语法:memcached_connect_timeout [ time ]
默认值:60000
使用字段:http, server, location
连接memcached的超时时间,单位为毫秒。1
2
3
4memcached_read_timeout
语法:memcached_read_timeout [ time ]
默认值:60000
使用字段:http, server, location
读取memcached数据的超时时间,单位为毫秒。1
2
3
4memcached_send_timeout
语法:memcached_send_timeout [ time ]
默认值:60000
使用字段:http, server, location
发送memcached数据的超时时间,单位为毫秒。1
2
3
4memcached_buffer_size
语法:memcached_buffer_size [ size ]
默认值:see getpagesize(2)
使用字段:http, server, location
发送/收到的缓冲区大小,单位是字节。1
2
3
4memcached_next_upstream
语法:memcached_next_upstream [ error | timeout | invalid_response | not_found | off ]
默认值:error timeout
使用字段:http, server, location
指定在哪种错误状态下请求将转发到另外的负载均衡服务器,仅当memcached_pass有两个或两个以上值的时候使用。
变量1
2$memcached_key
memcached key的值
HTTP代理模块
这个模块可以转发请求到其他的服务器。
注意当使用http proxy模块(甚至FastCGI),所有的连接请求在发送到后端服务器之前nginx将缓存它们,因此,在测量从后端传送的数据时,它的进度显示可能不正确。
指令1
2
3
4proxy_buffer_size
语法:proxy_buffer_size the_size
默认值:proxy_buffer_size 4k/8k
使用字段:http, server, location
设置从被代理服务器读取的第一部分应答的缓冲区大小。
通常情况下这部分应答中包含一个小的应答头。
默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小。1
2
3
4proxy_buffering
语法:proxy_buffering on|off
默认值:proxy_buffering on
使用字段:http, server, location
为后端的服务器启用应答缓冲。
如果启用缓冲,nginx假设被代理服务器能够非常快的传递应答,并将其放入缓冲区,可以使用 proxy_buffer_size和proxy_buffers设置相关参数。
如果响应无法全部放入内存,则将其写入硬盘。
如果禁用缓冲,从后端传来的应答将立即被传送到客户端。
nginx忽略被代理服务器的应答数目和所有应答的大小,接受proxy_buffer_size所指定的值。
对于基于长轮询的Comet应用需要关闭这个指令,否则异步的应答将被缓冲并且Comet无法正常工作。1
2
3
4proxy_buffers
语法:proxy_buffers the_number is_size;
默认值:proxy_buffers 8 4k/8k;
使用字段:http, server, location
设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8k。1
2
3
4proxy_busy_buffers_size
语法:proxy_busy_buffers_size size;
默认值:proxy_busy_buffers_size ["#proxy buffer size"] * 2;
使用字段:http, server, location, if
1 | proxy_cache |
设置一个缓存区域的名称,一个相同的区域可以在不同的地方使用。1
2
3
4proxy_cache_key
语法:proxy_cache_key line;
默认值:$scheme$proxy_host$request_uri;
使用字段:http, server, location
指令指定了包含在缓存中的缓存关键字。
proxy_cache_key “$host$request_uri$cookie_user”;
注意默认情况下服务器的主机名并没有包含到缓存关键字中,如果你为你的站点在不同的location中使用二级域,你可能需要在缓存关键字中包换主机名:
proxy_cache_key “$scheme$host$request_uri”;1
2
3
4proxy_cache_path
语法:proxy_cache_path path [levels=number] keys_zone=zone_name:zone_size [inactive=time] [max_size=size];
默认值:None
使用字段:http
指令指定缓存的路径和一些其他参数,缓存的数据存储在文件中,并且使用代理url的哈希值作为关键字与文件名。1
2
3
4proxy_cache_methods
语法:proxy_cache_methods [GET HEAD POST];
默认值:proxy_cache_methods GET HEAD;
使用字段:http, server, location
GET/HEAD用来装饰语句,即你无法禁用GET/HEAD即使你只使用下列语句设置:
proxy_cache_methods POST;1
2
3
4proxy_cache_min_uses
语法:proxy_cache_min_uses the_number;
默认值:proxy_cache_min_uses 1;
使用字段:http, server, location
多少次的查询后应答将被缓存,默认1。1
2
3
4proxy_cache_valid
语法:proxy_cache_valid reply_code [reply_code ...] time;
默认值:None
使用字段:http, server, location
为不同的应答设置不同的缓存时间,例如:1
2proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
为应答代码为200和302的设置缓存时间为10分钟,404代码缓存1分钟。
如果只定义时间:
proxy_cache_valid 5m;
那么只对代码为200, 301和302的应答进行缓存。
同样可以使用any参数任何应答。
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;1
2
3
4proxy_cache_use_stale
语法:proxy_cache_use_stale [error|timeout|updating|invalid_header|http_500|http_502|http_503|http_504|http_404|off] [...];
默认值:proxy_cache_use_stale off;
使用字段:http, server, location
这个指令告诉nginx何时从代理缓存中提供一个过期的响应,参数类似于proxy_next_upstream指令。
为了防止缓存失效(在多个线程同时更新本地缓存时),你可以指定’updating’参数,它将保证只有一个线程去更新缓存,并且在这个线程更新缓存的过程中其他的线程只会响应当前缓存中的过期版本。1
2
3
4proxy_connect_timeout
语法:proxy_connect_timeout timeout_in_seconds
默认值:proxy_connect_timeout 60
使用字段:http, server, location
指定一个连接到代理服务器的超时时间,需要注意的是这个时间最好不要超过75秒。
这个时间并不是指服务器传回页面的时间(这个时间由proxy_read_timeout声明)。如果你的前端代理服务器是正常运行的,但是遇到一些状况(例如没有足够的线程去处理请求,请求将被放在一个连接池中延迟处理),那么这个声明无助于服务器去建立连接。1
2
3
4proxy_headers_hash_bucket_size
语法:proxy_headers_hash_bucket_size size;
默认值:proxy_headers_hash_bucket_size 64;
使用字段:http, server, location, if
设置哈希表中存储的每个数据大小。1
2
3
4proxy_headers_hash_max_size
语法:proxy_headers_hash_max_size size;
默认值:proxy_headers_hash_max_size 512;
使用字段:http, server, location, if
设置哈希表的最大值。1
2
3proxy_hide_header
语法:proxy_hide_header the_header
使用字段:http, server, location
nginx不对从被代理服务器传来的”Date”, “Server”, “X-Pad”和”X-Accel-…”应答进行转发,这个参数允许隐藏一些其他的头部字段,但是如果上述提到的头部字段必须被转发,可以使用proxy_pass_header指令。1
2
3
4proxy_ignore_client_abort
语法:proxy_ignore_client_abort [ on|off ]
默认值:proxy_ignore_client_abort off
使用字段:http, server, location
防止在客户端自己终端请求的情况下中断代理请求。1
2
3
4proxy_ignore_headers
语法:proxy_ignore_headers name [name ...]
默认值:none
使用字段:http, server, location
这个指令(0.7.54+) 禁止处理来自代理服务器的应答。
可以指定的字段为”X-Accel-Redirect”, “X-Accel-Expires”, “Expires”或”Cache-Control”。1
2
3
4proxy_intercept_errors
语法:proxy_intercept_errors [ on|off ]
默认值:proxy_intercept_errors off
使用字段:http, server, location
使nginx阻止HTTP应答代码为400或者更高的应答。
默认情况下被代理服务器的所有应答都将被传递。
如果将其设置为on则nginx会将阻止的这部分代码在一个error_page指令处理,如果在这个error_page中没有匹配的处理方法,则被代理服务器传递的错误应答会按原样传递。1
2
3
4proxy_max_temp_file_size
语法:proxy_max_temp_file_size size;
默认值:proxy_max_temp_file_size 1G;
使用字段:http, server, location, if
当代理缓冲区过大时使用一个临时文件的最大值,如果文件大于这个值,将同步传递请求而不写入磁盘进行缓存。
如果这个值设置为零,则禁止使用临时文件。1
2
3
4proxy_method
语法:proxy_method [method]
默认值:None
使用字段:http, server, location
为后端服务器忽略HTTP请求处理方式,假如你将这个指令指定为POST,那么所有转发到后端的请求都将使用POST请求方式。1
2
3
4proxy_next_upstream
语法: proxy_next_upstream [error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off]
默认值:proxy_next_upstream error timeout
使用字段:http, server, location
确定在何种情况下请求将转发到下一个服务器:
error - 在连接到一个服务器,发送一个请求,或者读取应答时发生错误。
timeout - 在连接到服务器,转发请求或者读取应答时发生超时。
invalid_header - 服务器返回空的或者错误的应答。
http_500 - 服务器返回500代码。
http_502 - 服务器返回502代码。
http_503 - 服务器返回503代码。
http_504 - 服务器返回504代码。
http_404 - 服务器返回404代码。
off - 禁止转发请求到下一台服务器。
转发请求只发生在没有数据传递到客户端的过程中。1
2
3
4proxy_no_cache
语法:proxy_no_cache variable1 variable2 ...;
默认值:None
使用字段:http, server, location
确定在何种情况下缓存的应答将不会使用,示例:1
2proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;
proxy_no_cache $http_pragma $http_authorization;
如果为空字符串或者等于0,表达式的值等于false。1
2
3
4proxy_pass
语法:proxy_pass URL
默认值:no
使用字段:location, location中的if字段
这个指令设置被代理服务器的地址和被映射的URI,地址可以使用主机名或IP加端口号的形式。1
2
3proxy_pass_header
语法:proxy_pass_header the_name
使用字段:http, server, location
这个指令允许为应答转发一些隐藏的头部字段。1
2
3
4proxy_pass_request_headers
语法:proxy_pass_request_headers [ on | off ] ;
默认值:proxy_pass_request_headers on;
使用字段:http, server, location
1 | proxy_redirect |
如果需要修改从被代理服务器传来的应答头中的”Location”和”Refresh”字段,可以用这个指令设置。1
2
3
4proxy_read_timeout
语法:proxy_read_timeout time
默认值:proxy_read_timeout 60
使用字段:http, server, location
决定读取后端服务器应答的超时时间,它决定nginx将等待多久时间来取得一个请求的应答。超时时间是指完成了两次握手后并且状态为established的超时时间。
相对于proxy_connect_timeout,这个时间可以扑捉到一台将你的连接放入连接池延迟处理并且没有数据传送的服务器,注意不要将此值设置太低,某些情况下代理服务器将花很长的时间来获得页面应答(例如如当接收一个需要很多计算的报表时),当然你可以在不同的location里面设置不同的值。1
2proxy_redirect_errors
不推荐使用,请使用 proxy_intercept_errors
1 | proxy_send_lowat |
设置SO_SNDLOWAT,这个指令仅用于FreeBSD。1
2
3
4proxy_send_timeout
语法:proxy_send_timeout seconds
默认值:proxy_send_timeout 60
使用字段:http, server, location
设置代理服务器转发请求的超时时间,同样指完成两次握手后的时间,如果超过这个时间代理服务器没有数据转发到被代理服务器,nginx将关闭连接。1
2
3
4proxy_set_body
语法:proxy_set_body [ on | off ]
默认值:proxy_set_body off;
使用字段:http, server, location, if
1 | proxy_set_header |
这个指令允许将发送到被代理服务器的请求头重新定义或者增加一些字段。
这个值可以是一个文本,变量或者它们的组合。
proxy_set_header在指定的字段中没有定义时会从它的上级字段继承。
默认只有两个字段可以重新定义:
proxy_set_header Host $proxy_host;
proxy_set_header Connection Close;
未修改的请求头“Host”可以用如下方式传送:
proxy_set_header Host $http_host;
但是如果这个字段在客户端的请求头中不存在,那么不发送数据到被代理服务器。
这种情况下最好使用$Host变量,它的值等于请求头中的”Host”字段或服务器名:
proxy_set_header Host $host;
此外,可以将被代理的端口与服务器名称一起传递:
proxy_set_header Host $host:$proxy_port;
如果设置为空字符串,则不会传递头部到后端,例如下列设置将禁止后端使用gzip压缩:
proxy_set_header Accept-Encoding “”;1
2
3
4proxy_store
语法:proxy_store [on | off | path]
默认值:proxy_store off
使用字段:http, server, location
这个指令设置哪些传来的文件将被存储,参数”on”保持文件与alias或root指令指定的目录一致,参数”off”将关闭存储,路径名中可以使用变量:
proxy_store /data/www$original_uri;
应答头中的”Last-Modified”字段设置了文件最后修改时间,为了文件的安全,可以使用proxy_temp_path指定一个临时文件目录。
这个指令为那些不是经常使用的文件做一份本地拷贝。从而减少被代理服务器负载。1
2
3
4
5
6
7
8
9
10
11
12
13location /images/ {
root /data/www;
error_page 404 = /fetch$uri;
}
location /fetch {
internal;
proxy_pass http://backend;
proxy_store on;
proxy_store_access user:rw group:rw all:r;
proxy_temp_path /data/temp;
alias /data/www;
}
或者通过这种方式:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15location /images/ {
root /data/www;
error_page 404 = @fetch;
}
location @fetch {
internal;
proxy_pass http://backend;
proxy_store on;
proxy_store_access user:rw group:rw all:r;
proxy_temp_path /data/temp;
root /data/www;
}
注意proxy_store不是一个缓存,它更像是一个镜像。1
2
3
4proxy_store_access
语法:proxy_store_access users:permissions [users:permission ...]
默认值:proxy_store_access user:rw
使用字段:http, server, location
指定创建文件和目录的相关权限,如:
proxy_store_access user:rw group:rw all:r;
如果正确指定了组和所有的权限,则没有必要去指定用户的权限:
proxy_store_access group:rw all:r;1
2
3
4proxy_temp_file_write_size
语法:proxy_temp_file_write_size size;
默认值:proxy_temp_file_write_size ["#proxy buffer size"] * 2;
使用字段:http, server, location, if
设置在写入proxy_temp_path时数据的大小,在预防一个工作进程在传递文件时阻塞太长。1
2
3
4proxy_temp_path
语法:proxy_temp_path dir-path [ level1 [ level2 [ level3 ] ;
默认值:在configure时由--http-proxy-temp-path指定
使用字段:http, server, location
类似于http核心模块中的client_body_temp_path指令,指定一个地址来缓冲比较大的被代理请求。1
2proxy_upstream_fail_timeout
0.5.0版本后不推荐使用,请使用http负载均衡模块中server指令的fail_timeout参数。
1 | proxy_upstream_fail_timeout |
变量
该模块中包含一些内置变量,可以用于proxy_set_header指令中以创建头部。1
2
3
4
5
6$proxy_host
被代理服务器的主机名。
$proxy_host
被代理服务器的端口号。
$proxy_add_x_forwarded_for
包含客户端请求头中的"X-Forwarded-For",与$remote_addr用逗号分开,如果没有"X-Forwarded-For"请求头,则$proxy_add_x_forwarded_for等于$remote_addr。
URL重写模块
这个模块允许使用正则表达式重写URI(需PCRE库),并且可以根据相关变量重定向和选择不同的配置。
如果这个指令在server字段中指定,那么将在被请求的location确定之前执行,如果在指令执行后所选择的location中有其他的重写规则,那么它们也被执行。如果在location中执行这个指令产生了新的URI,那么location又一次确定了新的URI。
这样的循环可以最多执行10次,超过以后nginx将返回500错误。
指令1
2
3
4break
语法:break
默认值:none
使用字段:server, location, if
完成当前设置的规则,停止执行其他的重写指令。
示例:1
2
3
4if ($slow) {
limit_rate 10k;
break;
}
1 | if |
判断一个条件,如果条件成立,则后面的大括号内的语句将执行,相关配置从上级继承。
可以在判断语句中指定下列值:
一个变量的名称;不成立的值为:空字符传""或者一些用“0”开始的字符串。
一个使用=或者!=运算符的比较语句。
使用符号~*和~模式匹配的正则表达式:
~为区分大小写的匹配。
~*不区分大小写的匹配(firefox匹配FireFox)。
!~和!~*意为“不匹配的”。
使用-f和!-f检查一个文件是否存在。
使用-d和!-d检查一个目录是否存在。
使用-e和!-e检查一个文件,目录或者软链接是否存在。
使用-x和!-x检查一个文件是否为可执行文件。
正则表达式的一部分可以用圆括号,方便之后按照顺序用$1-$9来引用。
示例配置:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
if ($http_cookie ~* "id=([^;] +)(?:;|$)" ) {
set $id $1;
}
if ($request_method = POST ) {
return 405;
}
if (!-f $request_filename) {
break;
proxy_pass http://127.0.0.1;
}
if ($slow) {
limit_rate 10k;
}
if ($invalid_referer) {
return 403;
}
if ($args ~ post=140){
rewrite ^ http://example.com/ permanent;
}
内置变量$invalid_referer用指令valid_referers指定。1
2
3
4return
语法:return code
默认值:none
使用字段:server, location, if
这个指令结束执行配置语句并为客户端返回状态代码,可以使用下列的值:204,400,402-406,408,410, 411, 413, 416与500-504。此外,非标准代码444将关闭连接并且不发送任何的头部。1
2
3
4rewrite
语法:rewrite regex replacement flag
默认值:none
使用字段:server, location, if
按照相关的正则表达式与字符串修改URI,指令按照在配置文件中出现的顺序执行。
注意重写规则只匹配相对路径而不是绝对的URL,如果想匹配主机名,可以加一个if判断,如:1
2
3
4if ($host ~* www\.(.*)) {
set $host_without_www $1;
rewrite ^(.*)$ http://$host_without_www$1 permanent; # $1为'/foo',而不是'www.mydomain.com/foo'
}
可以在重写指令后面添加标记。
如果替换的字符串以http://开头,请求将被重定向,并且不再执行多余的rewrite指令。
标记可以是以下的值:
last - 完成重写指令,之后搜索相应的URI或location。
break - 完成重写指令。
redirect - 返回302临时重定向,如果替换字段用http://开头则被使用。
permanent - 返回301永久重定向。
注意如果一个重定向是相对的(没有主机名部分),nginx将在重定向的过程中使用匹配server_name指令的“Host”头或者server_name指令指定的第一个名称,如果头不匹配或不存在,如果没有设置server_name,将使用本地主机名,如果你总是想让nginx使用“Host”头,可以在server_name使用“*”通配符(查看http核心模块中的server_name)。例如:1
2
3rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;
return 403;
但是如果我们将其放入一个名为/download/的location中,则需要将last标记改为break,否则nginx将执行10次循环并返回500错误。1
2
3
4
5location /download/ {
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break;
return 403;
}
如果替换字段中包含参数,那么其余的请求参数将附加到后面,为了防止附加,可以在最后一个字符后面跟一个问号:
rewrite ^/users/(.*)$ /show?user=$1? last;
注意:大括号({和}),可以同时用在正则表达式和配置块中,为了防止冲突,正则表达式使用大括号需要用双引号(或者单引号)。例如要重写以下的URL:
/photos/123456
为:
/path/to/photos/12/1234/123456.png
则使用以下正则表达式(注意引号):1
rewrite "/photos/([0-9] {2})([0-9] {2})([0-9] {2})" /path/to/photos/$1/$1$2/$1$2$3.png;
同样,重写只对路径进行操作,而不是参数,如果要重写一个带参数的URL,可以使用以下代替:1
2
3if ($args ^~ post=100){
rewrite ^ http://example.com/new-address.html? permanent;
}
注意$args变量不会被编译,与location过程中的URI不同(参考http核心模块中的location)。1
2
3
4set
语法:set variable value
默认值:none
使用字段:server, location, if
指令设置一个变量并为其赋值,其值可以是文本,变量和它们的组合。
你可以使用set定义一个新的变量,但是不能使用set设置$http_xxx头部变量的值。具体可以查看这个例子1
2
3
4uninitialized_variable_warn
语法:uninitialized_variable_warn on|off
默认值:uninitialized_variable_warn on
使用字段:http, server, location, if
开启或关闭在未初始化变量中记录警告日志。
事实上,rewrite指令在配置文件加载时已经编译到内部代码中,在解释器产生请求时使用。
这个解释器是一个简单的堆栈虚拟机,如下列指令:1
2
3
4
5
6
7
8location /download/ {
if ($forbidden) {
return 403;
}
if ($slow) {
limit_rate 10k;
}
rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;
将被编译成以下顺序:1
2
3
4
5
6
7
8
9
10
11
12
13
14variable $forbidden
checking to zero
recovery 403
completion of entire code
variable $slow
checking to zero
checkings of regular expression
copying "/"
copying $1
copying "/mp3/"
copying $2
copying "..mpe"
completion of regular expression
completion of entire sequence
注意并没有关于limit_rate的代码,因为它没有提及ngx_http_rewrite_module模块,“if”块可以类似”location”指令在配置文件的相同部分同时存在。
如果$slow为真,对应的if块将生效,在这个配置中limit_rate的值为10k。
指令:1
rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;
如果我们将第一个斜杠括入圆括号,则可以减少执行顺序:1
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
之后的顺序类似如下:1
2
3
4
5
6
7checking regular expression
copying $1
copying "/mp3/"
copying $2
copying "..mpe"
completion of regular expression
completion of entire code
SSI模块
这个模块为处理服务器端包含(SSI)的输入提供一个过滤器,目前所支持的SSI命令并不完善。
如下例:1
2
3location / {
ssi on;
}
指令1
2
3
4ssi
语法:ssi [ on | off ]
默认值:ssi off
使用字段:http, server, location, location中的if字段
启用SSI处理。
注意如果启用SSI,那么Last-Modified头和Content-Length头不会传递。1
2
3
4ssi_silent_errors
语法:ssi_silent_errors [on|off]
默认值:ssi_silent_errors off
使用字段:http, server, location
如果在处理SSI的过程中出现“[an error occurred while processing the directive]”错误,禁止将其输出。1
2
3
4ssi_types
语法:ssi_types mime-type [mime-type ...]
默认值:ssi_types text/html
使用字段:http, server, location
默认只解析text/html类型,这个参数可以指定其他的MIME类型。1
2
3
4ssi_value_length
语法:ssi_value_length length
默认值:ssi_value_length 256
使用字段:http, server, location
定义允许SSI使用的参数值的长度。
SSI 命令
命令格式如下:1
<!--# command parameter1=value parameter2=value... -->
因为功能支持问题,暂不作详细的说明。
变量1
2
3
4$date_local
本地时区的当前时间,选项 "timefmt"可以指定格式。
$date_gmt
当前的格林尼治时间,选项 "timefmt"可以指定格式。
User ID模块
模块ngx_http_userid_module为连接发布cookie,主要使用$uid_got和$uid_set变量,注意:$uid_got无法$uid_set在SSI中取得,因为SSI过滤模块工作在userid模块过滤之前。
这个模块相当于Apache的mod_uid模块。
示例配置:1
2
3
4
5
6userid on;
userid_name uid;
userid_domain example.com;
userid_path /;
userid_expires 365d;
userid_p3p 'policyref="/w3c/p3p.xml", CP="CUR ADM OUR NOR STA NID"';
指令1
2
3
4userid
语法:userid [on|v1|log||off]
默认值:userid off
使用字段:http, server, location
是否启用发出cookie或者记录到被请求的cookie:1
2
3
4on - 启用版本2的cookie并记录。
v1 - 启用版本1的cookie并记录。
log - 不传送cookie,但是写入日志。
off - 禁用cookie。
1 | userid_domain |
指定cookie的域名,参数“none”不对任何域名发出cookie。1
2
3
4userid_expires
语法:userid_expires [ time | max ]
默认值:none
使用字段:http, server, location
设置cookie的过期时间。
参数设置并发出浏览器对于cookie的实效时间,值“max”指定过期时间为:2037年12月31日23:55:55 GMT,这是某些旧浏览器所能识别的最大时间。1
2
3
4userid_name
语法:userid_name name
默认值:userid_name uid
使用字段:http, server, location
设置cookie的名称。1
2
3
4userid_p3p
语法:userid_p3p line
默认值:none
使用字段:http, server, location
为和cookie一起传递的P3P头指定一个值。1
2
3
4userid_path
语法:userid_path path
默认值:userid_path /
使用字段:http, server, location
设置cookie路径。1
2
3
4userid_service
语法:userid_service number
默认值:userid_service address
使用字段:http, server, location
设置cookie发布的服务器地址,如果不设置,版本一的cookie将其设置为0,版本二将其设置为服务器IP。
uWSGI模块
为uwsgi协议提供支持。
示例配置:1
2
3
4location / {
uwsgi_pass unix:///var/run/example.com.sock;
include uwsgi_params;
}
注意不要把uwsgi协议和uWSGI服务器混淆。
指令1
2
3
4uwsgi_pass
语法:uwsgi_pass uri
默认值:none
使用字段:server, location
为一个uwsgi兼容服务器设置监听地址(tcp套接字,unix套接字或者流块)1
2
3
4uwsgi_param
语法:uwsgi_param key value
默认值:none
使用字段:server, location
为一个uwsgi请求增加一对key/value值。
示例:1
2
3
4
5location / {
uwsgi_pass unix:///var/run/example.com.sock;
include uwsgi_params;
uwsgi_param NEW_VAR foo;
}
1 | uwsgi_modifier1 |
为一个uwsgi请求设置第一个修饰语(默认为一个WSGI请求)。1
2
3
4uwsgi_modifier2
语法:uwsgi_modifier2 value
默认值:0
使用字段:server, location
为一个uwsgi请求设置第二个修饰语。1
2
3
4uwsgi_string
语法:uwsgi_string string
默认值: none
使用字段:server, location
为一个uwsgi请求增加一个字符串。
示例(为一个支持eval修饰语的uwsgi兼容服务器):1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17location / {
uwsgi_pass unix:///var/run/example.com.sock;
uwsgi_pass_request_headers off;
uwsgi_pass_request_body off;
uwsgi_string "
import uwsgi
uwsgi.start_response('200 OK', [('Content-type','text/plain')])
total = 30+22
uwsgi.send("30 + 22 = %d" % total)
";
uwsgi_modifier1 22;
uwsgi_modifier2 0;
}
1 | uwsgi_pass_request_headers |
在uwsgi请求中传递HTTP请求头。1
2
3
4uwsgi_pass_request_body
语法:uwsgi_pass_request_body on/off
默认值:on
使用字段:server, location
在uwsgi请求中传递HTTP请求实体(如果其可用)。
SplitClients模块
ngx-http-split-clients模块基于一些特定条件分开客户端连接,(例如ip地址,请求头,cookies等)
示例配置:1
2
3
4
5
6
7
8
9
10
11
12
13http {
split-clients "${remote-addr}AAA" $variant {
0.5% .one;
2.0% .two;
- "";
}
server {
location / {
index index${variant}.html;
}
}
}
可以使用$cookie-…作为来源来分离请求,来源字符串使用CRC32进行哈希计算并且哈希百分比将作为来源的值。
指令1
2
3
4split-clients
语法:split-clients $variable { ... }
默认值:none
使用字段:http
可选HTTP模块
HTTP Addition模块
这个模块可以在当前的location之前或者之后增加别的location。
它作为一个输出过滤器执行,包含到其他location中的主请求和子请求不会被完全缓冲,并且仍然以流的形式传递到客户端,因为最终应答体的长度在传递HTTP头的时候是未知的,HTTP的chunked编码总是在这里使用。
默认情况下这个模块是没有编译的,如果要使用则需要在编译时指定下列参数:
./configure –with-http_addition_module
示例配置:1
2
3
4location / {
add_before_body /before_action;
add_after_body /after_action;
}
指令1
2
3
4add_before_body
语法:add_before_body uri
默认值:no
使用字段:http, server, location
在应答体的前面增加URI,为一个处理结果发出子请求。1
2
3
4add_after_body
语法:add_after_body uri
默认值:no
使用字段:http, server, location
在应答体的后面增加URI,为一个处理结果发出子请求。1
2
3
4addition_types
语法:addition_types mime-type [mime-type ...]
默认值:text/html
使用字段:http, server, location
邮件模块
邮件核心模块
邮件代理配置
nginx可以处理和代理以下的邮件协议:
IMAP
POP3
SMTP
认证
nginx使用外部的HTTP类服务器来了解它将连接到哪个后端的IMAP/POP。
nginx在HTTP头中通过认证信息:1
2
3
4
5
6
7
8GET /auth HTTP/1.0
Host: auth.server.hostname
Auth-Method: plain
Auth-User: user
Auth-Pass: password
Auth-Protocol: imap
Auth-Login-Attempt: 1
Client-IP: 192.168.1.1
合适的应答为:1
2
3
4
5HTTP/1.0 200 OK # 这个字段实际上是被忽略或者可能不存在。
Auth-Status: OK
Auth-Server: 192.168.1.10
Auth-Port: 110
Auth-User: newname # 如果你连接到一个后端可以不理会这个用户名。
当为POP3认证使用APOP时,你必须返回Auth-Pass:1
2
3
4
5
6HTTP/1.0 200 OK # 这个字段实际上是被忽略或者可能不存在。
Auth-Status: OK
Auth-Server: 192.168.1.10
Auth-Port: 110
Auth-User: newname # 如果你连接到一个后端可以不理会这个用户名。
Auth-Pass: password # 这里必须为明文的用户名密码。
失败的应答为:1
2
3HTTP/1.0 200 OK # 这个字段实际上是被忽略或者可能不存在。
Auth-Status: Invalid login or password
Auth-Wait: 3 # nginx将在3秒后重新读取客户端的用户名与密码。
指令1
2
3
4imap_capabilities
语法:imap_capabilities "capability1" ["capability2" .. "capabilityN"]
默认值:"IMAP4" "IMAP4rev1" "UIDPLUS"
使用字段:main, server
在客户端发布IMAP命令CAPABILITY时,设置IMAP协议扩展列表,STARTTLS在你使用starttls指令时会自动添加。1
2
3
4imap_client_buffer
语法:imap_client_buffer size
默认值:4K/8K
使用字段:main, server
为IMAP命令设置读取缓冲区大小,默认值为分页大小(根据系统不同为4k或8k)。1
2
3
4listen
语法:listen address:port [ bind ]
默认值:no
使用字段:server
1 | listen指令指定了server{...}字段中可以被访问到的ip地址及端口号,可以只指定一个ip,一个端口,或者一个可解析的服务器名。 |
1 | pop3_auth |
为POP3客户端设置允许的认证动作:
·plain - USER/PASS,AUTH PLAIN,AUTH LOGIN
·apop - APOP
·cram-md5 - AUTH CRAM-MD51
2
3
4pop3_capabilities
语法:pop3_capabilities "capability1" ["capability2" .. "capabilityN"]
默认值:"TOP" "USER" "UIDL"
使用字段:main, server
在客户端发布POP3命令CAPA时,设置POP3协议扩展列表,STLS在你使用starttls指令时会自动添加,SASL通过指令pop3_auth添加。1
2
3
4protocol
语法:protocol [ pop3 | imap | smtp ] ;
默认值:IMAP
使用字段:server
为这个server块设置邮件协议。1
2
3
4server
语法:server {...}
默认值:no
使用字段:mail
指定一个虚拟服务器配置。
没有明确的机制来分开基于域名(请求中的主机头)和基于IP的虚拟主机。
可以通过listen指令来指定必须连接到这个server块的所有地址和端口,并且在server_name指令中可以指定所有的域名。1
2
3
4server_name
语法:server_name name fqdn_server_host
默认值:主机名,通过调用gethostname()取得。
使用字段:mail, server
1 | smtp_auth |
为SMTP客户端设置允许的认证动作:
login - AUTH LOGIN
plain - AUTH PLAIN
cram-md5 - AUTH CRAM-MD5
1 | smtp_capabilities |
在客户端发布命令EHLO时,设置SMTP协议扩展列表,这个列表使用smtp_auth指令中启用的动作自动扩展。1
2
3
4so_keepalive
语法:so_keepalive on|off;
默认值:off
使用字段:main, server
为后端的IMAP/POP3设置socket SO_KEEPALIVE选项。FreeBSD中keepalive参数使用于所有的连接,并且可以通过内核参数(sysctl net.inet.tcp.always_keepalive)关闭。1
2
3
4timeout
语法:timeout milliseconds;
默认值:60000
使用字段:main, server
设置到后端代理连接的超时时间。
邮件认证模块
示例配置:1
2auth_http localhost:9000/cgi-bin/nginxauth.cgi;
auth_http_timeout 5;
指令1
2
3
4auth_http
语法:auth_http URL
默认值:no
使用字段:mail, server
为认证设置网址到扩展HTTP类服务器。到达的协议请查看邮件核心模块中的pop3_auth指令。1
2
3
4auth_http_header
语法:auth_http_header header value
默认值:no
使用字段:mail, server
在认证过程中增加一个HTTP头和它的值,可以使用一个共享的秘密短语确保请求总是通过nginx应答。如:
auth_http_header X-NGX-Auth-Key “secret_string”;1
2
3
4auth_http_timeout
语法:auth_http_timeout milliseconds;
默认值:60000
使用字段:mail, server
为认证进程设置超时时间。
邮件代理模块
nginx可以代理IMAP, POP3,和SMTP协议。
指令1
2
3
4proxy
语法:proxy on | off
默认值:off
使用字段:mail, server
设置是否启用邮件代理。1
2
3
4proxy_buffer
语法:proxy_buffer size
默认值:4K/8K
使用字段:mail, server
为代理连接设置缓冲区大小,默认为分页大小,根据不同的操作系统可能是4k或8k。1
2
3
4proxy_pass_error_message
语法:proxy_pass_error_message on | off
默认值:off
使用字段:mail, server
可以把从后端获取的错误认证信息传递到客户端,通常如果通过了nginx的认证,那么后端的错误信息无法传递到客户端。
但是一些正确密码应答中的POP3错误,如CommuniGatePro通知用户一个关于邮箱超出容量限制(或者其它事件)将在认证中周期性的发出错误,在这种情况下有必要打开proxy_error_message。1
2
3
4proxy_timeout
语法:proxy_timeout time
默认值:24h
使用字段:mail, server
为代理连接设置超时时间。1
2
3
4xclient
语法:xclient on | off
默认值:on
使用字段:mail, server
是否为SMTP后端连接启用XCLIENT命令,这将允许后端强制客户端连接建立在IP/HELO/LOGIN上。
如果xclient启用,那么nginx首先转发到后端:
EHLO server_name
然后:
XCLIENT PROTO=ESMTP HELO=client_helo ADDR=client_ip LOGIN=authentificated_user NAME=[UNAVAILABLE]
邮件SSL认证模块
这个模块为POP3/IMAP/SMTP提供SSL/TLS支持。配置与HTTP SSL模块基本相同,但是不支持检察客户端证书。
指令1
2
3
4ssl
语法:ssl on | off
默认值:ssl off
使用字段:mail, server
为这个虚拟主机启用SSL。1
2
3
4ssl_certificate
语法:ssl_certificate file
默认值:cert.pem
使用字段:mail, server
为这个虚拟主机指定PEM格式的证书文件,相同的文件可以包含其它的证书,同样密钥为PEM格式。1
2
3
4ssl_certificate_key
语法:ssl_certificate_key file
默认值:cert.pem
使用字段:mail, server
为这个虚拟主机指定PEM格式的密钥。1
2
3
4ssl_ciphers
语法:ssl_ciphers file ciphers
默认值:ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
使用字段:mail, server
指出允许的密码,密码指定为OpenSSL支持的格式。1
2
3
4ssl_prefer_server_ciphers
语法:ssl_prefer_server_ciphers on | off
默认值:off
使用字段:mail, server
依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码。1
2
3
4ssl_protocols
语法:ssl_protocols [SSLv2] [SSLv3] [TLSv1]
默认值:SSLv2 SSLv3 TLSv1
使用字段:mail, server
指定要使用的SSL协议。1
2
3
4ssl_session_cache
语法:ssl_session_cache [builtin[:size [shared:name:size]
默认值:builtin:20480
使用字段:mail, server
设置储存SSL会话的缓存类型和大小。
缓存类型为:
builtin - 内建OpenSSL缓存,仅能用在一个工作进程中,缓存大小在会话总数中指定,注意:如果要使用这个类型可能会引起内存碎片问题,具体请查看下文中参考文档。
shared - 缓存在所有的工作进程中共享,缓存大小指定单位为字节,1MB缓存大概保存4000个会话,每个共享的缓存必须有自己的名称,相同名称的缓存可以使用在不同的虚拟主机中。
可以同时使用两个缓存类型,如:1
ssl_session_cache builtin:1000 shared:SSL:10m;
然而仅当builtin没有影响共享缓存时会使用。1
2
3
4ssl_session_timeout
语法:ssl_session_timeout time
默认值:5m
使用字段:mail, server
设置客户端能够反复使用储存在缓存中的会话参数时间。1
2
3
4starttls
语法:starttls on | off | only
默认值:off
使用字段:mail, server
含义
on - 允许为IMAP/SMTP使用STARTTLS和为POP3使用STLS。
off - 禁止命令STLS和STARTTLS。
only - 在客户端使用TLS启用STLS和STARTTLS。
Nginx配置
在更改配置文件之前首先备份配置文件nginx.conf1
cp /data/nginx/conf/nginx.conf /data/backup/nginx.conf20180403.bak
Nginx基本配置和参数说明
1 | #运行用户 |
Nginx location匹配规则
location匹配命令
~ #波浪线表示执行一个正则匹配,区分大小写
~* #表示执行一个正则匹配,不区分大小写
^~ #^~表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
= #进行普通字符精确匹配
@ #"@" 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files
location 匹配的优先级(与location在配置文件中的顺序无关)
= 精确匹配会第一个被处理。如果发现精确匹配,nginx停止搜索其他匹配。
普通字符匹配,正则表达式规则和长的块规则将被优先和查询匹配,也就是说如果该项匹配还需去看有没有正则表达式匹配和更长的匹配。
^~ 则只匹配该规则,nginx停止搜索其他匹配,否则nginx会继续处理其他location指令。
最后匹配理带有"~"和"~*"的指令,如果找到相应的匹配,则nginx停止搜索其他匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用。
例如1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17location = / {
# 只匹配"/".
[ configuration A ]
}
location / {
# 匹配任何请求,因为所有请求都是以"/"开始
# 但是更长字符匹配或者正则表达式匹配会优先匹配
[ configuration B ]
}
location ^~ /images/ {
# 匹配任何以 /images/ 开始的请求,并停止匹配 其它location
[ configuration C ]
}
location ~* .(gif|jpg|jpeg)$ {
# 匹配以 gif, jpg, or jpeg结尾的请求.
# 但是所有 /images/ 目录的请求将由 [Configuration C]处理.
[ configuration D ]
Nginx开启php支持
找到如下内容,删除注释字符,并将倒数第二行的 /scripts 替为 $document_root
修改前1
2
3
4
5
6
7#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
修改后1
2
3
4
5
6
7location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
重启后生效。
Nginx配置反向代理
nginx作为web服务器一个重要的功能就是反向代理。
nginx反向代理的指令不需要新增额外的模块,默认自带proxy_pass指令,只需要修改配置文件就可以实现反向代理。
配置前的准备工作,后端跑apache服务的ip和端口,也就是说可以通过http://ip:port能访问到你的网站。
然后就可以新建一个vhost.conf,加入如下内容,记得修改ip和域名为你的ip和域名。
修改nginx.conf,添加 include test.conf 到http{}段, reload nginx就可以了。
test.conf文件如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37## Basic reverse proxy server ##
## Apache backend for www.test.com ##
upstream apachephp {
server ip:8080; #Apache
}
## Start www.test.com ##
server {
listen 80;
server_name www.test.com;
access_log logs/test.access.log main;
error_log logs/test.error.log;
root html;
index index.html index.htm index.php;
## send request back to apache ##
location / {
proxy_pass http://apachephp;
#Proxy Settings
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_max_temp_file_size 0;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
## End www.test.com ##
Nginx配置负载均衡
一个简单的负载均衡的示例,把www.test.com均衡到本机不同的端口,也可以改为均衡到不同的地址上。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16http {
upstream myproject {
server 127.0.0.1:8000 weight=3;
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
}
server {
listen 80;
server_name www.test.com;
location / {
proxy_pass http://myproject;
}
}
}
Nginx配置图片服务器
首先建立存放图片的目录文件夹,在/data/nginx/html目录下建立images文件夹(也可以是其他路径)
Nginx默认使用端口是80,这里直接先把Nginx端口改为8088,在server字段中加入location字段1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27location ~ .*\.(gif|jpg|jpeg|png)$ { #关于图片格式的设定,可以增加其他图片格式
expires 24h;
root /data/nginx/html/images/;#指定图片存放路径
autoindex on;#打开预览功能
access_log /data/nginx/logs/images.log;#图片日志路径
#以下为关于代理访问的配置,也可以关闭
proxy_store on;
proxy_store_access user:rw group:rw all:rw;
proxy_temp_path /data/nginx/html/images/;#代理临时路径
proxy_redirect off;
proxy_set_header Host 127.0.0.1;
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 1280k;
proxy_connect_timeout 900;
proxy_send_timeout 900;
proxy_read_timeout 900;
proxy_buffer_size 40k;
proxy_buffers 40 320k;
proxy_busy_buffers_size 640k;
proxy_temp_file_write_size 640k;
if ( !-e $request_filename)
{
proxy_pass http://127.0.0.1:8088;#代理访问地址,可以是其他地址
}
}
这样一个简单的图片服务器就配置完成。
Nginx配置动静分离
Nginx是一种轻量级,高性能,多进程的Web服务器,非常适合作为静态资源的服务器使用,而动态的访问操作可以使用稳定的Apache、Tomcat及IIS等来实现,这里就以Nginx作为代理服务器的同时,也使用其作为静态资源的服务器,而动态的访问服务器就以Apache和Tomcat为例说明。
默认Nginx、Apache、Tomcat都安装在同台服务器,端口分别为80、88、8080。具体配置如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#默认静态资源
location / {
root /datda/nginx/html;
index index.html index.htm
allow all;
}
#动态资源加载
location ~\.(php)?$ {
proxy_pass http://127.0.0.1:88;
}
#动态资源加载
location ~\.(do|jsp)?$ {
proxy_pass http://127.0.0.1:8080;
}
同时在Apache和Tomcat中关于动态资源目录的配置即可,可以是同目录,即/data/nginx/html。
Nginx配置下载服务器
Nginx配置下载服务器即开启Nginx的索引功能,直接引导下载。可以直接对server字段进行配置,如下:1
2
3
4
5
6
7
8
9
10
11
12
13server {
listen 81; #端口
server_name www.testa.com; #服务名
charset utf-8; #避免中文乱码
root /data/backup; #显示的根索引目录,注意这里要改成你自己的,目录要存在
location / {
autoindex on; #开启索引功能
autoindex_exact_size off; #关闭计算文件确切大小(单位bytes),只显示大概大小(单位kb、mb、gb)
autoindex_localtime on; #显示本机时间而非 GMT 时间
}
}
Nginx上的所有服务名不能重复,端口不能重复,此次使用81端口进行访问。
Nginx配置邮件代理服务器
一般情况下,客户端发起的邮件请求在经过Nginx这个邮件代理服务器后,从网络通信的角度来看,Nginx实现邮件代理功能时会把一个请求分为以下4个阶段:
接收并解析客户端初始请求的阶段。
向认证服务器验证请求合法性,并获取上游邮件服务器地址的阶段。
Nginx根据用户信息多次与上游服务器交互验证合法性的阶段。
Nginx在客户端与上游邮件服务器间纯粹透传TCP流的阶段。
由此可以了解到,这些Nginx邮件模块的目的非常明确,就是使用事件框架在大量并发连接下高效地处理这4个阶段的请求。
Nginx配置邮件代理服务器需要安装mail模块,安装参照Nginx升级操作。
关于Nginx配置如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32mail {
// 邮件认证服务器的访问URL
auth_http IP:PORT/auth.php;
// 当透传上,下游间的TCP流时,每个请求所使用的内存缓冲区大小
proxy_buffer 4k;
server {
/*对于POP3协议,通常都是监听110端口。POP3协议接收初始客户端请求的缓冲区固定为128字节,配置文件中无法设置*/
listen 110;
protocol pop3;
proxy on;
}
server {
// 对于IMAP,通常都是监听143端口
listen 143;
protocol imap;
// 设置接收初始客户端请求的缓冲区大小
imap_client_buffer 4k;
proxy on;
}
server {
// 对于SMTP,通常都是监听25端口
listen 25;
protocol smtp;
proxy on;
// 设置接收初始客户端请求的缓冲区大小
smtp_client_buffer 4k;
}
}
Nginx配置PC端和手机端分离
一般情况下web网站的PC端页面和手机端页面是分开来开发的,那么就需要根据访问端的不同匹配到不同的页面,关于Nginx的配置示例如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32server {
listen 80;
#server_name www.testa.com;
client_max_body_size 100M;
client_body_buffer_size 100M;
access_log logs/access_80.log main;
error_log logs/error_80.log error;
location / {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow_Credentials' 'true';
add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH';
root /data/work/front/FrontEndPage;
index index.html index.htm mobile.html;
if ($http_user_agent ~* "(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino") {
root /data/work/front/FrontEndPage/mobile;
}
if ($http_user_agent ~* "^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-)") {
root /data/work/front/FrontEndPage/mobile;
}
try_files $uri $uri/ /index.html;
error_page 404 /404.html;
error_page 405 =200 $uri;
}
}
手机端页面的首页为mobile.html,所以在自定义首页中加入mobile.html。
手机端页面目录mobile放在根目录下,实际生产中根据实际情况配置。
Nginx优化
Nginx运行工作进程个数
一般设置为CPU的核心数或者核心数的2倍
查看系统核心数,使用top命令后按11
2
3
4
5
6
7
8top - 04:04:59 up 5 days, 22:57, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 149 total, 1 running, 148 sleeping, 0 stopped, 0 zombie
%Cpu0 : 0.3 us, 0.3 sy, 0.0 ni, 98.7 id, 0.0 wa, 0.0 hi, 0.3 si, 0.3 st
%Cpu1 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 7747784 total, 6489052 free, 138776 used, 1119956 buff/cache
KiB Swap: 3145724 total, 3145724 free, 0 used. 7332688 avail Mem
也可以通过命令1
cat /proc/cpuinfo |grep processor |wc -l
查看核心数,查看到CPU核心数为4,修改Nginx配置文件/data/nginx/conf/nginx.conf,修改后为:1
worker_processes 4;
重启nginx,查看nginx进程为:1
2
3
4
5
6root 24041 1 0 Apr03 ? 00:00:00 nginx: master process nginx
nobody 31044 24041 0 03:55 ? 00:00:00 nginx: worker process
nobody 31045 24041 0 03:55 ? 00:00:00 nginx: worker process
nobody 31046 24041 0 03:55 ? 00:00:00 nginx: worker process
nobody 31047 24041 0 03:55 ? 00:00:00 nginx: worker process
root 31695 14682 0 04:11 pts/0 00:00:00 grep --color=auto nginx
可以看到Nginx的work process个数已经变为4个。
Nginx运行CPU亲和力
比如4核配置1
2worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
比如8核配置1
2worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 0000100000010000 00100000 01000000 10000000;
worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。
Nginx最多可以打开文件数
1 | worker_rlimit_nofile 65535; |
这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。
注:
文件资源限制的配置可以在/etc/security/limits.conf设置,针对root/user等各个用户或者*代表所有用户来设置。
1 | * soft nofile 65535 |
用户重新登录生效(ulimit -n)
Nginx事件处理模型
1 | events { |
nginx采用epoll事件模型,处理效率高
work_connections是单个worker进程允许客户端最大连接数,这个数值一般根据服务器性能和内存来制定,实际最大值就是worker进程数乘以work_connections
实际我们填入一个65535,足够了,这些都算并发值,一个网站的并发达到这么大的数量,也算一个大站了!
multi_accept 告诉nginx收到一个新连接通知后接受尽可能多的连接,默认是on,设置为on后,多个worker按串行方式来处理连接,也就是一个连接只有一个worker被唤醒,其他的处于休眠状态,设置为off后,多个worker按并行方式来处理连接,也就是一个连接会唤醒所有的worker,直到连接分配完毕,没有取得连接的继续休眠。当你的服务器连接数不多时,开启这个参数会让负载有一定的降低,但是当服务器的吞吐量很大时,为了效率,可以关闭这个参数。
连接超时时间
主要目的是保护服务器资源,CPU,内存,控制连接数,因为建立连接也是需要消耗资源的1
2
3
4
5
6
7
8
9
10
11
12keepalive_timeout 60;
tcp_nodelay on;
client_header_buffer_size 4k;
open_file_cache max=102400 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 1;
client_header_timeout 15;
client_body_timeout 15;
reset_timedout_connection on;
send_timeout 15;
server_tokens off;
client_max_body_size 10m;
参数解释:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18keepalived_timeout客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接
tcp_nodelay;也是防止网络阻塞,不过要包涵在keepalived参数才有效
client_header_buffer_size 4k;
客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过 1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。
open_file_cache max=102400 inactive=20s;
这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件
数一致,inactive 是指经过多长时间文件没被请求后删除缓存。
open_file_cache_valid 30s;
这个是指多长时间检查一次缓存的有效信息。
open_file_cache_min_uses 1;
open_file_cache指令中的inactive 参数时间内文件的最少使用次数,如果超过这个数字,文
件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive 时间内一次没被使用,它将被移除。
client_header_timeout设置请求头的超时时间。我们也可以把这个设置低些,如果超过这个时间没有发送任何数据,nginx将返回request time out的错误
client_body_timeout设置请求体的超时时间。我们也可以把这个设置低些,超过这个时间没有发送任何数据,和上面一样的错误提示
reset_timeout_connection 告诉nginx关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间。
send_timeout响应客户端超时时间,这个超时时间仅限于两个活动之间的时间,如果超过这个时间,客户端没有任何活动,nginx关闭连接
server_tokens 并不会让nginx执行的速度更快,但它可以关闭在错误页面中的nginx版本数字,这样对于安全性是有好处的。
client_max_body_size上传文件大小限制
fastcgi调优
1 | fastcgi_connect_timeout 600; |
参数解释:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25fastcgi_connect_timeout 600; #指定连接到后端FastCGI的超时时间。
fastcgi_send_timeout 600; #向FastCGI传送请求的超时时间。
fastcgi_read_timeout 600; #指定接收FastCGI应答的超时时间。
fastcgi_buffer_size 64k; #指定读取FastCGI应答第一部分需要用多大的缓冲区,默认的缓冲区大小为fastcgi_buffers指令中的每块大小,可以将这个值设置更小。
fastcgi_buffers 4 64k; #指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求,如果一个php脚本所产生的页面大小为256KB,那么会分配4个64KB的缓冲区来缓存,如果页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp_path指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于磁盘。一般这个值应该为站点中php脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB,那么可以把这个值设置为“8 32K”、“4 64k”等。
fastcgi_busy_buffers_size 128k; #建议设置为fastcgi_buffers的两倍,繁忙时候的buffer
fastcgi_temp_file_write_size 128k; #在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍,该数值设置小时若负载上来时可能报502BadGateway
fastcgi_temp_path #缓存临时目录
fastcgi_intercept_errors on;#这个指令指定是否传递4xx和5xx错误信息到客户端,或者允许nginx使用error_page处理错误信息。
注:静态文件不存在会返回404页面,但是php页面则返回空白页!!
fastcgi_cache_path /usr/local/nginx1.10/fastcgi_cachelevels=1:2 keys_zone=cache_fastcgi:128minactive=1d max_size=10g;# fastcgi_cache缓存目录,可以设置目录层级,比如1:2会生成16*256个子目录,cache_fastcgi是这个缓存空间的名字,cache是用多少内存(这样热门的内容nginx直接放内存,提高访问速度),inactive表示默认失效时间,如果缓存数据在失效时间内没有被访问,将被删除,max_size表示最多用多少硬盘空间。
fastcgi_cache cache_fastcgi; #表示开启FastCGI缓存并为其指定一个名称。开启缓存非常有用,可以有效降低CPU的负载,并且防止502的错误放生。cache_fastcgi为proxy_cache_path指令创建的缓存区名称
fastcgi_cache_valid 200 302 1h; #用来指定应答代码的缓存时间,实例中的值表示将200和302应答缓存一小时,要和fastcgi_cache配合使用
fastcgi_cache_valid 301 1d; #将301应答缓存一天
fastcgi_cache_valid any 1m; #将其他应答缓存为1分钟
fastcgi_cache_min_uses 1; #该指令用于设置经过多少次请求的相同URL将被缓存。
fastcgi_cache_key http://$host$request_uri; #该指令用来设置web缓存的Key值,nginx根据Key值md5哈希存储.一般根据$host(域名)、$request_uri(请求的路径)等变量组合成proxy_cache_key 。
fastcgi_pass #指定FastCGI服务器监听端口与地址,可以是本机或者其它
总结:
nginx的缓存功能有:proxy_cache / fastcgi_cache
proxy_cache的作用是缓存后端服务器的内容,可能是任何内容,包括静态的和动态。
fastcgi_cache的作用是缓存fastcgi生成的内容,很多情况是php生成的动态的内容。
proxy_cache缓存减少了nginx与后端通信的次数,节省了传输时间和后端宽带。
fastcgi_cache缓存减少了nginx与php的通信的次数,更减轻了php和数据库(mysql)的压力。
CGI是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者。Fastcgi是用来提高CGI程序性能的。php-fpm是fastcgi进程的管理器,用来管理fastcgi进程的
gzip调优
使用gzip压缩功能,可能为我们节约带宽,加快传输速度,有更好的体验,也为我们节约成本,所以说这是一个重点。
Nginx启用压缩功能需要你来ngx_http_gzip_module模块(apache使用的是mod_deflate)。
一般我们需要压缩的内容有:文本,js,html,css,对于图片,视频,flash什么的不压缩,同时也要注意,我们使用gzip的功能是需要消耗CPU的!1
2
3
4
5
6
7
8gzip on;
gzip_min_length 2k;
gzip_buffers 4 32k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/plain text/css text/javascriptapplication/json application/javascript application/x-javascriptapplication/xml;
gzip_vary on;
gzip_proxied any;
参数解释:1
2
3
4
5
6
7
8
9
10
11
12gzip on; #开启压缩功能
gzip_min_length 1k; #设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取,默认值是0,不管页面多大都进行压缩,建议设置成大于1K,如果小与1K可能会越压越大。
gzip_buffers 4 32k; #压缩缓冲区大小,表示申请4个单位为32K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。
gzip_http_version 1.1; #压缩版本,用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可
gzip_comp_level 6; #压缩比例,用来指定GZIP压缩比,1压缩比最小,处理速度最快,9压缩比最大,传输速度快,但是处理慢,也比较消耗CPU资源。
gzip_types text/css text/xml application/javascript; #用来指定压缩的类型,‘text/html’类型总是会被压缩。
默认值: gzip_types text/html (默认不对js/css文件进行压缩)
# 压缩类型,匹配MIME��型进行压缩
# 不能用通配符 text/*
# (无论是否指定)text/html默认已经压缩
# 设置哪压缩种文本文件可参考 conf/mime.types
gzip_vary on; #varyheader支持,改选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用Squid缓存经过nginx压缩的数据
expires缓存优化
缓存,主要针对于图片,css,js等元素更改机会比较少的情况下使用,特别是图片,占用带宽大,我们完全可以设置图片在浏览器本地缓存365d,css,js,html可以缓存个10来天,这样用户第一次打开加载慢一点,第二次,就非常快了!缓存的时候,我们需要将需要缓存的拓展名列出来, Expires缓存配置在server字段里面1
2
3
4
5
6
7
8
9
10location ~* \.(ico|jpe?g|gif|png|bmp|swf|flv)$ {
expires 30d;
#log_not_found off;
access_log off;
}
location ~* \.(js|css)$ {
expires 7d;
log_not_found off;
access_log off;
}
注:log_not_found off;是否在error_log中记录不存在的错误。默认是。
总结:
expire功能优点
expires可以降低网站购买的带宽,节约成本
同时提升用户访问体验
减轻服务的压力,节约服务器成本,是web服务非常重要的功能。
expire功能缺点
被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验。解决办法:第一个缩短缓存时间,例如:1天,但不彻底,除非更新频率大于1天;第二个对缓存的对象改名。
网站不希望被缓存的内容 1)网站流量统计工具2)更新频繁的文件
防盗链
防止别人直接从你网站引用图片等链接,消耗了你的资源和网络流量,那么我们的解决办法由几种: 1:水印,品牌宣传,你的带宽,服务器足够
2:防火墙,直接控制,前提是你知道IP来源
3:防盗链策略下面的方法是直接给予404的错误提示1
2
3
4
5
6
7
8
9location ~*^.+\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
valid_referers noneblocked www.benet.com benet.com;
if($invalid_referer) {
#return 302 http://127.0.0.1/img/nolink.jpg;
return 404;
break;
}
access_log off;
}
参数可以使如下形式:
none 意思是不存在的Referer头(表示空的,也就是直接访问,比如直接在浏览器打开一个图片)
blocked 意为根据防火墙伪装Referer头,如:“Referer:XXXXXXX”。
server_names 为一个或多个服务器的列表。
系统内核参数优化
fs.file-max = 999999:这个参数表示进程(比如一个worker进程)可以同时打开的最大句柄数,这个参数直线限制最大并发连接数,需根据实际情况配置。
net.ipv4.tcp_max_tw_buckets = 6000 #这个参数表示操作系统允许TIME_WAIT套接字数量的最大值,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。该参数默认为180000,过多的TIME_WAIT套接字会使Web服务器变慢。
注:主动关闭连接的服务端会产生TIME_WAIT状态的连接
net.ipv4.ip_local_port_range = 1024 65000 #允许系统打开的端口范围。
net.ipv4.tcp_tw_recycle = 1#启用timewait快速回收。
net.ipv4.tcp_tw_reuse = 1#开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接。这对于服务器来说很有意义,因为服务器上总会有大量TIME-WAIT状态的连接。
net.ipv4.tcp_keepalive_time = 30:这个参数表示当keepalive启用时,TCP发送keepalive消息的频度。默认是2小时,若将其设置的小一些,可以更快地清理无效的连接。
net.ipv4.tcp_syncookies = 1#开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理。
net.core.somaxconn = 40960 #web 应用中 listen 函数的 backlog 默认会给我们内核参数的 net.core.somaxconn 限制到128,而nginx定义的NGX_LISTEN_BACKLOG 默认为511,所以有必要调整这个值。
注:对于一个TCP连接,Server与Client需要通过三次握手来建立网络连接.当三次握手成功后,我们可以看到端口的状态由LISTEN转变为ESTABLISHED,接着这条链路上就可以开始传送数据了.每一个处于监听(Listen)状态的端口,都有自己的监听队列.监听队列的长度与如somaxconn参数和使用该端口的程序中listen()函数有关
somaxconn参数:定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数,默认值为128,对于一个经常处理新连接的高负载 web服务环境来说,默认的 128 太小了。大多数环境这个值建议增加到 1024 或者更多。大的侦听队列对防止拒绝服务 DoS 攻击也会有所帮助。
net.core.netdev_max_backlog = 262144 #每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
net.ipv4.tcp_max_syn_backlog = 262144 #这个参数标示TCP三次握手建立阶段接受SYN请求队列的最大长度,默认为1024,将其设置得大一些可以使出现Nginx繁忙来不及accept新连接的情况时,Linux不至于丢失客户端发起的连接请求。
net.ipv4.tcp_rmem = 10240 87380 12582912#这个参数定义了TCP接受缓存(用于TCP接受滑动窗口)的最小值、默认值、最大值。
net.ipv4.tcp_wmem = 10240 87380 12582912:这个参数定义了TCP发送缓存(用于TCP发送滑动窗口)的最小值、默认值、最大值。
net.core.rmem_default = 6291456:这个参数表示内核套接字接受缓存区默认的大小。
net.core.wmem_default = 6291456:这个参数表示内核套接字发送缓存区默认的大小。
net.core.rmem_max = 12582912:这个参数表示内核套接字接受缓存区的最大大小。
net.core.wmem_max = 12582912:这个参数表示内核套接字发送缓存区的最大大小。
net.ipv4.tcp_syncookies = 1:该参数与性能无关,用于解决TCP的SYN攻击。
完整的内核优化设置:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33fs.file-max = 999999
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 10240 87380 12582912
net.ipv4.tcp_wmem = 10240 87380 12582912
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 40960
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024 65000
执行sysctl -p使内核修改生效。
系统连接数的优化
linux 默认值 open files为1024
#ulimit -n
1024
说明server只允许同时打开1024个文件
使用ulimit -a 可以查看当前系统的所有限制值1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 31175
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 31175
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
使用ulimit -n 可以查看当前的最大打开文件数。
新装的linux 默认只有1024 ,当作负载较大的服务器时,很容易遇到error: too many open files。因此,需要将其改大
在/etc/security/limits.conf最后增加:1
2
3
4* soft nofile 65535
* hard nofile 65535
* soft noproc 65535
* hard noproc 65535