有两个概念需要明白,同步和异步,阻塞和非阻塞
同步异步
同步和异步得终点在消息通知的方式上,也就是调用结果的通知方式不同。
同步
当一个同步调用发出去后,调用者要一直等待调用的结果通知后,才能进行后续的执行。
异步
当一个异步调用发出去后,调用者不必一直等待调用结果的返回,异步调用,要想获取结果,一般存在两种方式:
1.主动轮询异步调用结果
2.被调用方通过callback(回调通知)来通知调用方调用结果。实例解释
同步取快递:小明收到快递将送达的短信,在楼下一直等待快递宋大
异步取快递:小明收到快递将送达的短信,快递到下楼后,小明再下楼去取。异步取快递时,小明知道快递到楼下有两种方式。
1.不停的电话问快递小哥到没到,即主动轮询。
2.快递小哥到楼下后,打电话通知小明,然后小明下楼取快递,即回调通知。
阻塞与非阻塞
阻塞与非阻塞的终点在于进/线程等待消息时的行为,也就是在等待消息时,当前线/进程是挂起状态,还是非挂起状态。
阻塞
调用在发出后,在消息返回之前,当前线/进程会被挂起,直到有消息返回,当前进/线程才会被激活。
非阻塞
调动在发出去后,不会阻塞当前进程/线程,而会立即返回。
实例解释
阻塞取快递:小明收到快递即将送达的消息后,什么事都不做,一直专门等快递
非阻塞取快递:小明收到快递即将送达的消息后,一边敲代码,一边刷微信等快递。
同步和异步,重点在于消息通知方式。
阻塞与非阻塞,重点在于等消息时候的行为。
所以,有了4种组合方式:同步阻塞:小明收到快递将送达的消息后,啥都不干,一直等快递。
同步非阻塞:小明收到信息后,一边刷微博,一边等着取快递。
异步阻塞:小明收到消息后,啥都不干,就等着快递员通知后再取快递。
异步非阻塞:小明收到消息后,刷着抖音,等着快递员通知他后再去取快递。
大部分程序的I/O模型都是同步阻塞型的,单个进程每次只在一个文件描述符上执行I/O才足以,每次I/O系统调用都会阻塞,直到完成数据传输。传统的服务器就是采用的同步阻塞的多进程模型。一个server采用一个进程负责一个request的方式,一个进程负责一个request,直到会话结束。进程数就是并发数,而操作系统支持的进程数是优先的,且进程数越多,调度开销也就越大,因此无法面对高并发。
nginx就是采用了异步非阻塞方式工作。先了解一下I/O多路复用种的epoll模型。
epoll模型
当连接有I/O事件产生的时候,epoll就会告诉进程哪个连接有I/O事件,然后进程就会去处理这个事件。
例如,小明家楼下有一个收发室,每次有快递到了,门卫就会先代收并做了标记,然后通知小明去取快递。
为什么nginx比其他web服务器并发高(工作原理)
nginx配置use epoll后,以异步非阻塞方式工作,能轻松处理百万级的并发连接。
处理过程:
每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到可能发生阻塞的地方。比如向后端服务器转发request,并等待请求返回。那么,这个处理的worker不会这么傻等着,他会在发送完请求后,注册一个事件:如果后端服务器返回了,告诉这个worker,worker继续解这处理这个请求。遇是worker就去休息了。此时,如果再有新的request进来,他就可以很快再按照这种方式处理。而一旦后端服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。通过这种快速处理,快速释放请求的方式,达到同样的配置可以处理更大并发量的目的。
nginx(engine x)是一个高性能的HTTP和反向代理服务器,同时也提供了IMAP和SMTP服务。nginx是由伊戈尔·赛索耶夫为俄罗斯访问量地儿的Rambler.ru站点开发的,第一个公布版本0.1.0发布于2004.10.4。
nginx是一款轻量级的web服务器/反向代理服务器及电子邮件代理服务器(IMAP/POP3),在BSD-like协议下发行。其特点是占有内存少,并发能力强。
工作模式:
nginx有另种工作模式:master-worker模式和单进程模式。在master-worker模式下,有一个master进程和至少一个的worker进程,单进程模式顾名思义只有一个进程。这两种模式各有各自的特点和适用场景。
master-worker模式(默认模式):
该模式下,nginx启动成功后,会有一个master进程和至少一个worker进程。master进程负责处理系统信号,加载配置,管理worker进程(启动,杀死,监控,发送消息/信号灯功能)。worker进程负责处理具体的业务逻辑,也就是说,对外部来说,真正提供服务的是worker进程。生产环境下一般使用这种模式,因为此模式有以下优点:
1.稳定性高,只要还有worker进程存货,就能提供服务,并且一个worker进程挂掉master进程会立即启动一个新的worker进程,保证worker进程数不变,降低服务中断的概率。
2.配置linux的cpu亲和性配置,可以充分利用多核cpu的优势,提升性能。
3.处理信号/配置 重加载/升级时可以做到尽可能少或者不中断服务(热重启/热部署)单进程模式
该进程模式下,nginx启动后只有一个进程,nginx的所有工作都由这个进程负责。由于只有一个进程,因此可以很方便地里用gdb等工具进行调试。该模式不支持nginx的平滑升级功能,任何信号处理都可能造成服务中断,并且由于时单进程,进程挂掉后,在没有外部监控的情况下,无法重启服务。因此,该模式一般只在开发阶段和调试时使用,生产环境下不会使用。
配置文件结构
user nginx;
#程序运行用户
worker_processes 1;
#worker进程数,一般按照cpu核心数指定。auto自动,可以自己指定
#error_log logs/error.log;
#报错日志路径
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
#pid保存的pid文件。里面是nginx运行起来后master进程的pid
events {
use epoll;
#使用epoll模型,对于2.6以上的内核建议使用,有助于提高性能
worker_connections 1024;
#工作进程最大连接数量,一个工作进程可以处理最大的连接数量,正常应该是启动进程数x51200。
#也就是worker processes x 51200。
}
http { #网站优化参数
include mime.types;
#设置浏览器处理服务器传给浏览器的文件的方式;
default_type application/octet-stream;
#默认为下载,浏览器访问到未定义的扩展名的时候,就默认为下载该文件
#如果将这个设置改成default_type text/html;那就是告诉浏览器默认的打开方式是把所有未设置的扩展名当HTML文件打开。
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#记录日志log文件的格式设置
#access_log logs/access.log main;
#成功日志目录位置和格式
sendfile on;
#设置http接收和发送文件 开启
#tcp_nopush on;
#用来提升网络包的传输'效率,只有设置sendfile开启的时候才生效
#keepalive_timeout 0;
keepalive_timeout 65;
#设置http连接超时时间,65s
#gzip on;
#文件数据压缩
server { #具体某一网站的配置信息
listen 80;
#监听端口
server_name localhost;
#代理服务器名称,localhost就是本机
#charset koi8-r;
#指定编码格式
#access_log logs/host.access.log main;
#日志文件目录及日志文件格式
location / { #正向代理"/"路径和相关配置,/表示路径,用正则表示,这里匹配到访问对象,其下配置就是具体操作的配置
root html;
#当指定/时,指向的目录
index index.php index.html index.htm;
#默认加载页面文件和优先级
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ { #识别php
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server { #这里配置的https
# 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才会生效。
pkill -HUP nginx
a.安装nginx时将stub_status模块开启,也就是–with-http_stub_status_module
b.修改nginx配置文件(写入要访问的server标签中)
location /nginx_status {
stub_status on; #开启stub_status访问统计
access_log off; #状态统计访问不记录到日志中
}
c.客户端网文网址:http://IP:端口/nginx_status
active connection,表示当前活动连接数
server accepts handled requests,表示当前已处理的连接信息
最后三个数字依次表示:已处理链接数;成功的TCP握手次数;已处理的请求数
a.原理和apache的目录保护原理一样
b.在需要保护的location中加入
auth_basic “welcome to myNginx!”;
auth_basic_user_file /usr/local/nginx/html/htpasswd.nginx;
c.使用http命令htpasswd进行用户密码文件的创建
htpasswd -c /usr/local/nginx/html/htpasswd.nginx user
#这种生产文件的话需要httpd服务
d.重启nginx并再次访问页面即可。
a.在需要的location中添加:
allow 192.168.1.130;
仅允许这个IP访问
deny 192.168.1.0;
不允许1网段的访问
a.准备域名,规划好两个网站网页存放目录
www.laoli.com,/usr/local/html/laoli
www.laolicb.com /usr/local/html/laolicb
代理和反向反历
代理:找别人代替你去完成一件你完不成的事,代理的对象是客户端(例如:代购)。
反向代理:替厂家卖东西的人就叫反向代理,代理的对象是服务器端(例如:烟酒代理)。
a.在另外一台服务器上安装apache,启动并填写测试页面
192.168.1.131
为了方便测试直接yum -y install httpd即可,注意rpm安装的页面位置。
c.重启nginx,并使用客户端访问,这时候访问的内容是apache的页面内容即为成功。
负载均衡(Load Balance)其意思就是将任务分摊到多个操作单元进行执行,例如web服务器,FTP服务器、企业关键应用服务器,从而共同完成任务。
重启nginx,使用客户端访问测试
扩展
rr算法实现加权轮询
upstream bbs{
server 192.168.x.x:80 weight=1;
server 192.168.x.x:80 weight=2;
#加权weight,可以理解是访问第一个服务器1次,访问第二台服务器两次,类似比例。
}
a.安装nginx时,需要将ssl模块开启,–with-http_ssl_module
e.重启nginx,直接访问http://www.laoli.com,会自动跳转至https即可。