4.1 重启Nginx

  1. sudo /usr/local/sbin/nginx -s reload

4.2 关闭Nginx

  1. #快速停止服务
  2. sudo /usr/local/sbin/nginx -s stop
  3. #优雅停止服务
  4. sudo /usr/local/sbin/nginx -s quit
  5. kill -s SIGQUIT pid_master
  6. kill -s SIGWINCH pid_master

4.3 Nginx进程之间关系

一个master进程来管理多个work进程.

work进程数量和CPU的核数相同(进程间切换的代价最小)

4.4 Nginx配置通用语法

块配置项

块配置项由一个块配置项名和一对大括号组成. 比如

  1. events {
  2. use epoll;
  3. }

nginx.conf中的events,http,server,location,upstream等都是块配置项 块配置项可以嵌套,内嵌块直接继承外层块.

块配置项的语法格式

  1. 基本格式:
  2. 配置项名 配置项值1 配置项值2 ...;
  3. 配置项目必须是nginx的某一模块想要处理的,否则判定为非法配置项名. 配置项值可以是数字,字符串包括正则表达式,可能有多个值. 每行配置的末尾以分好';'结束

配置项的单位

  1. '#'字符开始 的一行视为注释
  2. #pid logs/nginx.pid
  3. 指定空间大小 单位包括 K k 千字节(KB),M m 兆字节(MB)
  4. gzip_buffers 4 8k;
  5. client_max_body_size 64M;
  6. 指定时间大小 单位包括 ms,s,s,m,h,d,w,M,y; expires 10m;#有效期为10s

配置项中使用变量

  1. $varname 比如:
  2. log_format main '$remote_addr - $remote_user'

4.5 Nginx服务基本配置

  1. Nginx服务在运行时,至少需要加载几个核心模块和一个事件类模块. 这些模块所支持的配置统称为基本配置.
  2. 主要分为4大类:
  3. 1用于调试定位为题的配置项
  4. 2正常运行的必备配置项
  5. 3优化性能的配置项
  6. 4事件类配置项

用以调试和定位问题的配置块

是否以守护进程方式运行

  1. daemon on|off;
  2. 默认为on
  3. 如果调试阶段 可以设置为off 前台进程方式运行 这样便于跟踪调试Nginx

是否以master/worker方式工作

  1. master_process on | off;
  2. 默认为on
  3. 如果调试阶段 可以设置为off master进程自身来响应请求 这样便于跟踪调试Nginx

errorr日志的设置

  1. error_log /path/file level;
  2. #第一个项为设置为error日志的路径和文件名
  3. #第二项为等级 有debug,info,notice,warn,error,crit,alert,emerg 默认为 logs/error.log error;
  4. 当第一项设置为 /dev/null 表示忽略任何日志
  5. 当设置为 stderr 这样错误日志会输出到标准错误文件中.
  6. 第二项的等级 自左向右依次增加.
  7. 最后应该保证输出日志的硬盘空间应当足够使用
  8. **设置成debug模式的时候,需要在configure 加上--with-debug 参数

仅对指定的客户端输出debug级别的日志

  1. debug_connection IP[/port]
  2. 由于该配置属于事件类配置,需要放置在events{...}才有效 例如:
  3. events{
  4. debug_connection 192.168.1.100;
  5. debug_connection 192.168.1.100/24;
  6. }
  7. 仅对以上设置的IP才设置成debug级别的日志,其他请求沿用error_log 配置的级别

限制coredump核心转储文件的大小

  1. worker_rlimit_core_size size;
  2. size来限制coredump文件的大小.

指定coredump文件的位置

  1. working_directory path;
  2. path指定coredump文件的位置
  3. 需要保证path路径有足够的写入权限和足够的使用空间.

正常运行配置项

引入其他配置文件

  1. include /path/file;
  2. include配置项可以将其他配置文件引入到当前的nginx.conf文件中,参数可以是绝对路径和相对(conf/)路径
  3. include mine.types;
  4. include vhost/*.conf

pid文件的位置

  1. pid path/file
  2. logs/nginx/pid
  3. 保存master进程IDpid文件夹的存放路径
  4. 应该确保nginx在相应的目录中有创建pid文件的权限.

Nginx worker进程运行的用户和用户组

  1. user username [groupname];
  2. user nobody nobody;
  3. user用于设置master进程启动后,fork出的worker子进程运行在哪个用户和用户组下.
  4. 当设置username没有设置groupname,则默认usernamegroupname相同.

指定worker进程可以打开的最大文件句柄描述符个数

  1. worker_rlimit_nofile limit_num;
  2. 设置一个worker进程可以打开的最大文件句柄数.(应该大于最大连接数)

限制信号队列长度

  1. worker_rlimit_sigpending limit_num;
  2. 设置每个用户发往Nginx信号队列的大小.多的将丢弃

优化性能配置项

Nginx worker进程的个数

  1. worker_process number;
  2. 默认为1
  3. worker进程的数量直接影响性能.合适的worker进程数量和业务息息相关.
  4. worker进程是单线程的进程,如果确认各模块中不会出现阻塞调用那么number设置为cpu的核数
  5. 如果有可能出现阻塞调用,number设置的比cpu核数大一点.
  6. worker进程可以充分利用多核系统架构,如果worker进程相比CPU数量太多会增加进程间切换的消耗.

绑定Nginx worker进程到指定的CPU内核

  1. **仅对Linux有效
  2. worker_cpu_affinity cpumask[cpumask...]
  3. 可防止多个进程抢占同一核心
  4. worker_processes 4;
  5. worker_cpu_affinity 1000 0100 0010 0001;
  6. worker_processes 2;
  7. worker_cpu_affinity 10 01;

系统调用getimeofday()的执行频率

  1. 默认 timer_resolution t;
  2. 例如 timer_resolution 100ms;表示至少每100ms才调用一次gettimeofday()
  3. 目前大多数内核中,花销只是一次vsyscall()仅对共享内存页中的数据做访问.一般可以不适用这个配置

事件类配置项

是否打开accept锁

  1. acceptNginx负载均衡锁.这把锁可以让多个work进程轮流,有序的与新的客户端建立TCP连接.
  2. 默认是打开的.
  3. 如果配置关闭,建立TCP连接耗时会更短.但是多个worker之间负载不会均衡.

lock文件的路径

  1. lock_file path/file
  2. 默认 logs/nginx.lock
  3. accept锁可能需要这个lock文件,如果accept锁配置关闭那么lock_file配置无效
  4. 如果accept锁配置打开且由于操作系统和编译器等因素导致Nginx不支持原子锁,将利用文件锁实现accept.

使用accept锁后到真正建立连接之间的延迟时间

  1. accept_mutex_delay numberms;
  2. 默认500ms;
  3. 一个worker进程试图获取到accept锁失败,经过number ms时间再次试图获取accept锁.

批量建立连接

  1. multi_accept [on|off]
  2. 默认off
  3. 当时间模型通知有新连接时,尽量对本次调度中客户端发起的TCP请求都建立连接.

选择事件模型

  1. use [kqueue | rtsig epoll | /dev/poll | select |poll |eventport]
  2. 默认 Nginx会自动选择最适合的事件模型.
  3. 对于Linux来说,可以供选择的时间驱动模型有select,poll,epoll的三种.

每个worker的最大连接数

  1. worker_connection number;
  2. 定义每个worker进程可以同时处理的最大连接数

使用HTTP核心模块配置一个静态WEB服务器

  1. 所有的HTTP配置项都必须直属于http块,server块,location块,upstream块,if块.
  2. 直属于指的是配置项直接所属的大括号对应的设置块

虚拟主机与请求的分发

  1. 由于IP有限,存在多个主机域名对应同一个IP地址的情况.在nginx.conf中可以通过server 来设置server_name定义虚拟主机.
  2. 每个server块就是一个虚拟主机,只处理与之相应的主机域名请求,
  3. 这样一套服务器上的Nginx就能以不同的方式处理不同的域名的HTTP请求了.

监听端口

  1. listen address:port[default | default_server |[backlog=num |revbuf=size
  2. | sndbuf=size| accept_filter=filter |deferred|bind|ipv6only=[on|off] |ssl]]

默认listen 80

在listen之后可以只加IP地址,端口,或者主机名

  1. isten 127.0.0.1:8000;
  2. listen localhost;
  3. listen 8000;
  4. listen *:8000;
  5. listen 443 default_server ssl;
  1. default 将所在的server块作为整个WEB服务的默认server块;如果所有的server都没设置这个参数, nginx.conf第一个server作为默认块.
  2. 当一个请求无法匹配配置文件的任一主机名就会选用默认虚拟主机. default_server 同上
  3. backlog=num 表示TCPbacklog队列的大小,默认为-1表示不设置. TCP三次握手过程中进程还没有处理监听句柄,backlog用以放置这个新连接, 如果队列已满,新客户端3次握手建立连接失败
  4. deferred 设置这个参数后,通过三次握手之后内核不会在建立连接时处理,而是等发来数据的时候处理连接.
  5. bind 绑定当前地址:端口
  6. ssl 在当前监听的端口上建立的连接必须给予SSL协议

主机名称

  1. server_name name[...];
  2. 默认 server_name "";
  3. server_name之后可以跟多个主机名称
  4. eg: server_name www.wowpai.top download.wowpai.top;
  5. 在开始处理HTTP请求时,Nginx会取出header头中的host,与server中每个server_name进行比较, 如果多个server块都匹配需要按照优先级来选择处理的server块.
  6. 首先选择所有字符完全匹配的server_name www.wowpai.top
  7. 其次选择通配符在前面的server_name *.wowpai.top
  8. 其次选择通配符在后面的server_name www.wowpai.*
  9. 最后选择使用正则匹配的server_name ~^\.wowpai\.top$
  10. 如果以上都不能匹配将按照以下的server块:
  11. 优先选择在listen配置项后加入[default |default_server]的server 找到匹配listen端口的第一个server
  12. 如果server_name后面跟着字符串 server_name ""表示匹配没有Host这个HTTP头部的请求
  13. Nginx使用server_name配置项针对特定Host域名的请求提供不同的服务以实现虚拟主机的功能.

server_names_hash_bucket_size

  1. server_names_hash_bucket_size size;
  2. 默认 server_names_hash_bucket_size 32|64|128;
  3. 可配置块 http server location
  4. 为提高查找相应的server_name的能力,Nginx使用散列表来存储. size设置了每个散列块占用的字节数.

server_names_hash_max_size

  1. server_names_hash_max_size size;
  2. 默认 server_names_hash_max_size 512;
  3. 可配置块 http serverlocation
  4. server_names_hash_max_size 影响散列表的冲突率,server_names_hash_max_size越大,冲突率越低,检索速度越快.

重定向主机名称的处理

  1. server_name_in_redirect on|off;
  2. 默认 on
  3. 该配置需要配合server_name 使用.在使用on打开的时候,表示在重定向请求时会使用server_name里面配置的
  4. 第一个主机名代替原来的请求中的Host头部.
  5. 当使用off关闭时,表示在重定向请求时使用请求本身的Host头部.

location

  1. location [=|~|~* |^~| @ ] | /uri/ {}
  2. 可配置块 server
  3. location会尝试根据用户请求中的URI来匹配上面的/uri表达式,如果可以[匹配就选择location{}块中的配置来处理用户请求.
  4. location的匹配规则:
  5. = 表示把URI作为字符 以便与参数中的uri做完全匹配
  6. location = /{
  7. #只有当用户请求/时 才会调用该location下的配置
  8. }
  9. ~ 表示匹配URI时字母大小写敏感的
  10. ~* 表示匹配URI时忽略字母大小写 后面可以跟上正则表达式
  11. location ~* \.(gif|jpg|jpeg){
  12. #匹配这三种图片的资源请求
  13. }
  14. ^~ 表示匹配URI只需要前半部分uri参数匹配即可
  15. location ^~ /images/{
  16. #以/images/开始的请求都会匹配上
  17. }
  18. @ 表示仅用于Nginx服务内部请求之间的重定向,带有@的location不直接处理用户请求
  19. 没有匹配的URI应该得到一个响应,
  20. location /{
  21. #前面所有的匹配都未成功就意味着会被这个location 匹配-----捕获
  22. }
  23. **location匹配的存在一定的优先级:先精确匹配然后模糊匹配,最后匹配/

文件路径定义

1 以root设置资源路径

  1. root path;
  2. 默认 root html;
  3. 配置项: http server location if
  4. location /download/ {
  5. root /opt/web/html/;
  6. }
  7. 如果请求的URI是/download/index/test.html,那么WEB服务器应该返回的是服务器上
  8. /opt/web/html/download/index/test.html

2 以alias设置资源路径

  1. alias path;
  2. 配置块:location
  3. alias也是用来设置资源路径的.与root的不同点在于如何解读紧跟location后面的参数. 这将会致使aliasroot以不同的方式将用户的请求映射到真正的磁盘文件上.
  4. 如果请求的URI /conf/nginx.conf,实际上访问文件在/usr/local/nginx/conf/nginx.conf
  5. location /conf{
  6. alias /usr/local/nginx/conf/;
  7. }
  8. location /conf{
  9. root /usr/local/nginx/;
  10. }
  11. 使用alias时在URI向实际文件映射的过程中,已经把location后配置的/conf这部分字符串丢弃掉. 最终映射成path/nginx.conf文件
  12. root则不一样 最终直接映射成 path/conf/nginx.conf

3 设置首页

  1. index file ...;
  2. 默认 index index.html;
  3. 配置块 http server
  4. location location /{
  5. root html;
  6. index index.html index.htm index.php;
  7. }
  8. 优先返回index.php,没有的话返回index.htm,如果还没有,再尝试放回index.html

4 根据HTTP返回码重定向

  1. rror_page code[code ...] [= | = answer-code] uri|@name_location
  2. 配置块 http server location if
  3. 如果某个请求返回错误码时匹配上了error_page中设置的code,则重定向到新的URI中. 虽然重定向了URI,但返回的错误码还是和原来的相同.可以通过'='来改变返回的错误码
  4. error_page 404 =200 /empty.html
  5. 如果不修改 URI,只是想让这样的请求重定向到另一个location中处理
  6. location /{
  7. error_page 404 @failback;
  8. }
  9. location @failback{
  10. proxy_pass http://127.0.0.1:8081;
  11. }

5 是否允许定义error_page

  1. recursive_error_pages [on|off];
  2. 默认recursive_error_pages off;
  3. 配置块 http server location
  4. 确定是否允许定义error_page

try_files

  1. try_files path1 [path2] uri;
  2. 配置块 server location
  3. try_files 后面可以跟上多个path,且最后一定要跟上uri
  4. 按照顺序遍历每个path,如果可以有效的读取就直接返回这个path并结束请求. 否则继续向后遍历,最后就重定向到uri
  5. location /{
  6. #try_files $uri $uri/ /$uri.html $uri/index.html @other;
  7. try_files $uri $uri/ /error/php?c=404 =404;
  8. }
  9. location @other{
  10. proxy_pass http://backend;
  11. }

对客户端请求的限制

按HTTP方法名限制用户请求

  1. limit_execpt method ...{
  2. ...
  3. }
  4. 配置块 location
  5. 方法名有 PUT HEAD POST DELETE MKCOL COPY MOVE OPTIONS PROPFIND PROPPATCH LOCK UNLOCK PATCH
  6. limit GET{
  7. allow 192.168.1.110/32;
  8. deny all;
  9. }
  10. 禁止GET HEAD方法,其他方法允许

HTTP请求包体的最大值

  1. client_max_body_size size;
  2. 默认 client_max_body_size 1m;
  3. 配置块 http server location
  4. 用户打算上传一个超过10G的文件,发超过定义client_max_size的值,回复错误

对请求的限速

  1. imit_rate speed;
  2. limit_rate 0;
  3. 配置块 http server location if 限制客户端请求限制每秒的传输的字节数.0表示不限制
  4. server{
  5. if ( $slow)
  6. {
  7. set $limit_rate 4k;
  8. }
  9. }