4.1 重启Nginx
sudo /usr/local/sbin/nginx -s reload
4.2 关闭Nginx
#快速停止服务sudo /usr/local/sbin/nginx -s stop#优雅停止服务sudo /usr/local/sbin/nginx -s quitkill -s SIGQUIT pid_masterkill -s SIGWINCH pid_master
4.3 Nginx进程之间关系
一个master进程来管理多个work进程.
work进程数量和CPU的核数相同(进程间切换的代价最小)
4.4 Nginx配置通用语法
块配置项
块配置项由一个块配置项名和一对大括号组成. 比如
events {use epoll;}
nginx.conf中的events,http,server,location,upstream等都是块配置项 块配置项可以嵌套,内嵌块直接继承外层块.
块配置项的语法格式
基本格式:配置项名 配置项值1 配置项值2 ...;配置项目必须是nginx的某一模块想要处理的,否则判定为非法配置项名. 配置项值可以是数字,字符串包括正则表达式,可能有多个值. 每行配置的末尾以分好';'结束
配置项的单位
以'#'字符开始 的一行视为注释#pid logs/nginx.pid指定空间大小 单位包括 K k 千字节(KB),M m 兆字节(MB)gzip_buffers 4 8k;client_max_body_size 64M;指定时间大小 单位包括 ms,s,s,m,h,d,w,M,y; expires 10m;#有效期为10s
配置项中使用变量
$varname 比如:log_format main '$remote_addr - $remote_user'
4.5 Nginx服务基本配置
Nginx服务在运行时,至少需要加载几个核心模块和一个事件类模块. 这些模块所支持的配置统称为基本配置.主要分为4大类:1用于调试定位为题的配置项2正常运行的必备配置项3优化性能的配置项4事件类配置项
用以调试和定位问题的配置块
是否以守护进程方式运行
daemon on|off;默认为on如果调试阶段 可以设置为off 以 前台进程方式运行 这样便于跟踪调试Nginx
是否以master/worker方式工作
master_process on | off;默认为on如果调试阶段 可以设置为off 以 master进程自身来响应请求 这样便于跟踪调试Nginx
errorr日志的设置
error_log /path/file level;#第一个项为设置为error日志的路径和文件名#第二项为等级 有debug,info,notice,warn,error,crit,alert,emerg 默认为 logs/error.log error;当第一项设置为 /dev/null 表示忽略任何日志当设置为 stderr 这样错误日志会输出到标准错误文件中.第二项的等级 自左向右依次增加.最后应该保证输出日志的硬盘空间应当足够使用**设置成debug模式的时候,需要在configure时 加上--with-debug 参数
仅对指定的客户端输出debug级别的日志
debug_connection IP[/port]由于该配置属于事件类配置,需要放置在events{...}才有效 例如:events{debug_connection 192.168.1.100;debug_connection 192.168.1.100/24;}仅对以上设置的IP才设置成debug级别的日志,其他请求沿用error_log 配置的级别
限制coredump核心转储文件的大小
worker_rlimit_core_size size;以size来限制coredump文件的大小.
指定coredump文件的位置
working_directory path;path指定coredump文件的位置需要保证path路径有足够的写入权限和足够的使用空间.
正常运行配置项
引入其他配置文件
include /path/file;include配置项可以将其他配置文件引入到当前的nginx.conf文件中,参数可以是绝对路径和相对(conf/)路径include mine.types;include vhost/*.conf
pid文件的位置
pid path/filelogs/nginx/pid保存master进程ID的pid文件夹的存放路径应该确保nginx在相应的目录中有创建pid文件的权限.
Nginx worker进程运行的用户和用户组
user username [groupname];user nobody nobody;user用于设置master进程启动后,fork出的worker子进程运行在哪个用户和用户组下.当设置username没有设置groupname,则默认username与groupname相同.
指定worker进程可以打开的最大文件句柄描述符个数
worker_rlimit_nofile limit_num;设置一个worker进程可以打开的最大文件句柄数.(应该大于最大连接数)
限制信号队列长度
worker_rlimit_sigpending limit_num;设置每个用户发往Nginx信号队列的大小.多的将丢弃
优化性能配置项
Nginx worker进程的个数
worker_process number;默认为1worker进程的数量直接影响性能.合适的worker进程数量和业务息息相关.worker进程是单线程的进程,如果确认各模块中不会出现阻塞调用那么number设置为cpu的核数如果有可能出现阻塞调用,number设置的比cpu核数大一点.多worker进程可以充分利用多核系统架构,如果worker进程相比CPU数量太多会增加进程间切换的消耗.
绑定Nginx worker进程到指定的CPU内核
**仅对Linux有效worker_cpu_affinity cpumask[cpumask...]可防止多个进程抢占同一核心worker_processes 4;worker_cpu_affinity 1000 0100 0010 0001;worker_processes 2;worker_cpu_affinity 10 01;
系统调用getimeofday()的执行频率
默认 timer_resolution t;例如 timer_resolution 100ms;表示至少每100ms才调用一次gettimeofday()目前大多数内核中,花销只是一次vsyscall()仅对共享内存页中的数据做访问.一般可以不适用这个配置
事件类配置项
是否打开accept锁
accept是Nginx负载均衡锁.这把锁可以让多个work进程轮流,有序的与新的客户端建立TCP连接.默认是打开的.如果配置关闭,建立TCP连接耗时会更短.但是多个worker之间负载不会均衡.
lock文件的路径
lock_file path/file默认 logs/nginx.lockaccept锁可能需要这个lock文件,如果accept锁配置关闭那么lock_file配置无效如果accept锁配置打开且由于操作系统和编译器等因素导致Nginx不支持原子锁,将利用文件锁实现accept.
使用accept锁后到真正建立连接之间的延迟时间
accept_mutex_delay numberms;默认500ms;一个worker进程试图获取到accept锁失败,经过number ms时间再次试图获取accept锁.
批量建立连接
multi_accept [on|off]默认off当时间模型通知有新连接时,尽量对本次调度中客户端发起的TCP请求都建立连接.
选择事件模型
use [kqueue | rtsig epoll | /dev/poll | select |poll |eventport]默认 Nginx会自动选择最适合的事件模型.对于Linux来说,可以供选择的时间驱动模型有select,poll,epoll的三种.
每个worker的最大连接数
worker_connection number;定义每个worker进程可以同时处理的最大连接数
使用HTTP核心模块配置一个静态WEB服务器
所有的HTTP配置项都必须直属于http块,server块,location块,upstream块,if块.直属于指的是配置项直接所属的大括号对应的设置块
虚拟主机与请求的分发
由于IP有限,存在多个主机域名对应同一个IP地址的情况.在nginx.conf中可以通过server块 来设置server_name定义虚拟主机.每个server块就是一个虚拟主机,只处理与之相应的主机域名请求,这样一套服务器上的Nginx就能以不同的方式处理不同的域名的HTTP请求了.
监听端口
listen address:port[default | default_server |[backlog=num |revbuf=size| sndbuf=size| accept_filter=filter |deferred|bind|ipv6only=[on|off] |ssl]]
默认listen 80
在listen之后可以只加IP地址,端口,或者主机名
isten 127.0.0.1:8000;listen localhost;listen 8000;listen *:8000;listen 443 default_server ssl;
default 将所在的server块作为整个WEB服务的默认server块;如果所有的server都没设置这个参数, nginx.conf第一个server作为默认块.当一个请求无法匹配配置文件的任一主机名就会选用默认虚拟主机. default_server 同上backlog=num 表示TCP中backlog队列的大小,默认为-1表示不设置. TCP三次握手过程中进程还没有处理监听句柄,backlog用以放置这个新连接, 如果队列已满,新客户端3次握手建立连接失败deferred 设置这个参数后,通过三次握手之后内核不会在建立连接时处理,而是等发来数据的时候处理连接.bind 绑定当前地址:端口ssl 在当前监听的端口上建立的连接必须给予SSL协议
主机名称
server_name name[...];默认 server_name "";server_name之后可以跟多个主机名称eg: server_name www.wowpai.top download.wowpai.top;在开始处理HTTP请求时,Nginx会取出header头中的host,与server中每个server_name进行比较, 如果多个server块都匹配需要按照优先级来选择处理的server块.首先选择所有字符完全匹配的server_name www.wowpai.top其次选择通配符在前面的server_name *.wowpai.top其次选择通配符在后面的server_name www.wowpai.*最后选择使用正则匹配的server_name ~^\.wowpai\.top$如果以上都不能匹配将按照以下的server块:优先选择在listen配置项后加入[default |default_server]的server块 找到匹配listen端口的第一个server块如果server_name后面跟着字符串 server_name ""表示匹配没有Host这个HTTP头部的请求Nginx使用server_name配置项针对特定Host域名的请求提供不同的服务以实现虚拟主机的功能.
server_names_hash_bucket_size
server_names_hash_bucket_size size;默认 server_names_hash_bucket_size 32|64|128;可配置块 http server location为提高查找相应的server_name的能力,Nginx使用散列表来存储. size设置了每个散列块占用的字节数.
server_names_hash_max_size
server_names_hash_max_size size;默认 server_names_hash_max_size 512;可配置块 http serverlocationserver_names_hash_max_size 影响散列表的冲突率,server_names_hash_max_size越大,冲突率越低,检索速度越快.
重定向主机名称的处理
server_name_in_redirect on|off;默认 on该配置需要配合server_name 使用.在使用on打开的时候,表示在重定向请求时会使用server_name里面配置的第一个主机名代替原来的请求中的Host头部.当使用off关闭时,表示在重定向请求时使用请求本身的Host头部.
location
location [=|~|~* |^~| @ ] | /uri/ {}可配置块 serverlocation会尝试根据用户请求中的URI来匹配上面的/uri表达式,如果可以[匹配就选择location{}块中的配置来处理用户请求.location的匹配规则:= 表示把URI作为字符 以便与参数中的uri做完全匹配location = /{#只有当用户请求/时 才会调用该location下的配置}~ 表示匹配URI时字母大小写敏感的~* 表示匹配URI时忽略字母大小写 后面可以跟上正则表达式location ~* \.(gif|jpg|jpeg){#匹配这三种图片的资源请求}^~ 表示匹配URI只需要前半部分uri参数匹配即可location ^~ /images/{#以/images/开始的请求都会匹配上}@ 表示仅用于Nginx服务内部请求之间的重定向,带有@的location不直接处理用户请求没有匹配的URI应该得到一个响应,location /{#前面所有的匹配都未成功就意味着会被这个location 匹配-----捕获}**location匹配的存在一定的优先级:先精确匹配然后模糊匹配,最后匹配/
文件路径定义
1 以root设置资源路径
root path;默认 root html;配置项: http server location iflocation /download/ {root /opt/web/html/;}如果请求的URI是/download/index/test.html,那么WEB服务器应该返回的是服务器上/opt/web/html/download/index/test.html
2 以alias设置资源路径
alias path;配置块:locationalias也是用来设置资源路径的.与root的不同点在于如何解读紧跟location后面的参数. 这将会致使alias与root以不同的方式将用户的请求映射到真正的磁盘文件上.如果请求的URI是 /conf/nginx.conf,实际上访问文件在/usr/local/nginx/conf/nginx.conflocation /conf{alias /usr/local/nginx/conf/;}location /conf{root /usr/local/nginx/;}使用alias时在URI向实际文件映射的过程中,已经把location后配置的/conf这部分字符串丢弃掉. 最终映射成path/nginx.conf文件而root则不一样 最终直接映射成 path/conf/nginx.conf
3 设置首页
index file ...;默认 index index.html;配置块 http serverlocation location /{root html;index index.html index.htm index.php;}优先返回index.php,没有的话返回index.htm,如果还没有,再尝试放回index.html
4 根据HTTP返回码重定向
rror_page code[code ...] [= | = answer-code] uri|@name_location配置块 http server location if如果某个请求返回错误码时匹配上了error_page中设置的code,则重定向到新的URI中. 虽然重定向了URI,但返回的错误码还是和原来的相同.可以通过'='来改变返回的错误码error_page 404 =200 /empty.html如果不修改 URI,只是想让这样的请求重定向到另一个location中处理location /{error_page 404 @failback;}location @failback{proxy_pass http://127.0.0.1:8081;}
5 是否允许定义error_page
recursive_error_pages [on|off];默认recursive_error_pages off;配置块 http server location确定是否允许定义error_page
try_files
try_files path1 [path2] uri;配置块 server locationtry_files 后面可以跟上多个path,且最后一定要跟上uri按照顺序遍历每个path,如果可以有效的读取就直接返回这个path并结束请求. 否则继续向后遍历,最后就重定向到uri上location /{#try_files $uri $uri/ /$uri.html $uri/index.html @other;try_files $uri $uri/ /error/php?c=404 =404;}location @other{proxy_pass http://backend;}
对客户端请求的限制
按HTTP方法名限制用户请求
limit_execpt method ...{...}配置块 location方法名有 PUT HEAD POST DELETE MKCOL COPY MOVE OPTIONS PROPFIND PROPPATCH LOCK UNLOCK PATCHlimit GET{allow 192.168.1.110/32;deny all;}禁止GET 和HEAD方法,其他方法允许
HTTP请求包体的最大值
client_max_body_size size;默认 client_max_body_size 1m;配置块 http server location用户打算上传一个超过10G的文件,发超过定义client_max_size的值,回复错误
对请求的限速
imit_rate speed;limit_rate 0;配置块 http server location if 限制客户端请求限制每秒的传输的字节数.0表示不限制server{if ( $slow){set $limit_rate 4k;}}
