Nginx基础+调优

Nginx学习笔记

Nginx 自建yum源安装
nginx.org 找到yum源
vim /etc/yum.repo/nginx.repo
yum install -y nginx

Nginx 源码编译安装

Wget http://nginx.org/download/nginx-1.10.1.tar.gz
Tar -zxvf /nginx-1.10.1.tar.gz
Make
Make install
./configer --prifx = /user/program 指定安装配置文件路径
/user/program/nginx/sbin/nginx -c /user/program/nginx/conf/nginx.conf 启动nginx

web service:Nginx
1主要用于服务于静态内容(static contents)的web服务器
2用于web的反向代理(web reverse proxy) 是一种很好的工作在应用层的负载均衡器
主要负载均衡2个方面,http mail方面的方向代理
3有很强的cahe缓存能力,通过第三方的模块引入 提供缓存管理功能
Varnish,squid 如果不构建cdn,一般用varnish做缓存工具
CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。
Haproxy:tcp reverse proxy和 http reverseproxy基于应用层和TCP层的反向代理。
Keepalived:HA
Ats:apache traffic server 反向代理和缓存。 (目前国内不流行,目前淘宝在转ats)
MogileFS,做图片存储的分布式文件系统

Nginx: engine X (2002年开发,2004年发行)
Apache:设计之初由于并发量不高,就是为稳定而设计的,一个请求就会占用一个进程,对系统资源消耗过大。
后来为了达到C10K(一万并发量), 开发了轻量级服务器lighttpd,nginx

http protocol: http协议

客户端发起请求 , 服务器端做出响应 request → respons
请求报文格式:
请求报文

响应报文

响应码:
1XX:状态信息码
2XX:成功响应吗 200 资源存在
3XX:重定向 301 302 304
4XX:客户端错误 404
5XX:服务器端错误 资源存在,服务器端无法正常响应

LAMP
当请求的时候,需要先DNS服务器做名称解析,当服务器响应后 本地用户浏览器会重新使用IP地址访问目标服务器,目标服务器在接受到用户请求后,分析用户请求的资源,如果有资源,需要到本地服务器存储设备上取得页面文件后构建响应报文,再给予响应。
如果请求的是动态内容,如PHP语言, APACHE 没有解码器,需要通过模块,CGI,FPM,或者fastcgi的方式解码。
Css:层叠样式表,用户实现丰富的页面元素展示。
动态太消耗资源 而且执行速度较慢,
Nginx服务器与PHP结合时,是没办法以模块方式结合的,nginx要想连接到PHP工作,php必须工作于FPM模式,就是fastcgi模式。

Stateless:http协议是一种无状态协议(Web page:web页面由许多web object(web对象)组成,每一个web对象都是单独获取的。

http: 80/tcp http被设计于通过80端口 tcp传输
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议
位码即tcp标志位,有6种标示:
SYN(synchronous建立联机) 表示同步序号,用来建立连接
ACK(acknowledgement 确认) 确认标志
PSH(push传送)
FIN(finish结束)
RST(reset重置)
URG(urgent紧急)

SYN-SEND -在发送连接请求后等待匹配的连接请求
SYN-RECEIVED - 在收到和发送一个连接请求后等待对连接请求的确认;
ESTABLISHED- 代表一个打开的连接,数据可以传送给用户;
第一次握手:建立连接时,客户端向服务器发送SYN包,并进入SYN-SEND状态,等待服务器确认
第二次握手:服务器收到客户端的SYN包后进行确认并回应SYNACK报文,进入SYN-RECVZ状态,等待对连接请求的确认
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据。

Keepalive:当一个资源传输结束后,tcp协议不断开。带来的好处是一个用户在获取多个连接资源的时候连接断开的消耗就节省下来,这样就达到了节省时间的目的。
缺点是在实现负载均衡时,由于保持了连接,所以来自同一个客户端的请求在请求超时之前将会始终被定向到一个web sever 中去。连接就会持续存在,负载均衡的效率就会降低。对于一个高并发的站点来说是一个缺陷,所以这样取决于网站的并发数量来决定是否开启。
从时间上做限定:timeout(ms毫秒 或 s秒 )
从数量上做限定:
一个用户访问过站点后,http协议是一种无状态协议,并不计入用户的任何信息,无法识别此前断开的连接跟下一次连接有什么联系)。
服务器给用户设置set-cookie , 记录用户的访问信息,基于cookie 来实现用户信息的追踪,进而让用户的访问状态能够被服务器追踪。

Web服务在面向大量IO用户请求的IO模型:http://www.cnblogs.com/renxs/p/3683189.html
1. 同步,就是我调用一个功能,该功能没有结束前,我死等结果。
2. 异步,就是我调用一个功能,不需要知道该功能结果,该功能有结果后通知我(回调通知)
3. 阻塞,就是调用我(函数),我(函数)没有接收完数据或者没有得到结果之前,我不会返回。
4. 非阻塞,就是调用我(函数),我(函数)立即返回,通过select通知调用者
同步IO和异步IO的区别就在于:数据拷贝的时候进程是否阻塞!
阻塞IO和非阻塞IO的区别就在于:应用程序的调用是否立即返回!
阻塞和非阻塞是指当进程访问的数据如果尚未就绪,进程是否需要等待,也就是未就绪时是直接返回还是等待就绪;而同步和异步是指访问数据的机制,同步一般指主动请求并等待I/O操作完毕的方式,当数据就绪后在读写的时候必须阻塞(区别就绪与读写二个阶段,同步的读写必须阻塞),异步则指主动请求数据后便可以继续处理其它任务,随后等待I/O,操作完毕的通知,这可以使进程在数据读写时也不阻塞。(等待"通知")

1. Linux下的五种I/O模型
1)阻塞I/O(blocking I/O) 进程会一直阻塞,直到数据拷贝完成
2)非阻塞I/O (nonblocking I/O) 非阻塞IO通过进程反复调用IO函数(多次系统调用,并马上返回);在数据拷贝的过程中,进程是阻塞的;
3) I/O复用(select 和poll) (I/O multiplexing)主要是select和epoll;对一个IO端口,两次调用,两次返回,比阻塞IO并没有什么优越性;关键是能实现同时对多个IO端口进行监听;
I/O复用模型会用到select、poll、epoll函数,这几个函数也会使进程阻塞,但是和阻塞I/O所不同的的,这两个函数可以同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。

4)信号驱动I/O (signal driven I/O (SIGIO))两次调用,两次返回;
首先我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。

5)异步I/O (asynchronous I/O (the POSIX aio_functions))数据拷贝的时候进程无需阻塞。
当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者的输入输出操作

Nginx特性:
基本功能:1静态资源的web服务器,能缓存打开的文件描述符
2 反向代理服务器,缓存、负载均衡
3 支持FastCGI协议,使PHP-FPM服务器结合起来提供LNMP
4 模块化机制(不像APACHE一样动态选择装载),非DSO机制Dynamic SharedObjects(动态共享目标),支持多种过滤器gzip等 ,SSI 和图像大小调整等等,支持SSL
扩展功能:1给予名称和IP做虚拟主机
2 支持keepalive
3 支持平缓配置更新或程序版本升级
4 定制访问日志,支持使用日志缓存以提高性能
5 支持url rewrite 地址重新
6 支持路径别名,支持基于IP及用户的认证,通过HTTPpassword来实现
7支持速率限制,并发限制等

Nginx的基本架构:
一个maste,生成一个或多个worker
支持事件驱动机制来工作:
支持事件驱动机制工作的方式有kqueue,epoll,/dev/poll
非事件驱动 select,poll,rt signals实时信号
支持sendfile,一个用户请求静态页面的过程是请求到内核,由内核交给用户中的服务进程,服务进程发现用户请求的页面文件,于是发起系统调用,由内核到磁盘上取数据,数据要从磁盘到内核,到内核再到进程,进程把它封装成响应报文,再从进程到内核。由内核直接向外响应,提高系统的响应方式。
支持文件的AIO机制(异步IO)
支持mmap

总结Nginx:非阻塞模型,事件驱动机制,一个master生成多个worker(逻辑CPU总数-1),一个worker响应多个用户请求。

事件驱动机制(比如说鼠标左击、双击都是具体事件,根据这些事件启用预先设置的相应动作就是事件驱动机制。)

Nginx的模块类别:
核心模块
标准http模块
邮件模块
第三方扩展模块

安装方法:编译安装 RPM包安装

Nginx的配置文件:
Main配置段 核心配置段
http{ 标准配置段 (默认编译安装如果不安装用without指令禁用)
}
可选模块 用with指令安装
配置参数需要以分号结尾,语法格式:
参数名 值

Nginx 基本核心配置类别:
用于调试、定位问题
正常运行的必备配置
优化性能的配置
事件类的配置

Master通常是root用户运行,worker进程应该以普通用户身份运行:nginx用户、nginx组:
Http的方法:GET , HEAD ,POST , PUT, DELETE,TRACE

Nginx的配置:
正常运行的必备配置:
1 user username {groupname};
指定运行worker进程的用户和组
2 pid /path/to/pidfile_name;
指定nginx的pid文件
3 worker_rlimit_nofile #;
指定一个worker进程所能打开的最大文件句柄数
4 worker_rlimit_sigpending #;
设定每个用户能够发往worker进程的信号数量

优化性能相关的配置:

1 worker_processes #;
Worker进程的个数,通常起数值应该为CPU的物理核心数减1;
2 worker_cpu_affinity cpumask ...;
0000
0010
0100
1000
worker_processes 6
Worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000;
3 ssl_engine device;
在存在ssl硬件加速器的服务器上,指定所使用的ssl硬件加速设备;
4 timer_resolution t;
每次内涵时间调用返回时,都会使用gettimeofday()来更新nginx缓存时钟;timer_resolution用户定义每隔多久才会由gettimeofday()更新一次缓存时钟;X86-64系统上,gettimefday()代价已经很小了,可以忽略此配置;
5 worker_priority number;
-20,19之间的值;

事件相关的配置
1、accept_mutex {on|off};
是否打开nginx的负载均衡锁;此锁能够让多个worker进程轮流的、序列化的与新客户端建立连接;而通常当一个worker进程的负载达到其上线的7/8,master就尽可能不再请求调度此worker;

2、lock_file /path/to/lock_file;
Lock锁文件

3、accept_mutex_delay number; (一般为ms 默认是500ms)
使用accept锁模式中。一个worker进程为取得accept锁的等待时长;如果某worker进程在某次试图取得锁匙失败了,至少要等待这么长时间才能再次请求锁。

4、multi_accept on|off; (默认为off)
是否允许一次性的响应多个用户请求;

5、use {epoll|rtsig|select|poll};
定义使用的时间模型,建议让nginx自动选择,一般选择epoll
epoll能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。

6、worker_connections #;
每个worker能都并发响应的最大请求数;

用户调试、定位问题:只调试nginx时使用
1、Daemon {on|off};
是否让nginx运行于后台;默认为on 调试时应该设置为off,使所有信息直接输出控制台

2、master_process on|off;
是否以master/worker模式运行nginx,默认为on,调试时可以设置为off以方便追踪;

3、error_log /path/to/error_log level;
错误日志文件及其级别;调试时可以使用debug级别,默认为error级别,但要求在编译时必须使用--with-debug启用debug功能;
Nginx的http功能:

必须使用虚拟机来配置站点:每个虚拟机使用一个server{}段配置;
Server{
}
非虚拟主机的配置或公共配置,需要定义在server之外
http{
Directive value;
...
Server{
}
Server{
}
虚拟主机的相关配置:

1、server{}
定义一个虚拟主机;nginx支持使用基于主机名或IP的虚拟主机;
2、Listen
Listen address{:port};
Listen port
Default_server:定义此server为http中默认的server,如果所有的server中没有任何一个listen使用此参数,那么第一个server即为默认server。
rcvbuf=SIZE:接受缓冲大小;
Sendbuf=SIZE:发送缓冲大小;
SSL:https server;
3、server_name{...}
Server_name 可以跟多个主机名;名称中可以使用通配符和正则表达式;当nginx收到一个用户请求时,会去除其首部的server的值,而后跟众server_name进行比较; 比较方式:
(1)先做精确匹配; www.sohu.com
(2)左侧通配符匹配; *.souhu.com
(3)右侧通配符匹配; www.*
(4)正则表达式匹配; ~开头

4、server_name_hash_bucket_size 32|64|128;
为了实现快速主机查找,nginx使用hash表来保存主机名; 此项作为了解

5、location [ = | ~ | ~* | ^~ ]uri {...}
Location @name {...} 2种方式(可以定在server或者location段中,server段中可以有多个location)
功能:允许根据用户请求的URI来匹配指定的各location以进行访问配置;匹配到时,将被location块中的配置所处理;比如:http://www.llq.fun/images/logo.gif
=:精确匹配;
~:正则表达式模式匹配,匹配时区分字符大小写
~*:正则表达式模式匹配,匹配时忽略字符大小写
^~:URI前半部分匹配,不检查正则表达式

匹配优先级;
字符字面量、正则表达式检索(由第一个匹配到所处理)、按字符字面量
1、root path
设置web资源路径;用于指定请求的根文档目录;示例 http://www.llq.fun/images/b.html
Location / {
root /www/htdocs;
}
Location ^~/images/ {
root /web;
}
2、alias path

3、index file ...;
定义默认页面
4、error_page cade ... [={response}] uri;
当对某个请求返回错误时,如果匹配上了error_page指令中设定的code,则重定向到新的URI中;错误页面重定向;
5、try_files path [path2 ...] uri;
自左至右尝试读取由path所指定路径,在第一次找到即停止并返回,如果所有path均不存在,则返回最后一个uri;

网络连接相关的配置:
1、keppalive_timeout time;
保持连接的超时时长, 默认75s
2、keepalive_requests n;
在一次长连接上允许承载的最大请求数;
3、keppalive_disable [msie6 | safari | none]
对指定的浏览器禁止使用长连接;
4、tcp_nodelay on | off;
对keppalive连接是否使用tcp_nodelay选项 确认延迟,默认为ON,了解。
5、client_header_timeout time;
读取http请求首部的超时时长;
6、client_hbody_timeout time;
读取http请求包体的超时时长;
7、send ——timeout time;
发送响应的超时时长;

对客户端请求的限制;
1、limit_except method ... 【...】
指定对范围之外的其他方法的访问控制;

2 、client_max_body+size SIZE;
http请求包体的最大值;常用于限定客户所能够请求的最大包体;
根据请求首部中的content-length来检测,以避免无用的传输;
3、limit_rate speed; 比如40K
限制客户端每秒钟传输的字节数;默认为0,表示没有限制;
4、limit_rate_after time;
Nginx服务器端向客户端发送响应报文时。如果时长超出了此处指定的时长,则后续的发送过程开始限速

文件操作的优化:
1、sendfile on|off;
是否启用sendfile功能,
linux的sendfile()系统调用,服务器响应一个http请求的步骤如下:
1 把磁盘文件读入内核缓冲区
2 从内核缓冲区读到内存
3 处理(静态资源不需处理)
4 发送到网卡的内核缓冲区(发送缓存)
5 网卡发送数据
数据从第一步中的内核缓冲区到第四步的内核缓冲区白白绕了一个圈,没有任何变化浪费了时间,而sendfile系统调用就是来解决这个问题的。sendfile省略了上面的 2、3步,磁盘文件被直接发送到了网卡的内存缓冲区,减少了数据复制和内核态切换的开销 。

2、aio on | off;
是否启用aio功能;
3、open_file_cache max=N [inactive=time]|off;
是否打开文件缓存功能;
Max:缓存条目的最大值,当满了以后将根据LRU算法进行置换;
Inactive:某缓存条目在指定时长内没有被访问过时,将自动被删除;默认为60s;
缓存的信息包括:
文件句柄,文件大小和上次修改时间;
已经打开的目录结构;
没有找到或没有访问权限的信息;
4、open_file_cache_error on|off;
是否缓存文件找不到或没有权限访问等相关信息;
5、open_file_cache_valid time;
多长时间检查一次缓存中的条目是否超出非活动时长;
6、open_file_cache_min_use #;
在inactive指定的时长内被访问次数超出指定的次数,才不会被删除。

对客户端请求的特殊处理:
1、ignore_invalid headers on|off;
是否忽略不合法的http首部;默认为on,off意味着请求首部中出现不合规的首部时将拒绝响应。
2、log_not_found on|off;
是否将文件找不到的相关信息也记录进错误日志中;
3、resolver address;
指定nginx使用的dns服务器地址;
4、resover_timeout time;
指定DNS解析超时时长,默认为30s;
5、server_tokens on|off;
是否在错误页面中显示nginx的版本号;为了安全起见 一般不显示。

HTTP核心模块的内置变量:
$uri :当前请求的uri,不带参数;
$request_uri: 请求的uri,带完整参数;
$host:http请求报文host首部;如果请求中没有host首部,则以处理次请求的虚拟主机的主机名代替;
$hostname:nginx服务运行主机的主机名;
$remote_addr:客户端IP
$remote_port:客户端port (端口)
$remote_user:使用用户认证时客户端用户输入的用户名;
$request_filename:用户请求中的uri经过本地root或alias转换后的映射的本地的文件路径;
$request_method:请求方法
$server_addr:服务器地址
$server_name:服务器名称
$server_port:服务器端口
$server_protocol:服务器向客户端发送响应时的协议,如http/101, http/1.0
$scheme:在请求中使用scheme,如https:www.llq.fun/中的https;
$http_HEADER:匹配请求报文中指定的HEADER,$http_host匹配请求报文中的host首部
$sent_http_HEADER:匹配响应报文中指定的header,例如$http_content_type匹配响应报文中的content_type首部;
$document_root:当前请求映射到的root配置;

配置使用nginx
1、Server{
Listen
Server_name
Root
}
2、访问控制access模块
Allow
Deny
3、用户认证示例
location /admin/ {
root /www/a.com;
auth_basic "admin area";
auth_basic_user_file /etc/httpd/.htpasswd;
}
4、建立下载站点autoindex模块
location /download/ {
root /www/a.com;
autoindex on;
}
5、防盗链
(1)定义合规的引用
Valid_referer
(2)拒绝不合规的引用
If ($invalid_referer) {
Rewrite
}
6、地址重写模块 URL rewrtie
Rewrite regex replacement [flag];

您先最多循环10次,超出置换会返回500错误。
注意:一般将rewrite卸载location中时都使用break标志,或者将rewrite写在if上下文中
Rewrite_log on|off ;
是否把重写过程揭露在错误日志中,默认为notice级别;默认是off
Return code;
用于结束rewrite规则,并且为客户返回状态码,可以使用的状态码有204,400,402-406,500-504等

Nginx+php
/etc/nginx/conf.d/default.conf
在Linux环境下下配置好nginx后
cd /etc/nginx/conf.d
#进入nginx配置
cat default.conf
#查看默认配置
server {
listen 80; #侦听80端口
server_name localhost; #定义使用www.xx.com访问

#charset koi8-r; #字符编码
#access_log /var/log/nginx/log/host.access.log main; #设定本虚拟主机的访问日志

location / { #默认请求
root /usr/share/nginx/html; #定义服务器的默认网站根目录位置
index index.html index.htm; #定义首页索引文件的名称
}

#error_page 404 /404.html; #定义错误提示页面

# redirect server error pages to the static page /50x.html #重定向服务器错误页面
#
error_page 500 502 503 504 /50x.html; #定义错误提示页面
location = /50x.html {
root /usr/share/nginx/html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80 #代理服务器的PHP脚本到Apache侦听127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 #通过PHP脚本到127.0.0.1:9000的FastCGI服务器监听
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}

您还未添加分享代码,请到主题选项中,添加百度分享代码!

您可以选择一种方式赞助本站

支付宝转账赞助

支付宝扫一扫赞助

微信钱包扫描赞助

DevOps

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

图片 表情