nginx如何实现高并发?

启动nginx服务器后,输入 ps -ef |grep nginx,会发现nginx有一个master进程 和若干个worker进程,

这些worker进程是平等的,都是被master fork 过来的,在master里面,先建立需要listen 的 socket(listenfd),

然后再fork出多个worker进程.当用户进入nginx服务的时候,每个worker的listenfd 变的可读,并且这些worker

会抢一个叫accept_mutex的东西,accept_mutex 是互斥的,一个worker得到了,其他的worker 就歇菜了.

而抢到这个accept_mutex 的worker就开始 读取请求--解析请求--处理请求--返回数据给 客户端后,这个事件就算彻底结束

nginx 用这个方法是底下的worker进程抢注用户的要求,搭配 异步非阻塞的方式,实现高并发

nginx.conf 的第二行家是work_process 默认为4 也可以更改成 auto 这个值不是越大越好

编写一个 access模块 要求准许 192.168.3.29/24 的机器访问,准许10.1.20.6/16这个网段的所有机器访问,

准许34.26.157.0/24 这个网段访问,除此之外的机器不准许访问

location /{

access 192.168.3.29/24;

access 10.1.20.6/16;

access 34.26.157.0/24;

deny all;

}

nginx负载均衡用法

nginx 不能直接和java 搭配使用,因为nginx不能解析java,nginx一般指向java服务器,

nginx指向tomcat,tomcat 指向java

在http{} 这个括号里面有两个内置大括号 ,一个是 upstream xx{} ,一个是 server {  ...proxy_pass http://xx }

利用proxy_pass 这个属性同 upstream 进行交互,转移到tomcat 里面了

一个最简单的 upstream 写法如下

upstream backend{

 server backend1.example.com;

 server backend2.example.com;

 server.backend3.example.com

}

server{

    location /{

      proxy_pass http://backend

  }

}

1后端服务器

通过upstream 可以设定后端服务器,指定的方式可以是IP 地址与端口,域名,unix套接字(socket)

其中如果域名可以被解析为多个地址,则这些地址都作为backend

upsteam backend{

  server blog.csdn.net/poechant;

  server 145.223.156.89:8090;

  server unix:/tmp/backend3;

}

第一个backend 是用域名指定的.第二个backend是用IP 和端口号指定的.第三个backend 是用unix套接字指定的

2、负载均衡策略

分为轮询(round robin)、用户 IP 哈希(client IP)和指定权重 3 种方式,默认情况下,提供轮询作为负载均衡策略。

upstream backend {
    ip_hash;
    server backend1.example.com;
    server backend2.example.com;
    server.backend3.example.com;
}

这种策略中,用于进行 hash 运算的 key,是 client 的 C 类 IP 地址(C 类 IP 地址就是范围在 192.0.0.0 到 223.255.255.255 之间,前三段号码表示子网,第四段号码为本地主机的 IP 地址类别)。这样的方式保证一个 client 每次请求都将到达同一个 backend。当然,如果所 hash 到的 backend 当前不可用,则请求会被转移到其他 backend。

再介绍一个和 ip_hash 配合使用的关键字:down。当某个一个 server 暂时性的宕机(down)时,你可以使用“down”来标示出来,并且这样被标示的 server 就不会接受请求去处理。具体如下:

upstream backend {
    server blog.csdn.net/poechant down;
    server 145.223.156.89:8090;
    server unix:/tmp/backend3;
}

还可以使用指定权重(weight)的方式,如下:

upstream backend {
    server backend1.example.com;
    server 123.321.123.321:456 weight=4;
}

默认情况下 weight 为 1,对于上面的例子,第一个 server 的权重取默认值 1,第二个是 4,所以相当于第一个 server 接收 20% 的请求,第二接收 80% 的。要注意的是 weight 与 ip_hash 是不能同时使用的,原因很简单,他们是不同且彼此冲突的策略。

3、重试策略

可以为每个 backend 指定最大的重试次数,和重试时间间隔。所使用的关键字是 max_fails 和 fail_timeout。如下所示:

upstream backend {
    server backend1.example.com weight=5;
    server 54.244.56.3:8081 max_fails=3 fail_timeout=30s;
}

在上例中,最大失败次数为 3,也就是最多进行 3 次尝试,且超时时间为 30秒。max_fails 的默认值为 1,fail_timeout 的默认值是 10s。传输失败的情形,由 proxy_next_upstream 或 fastcgi_next_upstream 指定。而且可以使用 proxy_connect_timeout 和 proxy_read_timeout 控制 upstream 响应时间。

有一种情况需要注意,就是 upstream 中只有一个 server 时,max_fails 和 fail_timeout 参数可能不会起作用。导致的问题就是只会尝试一次 upstream 请求,如果失败这个请求就被抛弃了 : ( ……解决的方法,比较取巧,就是在 upstream 中将你这个可怜的唯一 server 多写几次,如下:

upstream backend {
    server backend.example.com max_fails fail_timeout=30s;
    server backend.example.com max_fails fail_timeout=30s;
    server backend.example.com max_fails fail_timeout=30s;
}

4、备机策略

可以使用“backup”关键字。当所有的非备机(non-backup)都宕机(down)或者繁忙(busy)的时候,就只使用由 backup 标注的备机。必须要注意的是,backup 不能和 ip_hash 关键字一起使用。举例如下:

upstream backend {
    server backend1.example.com;
    server backend2.example.com backup;
    server backend3.example.com;
}

nginx常见错误处理方法

404 bad request

一般原因:请求的header过大

解决方法:配置的nginx.conf 相关设置

client_header_buffer_size 16k

large_client_header_buffer 4 64k

413 request Entity Too Large

一般原因:文件上传问题

解决方法: 配置nginx.conf 相关设置

1.client_max_body_size 10m;

配置php.ini 如下 必须和nginx.conf保持一致

post_max_size=10M

upload_max_filesize=2M

499 Client Closed Request

一般原因:客户端在未等到服务器相应返回前就关闭了客户端描述符

一般出现在客户端设置超时后,主动关闭SOCKET 解决方法:根据实际Nginx 后端服务器的处理时间修改客户端超时时间

500 Internal server error

一般原因;脚本错误(php语法错误,lua语法错误)

访问量过大,系统资源限制,不能打开过多的文件

磁盘空间不足 (access_log 开启可能导致磁盘满溢 关闭)

解决方法:语法错误查看 nginx_err_log php_err_log

文件访问量

1.修改nginx 配置文件

1.worker_rlimit_nofile 65535

2 修改/etc/security/limits.conf

1. * soft nofile  65535

2. * hard nofile 65535

502 Bad GATEWAY 503 Service Unavailable

一般原因:后端服务无法处理,业务中断

解决方法:根据后端服务器实际处理情况,调正后请求超时时间

1.proxy_read_timeout 90;

2.proxy_send_timeout 90

一般原因:可能网站页面缓存大,而fastcgi默认进程应缓存区 8k

解决方法:配置nginx.conf 相关设置

1.fastcgi_buffers 8  128k

1.send_timeout 60

http://www.cnblogs.com/liyongsan/p/6795851.html

nginx 知识的更多相关文章

  1. nginx知识总结

    nginx知识总结 一.功能 负载均衡 反向代理 静态资源服务器 二.来源 nginx 俄罗斯第二网站开源项目 tengine 淘宝团队基于nginx开发的 区别:nginx安装之后还得装第三方软件包 ...

  2. 前端开发者必备的Nginx知识

    摘要: 最常用的Web服务器 -- Nginx 原文:前端开发者必备的Nginx知识 作者:ConardLi Fundebug经授权转载,版权归原作者所有. Nginx在应用程序中的作用 解决跨域 请 ...

  3. 「查缺补漏」巩固你的Nginx知识体系

    Nginx篇 基本介绍 Nginx是一款轻量级的 Web服务器 / 反向代理服务器 / 电子邮件(IMAP/POP3)代理服务器,主要的优点是: 支持高并发连接,尤其是静态界面,官方测试Nginx能够 ...

  4. 一:Nginx知识整理

    Nginx与服务器集群 一:集群 1.什么是集群 集 合在一起 放在一起 群 一堆 很多 服务器架构集群:多台服务器组成的响应大并发,高数据量访问的架构体系. 分布式服务器架构: 特点: 1)成本高 ...

  5. nginx知识图谱

    nginx启动起来后有两个进程,一个是主进程,一个是守护进程

  6. nginx知识问答

    1.请解释一下什么是Nginx? 答:Nginx是一个web服务器和反向代理服务器,用于HTTP.HTTPS.SMTP.POP3和IMAP协议.2.请列举Nginx的一些特性? 答:Nginx服务器的 ...

  7. nginx知识学习

    设备: macbook 有用的命令行: sudo nginx -t  测试nginx是否正常 sudo nginx -s reload  平滑重启 配置目录: /usr/local/etc/nginx ...

  8. Web前端必备-Nginx知识汇总

    一.Nginx简介 Nginx是一个高性能.轻量级的Web和反向代理服务器, 其特点是占有内存及资源少.抗并发能力强. Nginx安装简单.配置简洁.启动快速便捷.支持热部署.支持 SSL.拥有高度模 ...

  9. 前端必须知道的 Nginx 知识

    Nginx一直跟我们息息相关,它既可以作为Web 服务器,也可以作为负载均衡服务器,具备高性能.高并发连接等. 1.负载均衡 当一个应用单位时间内访问量激增,服务器的带宽及性能受到影响, 影响大到自身 ...

随机推荐

  1. 1067 Sort with Swap(0, i) (25 分)

    Given any permutation of the numbers {0, 1, 2,..., N−1}, it is easy to sort them in increasing order ...

  2. tomcat服务器和HTTP协议

    tomcat:一个服务器的服务器软件,发布资源要用的 服务器组成: 1.服务器硬件 2.服务器软件 3.项目(一堆资源的集合) 4.资源tomcat本身是一个java程序,必须依赖jre运行eclip ...

  3. form表单和CSS基础

    form 表单 input type="" 表单的组合标签,用来确定需要的是什么输入类型 type属性值: 文本输入框:text 密码输入框:password 单选按钮:radio ...

  4. 6.2_springboot2.x分布式整合Dubbo

    1.分布式应用 ​ 在分布式系统中,国内常用zookeeper+dubbo组合,而Spring Boot推荐使用全栈的Spring,Spring Boot+Spring Cloud. 分布式系统: 特 ...

  5. python调用tushare获取A股上市公司管理层人员信息

    接口:stk_managers 描述:获取上市公司管理层 注:tushare模块下载和安装教程,请查阅我之前的文章 积分:用户需要2000积分才可以调取,具体请参阅本文最下方积分获取办法 输入参数 名 ...

  6. JAVA里面的int类型 和Integer类型,有什么不一样

    JAVA里面的int类型 和Integer类型,有什么不一样 原创 2013年09月04日 23:15:11 标签: java / 2120 编辑 删除 JAVA里面的int类型 和Integer类型 ...

  7. Mysql 查询视图出现The user specified as a definer ('root'@'%') does not exist的问题

    今天服务器Mysql版本在5.7升级到8.0+之后,部分网站(老的)访问视图出现The user specified as a definer ('root'@'%') does not exist问 ...

  8. python的一个简单日志记录库glog的使用

    一. glog的简介 glog所记录的日志信息总是记录到标准的stderr中,即控制台终端. 每一行日志记录总是会添加一个谷歌风格的前缀,即google-style log prefix, 它的形式如 ...

  9. jq-demo-阻止冒泡,阻止默认行为

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. Python with语句的概率,不多说了直接上代码!

    python中的with语句用于访问资源.它确保执行指定的__exit__(“清理”)操作,而不管释放被访问资源的处理过程中的错误或异常,例如读取和写入文件后自动关闭.线程中锁的自动获取和释放等. p ...