nginx优势 select,epoll模型

对于一次IO访问(以read举例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。所以说。当一个read操作发生时,它会经历两个阶段:

  1. .等待数据准备(waiting for the data to be ready
  2. .将数据从内核拷贝到进程中,正是因为这两个阶段,Linux系统产生了下面的五种网络模:
  3. - 阻塞IOblocking IO
  4. - 非阻塞IOnonblocking IO
  5. - IO多路复用(IO multplexing
  6. - 信号驱动IOsignal driven IO
  7. - 异步IOasynchronous IO
  8. 注:由于signal driven IO在实际中并不常用,所以只提剩下的四种IO模型

阻塞IO(blocking IO)

在Linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样的:

  当用户进程调用了recvfrom这个系统调用,kernel就开始了IO的第一个阶段:准备数据(对于网络IO来说,很多时候啥数据在一开始还没有到达。比如,还没有收到一个完整的udp包。这个时候kernel就要等待足够的数据到来)。这个过程需要等待,也就是说数据被拷贝到操作系统内核的缓冲区中是需要一个过程的。而在用户进程这边,整个进程都会被阻塞(当然,这个事进程自己选择的阻塞)。当kernel一直等到数据准备好了。他就会将数据从kernel中拷贝到用户内存,然后kernel返回结果。用户进程才接触blocking状态,重新运行起来。

  所以,blocking IO 的特点就是在IO执行的两个阶段都被block了。

非阻塞IO(nonblocking IO)

Linux下,可以通过设置socket使其变为non-blocking。当对一个non-blocing socket执行读操作时,整个流程是这个样子的:

  当用户进程发出read操作时,如果kernel中的数据还没有准备好,那么它并不会block用户进程,而是立刻返回一个error,从用户进程角度讲,它发起一个read操作后,并不需要等待,二十马上就得到了一个结果。用户进程判断结果是一个error时,他就知道啥数据还没有准备好,于是它可以再次发送read操作。一旦kernel中的数据准备好了,并且又再次收到了用户进程的system call,那么它马上就将数据拷贝到了用户内存,然后返回。

  所以,nonblocking IO的特点是用户进程需要不断的主动询问kernel数据准备好了没有。

IO多路复用(IO multiplexing)

IO multiplexing 就是我们说的select,poll,epoll,有些地方也称这总IO方式为事件驱动IO(event driven IO)。select/epoll的好处就在于单个process就可以同时处理多个网络连接的IO。他的基本原理就是select,poll,epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。

  当用户进程调用了select,那么这个进程会被block,而同时,kernel会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回,这个会后用户进程再调用read操作。将数据从kernel拷贝到用户进程。

  所以,IO多路复用的特点是通过一种机制,一个进程能同时等待多个文件描述符,而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态,select()函数就会返回。

  这个图和blocking IO的图其实并没有太大的不同,事实上,还更差一些,因为这里需要使用两个system call (select 和recvform),而blocking IO 只调用了一个system call(recvform),但是,用select的有事在于它可以同时处理多个connection。

  所以,如果处理的链接数不是很高的话,使用select/epoll 的web server 不一定比使用multi-threading + blocking IO 的web server性能更好,可能延迟还更大。

  select/epoll 的优势并不是对于单个连接能处理的更快,而是在于能处理更多的链接

在IO multiplexing model中,实际中,对于每一个socket,一般都设置成为nonblocking,但是,如上图所示,这个用户的process其实是一直被block的,只不过process是被select这个函数block,而不是被socket IO给block。

异步IO(asynchronous IO)

Linux下的asynchronous IO其实用得很少,先看一下它的流程:

用户进程发起read操作之后,立刻就可以开始做其它的事。而另一方面,从kernel的角度,当它收到一个asynchronous之后,首先它会立刻返回,所以不会对用户进程产生任何的block。然后,kernel会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel会给用户进程发送一个signal,告诉它read操作完成了。

--------------------------------------------------------------------------------------------------------------------------------

nginx安装

  1. 可以采用源码安装或者yum安装,具体方式请百度
  2. nginx需要依赖gcc等依赖,建议先安装依赖

刚刚遇到一个问题,centos7安装nginx竟然报错了。。

  1. [root@localhost ~]# yum install nginx -y
  2. 已加载插件:fastestmirror, langpacks
  3. Loading mirror speeds from cached hostfile
  4. * base: mirrors.tuna.tsinghua.edu.cn
  5. * extras: mirrors.cn99.com
  6. * updates: mirrors..com
  7. 没有可用软件包 nginx
  8. 错误:无须任何处理
  9. [root@localhost ~]#

这个问题比较容易解决,可以采用epel的方式安装nginx

  1. [root@localhost ~]# yum install epel-rpm-macros
  2. [root@localhost ~]# yum update
  3. [root@localhost ~]# yum install nginx
  4. [root@localhost ~]#

安装就到这里了,遇到问题自行百度就好。

  1. [root@localhost ~]# systemctl stop nginx # 停止服务
  2. [root@localhost ~]# systemctl start nginx # 启动服务
  3. [root@localhost ~]# systemctl status nginx # 查看状态
  4. [root@localhost ~]# systemctl restart nginx # 重新加载
  5. [root@localhost ~]#
  1. [root@localhost ~]# systemctl status nginx
  2. nginx.service - The nginx HTTP and reverse proxy server
  3. Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
  4. Active: inactive (dead)
  5.  
  6. 9 :: localhost.localdomain systemd[]: Unit nginx.service cannot be reloaded because it is...ve.
  7. Hint: Some lines were ellipsized, use -l to show in full.
  8. [root@localhost ~]# systemctl stop nginx
  9. [root@localhost ~]# systemctl start nginx
  10. [root@localhost ~]# systemctl status nginx
  11. nginx.service - The nginx HTTP and reverse proxy server
  12. Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
  13. Active: active (running) since -- :: CST; 2s ago
  14. Process: ExecStart=/usr/sbin/nginx (code=exited, status=/SUCCESS)
  15. Process: ExecStartPre=/usr/sbin/nginx -t (code=exited, status=/SUCCESS)
  16. Process: ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=/SUCCESS)
  17. Main PID: (nginx)
  18. Tasks:
  19. CGroup: /system.slice/nginx.service
  20. ├─ nginx: master process /usr/sbin/nginx
  21. ├─ nginx: worker process
  22. └─ nginx: worker process
  23.  
  24. 9 :: localhost.localdomain systemd[]: Starting The nginx HTTP and reverse proxy server...
  25. 9 :: localhost.localdomain nginx[]: nginx: the configuration file /etc/nginx/nginx.co... ok
  26. 9 :: localhost.localdomain nginx[]: nginx: configuration file /etc/nginx/nginx.conf t...ful
  27. 9 :: localhost.localdomain systemd[]: Started The nginx HTTP and reverse proxy server.
  28. Hint: Some lines were ellipsized, use -l to show in full.
  29. [root@localhost ~]#

nginx默认使用80端口,已经启动了,可以从浏览器中进行访问了。

nginx核心模块

https://nginx.org/en/docs/    可以进这个里面找你需要的看,

nginx HTTP模块

https://nginx.org/en/docs/http/ngx_http_core_module.html#server

Nginx虚拟主机

Nginx反向代理

反向代理 VS 正向代理

什么是正向代理?什么是反向代理?

正向代理:

  1. 假设在客户机与目标主机之间,只用户代理内部网络对Internet的链接请求,客户机必须指定代理服务器,并将原来要直接发送到web服务器上的HTTP请求发送到代理服务器中。
  2.   .提高访问速度
  3.   .防火墙作用
  4.   .通过代理服务器访问不能方案文的目标站点

反向代理:

  1. 服务器架设在服务器端,通过缓冲经常被请求的页面来环节服务器的工作量,将客户机请求转发给内部网络上的目标服务器;并将从服务器上得到的结果返回给Internet请求链接的客户端,此时代理服务器与目标主机一起对外表现为一个服务器。
  2.   .可以防止外网对内网服务器的恶性攻击
  3.   .缓存以减少服务器的压力
  4.   .访问安全控制之外
  5.   .可以进行负载均衡,将用户的请求分配给多个服务器
  1. # proxy the PHP scripts to Apache listening on 127.0..1c80
  2. #
  3. #location ~ \.php$ {
  4. # proxy_pass http://127.0.0.1;
  5. #}
  6. location ~ \.html$ {
  7.   proxy_pass http://192.168.251.102c8080;
  8. }
  1. # proxy the PHP scripts to Apache listening on 127.0..1c80
  2. #
  3. #location ~ \.php$ {
  4. # proxy_pass http://127.0.0.1;
  5. #}
  6. location ~ \.html$ {
  7.   proxy_pass http://webserver;
  8. }
  9. upstream webserver {
  10.   server 192.168..102:8080;
  11. }
  1. # proxy the PHP scripts to Apache listening on 127.0..1c80
  2. #
  3. #location ~ \.php$ {
  4. # proxy_pass http://127.0.0.1;
  5. #}
  6. location ~ \.html$ {
  7.   proxy_pass http://webserver;
  8.   proxy_cache my-cache;
  9. }
  10. upstream webserver {
  11. s  erver 192.168..102c8080;
  12. }
  1. server {
  2. listen ;
  3. server_name xxx.xt.com;
  4. access_log /var/log/nginx/git.chjrt.access.log;
  5. error_log /var/log/nginx/git.chjrt.error.log;
  6. location / {
  7. proxy_set_header Host $host;
  8. proxy_set_header X-Real-IP $remote_addr;
  9. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  10. proxy_pass http://172.20.206.41:8089;
  11. }
  12. }

https://nginx.org/en/

中文文档

更多等用到了补充。目前就用了这么点。。

服务管理-Nginx的更多相关文章

  1. Centos6.5 设置Tomcat8 service服务实现自启动和服务管理

    Centos6.5 设置Tomcat8 service服务实现自启动和服务管理 将tomcat设置成像apache,nginx一样. 用serviec xxxx start/stop/restart ...

  2. [Linux]服务管理:rpm包, 源码包

    --------------------------------------------------------------------------------------------------- ...

  3. 如何使用service命令来管理nginx

    如何使用service命令来管理nginx??? 如: service nginx start service nginx restart service nginx stop service ngi ...

  4. 如何写SysV服务管理脚本

    本文目录: 1.1 SysV脚本的特性1.2 SysV脚本要具备的能力1.3 start函数分析1.4 stop函数分析1.5 reload函数分析1.6 status.restart.force-r ...

  5. CentOS7服务管理

    1.在/usr/lib/systemd/system目录下建立服务启动文件,文件格式:[root@Centos7 ]# cat /usr/lib/systemd/system/nginx.servic ...

  6. 集群容器管理之swarm ---服务管理

    服务管理 # 创建服务docker service create --replicas 1 --name hello busybox # docker service update --args &q ...

  7. Web服务器之Nginx详解(操作部分)

    大纲 一.前言 二.Nginx 安装与配置 三.Nginx 配置文件详解 四.Nginx 命令参数 五.配置Nginx提供Web服务 六.配置Nginx的虚拟主机 七.配置Nginx的用户认证 八.配 ...

  8. Ansible 使用 Playbook 管理 Nginx 配置文件

    前面我们已经安装完 Nginx,但是在日常维护中经常需要修改配置文件,并重新加载配置文件,因此来写一个管理 Nginx 配置文件的 Playbook: [root@localhost ~]$ mkdi ...

  9. shell服务管理->

    nginx.php等服务管理练习脚本 ->nginx的启动状态 root@jumpserver- day02]# cat nginx_web.sh #!/bin/bash source /etc ...

随机推荐

  1. 项目记事【Hibernate-1】:调用 saveOrUpdate() 方法出错

    Hibernate 版本:3.3.1 背景: 后端编辑一个对象,该对象(ProductDO)下,有一个另一个自定义对象(ProductLiabilityDO)的 OneToMany 关系,如下: @O ...

  2. 【bzoj3505】[Cqoi2014]数三角形 容斥原理

    题目描述 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. 输入 输入一行,包含两个空格分隔的正整数m和n. 输出 输出一个 ...

  3. BZOJ3990 [SDOI2015]排序 【搜索】

    题目 小A有一个1-2^N的排列A[1..2^N],他希望将A数组从小到大排序,小A可以执行的操作有N种,每种操作最多可以执行一次,对于所有的i(1<=i<=N),第i中操作为将序列从左到 ...

  4. 【HNOI2011/bzoj2337】XOR和路径

    第二道高斯消元练习题 题意 一张无向图,从点 $1$ 出发每次随机选一条出边走,走到 $n$ 停止,求经过的所有边权异或和的期望. $n\le 100$ 题解 注意一点,异或和的期望 $≠$ 期望的异 ...

  5. Django自定义User模型和登录验证

    用户表已存在(与其他App共用),不能再使用Django内置的User模型和默认的登录认证.但是还想使用Django的认证框架(真的很方便啊). 两个步骤: 1)自定义Use模型,为了区分系统的Use ...

  6. 如何从sql server导出到csv文件

    如何从sql server导出到csv文件,具体代码如下: private static void WriteHeader(SqlDataReader reader, TextWriter outpu ...

  7. Larevel5.1 打印SQL语句

    Larevel5.1 打印SQL语句 为了方便调试,开发时需要打印sql. 方法一(全局打开): SQL打印默认是关闭的, 需要在/vendor/illuminate/database/Connect ...

  8. Yii CActiveForm 客户端验证(enableClientValidation)和自定义验证

    使用Yii的CActiveForm默认使用服务器端模型(model)的rules规则验证数据. 但这会导致无谓的请求提交,比较好的方式是为了用户体验在客户端也验证,而为了安全性,在服务器端和数据库也做 ...

  9. AC日记——让我们异或吧 洛谷 P2420

    题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中…xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B是否是男生)=A和B是否能 ...

  10. CSS-滤镜 -webkit-filter

    css滤镜属性,可以在元素呈现之前,为元素的渲染提供一些效果,如模糊.颜色转移之类的.滤镜常用于调整图像.背景.边框的渲染. 语法: webkit-filter: none | blur(px) | ...