Nginx原理
- 原理机制
- Nginx采用多进程(每个worker进程只对应一个线程)和I/O多路复用机制,实现并发的事件驱动处理;
- 多路复用即通过一种机制监视多个文件描述符,一旦文件描述符就绪(读写就绪),就可通知程序进行相应的读写操作;
- 多路复用机制在处理单个连接没有优势,但在一个进程或线程内可处理多个连接;并减少系统开销,如创建进程或线程,维护进程或线程;
- 一般worker 进程数设置成机器 cpu 核数,否则一个cpu多个worker进程会造成竞争(上下文切换);
- master进程主要用来管理worker进程:接收外部信号(如命令行输入);向worker发送信号;监控worker状态;worker退出后创建新的worder进程;
- Nginx采用epoll多路复用模型,相对于select模型,没有文件描述符数量限制;select/poll采用轮询方式,而epoll采用每个fd的回调函数获取状态变化;而且select/poll(没有文件描述符数量限制,但都采用轮询方式)要获取某个文件描述符状态时,需将文件描述符的集合在用户和内核之间复制整个集合,epoll只需要将用户关心的文件描述符一次性copy到内核;
- I/O流操作概念
- 阻塞:等待数据就绪,数据完成操作后(读/写)再返回进行下一个流操作,在I/O第一阶段和第二阶段都发生阻塞;
- 非阻塞:主动轮询检查数据是否可以操作,直到数据完成操作并返回;在I/O第一阶段没有阻塞,但第二阶段发生阻塞;
- 所以严格意义上,阻塞,非阻塞及多路复用都属于I/O同步;因为I/O操作分为两个阶段:数据就绪阶段,用户进程和内核进程之间的数据复制阶段;
- 异步I/O操作不会导致请求进程阻塞,因为当发出I/O操作请求,直接返回,等待I/O操作完成后,再通知调用进程(回调函数);

- 负载均衡策略
- 默认轮询:以请求到服务(如Tomcat)的时间顺序不同来分配(如宕机自动忽略);
upstream tomcat_server
{
server 192.168.1.100:8080;
server 192.168.1.100:9090;
}
- 最少链接:哪个服务器链接数最少请求到哪个;
upstream tomcat_server
{
least_conn;
server 192.168.1.100:8080;
server 192.168.1.100:9090;
}
- weight权重:weight值越大,请求根据服务器权重分配;
upstream tomcat_server
{
server 192.168.1.100:8080 weight=2;
server 192.168.1.100:9090 weight=1;
}
- ip_hash:根据请求的用户IP计算hash值,根据hash选择对应的服务器,这样可以保证同一用户请求到同一服务器;
upstream tomcat_server
{
ip_hash;
server 192.168.1.100:8080;
server 192.168.1.100:9090;
}
- url_hash:基本与ip_hash一致,但url_hash能够提高后端缓存服务器的效率,如提高squid的效率,但是当后端服务器宕机的时候,url_hash不会自动跳转的其他缓存服务器,而是返回给用户一个503错误;所以session问题还得使用如memcached来实现session共享(或客户端cookie机制?)。
upstream tomcat_server
{
hash $request_url;
server 192.168.1.100:8080;
server 192.168.1.100:9090;
}
- fair:哪个服务器的响应时间短,就选择谁;
upstream tomcat_server
{
server 192.168.1.100:8080;
server 192.168.1.100:9090;
fair;
}
- Nginx实现地址映射,可将某些资源如下载文件不需直接放在服务器下,如配置:
location ~ ^/images/(.*)
{
expires 1s;
alias E:/test/images/$1; #“$1”表是location后面()的内容
index index.html index.htm;
break;
}
- 基本配置(以Linux下为例)
user root; #运行用户
worker_processes 1; #启动进程,通常设置成和cpu的数量相等
#全局错误日志及每个进程PID文件
error_log /usr/local/nginx/logs/error.log;
error_log /usr/local/nginx/logs/error.log notice;
error_log /usr/local/nginx/logs/error.log info;
pid /usr/local/nginx/logs/nginx.pid;
# 工作模式及连接数上线
events
{
use epoll; #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
worker_connections 1024; #单个后台worker process进程的最大并发链接数
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http
{
include mime.types;
default_type application/octet-stream;
#设定请求缓冲
server_names_hash_bucket_size 128;
client_header_buffer_size 32K;
large_client_header_buffers 4 32k;
# client_max_body_size 8m;
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
#必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
tcp_nopush on;
tcp_nodelay on;
#连接超时时间
keepalive_timeout 65;
#开启gzip压缩,降低传输流量
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
#添加tomcat列表,真实应用服务器都放在这
upstream tomcat_pool
{
#server tomcat地址:端口号 weight表示权值,权值越大,被分配的几率越大;
server 192.168.0.223:8080 weight=4 max_fails=2 fail_timeout=30s;
server 192.168.0.224:8080 weight=4 max_fails=2 fail_timeout=30s;
}
server
{
listen 80; #监听端口
server_name localhost;
#默认请求设置
location /
{
proxy_pass http://tomcat_pool; #转向tomcat处理
}
#所有的jsp页面均由tomcat处理
location ~ \.(jsp|jspx|dp)?$
{
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://tomcat_pool; #转向tomcat处理
}
#所有的静态文件直接读取不经过tomcat,nginx自己处理
location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 1h;
}
#定义错误提示页面
error_page 500 502 503 504 /50x.html;
location = /50x.html
{
root html;
}
}
#HTTPS server
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
Nginx原理的更多相关文章
- nginx 原理&知识
2015年6月4日 17:04:20 星期四 发现两个关于nginx原理的系列文章, 非常好 http://blog.sina.com.cn/s/blog_6d579ff40100wi7p.html ...
- apache和nginx原理上的不同之处
今天群里提到面试时问到apache和nginx原理有什么不同,一时还真没想起,想到的只是他们的优缺点,便搜索了下.记录学习下.顺便记录下优缺点吧. 原理不同之处: 为什么Nginx的性能要比Apach ...
- 三、Nginx原理解析
Nginx原理解析 一.反向代理 工作流程 用户通过域名发出访问Web服务器的请求,该域名被DNS服务器解析为反向代理服务器的IP地址: 反向代理服务器接受用户的请求: 反向代理服务器在本地缓存中查找 ...
- Nginx 笔记(四)nginx 原理与优化参数配置 与 nginx 搭建高可用集群
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.nginx 原理与优化参数配置 master-workers 的机制的好处 首先,对于每个 ...
- NGINX原理分析 之 SLAB分配机制
1 引言 众所周知,操作系统使用伙伴系统管理内存,不仅会造成大量的内存碎片,同时处理效率也较低下.SLAB是一种内存管理机制,其拥有较高的处理效率,同时也 有效的避免内存碎片的产生,其核心思想是预分配 ...
- Nginx 原理解析和配置摘要
前言 Nginx 作为高性能的 http 服务器,知名度不必多言,相似产品中无出其右.本篇随笔记录我认为较为重要的原理和配置. 1. 原理解析 1.1 结构 以上是 Nginx 的结构图,其包含一个 ...
- Nginx原理和配置总结
一:前言 Nginx是一款优秀的HTTP服务器和反向代理服务器,除却网上说的效率高之类的优点,个人的切身体会是Nginx配置确实简单而且还好理解,和redis差不多,比rabbitmq好理解太多了: ...
- 12: nginx原理及常用配置
1.1 nginx基本介绍 1.nginx高并发原理( 多进程+epoll实现高并发 ) 1. Nginx 在启动后,会有一个 master 进程和多个相互独立的 worker 进程. 2. 每个子进 ...
- NGINX原理 之 SLAB分配机制(转)
1 引言 众所周知,操作系统使用伙伴系统管理内存,不仅会造成大量的内存碎片,同时处理效率也较低下.SLAB是一种内存管理机制,其拥有较高的处理效率,同时也有效的避免内存碎片的产生,其核心思想是预分配. ...
随机推荐
- js打印html指定元素,解决动态获取的图片无法打印问题
用js来调用浏览器的打印接口很容易,一两行代码就能搞定,但是有些数据是通过动态生成的,例如一些动态生成的二维码,有时候调用打印接口图片会无法显示 为了解决这个问题,建议使用下面这个库 下载:https ...
- Vim里常见的几个不可见字符
Vim里常见的几个不可见字符:^@ = 0x00 Null值^I = 0x09 水平制表^J = 0x0A 换行^M = 0x0D 回车
- centos7 基础命令
一: linux基础 (1) 查看服务器的IP信息 ip add showifconfig (2) 操作网卡命令(重启网络和启用网卡) systemctl restart networksystemc ...
- XML 与 XML Schema的使用教程
引言:我写本文的宗旨在于给需要使用XML,而又对XML不是很熟悉的人们提供一种使用思路,而不没有给出具体的 使用方法,至于下文中提到的使用方法,还未尝试过,都是从网上整理而来! 一.概述 什么 ...
- Git Learning2 GitHub upload
1.在自己的github上创建一个仓库 2.git remote add [name] [link] 使用git来增加一个link的别名 3.git push [linkname] [分支名] 4.g ...
- UI组件--element-ui--Table组件自定义合计行
需求: Element-ui的Table组件自带合计行, 但是需求需要在合计行的某些单元格有特别的样式以及事件, 没有研究出怎么在既有合计行上完成此需求, 于是利用其原本的一些属性完成自定义合计行. ...
- Subversion ----> svnserve.conf / authz / passwd / hooks-env.tmpl <<翻译笔记>>
svnserve.conf 假如你使用这个文件去允许访问这个仓库,那么这个文件控制着svnserve后台进程的配置.(但是如果你只是允许通过http和/或者 file:URLs,则这个文件就不起作用了 ...
- 合并两个 Lambda 表达式
概述 在开发工作中,有些时候需要对一些增删改查进行封装(用 Lambda 表达式来筛选数据),但是又有一部分条件总是相同的,对于相同的部分可以直接写到方法里,而不同的部分作为参数传进去. 定义扩展方法 ...
- windows系统下安装rabbitmq教程
1.简介 安装rabbitmq需要下载软件Erlang语言开发包和RabbitMQ文件包.文件最新下载地址如下: Erlang: https://www.erlang.org/ RabbitMQ: h ...
- 和初学者交流学习java语言一些体会。
对初学者,自己学习java语言的一些体会: 1.工欲善其事,必先利其器.先把Java学习工具准备好,包括集成开发环境IDE,自己觉得MyEclipse比较适合,还有数据库,Oracle或MySQL,S ...