nginx简介

  • nginx是来自于俄罗斯的网站服务
  • 功能十分丰富,可以作为
    • http服务器
    • 网络负载均衡
    • 正向代理和反向代理
  • nginx由一系列的模块组成

    • 核心模块
      • HTTP模块、EVENT模块和MAIL模块
    • 基础模块
      • HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块
    • 第三方模块
      • HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块及用 户自己开发的模块

        web请求处理机制

  • 多进程方式:服务器每接到一个客户端的请求就生成一个子进程,影响客户端。

    • 有点,反应速度很快,子进程之间相互独立。安全
  • 多线程方式:服务器,每收到一个客户端请求回派生出一个线程与客户端进行交互
    • 有点:开销小。子线程之间共享内存空间,相对不安全
  • nginx是多进程组织模型,而且是由一个master主进程和worker工作进程组成

    linux IO模式以及select、poll、epoll、详解

    1、概念说明

    用户空间和内核空间

    操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件的权限。
    为了保证用户不可以直接操作内核,保护内核空间。操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间

    进程切换

    为了控制进程的和执行,内核必须由能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程,成为进程切换。任何进程都是在操作系统的支持下运行的,是与内核紧密相关的。
    进程之间切换所经历的步骤
  1. 保存处理机上下文,包括程序计数器和其他寄存器。
  2. 更新PCB信息。
  3. 把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列。
  4. 选择另一个进程执行,并更新其PCB。
  5. 更新内存管理的数据结构。
  6. 恢复处理机上下文。

是十分消耗资源的

文件描述符fd

文件描述符是计算机科学的术语,是一个用于表述指向文件的引用的抽象化的概念
在形式上是一个非负整数,是一个索引值

IO模式

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

  1. 等待数据准备 (Waiting for the data to be ready)
  2. 将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)

五种网络模式方案

  • 阻塞 I/O(blocking IO)
  • 非阻塞 I/O(nonblocking IO)
  • I/O 多路复用( IO multiplexing)
  • 信号驱动 I/O( signal driven IO)
  • 异步 I/O(asynchronous IO)
  1. 阻塞IO
    • 当kernel一直等到数据准备好了,它就会将数据从kernel中拷贝到用户内存,然后kernel返回结果,用户进程才解除block的状态,重新运行起来。所以,blocking IO的特点就是在IO执行的两个阶段都被block了。
  2. 非阻塞IO:
    • 当用户进程发出read操作时,如果kernel中的数据还没有准备好,那么它并不会block用户进程,而是立刻返回一个error。从用户进程角度讲 ,它发起一个read操作后,并不需要等待,而是马上就得到了一个结果。用户进程判断结果是一个error时,它就知道数据还没有准备好,于是它可以再次发送read操作。一旦kernel中的数据准备好了,并且又再次收到了用户进程的system call,那么它马上就将数据拷贝到了用户内存,然后返回。
  3. 多路复用(select,poll,epoll)

    多路复用(select,poll,epoll)

    select,poll,epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。

    三者之间的不同

  4. select

select:int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
当select函数返回后,可以 通过遍历fdset,来找到就绪的描述符。
缺点:中的fd_set有最大长度限制,为1024

  1. poll:不同与select使用三个位图来表示三个fdset的方式,poll使用一个 pollfd的指针实现。同时,pollfd并没有最大数量限制(但是数量过大后性能也是会下降)。 和select函数一样,poll返回后,需要轮询pollfd来获取就绪的描述符。
  2. epoll:epoll更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。

    nginx

  3. nginx安装,需要首先下载对应的依赖包

yum install epel-release.noarch -y `` yum install nginx -y

  1. nginx目录结构

image.png

  1. nginx.conf配置文件 ```bash user www;#worker进程的管理用户 6 workerprocesses auto;#自动调整cpu核数 7 error_log /var/log/nginx/error.log;#错误日志文件目录 8 pid /run/nginx.pid;#定义pid文件 9 10 # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. 11 include /usr/share/nginx/modules/.conf; 12 13 events { 14 worker_connections 1024;定义一个用户可以同时接收1024个请求 15 } 16 17 http { 18 log_format main ‘$remote_addr - $remote_user [$time_local] “$request” ‘ 19 ‘$status $body_bytes_sent “$http_referer” ‘ 20 ‘“$http_user_agent” “$http_x_forwarded_for”‘;#日志格式 21 22 access_log /var/log/nginx/access.log main;#日志文件路径 23 24 sendfile on;# 允许sendfile方式传输文件 25 tcp_nopush on;#有消息传来时不急着发送,而是等着数据包装满数据在进行发送和 26 tcp_nodelay on;#连接保持活动状态 27 keepalive_timeout 65;# 超时时间 28 types_hash_max_size 4096;;# 连接超时时间 29 30 include /etc/nginx/mime.types;# 文件扩展名与文件类型映射表 31 default_type application/octet-stream;#支持的文件类型 32 33 # Load modular configuration files from the /etc/nginx/conf.d directory. 34 # See http://nginx.org/en/docs/ngx_core_module.html#include 35 # for more information. 36 include /etc/nginx/conf.d/.conf; 37 38 server { 39 listen 80;#监听端口 40 listen [::]:80;#监听ipv6端口 41 server_name ; 42 root /usr/share/nginx/html;指定网页根目录 43 44 # Load configuration files for the default server block. 45 include /etc/nginx/default.d/*.conf;#配置文件目录 46 47 error_page 404 /404.html; 48 location = /404.html { 49 }#网页内容匹配 50 51 error_page 500 502 503 504 /50x.html; 52 location = /50x.html { 53 } 54 }
  1. - / 用来匹配index.html文件
  2. - /document 用来匹配/document/index.html
  3. - `~* \.(gif|jpg|jpeg)$` 用来匹配 /images/1.jpg
  4. <a name="fpUQg"></a>
  5. ## 案例一、网站的搭建
  6. 1. 编写配置文件
  7. ```bash
  8. [root@www conf.d]# vim /etc/nginx/conf.d/www.conf
  9. server {
  10. listen *:8080;#监听8080端口
  11. server_name www.eagle.com;#指定域名
  12. location / {
  13. root /usr/share/nginx/html;网站根目录
  14. index ealgeslab.html;#index文件
  15. }
  16. }
  1. systemctl restart nginx重启nginx服务
  2. vim /usr/share/nginx/html/eagelslab.html编写网站内容
  3. systemctl stop firewalld关闭防火墙+setenforce 0关闭selinux
  4. vim /etc/hosts配置本地域名解析

    nginx服务操作的两种方式

  • systemctl restart/reload/stop/enable/disable
  • nignx -t检查nginx配置是否正确

    nginx的相关模块

    ngx_http_access_module

  • 实现ip地址的访问控制,该种方式用于自上而下的匹配,一旦匹配成功则不再向下匹配

    server {
    deny 192.168.1.1;#拒绝IP地址访问
    allow 192.168.1.0/24;允许网络地址访问
    allow 10.1.1.0/16;
    allow 2001:0db8::/32;
    deny all;
    }
    

    ngx_http_auth_basic_module

  • 实现网站访问的用户控制作用 ```bash location / { auth_basic “closed site”; auth_basic_user_file conf/htpasswd;#允许访问的用户以及密码所在的目录 }

 htpasswd -bc /etc/nginx/conf/htpasswd admin 123456  **htpasswd工具是在下载httpd的时候所使用到的,所以在使用的时候要预先下载httpd或者直接下载该工具**
<a name="rpRrr"></a>
###  ngx_http_stub_status_module  

- 用于展示网站的访问状态信息
- 在访问的时候在域名后加`/basic_status`
```bash
location = /basic_status {
stub_status;
}