nginx 基础总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx 基础总结相关的知识,希望对你有一定的参考价值。

nginx官方站点:http://nginx.org/

解决C10k的问题;能支持较大并发的服务器程序,突破了1万个请求。

nginx功能:

可以当做静态的web服务器;

    core模块实现http功能;

    支持虚拟主机(基于port、hostname、ip方式);

    keepalived保持会话

    访问日志

    url rewrite重写

    路径别名

    基于ip访问控制

    速率限制及并发数量限制等;

可作为(http的)反代服务器及负载均衡器;

    proxy模块实现反代

    upstream模块实现负载均衡

支持fastcgi使用FastCGI模块php通信

基于模块化,,可以与后端的不同应用通信;需要哪种功能就把哪种功能的模块编译进来即可;


Nginx模块一般可分为三类:核心模块、标准模块(http和邮件)、第三方模块(各种应用);

每个模块都有相应的配置指令和内置变量;


Nginx是模块化设计,包括核心模块、标准模块(http标准模块、http可选模块、mail模块)、3rd(第三方)模块

Nginx配置文件结构:

nginx.conf:主配置文件

main block:全局配置(对http及mail模块均有效);

    event {

        ...

    }:事件驱动的相关配置;

    http{

        ...

    }:http协议的相关配置;

    mail {

        ...

    }:mail相关配置;


http相关的配置:

http {

    ...

    ...

    server { 每个用来定义一个虚拟主机,但只能有一个虚拟主机使用https;

        ...

        servr_name 当前主机名

        root 根文档路径

        alias 别名

        location /uri/{ 定义类似于别名的映射;

            ...

            if

        }

        ...

    }

    server {

        ...

        ...

    }

}


main block配置段: Core functionality 核心模块

配置指令的类别:3类

正常运行必备的配置;

优化性能的配置;

用于调试、定位问题的配置;


正常运行必备的配置:

1、user USERNAME [GROUPNAME];

指定用于运行worker进程的用户和组;组可省略;


例如:

user  nginx  nginx;


2、pid /PATH/TO/PID_FILE;

指定nginx进程的pid文件路径;


例如:

pid        /var/run/nginx.pid;


3、worker_rlimit_nofile number;

单个worker进程所能打开的最大文件数,默认1024个;




性能优化相关的配置:

1、worker_processes number | auto;

指明worker的进程数,通常为CPU的核心数减1;


例如:

worker_processes  4;


 2、绑定nginx使用固定哪颗cpu

worker_cpu_affinity cpumask ...;

worker_cpu_affinity auto [cpumask];

CPUMASK:掩码,只能有一位置1,代表固定的cpu颗数;

0000 0001 第0号cpu,即第1颗cpu

0000 0010 第1号cpu,即第2颗cpu

0000 0100 第2号cpu,即第3颗cpu

......


例如:

worker_cpu_affinity 0001 

工作在第1颗cpu上,但是cpu编号是从0开始;


3、worker_priority nice;

工作进程优先级,nice:[-20,19],对应优先级:[100-139],nice值越小,优先级越高;


例如:

worker_priority -5;


调试、定位问题

1、daemon on|off;

是否以守护进程方式启动nginx进程;只有调试时才关闭,为off;


2、master_proces on|off;

是否以master/worker模型启动nginx进程;只有调试时才关闭,为off;


3、error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug | info | notice | warn | error | crit | alert | emerg];

错误日志文件的记录方式及其日志级别;其中debug,依赖于编译时--with-debug选项;


例如:

error_log  /var/log/nginx/error.log warn;


file /PATH/TO/SOME_LOG_FILE; 指定日志文件路径,也可以使用syslog记录日志;

stderr:发送到错误输出

syslog:server=address[,parameter=value]:发送给syslog服务器;要指明服务器IP或参数;

memory:size 记录到内存中;性能好,断电会消失,磁盘IO压力大;一般打开日志缓冲,缓解IO压力;

日志级别(列出的选项):debug依赖于configure时的--with-debug选项;


 events配置段

1、worker_connections numbers;

每个worker进程所能够并发打开的最大连接数;受限于(worker_rlimit_nofile设置)它所能够打开的文件数量的;

当前主机所能响应的最大并发连接数=worker_processes*worker_connections


2、use method;

指明并发连接请求处理时使用的方法;支持的方法有:select、poll、kqueue、epoll、/dev/poll、eventport


3、accept_mutex on|off;

是否打开负载均衡锁,启用时,表示用于让多个worker进程轮流地、序列化的响应新请求;


4、lock_file file;

指明锁文件路径且需要自定义;nginx使用锁机制实现互斥功能,并且序列化的让各worker访问这段共享内存;


http配置段:ngx_http_core_module模块

定义套接字相关功能:

1、server {

    listen PORT;

    server_name HOSTNAME;

    root /PATH/TO/DOCUMENTROOT;

    ...

}


注意:

(1)基于port的虚拟主机:

listen指令需要使用不同的端口;

(2)基于HOSTNAME的虚拟主机:

server_name指令指向不同的主机名;

(3)基于IP的虚拟主机;

listen IP:por

ip要使用不同的地址;


例如:基于端口的虚拟主机

server {

    listen 80;

    server_name webserver;

    root /usr/share/nginx/html;

    index index.html;

}


server {

    listen 808;

    server_name webserver;

    root /var/www/html;

    index index.html;

}


例如:基于主机名的虚拟主机

server {

    listen 80;

    server_name www.stu11.com;

    root /usr/share/nginx/html;

    index index.html;

    sendfile on;

}


server {

    listen 80;

    server_name www1.stu11.com;

    root /var/www/html;

    index index.html;

}


例如:基于ip的虚拟主机

server {

    listen 172.18.11.11:80;

    server_name webserver;

    root /usr/share/nginx/html;

    index index.html;

}


server {

    listen 172.18.11.12:80;

    server_name webserver;

    root /var/www/html;

    index index.html;

}



2、listen(定义方法有3种):

(1)listen address[:port] [default_server] [ssl] [backlog=number] [rcvbuf=size] [sndbuf=size]; 

指明地址,默认端口为80;


(2)listen port [default_server] [ssl] [backlog=number] [rcvbuf=size] [sndbuf=size];

指定端口的所有地址,即本机所有可用地址的端口;


(3)listen unix:path [default_server] [ssl] [backlog=number] [rcvbuf=size] [sndbuf=size];

使用unix socket套接字文件实现通信,客户端和服务端都是本机进程,使用本地回环接口进行通信,特点就是不会经由协议栈发送数据;


default_server:设置默认虚拟主机;

ssl:限制只能通过ssl连接提供服务;端口要为443;

backlog:后援队列的长度;

rcvbuf:接收缓冲区大小;

sndbuf:发送缓冲区大小;


3、server_name name ...;

为虚拟主机指明当前server的主机名;后可跟一个或空白字符分隔的多个主机名;支持使用*通配任意长度的任意字符;~起始的正则表达式模式字符串;

主机名匹配应用策略:(优先级)由高到底:

(1)首先精确匹配;

(2)左侧*通配符匹配;

(3)右侧*通配符匹配;

(4)正则表达式模式匹配;


4、tcp_nodelay on|off;

默认为on,只对keepalived模式下的连接是否启用此功能,客户端请求有小数据时,服务端不延迟等待多个小数据之后再响应给客户端,而是立即发送给客户端;


5、sendfile on|off;

是否启用sendfile功能,即在内核中直接封装响应报文响应用户的请求;默认是关闭的,需要手动启用;


定义路径相关配置:

6、root path;

设置web资源的路径映射;用于指明用户请求的url所对应的本地文件系统上的文档所在目录路径;

可用的上下文:

http:表示对所有server都生效;

server:表示只对当前一个server生效;

location:表示只对location中的URL生效;

if:表示仅对条件判断生效;


7、location(有2种方式):

根据用户请求的URI来匹配定义的多个location,匹配到时,此请求将被相应的location块中的配置指令所处理;

(1)location [ = | ~ | ~* | ^~ ] uri { ... }

(2)location @name {...}


匹配优先级:=、^~、~/~*、不带符号;

=:URI精确匹配;用户给定的URI与location中的完成一样;

^~:对URI左半部分做匹配检查,不区分字符大小写;

~:做正则表达式模式匹配,区分字符大小写;

~*:做正则表达式模式匹配,不区分字符大小写;


8、alias path;

定义路径别名,也是文档映射的一种机制,只能用在location上下文;

注意:

root指令:给定的路径对应于location中/uri/左侧的/;

alias指令:给定的路径对应于location中的/uri/右侧的/(这个url),而不包含uri本身;


例如:

请求资源:http://www.magedu.com/bbs/a.jpg

对应资源:http://www.magedu.com/web/forum/a.jpg

文件路径:/web/forum/a.jpg


location /bbs/ {

   alias /web/forum/;

}


相当于访问的是:/web/forum/a.jpg;


例如:

location /bbs/ {

    root /web/forum/;

}

相当于访问的是:/web/forum/bbs/a.jpg


9、index file ...;

设置默认主页;在不同的location可指定不同的主页;


10、error_page code...[=[response]] url;

自定义错误页面,根据用户请求的资源的http响应的状态码实现错误页重定向;


例如:

 ]# vim /etc/nginx/nginx.conf

server {

    listen 80;

    server_name www.stu11.com;

    root /web;



    location /www/ {

    root /web/var/;

    index page.html;

    }


    location / {

    root /var/www/html;

    index index.html;

    }


    error_page 404 /index.html;



    index index.html;

    sendfile on;

}


 ]# vim /var/www/html/index.html                  

 <h1>Error_Page</h1>


在浏览器输入:http://www1.stu11.com/hello.html

显示:Error_Page



用错误页面响应时,响应码是404;

也可以定义响应码,例如让客户端显示错误页面时的响应码为200,则:

]# vim /etc/nginx/nginx.conf

error_page  404  =200       /404.html;


在浏览器输入:http://www1.stu11.com/hello.html

显示:Error_Page


11、try_files 

实验失败!


定义客户端请求的相关配置:

12、keepalive_timeout timeout [header_timeout];

设定保持连接的超时时长,0表示禁止使用长连接,默认为75秒;


13、keepalive_requests number;

在一次长连接上所允许请求的资源的最大数量,默认100个;


14、keepalive_disable none|browser...;

对哪种浏览器禁用长连接;none表示不禁用;


15、send_timeout time;

向客户端发送响应报文的超时时长,默认60秒;特别地,是指两次写操作之间的间隔时长;


16、client_body_buffer_size size;

用于接收客户端请求报文的body部分的缓冲区大小,默认为16k,超出此大小时,其将被暂存到磁盘上;


17、client_body_tmp_path path[level1 [level2 [level3]]];

设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;


例如:

client_body_tmp_path /var/tmp/body 2 1 2;

表示在/var/tmp/body目录下用2个十六进制数创建一级子目录,即可创建256个(2个十六进制数的变化范围)一级子目录;然后在每个一级子目录下又用1个十六进制数创建二级子目录,即可创建16个(1个十六进制数的变化范围)二级子目录;最后在每个二级子目录下又可创建256个(2个十六进制数的变化范围)三级子目录;


对客户端请求进行限制的相关配置:

18、limiti_rate rate;

限制服务器端每秒钟响应给客户端的传输速率,单位是字节/秒,bytes/second,0表示无限制;


例如:

]# vim /etc/nginx/nginx.conf

location /download/ {

    limit_rate 20480;

    root /web/host1;

}


]# mkdir /web/host1/download

]# dd if=/dev/zero of=/web/host1/download/test.img bs=1M count=50       

]# nginx -s reload

]# vim /web/host1/download/index.html

<h1>download</h1>


在本机测试:

]# wget http://192.168.255.2/test.img   


浏览器测试:http://www1.stu11.com/download/test.img

显示:下载对话框;速度非常慢;


19、limit_except method... {...};

限制对指定的请求方法之外的其它方法的使用客户端;


例如:

limit_except GET POST{

    allow 172.17.0.0/16;

    deny all;

}

表示除了GET(自动包含HEAD)和POST之外的其它方法仅允许172.18.0.0/16中的主机使用;


文件操作优化的配置:

20、aio on|off|threads[=pool];

是否启用aio功能;默认关闭;指明使用多少个线程;不指定就是用多少启用多少线程;可用在http, server, location;


21、directio size|off;

是否启用直接IO;启用多大的IO空间;

直接IO就是写请求的时候,数据不在内存中缓存而是直接刷到磁盘上去,这就是直接IO;对性能有影响,对数据可靠性比较高;


22、缓存启用

open_file_cache off;

对打开的文件是否缓存下来,nginx缓存的是文件的元数据;off:表示不缓存;

nginx可以缓存以下三种信息:

(1)文件的描述符、文件大小和最近一次的修改时间;

(2)打开的目录结构;

(3)没有找到的或没有权限访问的文件的相关信息;


open_file_cache max=N[inactive=time];

max=N:可缓存的缓存项上限;达到上限后会使用LRU算法实现缓存管理;

inactive=time:缓存项的超时时长,在此处指定的时长内未被命中的缓存项即为非活动项;


23、open_file_cache_errors on|off;

是否缓存查找时发生错误的文件一类的信息;open_file_cache的功能是否有效,取决于此处指令;


24、open_file_cache_min_uses number;

缓存项在非活动期限内,最少应该被访问的次数;

非活动项是在open_file_cache中指定的时长内至少要访问多少次,才认为是活动项,少于此处指定的次数才认为是非活动项;


25、open_file_cache_valid time;

缓存项有效性的检查频率;默认为60秒;


ngx_http_access_module模块:访问控制模块

实现基于客户端ip的访问控制功能;

26、allow address|CIDR|unix:|all;

27、deny address|CIDR|unix:|all;


ngx_http_auth_basic_module模块;基于用户认证的模块

28、auth_basic string|off;

使用basic机制进行用户认证;用户为虚拟用户,要指明账号、密码的位置;


例如:

    location / {

        allow 172.18.11.0/24;

        deny all;

    }


29、auth_basic_user_file file;

认证用的账号密码文件;


文件格式:

name:password:comment

密码格式:

htpasswd命令


例如:

    location /www/ {

    root /web/var/;

    index page.html;

    auth_basic "Admin page";

    auth_basic_user_file /web/var/.passwd;

    }


]# htpasswd -c -m /etc/nginx/.nginxpasswd tom

输入:tom的密码

技术分享

ngx_http_stub_status_module模块;用于输出nginx的基本状态信息

30、stub_status;


显示状态信息:

Active connections: 2 

server accepts handled requests

 19 19 44 

Reading: 0 Writing: 1 Waiting: 1 


 表示意义:

Active connecttions:处于活动状态的客户端连接的数量;(包括等待客户端发来请求、开始建立连接的客户端但已经处于等待客户端发请求、或正在处理客户端请求、正在给客户端发响应报文)


accepts:服务器已经接受客户端请求的总数;(包括已经处理完、正在处理)

handled:已经处理完成的客户端请求的总数;(接收的大于处理完成的数量;)

requests:客户端已经发来的请求总数;(包含拒绝的请求)


Reading:正处于读取客户端请求报文首部的连接数量;

Writing:正处于向客户端发送响应报文过程中的连接数;

Waiting:正处于等待客户端发出请求的空闲连接数;如果启用保持连接功能,客户端请求资源后没再请求就处于空闲状态;如果waiting状态数量很多,表示大量客户端处于空闲状态,有可能是keep allive timeout设置时间太长所导致;


例如:

    location /status {

        stub_status;

    }

技术分享


ngx_http_referer_module模块;基于引用做访问控制;表示从哪个链接跳转到当前页面;

31、valid_refers none|blocked|server_names|string...;

定义合法的referer数据;可实现防盗链拒绝访问,拒绝来自某链接到本网页等功能;


none:请求报文首部没有referer首部;

blocked:请求报文的referer首部没有值;

server_names:其值是主机名;一般是自己的域名;

string:有2种

arbitrary string:直接字符串,可以使用*通配符;

regular expression:被指定的正则表达式模式匹配到的字符串,要使用~开头;


ngx_http_ssl_module模块;

32、ssl on|off;

是否启用当前虚拟主机的ssl;手动测试时,可临时关闭;


33、ssl_certificate file;

以上是关于nginx 基础总结的主要内容,如果未能解决你的问题,请参考以下文章

docker基础命令总结

SLAM基础矩阵矩阵基础相关概念总结

第五周总结

PHP 基础总结

计算机网络基础知识总结

Nginx基础整理