nginx简介
- nginx是来自于俄罗斯的网站服务
- 功能十分丰富,可以作为
- http服务器
- 网络负载均衡
- 正向代理和反向代理
nginx由一系列的模块组成
多进程方式:服务器每接到一个客户端的请求就生成一个子进程,影响客户端。
- 有点,反应速度很快,子进程之间相互独立。安全
- 多线程方式:服务器,每收到一个客户端请求回派生出一个线程与客户端进行交互
- 有点:开销小。子线程之间共享内存空间,相对不安全
- nginx是多进程组织模型,而且是由一个master主进程和worker工作进程组成
linux IO模式以及select、poll、epoll、详解
1、概念说明
用户空间和内核空间
操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件的权限。
为了保证用户不可以直接操作内核,保护内核空间。操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间进程切换
为了控制进程的和执行,内核必须由能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程,成为进程切换。任何进程都是在操作系统的支持下运行的,是与内核紧密相关的。
进程之间切换所经历的步骤
- 保存处理机上下文,包括程序计数器和其他寄存器。
- 更新PCB信息。
- 把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列。
- 选择另一个进程执行,并更新其PCB。
- 更新内存管理的数据结构。
- 恢复处理机上下文。
文件描述符fd
文件描述符是计算机科学的术语,是一个用于表述指向文件的引用的抽象化的概念
在形式上是一个非负整数,是一个索引值
IO模式
对于一次IO访问(以read举例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。所以说,当一个read操作发生时,它会经历两个阶段:
- 等待数据准备 (Waiting for the data to be ready)
- 将数据从内核拷贝到进程中 (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)
- 阻塞IO
- 当kernel一直等到数据准备好了,它就会将数据从kernel中拷贝到用户内存,然后kernel返回结果,用户进程才解除block的状态,重新运行起来。所以,blocking IO的特点就是在IO执行的两个阶段都被block了。
- 非阻塞IO:
- 当用户进程发出read操作时,如果kernel中的数据还没有准备好,那么它并不会block用户进程,而是立刻返回一个error。从用户进程角度讲 ,它发起一个read操作后,并不需要等待,而是马上就得到了一个结果。用户进程判断结果是一个error时,它就知道数据还没有准备好,于是它可以再次发送read操作。一旦kernel中的数据准备好了,并且又再次收到了用户进程的system call,那么它马上就将数据拷贝到了用户内存,然后返回。
-
多路复用(select,poll,epoll)
select,poll,epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。
三者之间的不同
select
select:int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
当select函数返回后,可以 通过遍历fdset,来找到就绪的描述符。
缺点:中的fd_set有最大长度限制,为1024
- poll:不同与select使用三个位图来表示三个fdset的方式,poll使用一个 pollfd的指针实现。同时,pollfd并没有最大数量限制(但是数量过大后性能也是会下降)。 和select函数一样,poll返回后,需要轮询pollfd来获取就绪的描述符。
epoll:epoll更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。
nginx
nginx安装,需要首先下载对应的依赖包
yum install epel-release.noarch -y `` yum install nginx -y
- nginx目录结构
- 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 }
- / 用来匹配index.html文件
- /document 用来匹配/document/index.html
- `~* \.(gif|jpg|jpeg)$` 用来匹配 /images/1.jpg
<a name="fpUQg"></a>
## 案例一、网站的搭建
1. 编写配置文件
```bash
[root@www conf.d]# vim /etc/nginx/conf.d/www.conf
server {
listen *:8080;#监听8080端口
server_name www.eagle.com;#指定域名
location / {
root /usr/share/nginx/html;网站根目录
index ealgeslab.html;#index文件
}
}
systemctl restart nginx
重启nginx服务vim /usr/share/nginx/html/eagelslab.html
编写网站内容systemctl stop firewalld
关闭防火墙+setenforce 0
关闭selinuxvim /etc/hosts
配置本地域名解析nginx服务操作的两种方式
systemctl restart/reload/stop/enable/disable
-
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;
}