您现在的位置是:首页 >技术教程 >nginx 服务器总结网站首页技术教程
nginx 服务器总结
一. 负载均衡的作用有哪些?
1、转发功能
按照一定的算法【权重、轮询】,将客户端请求转发到不同应用服务器上,减轻单个服务器压力,提高
系统并发量。
2、故障移除
通过心跳检测的方式,判断应用服务器当前是否可以正常工作,如果服务器期宕掉,自动将请求发送到
其他应用服务器。
3、恢复添加
如检测到发生故障的应用服务器恢复工作,自动将其添加到处理用户请求队伍中。
二. nginx实现负载均衡的分发策略
Nginx 的 upstream目前支持的分配算法:
1)、轮询 ——1:1 轮流处理请求(默认)
每个请求按时间顺序逐一分配到不同的应用服务器,如果应用服务器down掉,自动剔除,剩下的继续轮询。
2)、权重 ——you can you up
通过配置权重,指定轮询几率,权重和访问比率成正比,用于应用服务器性能不均的情况。
3)、ip_哈希算法
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个应用服务器,可以解决session共享
的问题
nginx做负载均衡实现的策略有哪些
轮询(默认)
权重
ip_hash
fair(第三方插件)
url_hash(第三方插件)
nginx做负载均衡用到哪些模块
- upstream 定义负载节点池。
- location 模块 进行URL匹配。
- proxy模块 发送请求给upstream定义的节点池。
负载均衡有那些实现方式
- 硬件负载
- HTTP重定向负载均衡
- DNS负载均衡
- 反向代理负载均衡
- IP层负载均衡
- 数据链路层负载均衡
nginx如何实现四层负载?
四层负载分为动态和静态负载
Nginx的四层静态负载均衡需要启用ngx_stream_core_module模块
默认情况下,ngx_stream_core_module是没有启用的,需要在安装Nginx时,添加–with-stream配置
- 参数启用
配置HTTP负载均衡时,都是配置在http指令下,配置四层负载均衡,则是在stream指令下,结构如下所示
stream {
upstream mysql_backend {
server 192.168.175.100:3306 max_fails=2 fail_timeout=10s weight=1;
least_conn;
}
server { #监听端口,默认使用的是tcp协议,如果需要UDP协议,则配置成listen 3307 udp;
listen 3307; #失败重试 proxy_next_upstream on;
proxy_next_upstream_timeout 0;
proxy_next_upstream_tries 0; #超时配置 #配置与上游服务器连接超时时间,默认60s
proxy_connect_timeout 1s; #配置与客户端上游服务器连接的两次成功读/写操作的超时时间,如果超
时,将自动断开连接 #即连接存活时间,通过它可以释放不活跃的连接,默认10分钟 proxy_timeout 1m;
#限速配置 #从客户端读数据的速率,单位为每秒字节数,默认为0,不限速 proxy_upload_rate 0; #从
上游服务器读数据的速率,单位为每秒字节数,默认为0,不限速 proxy_download_rate 0; #上游服务器
proxy_pass mysql_backend;
}
}
使用Nginx的四层动态负载均衡有两种方案:使用商业版的Nginx和使用开源的nginx-stream-upsyncmodule模块。注意:四层动态负载均衡可以使用nginx-stream-upsync-module模块,七层动态负载均
衡可以使用nginx-upsync-module模块。
你知道的web服务有哪些?
- apache
- nginx
- IIS
- tomcat
- lighttpd
- weblogic
为什么要用nginx
- 跨平台、配置简单,非阻塞、高并发连接:处理2-3万并发连接数,官方监测能支持5万并发,
- 内存消耗小:开启10个nginx才占150M内存 ,nginx处理静态文件好,耗费内存少,
- 内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务器了。重新将请求提交到其他的节点上。
- 节省宽带:支持GZIP压缩,可以添加浏览器本地缓存
- 稳定性高:宕机的概率非常小
- 接收用户请求是异步的
nginx的性能为什么比apache高?
nginx采用的是epoll模型和kqueue网络模型,而apache采用的是select模型
举一个例子来解释两种模型的区别:
菜鸟驿站放着很多快件,以前去拿快件都是短信通知你有快件,然后你去了之后,负责菜鸟驿站的人在
一堆快递里帮你找,直到找到为止。
但现在菜鸟驿站的方式变了,他会发你一个地址,比如 3-3-5009. 这个就是第三个货架的第三排,从做
往右第九个。
如果有几百个人同时去找快递,这两种方式哪个更有效率,不言而喻。
之前还看到这个例子也比较形象:
假设你在大学读书,住的宿舍楼有很多间房间,你的朋友要来找你。
select版宿管大妈就会带着你的朋友挨个房间去找,直到找到你为止。
而epoll版宿管大妈会先记下每位同学的房间号,
你的朋友来时,只需告诉你的朋友你住在哪个房间即可,不用亲自带着你的朋友满大楼找人。
如果来了10000个人,都要找自己住这栋楼的同学时,select版和epoll版宿管大妈,谁的效率更高,不言自
明。
同理,在高并发服务器中,轮询I/O是最耗时间的操作之一,select和epoll的性能谁的性能更高,同样十分
明了
select 采用的是轮询的方式来处理请求,轮询的次数越多,耗时也就越多
epoll的组成
epoll的接口非常简单,一共就三个函数:
1. int epoll_create(int size);
创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大。
这个参数不同于select()中的第一个参数,给出最大监听的fd+1的值。
需要注意的是,当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,
是能够看到这个fd的,所以在使用完epoll后,必须调用close()关闭,否则可能导致fd被耗尽。
2. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
epoll的事件注册函数,它不同与select()是在监听事件时告诉内核要监听什么类型的事件,
而是在这里先注册要监听的事件类型。第一个参数是epoll_create()的返回值,
第二个参数表示动作,用三个宏来表示:
EPOLL_CTL_ADD:注册新的fd到epfd中;
EPOLL_CTL_MOD:修改已经注册的fd的监听事件;
EPOLL_CTL_DEL:从epfd中删除一个fd;
第三个参数是需要监听的fd,第四个参数是告诉内核需要监听什么事
3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int
timeout);
等待事件的产生,类似于select()调用。
参数events用来从内核得到事件的集合,maxevents告之内核这个events有多大,这个 maxevents的值不
能大于创建epoll_create()时的size,参数timeout是超时时间(毫秒,0会立即返回,-1将不确定,也
有说法说是永久阻塞)。
该函数返回需要处理的事件数目,如返回0表示已超时
nginx和apache的区别
Nginx
轻量级,采用 C 进行编写,同样的 web 服务,会占用更少的内存及资源
抗并发,nginx 以 epoll and kqueue 作为开发模型,处理请求是异步非阻塞的,负载能力比
apache 高很多,而 apache 则是阻塞型的。在高并发下 nginx 能保持低资源低消耗高性能 ,而
apache 在 PHP 处理慢或者前端压力很大的情况下,很容易出现进程数飙升,从而拒绝服务的现
象。
nginx 处理静态文件好,静态处理性能比 apache 高三倍以上
nginx 的设计高度模块化,编写模块相对简单
nginx 配置简洁,正则配置让很多事情变得简单,而且改完配置能使用 -t 测试配置有没有问题,
apache 配置复杂 ,重启的时候发现配置出错了,会很崩溃
nginx 作为负载均衡服务器,支持 7 层负载均衡
七层负载可以有效的防止ddos攻击
nginx本身就是一个反向代理服务器,也可以左右邮件代理服务器来使用
Apache
apache 的 rewrite 比 nginx 强大,在 rewrite 频繁的情况下,用 apache
apache 发展到现在,模块超多,基本想到的都可以找到
apache 更为成熟,少 bug ,nginx 的 bug 相对较多
apache 对 PHP 支持比较简单,nginx 需要配合其他后端用
apache 在处理动态请求有优势,nginx 在这方面是鸡肋,一般动态请求要 apache 去做,nginx 适
合静态和反向。
apache 仍然是目前的主流,拥有丰富的特性,成熟的技术和开发社区
两者最核心的区别在于 apache 是同步多进程模型,一个连接对应一个进程,而 nginx 是异步的,多个
连接(万级别)可以对应一个进程。
需要稳定用apache,需要高性能用nginx
nginx常用的命令
启动 nginx 。
停止 nginx -s stop 或 nginx -s quit 。
重载配置 ./sbin/nginx -s reload(平滑重启) 或 service nginx reload 。
重载指定配置文件 .nginx -c /usr/local/nginx/conf/nginx.conf 。
查看 nginx 版本 nginx -v 。
检查配置文件是否正确 nginx -t 。
显示帮助信息 nginx -h 。
什么是反向代理,什么是正向代理,以及区别?
正向代理:
所谓的正向代理就是: 需要在用户端去配置的。配置完再去访问具体的服务,这叫正向代理
正向代理,其实是"代理服务器"代理了"客户端",去和"目标服务器"进行交互。
正向代理的用途:
- 提高访问速度
- 隐藏客户真实IP
反向代理:
反向代理是 在服务端的,不需要访问用户关心。用户访问服务器A, A服务器是代理服务器,将用户服务再转发到服务器B.这就是反向代理
反向代理的作用:
1.缓存,将服务器的响应缓存在自己的内存中,减少服务器的压力。
2.负载均衡,将用户请求分配给多个服务器。
3.访问控制
Squid、Varinsh、Nginx 有什么区别?
三者都实现缓存服务器的作用
Nginx本来是反向代理/web服务器,用了插件可以做做这个副业(缓存服务器)。但本身支持的特性
不是很多,只能缓存静态文件
varinsh 和squid是专业的cache服务,而nginx这些需要使用第三方模块
varnish本身在技术上的优势要高于squid,它采用了可视化页面缓存技术。
在内存的利用上,Varnis h比 Squid 具有优势,性能要比 Squid 高。
还有强大的通过 Varnish 管理端口,可以使用正则表达式快速、批量地清除部分缓存
Varnish 是内存缓存,速度一流,但是内存缓存也限制了其容量,缓存页面和图片一般是挺好的。
要做 cache 服务的话,我们肯定是要选择专业的 cache 服务,优先选择Squid 或者 Varnish
nginx是如何处理http请求的
四个步骤:
读取解析请求行;
读取解析请求头;
开始最重要的部分,即多阶段处理
nginx把请求处理划分成了11个阶段,也就是说当nginx读取了请求行和请求头之后,将请求封装了结构体ngx_http_request_t,然后每个阶段的handler都会根据这个ngx_http_request_t,对请求进行处理,例如重写uri,权限控制,路径查找,生成内容以及记录日志等等;
最后将结果放回给客户单。
也可以这么回答:
- 首先,Nginx 在启动时,会解析配置文件,得到需要监听的端口与 IP 地址,然后在 Nginx 的Master 进程里面先初始化好这个监控的Socket(创建 S ocket,设置 addr、reuse 等选项,绑定到
指定的 ip 地址端口,再 listen 监听)。 - 然后,再 fork(一个现有进程可以调用 fork 函数创建一个新进程。由 fork 创建的新进程被称为子进
程 )出多个子进程出来。 - 之后,子进程会竞争 accept 新的连接。此时,客户端就可以向 nginx 发起连接了。当客户端与
nginx进行三次握手,与 nginx 建立好一个连接后。此时,某一个子进程会 accept 成功,得到这个
建立好的连接的 Socket ,然后创建 nginx 对连接的封装,即 ngx_connection_t 结构体。 - 接着,设置读写事件处理函数,并添加读写事件来与客户端进行数据的交换。
最后,Nginx 或客户端来主动关掉连接,到此,一个连接就寿终正寝了。
nginx虚拟主机有哪些?
基于域名的虚拟主机
基于端口的虚拟主机
基于IP的虚拟主机
Nginx 怎么实现后端服务的健康检查
- 利用 nginx 自带模块 ngx_http_proxy_module 和 ngx_http_upstream_module 对后端节点做健康检查
- 利用 nginx_upstream_check_module 模块对后端节点做健康检查。(推荐此方法)
nginx的优化你都做过哪些?
. gzip压缩优化
. expires缓存有还
. 网络IO事件模型优化
. 隐藏软件名称和版本号
. 防盗链优化
. 禁止恶意域名解析
. 禁止通过IP地址访问网站
. HTTP请求方法优化
. 防DOS攻击单IP并发连接的控制,与连接速率控制
. 严格设置web站点目录的权限
. 将nginx进程以及站点运行于监牢模式
. 通过robot协议以及HTTP_USER_AGENT防爬虫优化
. 配置错误页面根据错误码指定网页反馈给用户
. nginx日志相关优化访问日志切割轮询,不记录指定元素日志、最小化日志目录权限
. 限制上传到资源目录的程序被访问,防止木马入侵系统破坏文件
. FastCGI参数buffer和cache配置文件的优化
. php.ini和php-fpm.conf配置文件的优化
. 有关web服务的Linux内核方面深度优化(网络连接、IO、内存等)
. nginx加密传输优化(SSL)
. web服务器磁盘挂载及网络文件系统的优化
. 使用nginx cache
一: 配置文件中对优化有明显效果的:
1. worker_processes 8;
nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu计为8)。
2. worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000
01000000 10000000;
为每个进程分配cpu,上例中将8 个进程分配到8 个cpu,当然可以写多个,或者将一个进程分配到多
个cpu。
3. worker_rlimit_nofile 65535;
这个指令是指当一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit
-n)与nginx 进程数相除,但是nginx 分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。
现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写
65535。
这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万
时就有进程可能超过10240了,这时会返回502错误。
4. use epoll
5. worker_connections 65535
每个进程允许的最多连接数, 理论上每台nginx 服务器的最大连接数为
worker_processes*worker_connections。
6. keepalive_timeout 60;
7. client_header_buffer_size 4k;
客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k
8. open_file_cache max=65535 inactive=60s;
这个将为打开文件指定缓存,默认是没有启用的,max 指定缓存数量,建议和打开文件数一致,
inactive 是指经过多长时间文件没被请求后删除缓存。
9. open_file_cache_valid 80s;
这个是指多长时间检查一次缓存的有效信息。
10. open_file_cache_min_uses 1;
open_file_cache 指令中的inactive 参数时间内文件的最少使用次数,如果超过这个数字,文件
描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive 时间内一次没被使用,它将被移除。
nginx的session不同步怎么办
我们可以采用ip_hash指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该
请求通过哈希算法,自动定位到该服务器。即每个访客固定访问一个后端服务器,可以解决session的问
题。
其他办法:那就是用spring_session+redis,把session放到缓存中实现session共享
nginx的常用模块有哪些?
1、ngx_http_core_module #包括一些核心的http参数配置,对应Nginx的配置为HTTP区块部分
2、ngx_http_access_module #访问控制模块,用来控制网站用户对Nginx的访问
3、ngx_http_gzip_module #压缩模块,对Nginx返回的数据压缩,属于性能优化模块
4、ngx_http_fastcgi_module #FastCGI模块,和 动态应用相关的模块,例如PHP
5、ngx_http_proxy_module #Proxy代理模块
6、ngx_http_upstream_module #负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查
7、ngx_http_rewrite_module #URL地址重写模块
8、ngx_http_limit_conn_module #限制用户并发连接数及请求数模块(防止ddos)
9、ngx_http_limit_req_module #根据定义的key限制Nginx请求过程的速率
10、ngx_http_log_module #访问日志模块,以指定的格式记录Nginx客户访问日志等信息
11、ngx_http_auth_basic_module #Web认证模块,设置Web用户通过账号、密码访问Nginx
12、ngx_http_ssl_module #ssl模块,用于加密的http连接,如https
13、ngx_http_stub_status_module #记录Nginx基本访问状态信息等模块
nginx各个版本的区别
Nginx官网提供了三个类型的版本
Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发版
Stable version:最新稳定版,生产环境上建议使用的版本
Legacy versions:遗留的老版本的稳定版
nginx默认配置文件
在 nginx 的配置文件中,大概分为几个区域:events {}、http {}、和没有被 {}包裹的区域。而 http {} 中还有 server {},以及 server {} 中的 location {}。结构如下:
worker_processes 1;
events {
worker_connections 1024;
}
http {
...
server {
...
location {
...
}
}
server {
...
}
}
没有被 {} 包裹的部分为全局配置,如 worker_processes 1; 设置工作进程(子进程)数为 1
events {} 为 nginx 连接配置的模块,如 worker_connections 1024; 设置每一个子进程最大允许连
接 1024 个连接
http {} 为 nginx http 核心配置模块
server {} 为虚拟主机配置模块,包括监听端口、监听域名等
location {} URI 匹配
location的规则
在 Nginx 的配置文件中,通常会用两个常用的区块(Block)来进行设置:
1.Server 区块
2.Localtion 区块
sever 区块主要是真的主机的配置,比如配置主机的域名,IP,端口等内容。当然,在一个 Nginx 的配
置文件里面,我们是可以指定多个 Sever 区块的配置的。
而 Location 区块则是在 Sever 区块里面,细分到针对不同的路径和请求而进行的配置。因为一个站点中
的 URI 通常会非常多,所以在 Location 区块设置这部分,你也是可以写多个 Location 的配置的。
location optional_modifier location_match {
# 这个 {} 里面的配置内容就是一个区块 Block
}
上面的 optional_modifier 配置项是可以使用正则表达式的。常用的几种如下:
留空。在留空的情况下,配置表示请求路径由 location_match 开始。
= ,等于号还是非常容易理解的:就是请求路径正好等于后面的 location_match 的值;跟第一项留空还
是有区别的。
~,飘号(注意是英文输入的飘号)表示大小写敏感的正则匹配。
~*表示大小写不敏感的正则匹配。
^~ 表示这里不希望有正则匹配发生。
nginx 处理localtion区块的顺序
每一个请求进来 Nginx 之后,Nginx 就会选择一个 Location 的最佳匹配项进行响应,处理的具体流程
是逐一跟 location 的配置进行比对,这个步骤可以分为以下几步:
先进行前缀式的匹配(也就是 location 的 optional_modifier 为空的配置)。
Nginx 其次会根据 URI 寻找完全匹配的 location 配置(也就是 location 的 optional_modifier
为 = 的配置).
如果还是没有匹配到,那就先匹配 ^~ 配置,如果找到一个配置的话,则会停止寻找过程,直接返回响应内
容。
如果还是没有找到匹配项的话,则会先进行大小写敏感的正则匹配,然后再是大小不写敏感的正则匹配
举例子:
location = / {
# = 等号配置符,只匹配 / 这个路由
}
location /data {
# 留空配置,会匹配有 /data 开始的路由,后续有匹配会往下匹配。
}
location ^~ /img/ {
# 注意 ^~ 配置,这里匹配到 /img/ 开始的话,直接就返回了。
}
location ~* .(png|gif|ico|jpg|jpeg)$ {
# 匹配以 png, gif, ico, jpg or jpeg 结尾的请求;这个通常用来设置图片的请求响应。
}
配置nginx防盗链
Nginx的防盗链原理是加入location项,用正则表达式过渡图片类型文件,对于信任的网址可以正常使用,
对于不信任的网址则返回相应的错误图片,在源主机(bt.com)的配置文件中加入以下代码:
vi /usr/local/nginx/conf/nginx.conf
location ~*.(jpg|gif|swf)$ {
valid_referers none blocked *.test.com test.com;
if ($invalid_referer) {
rewrite ^/http://www.bt.com/error.png;
}
}
下面分析一下这段代码:
~*.(jpg|gif|swf)$:这段正则表达式表示匹配不区分大小写,以.jpg或.gif或.swf结尾的文件。
valid_referers:设置信任的网站,可以正常使用图片。
none:浏览器中referer为空的情况,这就是直接在浏览器访问图片。
blocked:浏览器中referer不可空的情况,但是值被代理或防火墙删除了,这些值不以http://或
https://开头。
后面的网站或者域名:referer中包含相关字符串的网址。
if语句:如果链接的来源域名不在valid_referers所列出的列表中,$invalid_referer为1,则执行后
面的操作,即进行重写或返回403页面。
把图片error.png放到源主机(bt.com)的工作目录下。
ls /usr/local/nginx/html
50x.html index.html logo.jpg error.png
这是重启服务器,重新访问http://www.test.com/index.html,显示的是被重写的图片。