Nginx备忘录
安装
1 | # centos |
相关命令
1 | # mac中nginx默认安装在/usr/local/Cellar/nginx,同时也会加入到/usr/local/bin,进入 |
目录结构
1 | # nginx目录下 |
nginx.conf配置
使用mac的brew安装,目录在/usr/local/etc/nginx
1 | main |
nginx配置文件主要分为六个区域:main(全局设置)、events(nginx工作模式)、http(http设置)、sever(主机设置)、location(URL匹配)、upstream(负载均衡服务器设置)。
main模块
main是全局配置:
1 | user nobody nobody; |
user 来指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行。
worker_processes来指定了Nginx要开启的子进程数。每个Nginx进程平均耗费10M~12M内存。最优值取决于许多因素,包括(但不限于)CPU核的数量、存储数据的硬盘数量及负载模式。不能确定的时候,将其设置为可用的CPU内核数将是一个好的开始(设置为“auto”将尝试自动检测它)。该值设置的是子进程worker数量,同时还有一个主进程master,比如设置值为2时,总共有3个进程。
error_log用来定义全局错误日志文件。日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少。
pid用来指定进程id的存储文件位置。
worker_rlimit_nofile用于指定一个nginx进程可以打开的最多文件描述符数目,受限于操作系统的配置。如果你的nginx报错“too many open files”,就是操作系统的值比你设置的值小。可以通过ulimit -n查看操作系统的值。通过ulimit -n 65535修改,该命令将操作系统修改为65535。
events模块
events模块来用指定nginx的工作模式和工作模式及连接数上限:
1 | events { |
use用来指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中,因为Mac基于BSD,所以Mac也得用这个模式,对于Linux系统,epoll工作模式是首选。
worker_connections用于定义Nginx每个进程的最大连接数,即接收前端的最大请求数,默认是1024。最大客户端连接数由worker_processes和worker_connections决定,即Max_clients=worker_processes*worker_connections。在作为反向代理时,Max_clients变为:Max_clients = worker_processes * worker_connections/4。(关于max_clients值的计算,官方文档也没有给出明确公式,网上说法也不一。可以看下这个,我觉得还挺靠谱:Max_clients计算公式)
进程的最大连接数受Linux系统进程的最大打开文件数限制(每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄),只有操作系统中的ulimit -n的值比worker_connections的值大,该设置才有效。
http模块
http模块是最核心的模块,它负责HTTP服务器相关属性的配置,主要包含server和upstream子模块。
1 | http{ |
include 可以用来加载其他配置文件,如include /etc/nginx/conf.d/*.conf。上例中用来引入设定文件的mime类型,类型在配置文件目录下的mime.type文件定义,来告诉nginx来识别文件类型。
default_type默认文件类型,当文件类型未定义时使用该值,值默认为text/plain。通常修改为application/octet-stream,使用二进制流的方式解析。
log_format设置日志的格式,myFormat相当于别名,配合access_log使用。
access_log 访问日志存放目录。nginx调优时可以关闭该功能,提高磁盘IO读写速度。
server_tokens 对于性能没有优化,当访问失败时,可以隐藏nginx版本信息。
sendfile 可以使用sendfile(),使文件传输更高效。传输文件涉及到将内容从磁盘读取,写到Tcp连接的过程。该项关闭时的流程是,Pre-sendfile是传送数据之前在用户空间申请数据缓冲区。之后用read()将数据从文件拷贝到内核读取缓冲区,再从内核读取缓冲区读到用户缓冲区,write()将用户缓冲区数据写到内核Socket缓冲区,再写入网络协议引擎,进行传输。sendfile()可以在任意两个文件描述符之间互相拷贝数据,而sendfile()是可以立即将数据从磁盘读,经OS缓存,写入TCP socket,不经过用户缓冲区。因为这种拷贝是在内核完成的(避免了内核缓冲区和用户缓冲区之间的数据拷贝),sendfile()要比组合read()和write()以及打开关闭丢弃缓冲更加有效。
tcp_nopush 告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送。
tcp_nodelay 告诉nginx不要缓存数据,而是一段一段的发送。当需要及时发送数据时,就应该给应用设置这个属性,这样发送一小块数据信息时就不能立即得到返回值。tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞。
1 | http{ |
keepalive_timeout设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接。
client_header_timeout 请求头超时时间。
client_body_timeout 请求体超时时间。
reset_timeout_connection 关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间。
send_timeout 指定客户端的响应超时时间。这个设置不会用于整个转发器,而是在两次客户端读取操作之间。如果在这段时间内,客户端没有读取任何数据,nginx就会关闭连接。
limit_conn_zone 设置addr连接的共享内存为5m。$binary_remote_addr的长度为 4 bytes,会话信息的长度为 32 bytes,5m大约可以记录5*1k*32 个会话信息(一个会话占用 32 bytes。如果一个会话占用64bytes,可保存5*1k*16个会话)。
limit_conn 设置addr的最大连接数为100,每个ip最多同时开100个连接。
1 | http{ |
gzip 采用gzip压缩的形式发送数据。可以减少发送的数据量。
gzip_disable为指定的客户端禁用gzip功能。我们设置成IE6或者更低版本以使我们的方案能够广泛兼容。
gzip_static告诉nginx在压缩资源之前,先查找是否有预先gzip处理过的资源。这要求你预先压缩你的文件(在这个例子中被注释掉了),从而允许你使用最高压缩比,这样nginx就不用再压缩这些文件了(想要更详尽的gzip_static的信息,请点击这里)。
gzip_proxied允许或者禁止压缩基于请求和响应的响应流。我们设置为any,意味着将会压缩所有的请求。
gzip_min_length设置对数据启用压缩的最少字节数。如果一个请求小于1000字节,我们最好不要压缩它,因为压缩这些小的数据会降低处理此请求的所有进程的速度。
gzip_comp_level设置数据的压缩等级。这个等级可以是1-9之间的任意数值,9是最慢但是压缩比最大的。我们设置为4,这是一个比较折中的设置。
gzip_types设置需要压缩的数据格式。
1 | http{ |
open_file_cache打开缓存的同时也指定了缓存最大数目,以及缓存的时间。我们可以设置一个相对高的最大时间,这样我们可以在它们不活动超过20秒后清除掉。
open_file_cache_valid 在open_file_cache中指定检测正确信息的间隔时间。
open_file_cache_min_uses 定义了open_file_cache中指令参数不活动时间期间里最小的文件数。
open_file_cache_errors指定了当搜索一个文件时是否缓存错误信息,也包括再次给配置中添加文件。我们也包括了服务器模块,这些是在不同文件中定义的。如果你的服务器模块不在这些位置,你就得修改这一行来指定正确的位置。
server模块
server模块是http的子模块,用来定义虚拟主机的配置。一个http中可以有多个server。
1 | server { |
listen用于指定虚拟主机的服务端口。server_name用来指定IP地址或者域名,多个域名之间用空格分开。root 表示在这整个server虚拟主机内,全部的root web根目录。注意要和locate {}下面定义的区分开来。index 全局定义访问的默认首页地址。注意要和locate {}下面定义的区分开来。charset用于设置网页的默认编码格式。access_log用来指定此虚拟主机的访问日志存放路径,最后的main用于指定访问日志的输出格式。
location模块
nginx中最核心的模块,用来配置请求的路由,以及各种页面的处理情况。支持正则表达式、条件判断,同时可以设置负载均衡、反向代理、虚拟域名等。
匹配规则
location的url匹配具有一定优先级,其优先级如下:
1 | location [ = | ~ | ~* | ^~ ] uri { } |
语法
语法方面,主要有:
1 | location /static { |
root 用于指定当访问/static目录时,所对应的主机对应的目录,为/var/app/www/static。
alias 与root类似,但是区别在于当访问/static时,对应的路径为/var/app/www。
index 默认首页,按先后顺序依次查找。
try files 至少两个参数,按照顺序进行访问尝试,最后一个参数最好配置为静态页面,防止死循环。
rewite 将一个url重写成另一个url。
proxy_pass 反向代理配置,代理请求。其具体用法:
1 | # 当访问http://127.0.0.1/proxy/1.png时 |
upstream模块
upstream模块负责负载均衡。
1 | upstream baidu.com{ |
5种负载算法:
轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,则自动剔除故障机器,使用户访问不受影响。
weight 指定轮询权重,weight值越大,分配到的几率就越高,主要用于后端每台服务器性能不均衡的情况。
ip_hash 每个请求按访问IP的哈希结果分配,这样每个访客固定访问一个后端服务器,可以有效的解决动态网页存在的session共享问题。
fair(第三方) 更智能的一个负载均衡算法,此算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。如果想要使用此调度算法,需要Nginx的upstream_fair模块。
url_hash(第三方) 按访问URL的哈希结果来分配请求,使每个URL定向到同一台后端服务器,可以进一步提高后端缓存服务器的效率。如果想要使用此调度算法,需要Nginx的hash软件包。
另外,每台server还可以设置不同的负载状态:
down 表示当前server暂时不参与负载均衡。
backup 预留的备份机,当其他所有非backup机器出现故障或者繁忙的时候,才会请求backup机器,这台机器的访问压力最轻。
max_fails 允许请求的失败次数,默认为1,配合fail_timeout一起使用。
fail_timeout 经历max_fails次失败后,暂停服务的时间,默认为10s(某个server连接失败了max_fails次,则nginx会认为该server不工作了。同时,在接下来的 fail_timeout时间内,nginx不再将请求分发给失效的server)。
当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。
例子
1 | ########### 每个指令必须有分号结束。################# |
内置全局变量
1 | $args :这个变量等于请求行中的参数,同$query_string |