nginx 基础总结
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx 基础总结相关的知识,希望对你有一定的参考价值。
解决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 基础总结的主要内容,如果未能解决你的问题,请参考以下文章