1、Nginx介绍 2、编译安装 3、Nginx配置 4、nginx反向代理 5、Nginx缓存 6、Nginx与FastCGI结合反向代理 7、nginx负载均衡 8、ngx_stream_core_module模块 9、动静分离 ================================================================================================================================================ Nginx 1、nginx最主要的功能是:web服务器、反向代理服务器(负载均衡器)、缓存服务器 2、nginx特性 模块化设计。1.9.11以及更新的版本已经支持动态模块加载 高可靠性。主控进程master负责管理子进程worker 内存消耗少。10000个keep-alive连接仅需要2.5M内存 支持热部署:不关闭程序更新配置文件、升级程序 支持事件驱动、AIO、MMAP、sendfile 高并发性 支持rewrite重写 内置健康检查机制:后端服务器宕机,不会影响前端访问 节省宽带(压缩) 3、nginx应用 1、使用nginx结合fastcgi运行php、perl等程序 2、反向代理:负载均衡器、缓存加速、过滤器、安全 3、运行静态页面以及缓存 4、二次开发版本 Tenginx,OpenResty 5、nginx架构 master负责生成并管理worker进程,worker进程负责接收客户端请求,通过查找配置文件,将客户端的请求映射到一个location block, location中的不同指令生效启动不同的模块去完成响应请求的工作。同时,worker进程可以基于不用的协议(http、fastcgi等)与后端服 务器进程交互,如果nginx作为反向代理服务器,可以提供缓存加速及缓存管理等功能,同时,支持worker进程与磁盘的高性能IO模型。 支持事件驱动,默认是边缘触发的通知机制。 6、Nginx模块 核心模块 core module 标准模块 ngx_http_* ngx_mail_* ngx_stream_* 第三方模块 https://code.tutsplus.com/articles/nginx-guide-introduction--cms-21877 ================================================================================================================================================ 编译安装 1、编译安装nginx 1、创建用户组、用户 groupadd nginx useradd -M -g nginx nginx -s /sbin/nologin 2、安装依赖库 yum install openssl-devel pcre-devel gd-devel 3、nginx安装编译参数 ./configure \ --user=nginx \ --group=nginx \ --prefix=/usr/local/nginx \ --conf-path=/etc/nginx/nginx.conf \ --http-log-path=/var/nginx/access.log \ --error-log-path=/var/nginx/error.log \ --with-http_ssl_module \ --with-http_flv_module \ --with-http_gunzip_module \ --with-http_gzip_static_module \ --with-http_stub_status_module \ --with-http_image_filter_module 4、安装第三方模块 echo-nginx-module模块, 2、nginx服务脚本 [Unit] Description=nginx - high performance web server Documentation=http://nginx.org/en/docs/ After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target 3、nginx配置语法高亮 1、下载高亮插件脚本 http://www.vim.org/search.php 2、创建插件存放目录 mkdir -pv ~/.vim/syntax 3、安装插件 cp nginx.vim ~/.vim/syntax 4、常见配置文件 vim ~/.vim/filetype.vim au BufRead,BufNewFile /etc/nginx/*,/usr/local/nginx/conf/* if &ft == '' | setfiletype nginx | endif ================================================================================================================================================ Nginx配置 1、nginx程序 默认nginx使用conf/nginx.conf这个配置文件,在启动nginx时可以指定读取要使用的配置文件,使用-c选项 -s signal # 发送信号给nginx的master进程,sginal可以是:stop、quit、reopen、reload -g directives # 命令行中配置去全局配置 2、Nginx配置文件变量 内置变量:由模块定义并引入,可以使用 自定义变量:用户使用set指令定义变量。set variable_name value; 3、配置文件格式 main block events { 时间驱动相关配置 } http { 各server的公共配置 server { 每个server用于定义一个虚拟主机 location / { 配置URL } ... } stream { ... } } 4、main段 配置指令 1、user USER_NAME GROUP_NAME; 指定以什么用户或组的身份运行worker进程,GROUP_NAME可以省略 2、pid /path/to/pid.file; nginx运行的pid文件,如果编译时不指定,默认在logs目录内 3、include /path/to/file.conf; 包含其他路径下的配置文件 4、load_module /path/to/file.conf; 模块加载配置文件。include /usr/share/nginx/modules/*.conf; 5、worker_rlimit_nofile 65535; 所有工作进程的最大打开文件数的限制 6、worker_rlimit_core SIZE; 所有工作进程的核心文件的最大大小的限制,通常不需要调整 7、worker_processes N; 定义工作进程数量。为了避免进程上下文切换,消耗资源,可将工作进程数量设置为和CPU核心数一样,或者比CPU核心数少1的数量, 如果将值设置为auto,nginx将自动检测设置值 8、worker_cpu_affinity cpumask ...; 进程和CPU的绑定,目的是使CPU处理固定的进程,避免CPU缓冲频繁刷新,进程切换、造成CPU资源的消耗默认没有绑定到任何CPU。 值auto将自动把进程绑定到可用CPU。 示例:(即可CPU就写几位,从做往右,位上为1的位所对应的CPU被绑定了worker进程) CPU MASK: 00000001:0号CPU 00000010:1号CPU 10000000:8号CPU worker_cpu_affinity 0001 0010 0100 1000; worker_cpu_affinity 0101 1010; 9、timer_resolution 100ms; 降低时间解析度 10、worker_priority -10; 定义工作进程的调度优先级,即nice值:负值number表示较高的优先级。允许范围通常在-20到20之间 11、error_log 记录日志方式 [level]; 错误日志。debug, info, notice, warn, error, crit, alert, emerg.默认级别的error,则error之后 级别的信息都将写入日志文件,debug级别需要编译时指定参数--with-debug。 记录日志方式: file /path/logfile; stderr:发送到标准错误 syslog:server-address[,parameter=values]:发送到syslog memory:size 内存 12、daemon on|off; 是否以守护进程的方式运行nginx 13、master_process on|off; 是否以master/worker模型运行nginx;默认为on,off将不启动worker进程 5、event段 配置指令 1、accept_mutex on | off; 默认是关闭。如果accept_mutex启用,worker工作进程将轮流接受新的连接。否则,将通知所有worker 工作进程有新的连接请求,如果连接数很少的场景下,这个过程可能会浪费系统资源。 2、accept_mutex_delay 500ms; 如果accept_mutex已启用,则如果一个工作进程正在接受连接时,工作进程将尝试接受另一个新连接的 等待最长时间 3、use method; 指定nginx处理连接的使用的方法,通常不需要明确指定它,nginx默认会使用最有效的方法。 method例如:select、poll、epoll等 4、worker_connections number; 单个工作进程可以同时处理的最大连接数(main段),最大连接数是worker_connections x worker_processes 的乘积的数量,此值默认是1024 6、http段 配置指令 1、虚拟主机 server { root /var/www; listen 80; sever_name www.xuejinwei.com; } 2、root /path/to/file; 设置资源路径映射,即请求URL所对应的资源路径。可以在http, server, location, if in location段定义 root配置指令在server配置段中是对主机名访问生效 3、listen ADDR:PORT OPTIONS; 指定监听地址和端口。只能放置于server端。 OPTIONS: default_server # 设定为默认主机 ssl # 限制为只能通过ssl连接访问此主机 backlog=number # 超过并发请求后,将请求放入队列的长度 rcvbuf=N # 发送缓冲大小 sndbuf=N # 接收缓冲大小 4、server_name www.xuejinwei.com; 主机名称。可以写多个主机名,支持通配符和正则表达式。 通配符:* 正则表达式:正则表达匹配的主机名字符串,要在字符串前面加 "~" 符号。例如:~^www\d+\.xuejinwei\.com$ 匹配优先级从高到低: 精确字符串匹配 左侧通配符 右侧通配符 正则表达式 默认主机 5、server_tokens on|off; 隐藏nginx版本号。也可以放置于server配置段 6、tcp_nodelay on|off; 仅在长连接状态下有意义。off表示合并多个请求后再一并发送。用于http、server、location 7、sendfile on|off; 开启sendfile机制 8、location [ = | ~ | ~* | ^~ ] URL { ... } 可以用在server、location段。根据用户所访问的URL匹配并进行控制处理。location块可以出现多次。[实现从URL到文件系统的映射] Nginx会根据请求的URL去匹配location。 优先级从大到小: = 精确匹配 ^~ 字符串匹配,一旦匹配成功,则不再继续匹配下去 ~ 正则表达式匹配,区分大小写 ~* 正则表达式匹配,不区分大小写 不带任何符号。匹配所有的URL @ 定义location区段,这些区段客户端不能访问,只可以由内部产生的请求来访问 优先级生效顺序示例: location = / { [ configuration A ] } location / { [ configuration B ] } location ^~ /documents { [ configuration C ] } location ^~ /images/ { [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ { [ configuration E ] } The “/” request will match configuration A, the “/index.html” request will match configuration B, the “/documents/document.html” request will match configuration C, the “/images/1.gif” request will match configuration D, and the “/documents/1.jpg” request will match configuration E. 9、alias path; 只能定义在location段。定义路径别名。root定义所在location所对应的根目录,而alias是替换location的目录。 例如: location /images/ { root /www/host1; } # 表示在/www/host1 + /images/目录下查找所请求的资源 location /images/ { alias /www/alias; } # 表示在/www/alias/目录下查找所请求的资源 5、index index.file ...; 定义主页文件,可配置于http、server、location段。以顺序查找 6、error_page status_code[=status_code] ... URL; 错误页面。例如当错误状态码的404,如果定义了404=200,则返回给用户的状态码的200 示例: error_page 404 /404.html; error_page 404=200 /404.html; error_page 404 /404.html; server { location /404.html { root /path/to/error.html; # alias /path/to/dir_file; } } 7、try_files $uri file ... URI; 示例: location /images/ { try_files $uri /images/default.gif; # 如果在/images/目录下找URI中所对应的文件时没有找到,则返回default.gif文件 } location / { try_files $uri $uri/index.html $uri.html =404; # 当前面的文件都无法找到时,返回给客户404页面 } 8、网络相关的配置 http、server、location keepalive_time Ns; # 长连接超时时长 keepalive_requests Ns; # 一个长连接上所能请求的最大连接数 keepalive_diable NAME; # 为指定浏览器禁用长连接 send_timeout Ns; # 发送响应报文的超时时长 client_body_buffer_size 8k; # 用于接收每个客户端上传报文的body部分的缓冲区大小 ;默认为16k;超出此大小时,其将被暂存到磁盘上的由 client_body_temp_path指令所定义的位置 client_body_temp_path path level level2 level3; # level123定义了指定路径下目录的个数。三层目录结构。1级目录名占1位 client_body_timeout Ns; # 读取请求报文是实体部分的超时时长 client_header_timeout Ns; # 读取请求报文的首部的超时时长 limit_rate tate; # 限制响应给客户端的传输速率,单位是bytes/second limit_except method. . .; # 限制客户端不能使用的请求方法。只能用于location段配置 示例(仅有192.168.1.0网段的用户执行GET以为的请求方法): limit_except GET { allow 192.168.1.0/24; deny all; } 9、文件操作优化配置 aio on|off|threadspool; directio size|off; # 是否同步直接写磁盘。如果启动,例如directio 4m,表示文件大于4m时开始写入磁盘 10、缓存 open_file_cache max=N [inactive=time]|off; # 启用缓存。缓存对象包括:元数据、目录结构、错误缓存。 max=N,表示缓存对象上限,超过此值,则使用LRU算法清除缓存 inactive=time,在指定时间内未被命令或命中的次数少于open_file_cache_min_uses指定的值, 则被标记为非活动缓存,将会被清除。 open_file_cache_errors on | off; # 是否缓存错误消息,默认为off open_file_cache_valid time; # 缓存有效性检查频率,默认值为60s 11、allow IP/NETMASK; deny all; 访问控制 deny、allow 在 location 段定义 可以定义白名单和黑名单。生效顺序从上到下,一旦匹配就生效 12、基于用户认证 Auth_basic "提示信息"; Auth_basic_user_file "/usr/local/nginx/conf/userfile"; 用户必须还是服务器本地用户: vim /usr/local/nginx/conf/userfile xuekaixin:$apr1$YQ3xqzpk$Rf7QI0puHtLn0zSJpe8Je1 13、nginx状态监控,仅能用于location段配置 location /status { stub_status on; allow 192.168.1.100/24; deny all; } 状态页面结果: Active connections: 1 # 活动连接数,当前所有处于打开的状态连接数 server accepts handled requests # 已经接受的连接;已经处理的连接;已经处理的请求; 17 17 84 Reading: 0 Writing: 1 Waiting: 0 # 处于接受状态的连接;正处于发送响应或处理接受请求;保持连接状态数 14、定制日志格式 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' $status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time]; 定义一个缓存,用于存储名称包含变量的常用日志的文件描述符。该指令具有以下参数: max 设置缓存中描述符的最大数量; 如果缓存变满,最近最少使用的(LRU)描述符被关闭 inactive 设置缓存描述符关闭的时间,如果在此期间没有访问权限; 默认为10秒 min_uses 在由inactive参数定义的时间内设置文件使用的最小数量,以使描述符在缓存中保持打开状态; 默认情况下,1 valid 设置应该检查文件仍然存在的相同名称的时间; 默认为60秒 off 禁用缓存 用法示例: open_log_file_cache max = 1000 inactive = 20s valid = 1m min_uses = 2; 示例: access_log /spool/logs/nginx-access.log compression buffer=32k; 15、压缩相关配置指令 使用配置段:http, server, location, if in location gzip on|off; # 是否启用压缩传输 gzip_comp_level level; # 指定压缩级别从1-9,默认为1 gzip_disable regex ...; # 对某类“User-Agent”不执行压缩操作 示例:"MSIE 6.0; ... SV1" "MSIE [4-6]\." gzip_min_length 20; # 设置将被gzip压缩的响应的最小长度。即超过此大小,则都压缩传输 gzip_http_version 1.1; # 客户端请求压缩时使用的http版本的最小值 gzip_buffers 32 4k|16 8k; # 设置缓冲区大小,默认情况下,缓冲区大小等于一个内存页面。 gzip_types mime-type ...; # 启用除了“ text/html” 之外的指定MIME类型的响应。特殊值“ *”匹配任何MIME类型(0.8.29)。 “ text/html”类型的响应始终被压缩。 gzip_vary on; # 如果启用压缩,是否在响应报文首部插入“Vary: AcceptEncoding” gzip_proxied off|expired|no-cache|no-store|private|no_last_modified|no_etag|auth|any ...; # 根据请求和响应,启用或禁用代理请求的响应。 # off表示对代理服务器的请求不压缩, 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 如果请求头包含“授权”字段,则启用压缩; any 为所有代理的请求启用压缩 16、SSL配置 server { listen 443 ssl; # 监听端口 server_name localhost; # 主机名 ssl_certificate cert.pem; # 证书路径。当前虚拟主机使用PEM格式的证书文件 ssl_certificate_key cert.key; # 私钥文件路径 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;# zhichi ssl协议版本,此处为默认值 ssl_session_cache shared:SSL:1m; # 使用共享内存,还有一种形式:builtin:1000 单位为字节 OpenSSL内建缓存,为每个worker进程私有 off参数为关闭会话缓存,none,响应客户端可以缓存会话消息,但Nginx事实上没有缓存 ssl_session_timeout 5m; # 客户端连接可以复用ssl session cache中缓存的ssl参数的有 效时长,默认5m ssl_ciphers HIGH:!aNULL:!MD5; # 配置加密套件,定义算法 ssl_prefer_server_ciphers on; # 有限采取服务器算法 location / { root html; index index.html index.htm; } } 使用全站加密,http自动跳转https(可选) rewrite ^(.*) https://$host$1 permanent; 17、include /path/to/*.conf 指定包含的配置文件,不同功能的配置文件分离,便于管理与配置 18、rewrite:URL重写 将用户请求的URI基于PCRE regex描述的模式检查,匹配后进行重定向替换。匹配 语法:rewrite regex(正则表达式) replacement(替换) flag(标志); ^ 必须以^后的实体开头 $ 必须以$前的实体结尾 . 匹配任意字符 [] 匹配[]内的字集内的任意字符 [^] 匹配不包括[]内的字集内的任意字符 | 匹配|之前或之后的实体 () 组成一组用于匹配的的实体 示例:{可以在server、location中配置} rewrite ^/images/(.*\.jpg)$ /imgs/$1 break; # 将访问/images目录下的图片跳转到/imgs目录下 rewrite ^/images/(.*\.php)$ http://www.xuejinwei.me/$1 redirect; # 跨站跳转 location /images { rewrite ^/images/(.*\.php)$ http://www.xuejinwei.me/$1 redirect; } 基于浏览器分离: if($http_user_agent ~ Firefox){ rewrite ^(.*$) /firefox/$1 break; } if($http_user_agent ~ MSIE){ rewrite ^(.*$) /MSIE/$1 break; } if($http_user_agent ~ Chrome){ rewrite ^(.*$) /chrome/$1 break; } flag: last:匹配后不在对其他规则匹配,改写URL后重新以新的URL请求,并对新的URL再次进行匹配检查。内部有 循环的机制,但不会循环超过十次,如果超过十次,则返回500状态码 break:一旦RUL重写完成后,终止rewrite,不在继续匹配,直接跳转到重写规则配置块之后的配置中 redirect:返回临时重定向的http状态302 permanent:返回永久重定向的http状态301 重写完成后,返回重写后的URL给客户端,由客户端重新想新的URL发起请求 客户端显示的URL是重写后的URL return conde [text]; return conde [URL]; return [URL]; rewrite_log on|off; # 是否开启重写日志,发送至error_log 19、referer valid_referers none|blocked|server_names|string ...; # 定义referer首部的合法值,不能匹配的将是非法 none:请求报文中没有referer首部的 blocked:请求报文中有referer首部,但没有值 server_names:主机名或主机名模式 arbitrary_strint:任意字符,可以使用通配符* 正则表达式:要使用~开头,例如: ~.*\.magedu\.com 示例: valid_referers none blocked server_names *.xuejinwei.com *.xuejinwei.* ~\.xuejinwei\.; if ($invalid_referers) { return 301 https://www.xuejinwei.com; } ================================================================================================================================================ nginx反向代理 1、反向代理 反向代理是代理服务器的一种。它根据客户端的请求,从后端的服务器(如Web服务器)上获取资源,然后再将这些资源返回给客户端。 与反向代理不同,正向代理作为一个媒介将互联网上获取的资源返回给相关联的客户端,而反向代理是在服务器端(如Web服务器) 作为代理使用,而不是客户端。客户端通过正向代理可以访问很多不同的资源,而反向代理是很多客户端都通过它访问不同后端服务器 上的资源,而不需要知道这些后端服务器的存在,而以为所有资源都来自于这个反向代理服务器。 2、nginx采用master主进程负责管理worker进程的工作模式。master进程接收外界信号给worker进程发送信号,及监控管理worker进程。 nginx采用异步非阻塞的方式处理请求,子进程竞争接受新连接的方式,每个worker进程在某个瞬间只能处理一个连接,每个worker 进程有一个独立的连接池,连接池大小是worker_connections,即每个进程支持的最大连接数。 3、nginx反向代理 1、在nginx中,实现反向代理功能的模块是`ngx_http_proxy_module`模块。对于这个模块的介绍引用官方简洁的一句话: **The ngx_http_proxy_module module allows passing requests to another server.** 4、示例配置 nginx反向代理模块的配置指令除少数几个之外,都可以配置在http, server, location的配置段。 location / { proxy_pass http://localhost:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } 5、配置指令 1、proxy_pass proxy_pass配置指令配置代理服务器余后端服务器通信的的协议及所在服务映射位置,通常配置在location段。客户请求location 段指定的URL时,映射到后端服务器所对应的路径。 Note:如果proxy_pass http://192.168.1.151/app/;中的http://192.168.1.151/app/;最后没有斜线/,则意味将localtion中的 路径补到paroxy_pass的路径上去。 示例: # 用户向代理服务器发出的请求URL是http://192.168.1.150/xuekaixin/,则会映射到http://192.168.1.151/app/ location /xuekaixin/ { proxy_pass http://192.168.1.151/app/; } # 如果location中使用了rewrite,则映射的是重定向后的URL,即此时proxy_pass定义的URL失效,客户请求的URL是 http://192.168.1.150/web1/则会跳转至http://192.168.1.150/web2/ location / { rewrite /web1/ /web2/$1 break; proxy_pass http://192.168.1.151/web1/; index index.html index.htm; } # location中使用正则表达式匹配URL,则不进行映射,只是将location中的路径补到proxy_pass的URL后,且parocy_pass后头不能 能再写路径,否则被认为是语法错误。客户请求的URL是http://192.168.1.150/web1/,则会查找后端服务器web1目录下的资源 location ~* /web1/ { proxy_pass http://192.168.1.151; index index.html index.htm; } 错误示例: location ~* /web1/ { proxy_pass http://192.168.1.151/web2/; index index.html index.htm; } Note: 1、最后没有斜线/,则意味将location中的路径补到paroxy_pass的路径上去;最后有斜线/,则意味着将location中的路径替换到paroxy_pass 中的路径 2、location中使用正则表达式匹配URL,则不进行映射,只是将location中的路径补到proxy_pass的URL后,且parocy_pass后头不能再写路径, 否则被认为是语法错误。客户请求的URL是http://192.168.1.150/web1/,则会查找后端服务器web1目录下的资源 2、 proxy_set_header 后端服务器接收到代理服务器的请求时,会记录日志,但日志中的源IP是代理服务器的IP,不能记录真正的客户端IP地址。可以 通过proxy_set_header指令利用nginx内置变量将客户端IP传递给后端服务器,然后由后端服务器读取变量并记录进日志。 将报文头部重新定义或附加到传递给代理服务器的请求报文中。(自定义头部信息传递给后端服务器) 示例: location ~* /web1/ { proxy_pass http://192.168.1.151/web2/; index index.html index.htm; proxy_set_header X-Real-IP $remote_addr; # 添加首部,首部值为客户端IP地址 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 如果前端还有代理服务器,则累加IP地址 例如:X-Forwarded-For: client1, proxy1, proxy2 } # 后端服务器日志定义段配置 LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 3、proxy_ignore_client_abort 当客户端断开与服务器的连接且不等待响应时,是否关闭代理服务器与后端服务器的连接 proxy_ignore_client_abort on|off; 4、proxy_intercept_errors 当客户端请求状态码大于或等于300时,是否拦截并重定向到nginx的error_page proxy_intercept_errors on|off; 5、proxy_method 指定代理服务器向后端服务器请求方法 proxy_method method; ================================================================================================================================================ Nginx缓存 1、nginx反向代理服务器将客户端请求的内容缓存到本地,如果有客户端下次请求的内容在缓存中,则代理服务器不用向上游服务器取资源, 而是快速响应,直接将内容返回给客户端。 2、示例配置 http { proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=cache-name:10m; # 定义 } location / { proxy_cache cache-name; # 引用 } 3、配置指令(配置在location配置段) 1、proxy_cache_path 定义缓存存放路径及其属性。proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m; /data/nginx/cache # 缓存存放目录 levels=1:2 # 冒号隔开的几段,表示可以使用几级缓存子目录,每一段的数字,表示哪一级的缓存目录名称字符数 (此处的字符是从URL的哈希值从右向左取的字符数作为目录名称)如果levels参数没有配置,则Nginx 会将所有的文件放到同一个目录中 keys_zone=cache-name:10m # 内存中保存缓存的空间名称及大小,用来保存键key inactive=10m # 指定了缓存在不被访问的情况下能够在内存中保持的时间。默认是10分钟,如果在指定时间内资源被 访问了,则刷新删除时间 use_temp_path=off # 临时文件存放设定。如果为on,则为proxy_temp_path指定的路径存放,如果为off,则和缓存存放 为一个路径,建议为off,避免过多的拷贝数据 max_size=10g # 设定最大缓存上限 2、proxy_temp_path 定义用于存储具有从代理服务器接收的数据的临时文件的目录。最多可以在指定目录下使用三级子目录层次结构。 proxy_temp_path /spool/nginx/proxy_temp 1 2; 3、proxy_cache_use_stale 定义当代理服务器与后端服务器通信发生那种错误时,代理服务器可以用旧的缓存响应客户端。 off updating 可以最大限度地减少更新缓存数据时对代理服务器的访问次数。意思当客户端访问的资源正在从后端服务器更新至缓存时, 将旧的内容发给客户端,直到更新完毕后,客户端再次请求时,将新的资源发给客户端。 drror timeout invalid_header proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504; 4、proxy_cache 引用缓存定义 proxy_cache zone|off; 5、proxy_cache_methods 指定对客户端的某些请求方法才缓存,默认是GET、HEAD proxy_cache_methods GET | HEAD | POST ...; 6、proxy_connect_timeout 定义与代理服务器建立连接的超时时间。应该注意的是,这个超时通常不能超过75秒,可配置在http,server,location段 proxy_connect_timeout 60s; 7、定义客户端请求多少次之后将被缓存下来 proxy_cache_min_uses 1; 8、proxy_cache_lock 当多个客户同时请求多个缓存中不存在资源时,代理服务器只向后端请求一次,之后的将缓存返回给客户,避免代理服务器过多的与后端 服务器的通信 proxy_cache_lock on; 9、proxy_cache_valid 为不同的响应代码设置缓存时间 proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; proxy_cache_valid any 1m; 10、proxy_cache_revalidate 启用使用带有“If-Modified-Since”和“If-None-Match”头字段的条件请求的过期缓存项目的重新验证 proxy_cache_revalidate on|off; 11、proxy_read_timeout 表示从后端服务器读数据的超时时间,如果两次连续的读操作时间间隔大于设定值,则断开连接 proxy_read_timeout 180s; 12、proxy_send_timeout 向后端写数据的超时时间,如果两次连续的写操作时间间隔大于设定值,则断开连接 proxy_send_timeout 60s; 13、proxy_buffering 启用或关闭来自后端服务器的响应缓冲,当启用缓冲后,代理服务器收到后端服务器的响应后,将其保存至proxy_buffer_size和proxy_buffers 指令设置的缓冲区中,当缓冲关闭时,代理服务器收到响应后立马返回给请求方。 proxy_buffering on|off; 14、proxy_cache_key string; 指定缓存中用于键的内容。默认值为:proxy_cache_key $scheme$proxy_host$request_uri; 15、proxy_hide_header field; 默认nginx在响应客户端时,将后端服务器的报文首部隐藏。"Date", "Server", "X-Pad", and "X-Accel-..." 默认隐藏 4、添加自定义首部 add_header X-Cache-Status $upstream_cache_status; 在对客户端的响应中添加了一个`X-Cache-Status`HTTP响应头,从而可以知道缓存的状态,$upstream_cache_status的可能值: MISS——响应在缓存中没找到,从原始服务器取得,此次请求之后可能被缓存下来 HIT——响应包含来自缓存的最新有效的内容 BYPASS——响应来自原始服务器而不是缓存,这个响应之后可能会被缓存起来。 EXPIRED——缓存过期,请求从后端服务器来 STALE——内容陈旧是因为原始服务器不能正确响应。需要配置proxy_cache_use_stale。 UPDATING——缓存过期,返回旧的内容 REVALIDATED——proxy_cache_revalidate命令被启用,Nginx检测得知当前的缓存内容依然有效(If-Modified-Since或者If-None-Match)。 ================================================================================================================================================ Nginx与FastCGI结合 1、配置示例 location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; # FastCGI服务器地址端口 fastcgi_index index.php; # FastCGI的默认主页面 fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # 设置传递给FastCGI服务器的参数值,可以文本,变量或组成 include fastcgi_params; } 测试示例: location ~ \.php$ { fastcgi_pass 172.18.26.4:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /app/php$fastcgi_script_name; include fastcgi_params; } location ~ \.php$ { root /wwwdata; fastcgi_pass 10.53.252.212:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } 2、缓存配置指令 fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time]; path max_size= levels= lets_zone= inactive= fastcgi_cache zone|off; # 引用缓存 fastcgi_cache_key string; fastcgi_cache_methods fastcgi_cache_min_users number; fastcgi_keep_conn on|off; fastcgi_cache_valid ================================================================================================================================================ nginx负载均衡 1、ngx_http_upstream_module模块 nginx中实现负载均衡调度的模块ngx_http_upstream_module模块,nginx是一个非常高效的HTTP负载均衡器。负载均衡的指令只能配置到httpd段。 2、示例配置段 upstream backend { ip_hash; server backend1.example.com weight=5 max_fails=number fail_timeout=10s; server backend2.example.com:8080; server unix:/tmp/backend3; server backup1.example.com:8080 backup; server backup2.example.com:8080 backup; } server { location / { proxy_pass http://backend; } } 3、调度方式 1、轮询(round-robin)。轮流将请求调度到后端服务器,nginx负载均衡器的默认调度算法。 2、最少连接(least_conn)。其中请求被传递到具有最少数量的活动连接的服务器,同时考虑服务器的权重。如果有几个 这样的服务器,则依次使用加权循环平衡方法。 3、会话持久(ip-hash)。使用ip-hash时,客户端IP地址作为hash key使用,用来决策选择服务器集群中的哪个服务器来 处理这个客户端的请求。这个方法保证从同一个客户端发起的请求总是定向到同一台服务器,除非服务器不可用。 4、配置指令 1、server指令参数 1、weight 调度器将按照指定的权重比例调度到后端服务器。默认的权重的1 weight=5; 2、max_fails 设置健康监测次数,即监测几次失败后,停掉被代理服务器,默认为1 max_fails=3; 3、fail_timeout 默认为10分钟。负载均衡器尝试与后端服务器通信max_fails指定的次数都失败后,之后的fail_timeout时间段 内都将不在进行通信,超过fail_timeout时间段后,在进行max_fails次数尝试连接,如果失败,则断定为不可 达服务器,之后不在尝试连接。 fail_timeout=60s; 4、backup 标记为备用服务器 5、down 标记停掉某台服务器 6、max_conns 连接后端报务器最大并发活动连接数,1.11.5后支持 2、ip_hash 指定使用负载均衡算法,基于客户端ip地址作调度。 3、least_conn 指定使用负载均衡算法,最少连接。 4、调度算法: 1、ip_hash; 基于源地址调度 2、sticky基于cookie的调度 基于ip_hash的调度算法进行调度时,尽管有一定程度上可以将来自同一个IP的用户调度到后端同一台服务器上,但如果许多用户在一个局域网内, 通过SNAT的方式请求服务时,这些用户都会被调度到同一台服务器上。引入cookie机制,可以解决这一问题,每一个用户访问,都使用不同的cookie。 这样基于cookice调度,能够实现session 绑定。Sticky就是基于cookie的一种负载均衡解决方案,通过cookie实现客户端与后端服务器的会话保持, 在一定条件下可以保证同一个客户端访问的都是同一个后端服务器在nginx中,使用sticky指令实现这种机制。sticky指令的使用有三种方式: 1、Syntax: sticky cookie name [expires=time] [domain=domain] [httponly] [secure] [path=path]; name:cookie的名称 expires=time:用户浏览器保存cookie的时长,cookie过期时间,默认浏览器关闭就过期,也就是会话方式。 path=path:哪些路径对启用sticky,例如path/test,那么只有test这个目录才会使用sticky做负载均衡 domain=domain:哪些域名下可以使用这个cookie 2、sticky route $variable ...; 3、sticky learn create=$variable lookup=$variable zone=name:size [timeout=time]; 示例配置段: 方式一:coolie upstream backend { server backend1.example.com; server backend2.example.com; sticky cookie srv_id expires=1h domain=.example.com path=/; } 方式二:route map $cookie_jsessionid $route_cookie { ~.+\.(?P\w+)$ $route; } map $request_uri $route_uri { ~jsessionid=.+\.(?P\w+)$ $route; } upstream backend { server backend1.example.com route=a; server backend2.example.com route=b; sticky route $route_cookie $route_uri; } 3、least_conn 指定使用负载均衡算法,最少连接。 4、hash key [consistent]; 基于指定的key的hash表实现对请求的调度,此处的key可以是文本、变量、或组合。可以达到将同一类请求发往同一个后端服务器, 使用consistent参数,将使用一致性hash算法,适合后端是缓存服务器的场景。 示例: hash $request_uri consistent; hash $remote_addr; 5、wrr 轮询 5、health_check math=math_name|[parameters]; 后端服务器健康状态检测 支持以下可选参数: interval=time 设置两次连续运行状况检查之间的间隔,默认为5秒。 jitter=time 设置每个健康检查将随机延迟的时间,默认情况下,没有延迟。 fails=number 设置特定服务器的连续失败的健康状况检查的次数,在此之后,该服务器将被视为不健康,默认情况下为1。 passes=number 设置特定服务器的连续通过的健康检查的数量,之后服务器将被认为是健康的,默认情况下为1。 uri=uri 定义健康检查请求中使用的URI,默认情况下为“ /”。 mandatory 设置服务器的初始“检查”状态,直到第一次健康检查完成(1.11.7)。客户端请求不会传递到“检查”状态的服务器。如果未指定参数,则服务 器最初将被视为健康状态。 match=name 指定配置match响应应通过的测试的块,以便健康检查通过。默认情况下,响应应为状态代码2xx或3xx。 port=number 定义连接到服务器以执行运行状况检查时使用的端口(1.9.7)。默认情况下,等于服务器端口 示例: # status is 200, content type is "text/html", # and body contains "Welcome to nginx!" match welcome { status 200; header Content-Type = text/html; body ~ "Welcome to nginx!"; } # status is not one of 301, 302, 303, or 307, and header does not have "Refresh:" match not_redirect { status ! 301-303 307; header ! Refresh; } # status ok and not in maintenance mode match server_ok { status 200-399; body !~ "maintenance mode"; } ================================================================================================================================================ Nginx四层代理及调度 1、Nginx可以基于UDP、TCP协议进行调度连接,即基于传输层进行反向代理和调度。 2、配置格式 stream { # 用于main段 upstream ServerName { # upstream 来自 ngx_stream_upstream_core_module 模块 server DIP_ADDR1:PORT; server DIP_ADDR2:PORT; least_conn; hash $remote_addr consistent; # 基于源地址绑定进行调度 } server { listen VIP_ADDR:PORT; proxy_pass ServerName; proxy_timeout timeout; # 无数据传输时保持连接状态的超时时长,默认为10m proxy_connect_timeout time; # 配置Nginx与后端服务器建立连接时的超时时长 } } 3、配置指令 server ADDR:PORT; listen address:port [ssl] [udp] [proxy_protocol] [backlog=number] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]]; ================================================================================================================================================ 动静分离 location ~* \.(jpg|png|gif|jpeg)$ { } location ~* \php$ { } ================================================================================================================================================