nginx 工作原理和配置文件讲解 (2)

前面有提到,worker进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接。怎么做到的呢? 
首先,每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程。所有worker进程的listenfd会在新连接到来时变得可读。为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。 
当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了

nginx进程模型的好处

首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。 
其次,采用独立的进程,可以让worker互相之间不会影响,一个worker退出后,其它worker还在工作,服务不会中断,master进程则很快启动新的worker进程。 
当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。 
好处是很多的,只能在使用中慢慢体会了。

nginx处理高并发(网络事件)

nginx如何处理高并发呢?按理说nginx采用多worker的方式来处理请求,每个worker里面只有一个主线程,那能够处理的并发数很有限啊,多少个worker就能处理多少个并发,何来高并发呢? 
其实这就是nginx的高明之处,nginx采用了异步非阻塞的方式来处理请求,也就是说,nginx是可以同时处理成千上万个请求的。 
为什么nginx可以采用异步非阻塞的方式来处理呢,或者异步非阻塞到底是怎么回事呢?一个完整过程:请求过来,要建立连接,然后再接收数据,接收数据后,再发送数据,具体到系统底层,就是读写事件,而当读写事件没有准备好时,必然不可操作,如果不用非阻塞的方式来调用,那就得阻塞调用了,事件没有准备好,那就只能等了,等事件准备好了,你再继续吧。阻塞调用会进入内核等待,cpu就会让出去给别人用了,对单线程的worker来说,显然不合适,当网络事件越多时,大家都在等待呢,cpu空闲下来没人用,cpu利用率自然上不去了,更别谈高并发了。

4、配置文件介绍 [root@kg02 nginx]# grep -Ev "^$|#" nginx.conf.default worker_processes 1; #work 进程的数量 events { #事件区块开始 worker_connections 1024; #每个worker 进程支持的最大连接数 } http { #http 区块开始 include mime.types; #nginx 支持的媒体类型库文件 default_type application/octet-stream; #默认的媒体类型 sendfile on; #开启高速传输模式 keepalive_timeout 65; #连接超时 server { #第一个server 区 listen 80; #提供服务的端口,默认是80 端口 server_name localhost; #提供服务的域名主机名 location / { root html; #站点的根目录 index index.html index.htm; #默认的首页文件,多个用空格分开 } error_page 500 502 503 504 /50x.html; #出现对应的http 状态码,使用50x.html 回应客户 location = /50x.html { #访问50x.html root html; #指定对应的站点目录为html } } } 5、配置虚拟主机 5.1 基于多域名配置虚拟主机 [root@nginx01 html]# cat /etc/nginx/nginx.conf user root; error_log /var/log/nginx/error.log; worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name aaa.gd.com; location / { root /root/aaa; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } server { listen 80; server_name bbb.gd.com; location / { root /root/bbb; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } [root@nginx01 html]# /etc/init.d/nginx restart [root@nginx01 html]# cat /root/aaa/index.html aaa [root@nginx01 html]# cat /root/bbb/index.html Bbb #访问 [root@nginx02 ~]# curl aaa.gd.com aaa [root@nginx02 ~]# curl bbb.gd.com bbb 5.2 基于多端口配置虚拟主机 [root@nginx01 html]# cat /etc/nginx/nginx.conf user root; error_log /var/log/nginx/error.log; worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name aaa.gd.com; location / { root /root/aaa; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } server { listen 81; server_name bbb.gd.com; location / { root /root/bbb; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } [root@nginx02 ~]# curl aaa.gd.com aaa [root@nginx02 ~]# curl bbb.gd.com:81 Bbb 6.nginx 状态信息功能实战 [root@nginx01 html]# cat /etc/nginx/nginx.conf http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name aaa.gd.com; location / { root /root/aaa; stub_status on; #开启状态信息 index index.html index.htm; } [root@nginx02 ~]# curl aaa.gd.com Active connections: 1 server accepts handled requests 6 6 6 Reading: 0 Writing: 1 Waiting: 0 # Active connections: 1 (正处理的活动连接数有1个) Server 表示nginx 启动到现在共处理了6个连接 Accepts 成功创建了多少次握手 Handled requests 表示总共处理了多少次请求 #这些信息不能给用户看到,可以通过其他测试工具获取 7、配置错误日志 [root@nginx01 html]# cat /etc/nginx/nginx.conf user root; error_log /var/log/nginx/error.log; [root@nginx01 ~]# head -n5 /var/log/nginx/error.log 2018/08/26 23:43:45 [error] 2540#0: *1 "/root/aaa/index.html" is forbidden (13: Permission denied),
client: 192.168.1.232, server: aaa.gd.com, request: "GET / HTTP/1.1", host: "aaa.gd.com" # 日志级别warn/error/crit 默认使用error 8、access.log访问日志分析 [root@nginx01 ~]# cat /var/log/nginx/access.log |head -n2 192.168.1.232 - - [26/Aug/2018:23:43:45 +0800] "GET / HTTP/1.1" 403 169 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu)
libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
" #192.168.1.232 客户端的ip 403 表示状态码 169 响应的大小 #可以在日志中加入buffer和flush 参数,提高访问性能 9、访问日志轮询切割 [root@nginx01 ~]# cat log.sh #!/bin/bash DATE=`date +%F` BASEDIR="/var/log/nginx/" LOGNAME="access" cd $BASEDIR /bin/mv ${LOGNAME}.log ${LOGNAME}_${DATE}.log /etc/init.d/nginx -s reload [root@nginx01 ~]# crontab -l 0 0 * * * /bin/sh /root/log.sh >/dev/null 2>&1

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppfxd.html