nginx笔记
1、Nginx状态码
1.301:永久移动。被请求的资源已被永久移动位置。
2.302:请求的资源现在临时从不同的URI响应请求。
3.305:使用代理。被请求的资源必须通过指定的代理才能访问;
4.307:临时跳转。被请求的资源在临时从不同的url响应请求
5.400:错误请求
6.402:需要付款。为了将来可能需要的需求而预留的,用于一些数字货币或者微支付
7.403:禁止访问。服务器已经理解请求,但是拒绝执行
8.404:找不到对象。请求失败,资源不存在
9.406:不可接受的。请求的资源内容特性无法满足请求头中的文件,无法产生响应实体。
10.408:请求超时
11.409:冲突。由于和被请求的资源的当前状态之间存在冲突,请求无法完成
12.410:遗失的。被请求的资源在服务器上已经不可再用,而且没有任何已知的转发地址
13.413:响应实体太大。服务器拒绝处理当前请求,请求超过服务器能处理和允许的最大值
14.417:期望失败。在请求except中指定的预期内容无法被服务器满足
15.418:我是一个茶壶。超文本咖啡罐控制协议。但是并没有被实际的http服务器实现
16.420:方法失效
17.422:不可处理实体。请求格式正确,但由于含有语义错误,无法响应
18.500:服务器内部错误。服务器遇到了一个未曾预料的状况,导致他无法完成对请求的处理
19.502:请求后端失败
20.504:请求成功,但是请求超时
2、Nginx配置文件:/etc/nginx/nginx.conf,是一个纯文本类型文件,以区域形式组织。以一对大括号表示开始和结尾。
1.Main位于nginx.conf配置文件的最高层
2.Main层下可以有Event,http层
3.http层下下面允许有多个Server层,用于对不同网站做不同的配置
4.Server层也允许有多个Location,用于对不同的路径进行不同模块的配置
5.Nginx默认配置语法:
worker_processes 1;//工作进程,和CPU个数保持一致
error_log /var/log/nginx/error.log warn; //错误日志后接路径
pid /var/run/nginx.pid;//nginx服务启动进程id
events{ //事件模块
worker_connections 10000; //每个worker进程支持的最大连接数
use select or poll or epoll //内核模型
}
http{}//非虚拟主机的配置或公共配置定义在http段
server{
listen 80;#监听端口,默认80
server_name localhost;#提供服务的域名
location / { #控制网站访问路径
root /usr/share/nginx/html; //存放网站
index index.html index.htm; #默认首页
}
}
#错误页面,统一定义错误页面
#定义请求错误,指定错误代码
error_page 500 502 503 504 /50x.html;
location = /50x.html{ #错误代码重新定义到新的location
root /usr/share/nginx/html;
}
3、Nginx状态监控
1.server标签下
location /mystatus{
stub_status on;
}
//Nginx_status概述
Active connections:2 //Nginx当前活跃连接数
server accepts handled requests
16 16 19
server表示Nginx启动到现在共处理了16个连接。
accept表示Nginx启动到现在成功创建了16次握手
handled requests,表示共处理了19次请求
请求丢失数= 握手次数-连接数
Reading :Nginx读取客户端的header信息数
Writing : Nginx返回给客户端的header信息数
waiting :Nginx开启keep-alive长连接下既没有读也没有写信息数
4、Nginx下载站点:默认不允许列出整个目录浏览下载
1.server标签下
location /down{
//仅开启二级目录浏览
alias /share/tmp/; #别名
root /soft/package/src;
autoindex on;
autoindex_localtime on;
autoindex_exact_size off;
}
5、什么是nginx?
1.高性能的http和反向代理web服务器。
2.特点是占用内存小,并发能力强。
3.nginx专为性能优化而开发,性能是最重要的考量,实现上非常注重效率,能经受住高负载的考考验,报告表明最高支持50000个并发连接数
6、正向代理
如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet则需要通过代理服务器访问,这种代理就称为正向代理。在客户端配置代理服务器,通过代理服务器进行互联网的访问
7、反向代理
1.客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要把请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的代理服务器的地址而隐藏了真实服务器的IP
8、负载均衡
1.单个服务器无法解决并发访问高的问题,我们增加服务器的数量,然后将请求分发到各个服务器上,将原来请求集中到单个服务器上的情况转化到请求分发到多个服务器上,将负载分发到不同的服务器,即实现负载均衡
9、动静分离
1.为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器解析,加快解析速度,降低原来的单个服务器的压力。
10、nginx常用命令(进入nginx目录sbin)
1.查看nginx版本号 ./nginx -v
2.启动nginx ./nginx
3.关闭nginx ./nginx -s stop
4.重新加载nginx ./nginx -s reload
11、nginx配置文件(nginx/conf/nginx/conf/nginx.conf)由三部分组成
1.全局块:从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置命令,包括运行nginx服务器的用户(组),允许生成的worker process数,进程PID存放路径,日志存放路径和类型以及配置文件的引入。
1.worker_proessses 1;
这是nginx服务器并发处理服务的关键配置,worker_processes值越大,可以支持的并发处理量也越多,但是会受到硬件,软件的制约
2.events块:比如events{
worker_connections 1024;
}
events块涉及的指令主要影响nginx服务器与用户的网络连接,常用的设置包括是否开启对多work process下的网络进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动来处理连接请求,每个work process 可以同时支持的最大连接数
3.http块:包括http全局块,server块,算是nginx服务器配置最频繁的部分。
1.http全局块:包括文件引入,MIME-TYPE定义,日止自定义,连接超时时间,单链接请求数上限等。
2.server块:和虚拟主机密切相关,虚拟主机从用户的角度和独立的硬件完全相同。每个http块可以包括多个server块,而每个server块相当于一个虚拟主机,每个server块也分为全局server块,以及可以同时包含多个location块。
1.全局server块:最常见的是配置本虚拟机的监听配置和本虚拟机的主机名称或IP配置
2.location块:一个server块可以配置多location。这块主要基于nginx服务器接收到的请求字符串,对虚拟机名称之外的字符串进行匹配,对特定的请求进行处理。地址定向,数缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行
12、nginx配置实例-反向代理1
1.打开浏览器,在浏览器中栏输入www.123.com,跳转到linux系统Tomcat主页面
2.准备工作:
1.在linux系统安装Tomcat,使用默认8080 端口,进入Tomcat的bin目录中,./startup启动Tomcat服务器
2.对外开放访问端口:firewall-cmd -add-port=8080/tcp --permanent
firewall-cmd-reload
3.查看已经开放的端口:Firewall-cmd --list-all
4.在window系统通过浏览器访问网页:192.168.33.02:80
3.具体配置:
1.配置域名映射:windows系统的host文件中:192.168.17.129 www.123.com
2.在nginx进行请求转发:vi nginx.conf
server{
listen 80;
server_name 192.168.17.129;
location /{
root html;
proxy_pass http:127.0.0.1:8080;#要转发的地址
index index.html index.htm;
}
}
13、nginx反向代理实例2
1.实现效果:使用nginx反向代理,根据访问的路径跳转到不同的端口的服务中,nginx监听端口为9001
访问http://127.0.0.1:9001/edu/ 跳转到 127.0.0.1:8080
访问http://127.0.0.1:9001/vod/ 跳转到 127.0.0.1:8081
2.准备工作:
1.准备两个Tomcat服务器,一个Tomcat端口8080,一个8081
2.修改其中一个Tomcat端口号为8081,进入conf目录,修改server.xml
<server port ="8015" shutdown="SHUTDOWN">
<server port ="8081" >
<connector port ="8019" />
3.创建文件夹和测试页面
3.具体配置:
1.配置一个新的server
server{
listen 9001;
server_name 192.168.17.129;
location ~ /edu/{
proxy_pass http://127.0.0.1:8080;
}
location ~ /vod/{
proxy_pass http://127.0.0.1:8081;
}
}
2.开放端口号,关闭防火墙
4.location说明:
1.该指令用于匹配URL。
location 【= 或 ~或~*或^~】uri {}
1.=:用于不含正则表达式前的uri前,请求字符串与uri严格匹配,匹配成功就继续向下搜索并处理
2.~:用于表示URI包含正则,并且区分大小写
3.~*:用于表示URI包含正则,不区分大小写
4.^~:不含正则的URI,要求nginx找到标识的URI和请求字符串匹配度最高的location后,立即使用location处理。
14、nginx配置负载均衡
1.实现效果:浏览器地址输入地址http://192.168.17.129/edu/a.html.负载均衡效果,平均分担到8080和8081端口中。
2.准备工作:两台不同端口的Tomcat服务器8080,8081
3.在nginx中进行负载均衡配置:nginx.conf
http{
upstream myserver{
#负载均衡服务列表
server 192.168.17.129:8080;
server 192.168.17.129:8081;
}
server {
listen 80;
server_name 192.168.17.129;
location / {
proxy_path http://myserver;
root html;
index index.html index.htm;
}
}
}
3.nginx分配策略:
1.轮询(默认):每个请求按时顺序逐一分配到不同的服务器后端,如果服务器宕掉,能自动剔除。
2.weight:weight代表权重,默认为1,权重越高分配的客户端越多
upstream server_pool
server 192.168.5.21:80 weight=1
server 192.168.5.22:80 weight=10
3.ip-hash:请求根据访问ip的hash结果分配,这样每个访客访问固定的一个后端服务器,可以解决session的问题,例如:
upstream server_pool
ip_hash
server 192.168.5.21:80
server 192.168.5.22:80
4.fair方式:按照后端响应时间:按照后端服务器的响应时间来分配请求,响应时间短的优先分配
upstream server_pool
fair
server 192.168.5.21:80
server 192.168.5.22:80
15、nginx配置动静分离:动态请求和静态请求分开
1.通过location指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使通过浏览器缓存过期时间,减少与服务器之前的请求和流量,具体expires定义:给一个资源设定过期时间,即无需服务器验证,直接通过浏览器自身确定是否过期即可, 所以不会产生额外的流量,此种方法非常适合不经常变更的资源。比如设置3d,表示3天内访问这个url,发送一个请求,对比这个服务器最后更新时间没有变化,则不会从服务器抓取,返回304,如果有修改则重新从服务器下载,返回200
2.准备工作:准备一些静态资源
3.具体配置:在nginx.conf里修改
server{
listen 80;
server_name 192.168.17.129;
location /www/{
root /data/;
index index.html index.htm;
}
location /image/{
root /data/;
autoindex on;
}
}
4.最终效果:浏览器中输入地址:http://192.168.17.129/01.jpg
浏览器中输入地址:http://192.168.17.129/www/a.html
16、高可用的nginx
1.准备工作:
1.需要两台nginx服务器
2.需要keepalived
3.需要虚拟IP
4.配置两台服务器 192.168.17.129 和192.168.17.131
5.在两台服务器上安装nginx
6.在两台服务器上安装keepalived
1.使用yum命令安装 yum install keepalived -y
2.安装完成后,在etc下面生成keepalived目录,修改keepalived.conf
7.完成主从配置的高可用集群配置
17、nginx工作机制
Nginx分为单工作进程和多工作进程两种模式。
通常采用1个master+多个worker进程配合异步非阻塞的工作机制。
master进程主要负责管理自身和下属的worker进程,worker负责处理请求。
master(master进程会先建立好需要listen的socket)---fork生成子进程,继承socket(每个进程监控同一ip和端口)---当一个连接进入,产生惊群现象,所有进程都会收到通知,但只有一个进程能够抢到互斥锁,accept这个连接,其他进程则失败。
惊群现象:指一个fd事件被触发后,等候这个fd的所有进程、线程都被唤醒,但是只有一个会去响应。
worker进程工作:
当一个worker在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,一个完整的请求。一个请求,完全由worker进程来处理,而且只在一个worker中处理。
为什么Nginx支持高并发?
1个worker进程只有一个主线程,采用异步非阻塞的工作方式实现高并发。即每进来一个请求,会有一个worker去处理,但不是全程处理,处理到可能发生阻塞的地方(比如向后端FPM转发请求,并等待请求返回),这个worker不会这个傻等,它会在发送请求后,注册一个事件:如果有返回了,通知我。于是worker就去休息(继续监听连接),再有请求进来同样处理。一旦FPM返回了,就会触发事件,worker接手,请求才会往下走。
Apache的模式呢
对于Apache,每个请求都会独占一个工作线程,当并发数到达几千时,就同时有几千的线程在处理请求,对操作系统来说,占用内存非常大,线程的上下文切换带来的CPU开销也很大,性能就很难上去。