accept_mutex
当某一时刻只有一个网络链接到来时,多个睡眠进程会同事被叫醒,叫做惊群问题,这个指令设置为on的时候会对nginx进程接受连接进行序列化,防止多个进程对连接的争抢。默认为on,只能在event中配置
worker_connections
主要用来设置允许每一个worker process 同时开启的最大连接数,不能大于文件系统支持打开的文件句柄数目,只能在event中配置
access_log path log_format
定义访问日志路径,log_format 为日志格式名字,只在http中配置
log_format name string
定义日志格式,name 为日志格式名字,string为具体格式定义,只在http中配置
sendfile on | off
开启或者关闭sendfile()传送文件,如果这个选项开启,则可以定义下一个指令
sendfile_max_chunk size
开启sendfile()传送文件时每次传送最大的大小值
keepalive_timeout timeout
服务器对连接的保持时间
keepalive_requests number
长连接建立以后,用户端通过此连接发送请求,最大的次数,在server和location块中
listen IP:port | port
监听的ip和端口或者只监听端口,此外还可以设置在sock监听
server_name name
虚拟主机名,可以设置为多个,用逗号隔开,虚拟主机名可以用正则表达式,在server中设置
正则表达式的捕获功能:
server_name ~^www\.(.+)\.com$;
当请求通过www.myserver.com 到达nginx服务器时,将会被下面的正则表达式 匹配,其中的myserver将会被捕获,并记录到$1中,在本server块下的配置中,当需要myserver时,就可以使用$1代替myserver了
其中name 如果设置为ip,则就成了基于ip的虚拟主机了
location 配置
location 后可以加 = | ~ | ~* | ^~ uri
= 严格匹配uri
~ 区分大小写的正则
~* 不区分大小写的正则
^~
gzip 配置
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
gzip_disable "MSIE [1-6]\."; IE6及以上的浏览器不使用压缩
如果单个的server 不需要启用gzip,则只需在server中配置 gzip off 即可
rewrite
rewrite regex replacement [flag]
其中flag 可以为last、break、redirect、permanent
last:得到新的url后,将新的url重新执行一下server中所有
break:得到新的url后,将用新的url继续往下执行
redirect:将重写厚的url 返回给客户端,状态码为302,临时重定向
permanent:将重写厚的url 返回给客户端,状态码为301,永久重定向
rewrite_log on | off
开启重写日志,开启后日志将以notice级别输出到errorlog中
防盗链
server{
listen 80;
server_name www.myweb.name;
location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)${
valid_referers none blocked server_names *.myweb.name;
if ($invalid_referer){
rewrite ^/ http://www.myweb.com/images/forbidden.png;
}
}
}
nginx 相关配置
#安装
yum -y install pcre-devel openssl-devel gcc*
useradd -r nginx
./configure --prefix=/usr --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre
make && make install
#平滑升级概念
主进程不负责提供服务,仅仅负责管理各子进程,每一个worker线程可以同时响应多个请求,worker线程本身并不需要加载和分析配置文件,是由主进程完成的,所以worker线程可以在工作的同his,主进程来升级配置文件,新的用户到来,启用新的配置,旧的用户还使用旧的配置,当老用户全部退出以后,既全部升级为新的配置,既平滑升级
###主进程和worker进程
nginx的master进程负责读取和分析配置文件,按需要生成/收回工作进程,但不响应用户的请求
nginx的worker负责调用各种模块来完成各种功能,和磁盘交互等
#配置文件中的变量
set 自定义变量
$host 域名
$remote_addr 用户的地址
$request_uri 访问请求的uri(通常可以用location)
更多变量参照http://nginx.org/en/docs/http/ngx_http_core_module.html nginx的http核心模块最下方
###配置文件中的正则
location 后边不加上边4个任何一个符号,表示只要从这个地方开始的都受其限定
如果出现了多个localtion,先匹配 = 号,然后不做模式匹配的,然后正则匹配的,然后不带符号
location [ = | ~ | ~* | ^~ ] uri {
= 和后边的uri做精确匹配
~ 正则表达式的模式匹配(区分大小写)
~* 正则表达式的模式匹配(不区分大小写)
^~ 不做模式匹配
!~*:取反,不区分大小写
!~:取反,区分大小写
}
###配置文件中if的condition
-d,!-d:判断指定的路径是否为存在且为目录
-e,!-e:判断指定的路径是否存在,文件目录都可
-f,!-f:判断指定的路径是否存在且为文件
-x,!-x:判断指定路径的文件是否存在且可执行
###配置文件
##rewrite 正则 replacement [flag]
flag 重写完成 后续的工作该怎么完成
break 重写完成之后 不在检查后边的,结束本次匹配(避免循环重写,可以用这个)
last 重写完成之后 提前跳出,然后重第一个检查 rewrite 规则
permanent 返回301代码,隐式重定向
redirect 本身不完成重写,使用重定向机制完成返回另外一个地址,重定向完要重新检查 rewrite 类似last机制(返回302代码,显示重定向)
写在if中的rewrite通常是要break的
###统计功能
location /status {
stub_status on
}
access_log off; 关闭访问日志,定义服务器状态的相关信息,访问日志可能要关闭
access_log syslog:server=address[,parameter=values] [format];将日志发往日志服务器
###统计功能的内容参数
Active connections 活动的连接数
server accepts handled requests
已经接受过的连接,已经处理过的连接数,处理的请求数(启用keepalive以后一个连接可以发送N个请求)
前两个如果一样的话,没有任何一个连接断开
Reading: 0 Writing: 1 Waiting: 3
reading 读取客户端的连接数.
writing 响应数据到客户端的数量
waiting 开启 keep-alive 的情况下,这个值等于 active – (reading+writing), 意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接.
###压缩功能
gzip on | off
gzip_buffers number size 设置用来压缩一个响应的数目和大小
gzip_comp_level 1 压缩级别
gzip_disable regex 符合指定条件的不压缩
gzip_http_version 指定自己gzip所使用的http版本
gzip_min_length 设置执行压缩的最小值
gzip_proxied 是否在代理中允许使用gzip
gzip_types test/plain application/xml image压缩的类型
实例
http {
gzip on;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript application/json;
gzip_disable msie6
}
###配置文件中的其他选项
worker_processes 4;启用几个工作线程的个数,也可以指定为auto
worker_rlimit_nofile 51200;修改worker进程可以打开的文件数目,和系统配置有关
use 使用哪一种事件驱动模型,默认epool
expires 定义过期时间
error_page 自定义错误指令
keepalive_timeout 65;繁忙的主机可以给5秒钟
worker_connections 1024;一个worker的连接数目
index 指定默认首页文件
listen 指定监听的address[:port]
autoindex on; 类似apache的Indexes,提供下载比较有用,其他情况应该关闭
server_name 对于一个基于主机名的虚拟主机来说,此项为必须
add_header Cache_Control private; 自定义首部信息
log_format 日志格式
worker_cpu_affinity 0001 0010 0100 1000;将worker进程绑定在那个cpu上(后边参数是cpu mask,此处代表1,2,3,4颗)
worker_priority 0;定义优先级NIS值,-20到20,默认是0,调小一点以使得nginx优先获得cpu使用权
###认证模块
auth_basic "authname" 启用了auth_basic认证并且认证名字叫什么
auth_basic_user_file "/path" 认证文件存放位置(由htpasswd创建)
###关于nginx的系统配置
ulimit -n或者vim /etc/security/limits.conf定义nginx nofile 51200
###反向代理
location /{
proxy_pass http://127.0.0.1/remote/;
proxy_set_header field value;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;将真实地址以header的方式传递给后方主机,需要后端服务器修改日志格式,来记录X-Real-IP值(apache 将%h修改为%{X-Real-IP}i)
}
###负载均衡
upstream webservers { upstream必须定义在server之外,http之内
ip_hash 做iphash,保持会话一致
server IP backup;定义为backup以后是备用的,正常情况下不会被访问到,down表示当前server暂时不参与负载均衡
server IP weight=1;
server IP weight=1;
}
server {
location / {
proxy_pass http://webservers;
proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;当碰到以上的错误的时候,把请求转发到下一台主机
proxy_set_header X-Real-IP $remote_addr;
}
}
###动静分离
实例
`server {
listen 80
server_name www.pro.com
location ~* \.(jpg|png|gif|jpeg|html|css|js) {
proxy_pass
}
}`
###代理缓存
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;
缓存目录,缓存目录层数,1:2代表一级目录用1 个十六进制表示,二级目录用两个十六进制表示,也可以用2:2等,最多1:2:3,键值空间名(后边要用)和大小(hash能存很多)
上边保存在硬盘类似 /data/nginx/cache/c/29/alkjasdflkjaslkdfjlkasdjf
其他选项
inactive=time 非活动缓存从缓存中剔除的最大缓存时间
max_size=size 缓存空间最大大小
proxy_cache zone|off 使用一个缓存区域,或者关闭缓存,遵循upstream服务器的响应报文首部中关于缓存的设定
Set-Cookie
Cache-Control containing "no-cache","no-store","private", or a "max-age" with a non-numberic or 0 value
Expires with a time in the past
X-Accel-Expires:0
proxy_cache_min_users:某响应报文被缓存之前至少应该被请求的次数,一般设定3次
proxy_cache_use_stale:在无法联系到upstream服务器时的那种情形下让nginx使用本地缓存的过期的缓存对象直接响应客户端请求
proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_504 | http_404 | off
proxy_cache_valid [code] time: 用于为不同的响应设定不同时长的有效缓存时长,例如:proxy_cache_valid 200 302 10m;
proxy_cache_bypass string:设定在那种情形下,nginx将不从缓存中取数据:例如:
proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;
proxy_cache_bypass $http_pragma $http_authorization; 跟用户私有数据和认证有关的
使用实例
http {
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=STATIC:10m inactive=24h max_size=1g;
server {
location /{
proxy_pass http://www.test.com;
proxy_set_header Host \$host;
proxy_cache STATIC;
proxy_cache_valid 200 1d;
proxy_cache_valid 301 302 10m;
proxy_cache_valid any 1m;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
add_herder X-Via \$server_addr;
add_header X-Cache-Stauts $upstream_cache_status; //启用ipstream后查看是否命中缓存
}
}
}
###子进程
worker进程接受和处理用户的请求
cache manager 和 cache loader 管理cache