Nginx中文文档 - https://www.nginx.cn/doc/html
Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。node
Nginx 解决了服务器的C10K(就是在一秒以内链接客户端的数目为10k即1万)问题。它的设计不像传统的服务器那样使用线程处理请求,而是一个更加高级的机制—事件驱动机制
,是一种异步事件驱动结构。它能够轻松在百万并发链接下实现高吞吐量的Web服务,同时诸多应用场景下的问题均可以经过种种Nginx模块得以解决,而咱们所需的工做量也并不大linux
高并发请求的同时保持高效的服务nginx
热部署程序员
低内存消耗/很高的可靠性docker
处理响应请求很快shell
非阻塞、高并发链接-IO多路复用epoll(IO复用)ubuntu
轻量级后端
CPU亲和跨域
Nginx接收用户请求是异步的,即先将用户请求所有接收下来,再一次性发送到后端Web服务器,极大减轻后端Web服务器的压力。
支持内置服务器检测。Nginx可以根据应用服务器处理页面返回的状态码、超时信息等检测服务器是否出现故障,并及时返回错误的请求从新提交到其它节点上
采用Master/worker多进程工做模式
Nginx的功能包括基本HTTP功能和扩展功能。和Apache服务器同样,Nginx服务器为了提供更多的功能而且可以有效地扩展这些功能。每个模块都提供了一个功能,经过编译这些功能模块来实现功能的扩展
a)提供静态文件和index文件,处理静态文件,索引文件以及自动索引,打开文件描述符缓存;
b)使用缓存加速反向代理,反向代理加速(无缓存),简单的负载均衡和容错;
c)使用缓存机制加速远程FastCGI,简单的负载均衡和容错;
d)模块化的结构。过滤器包括gzipping,byte ranges,chunked responses,以及 SSI-filter。在SSI过滤器中,到同一个 proxy 或者 FastCGI 的多个子请求并发处理;
e)支持SSL 和 TLS SNI 支持;
f)IMAP/POP3代理服务功能;
g)使用外部 HTTP 认证服务器重定向用户到 IMAP/POP3 后端;
h)使用外部 HTTP 认证服务器认证用户后链接重定向到内部的 SMTP 后端;
下载地址:http://nginx.org/en/download.html
docker run --name nginx -p 8080:80 -d nginx
sudo apt-get install software-properties-common sudo add-apt-repository ppa:nginx/stable sudo apt-get update sudo apt-get install nginx
安装完成后,检查Nginx服务的状态sudo systemctl status nginx
和 版本nginx -V
启动时候若显示端口80被占用: Starting nginx: [emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use),
修改文件:/etc/nginx/sites-available/default,把 listen 后面的 80 端口号改成本身的端口,访问是须要添加端口号。
安装完后如出现403错误,那多是nginx配置文件里的网站路径不正确
sudo apt-get remove nginx nginx-common # 卸载删除除了配置文件之外的全部文件。 sudo apt-get purge nginx nginx-common # 卸载全部东东,包括删除配置文件。 sudo apt-get autoremove # 在上面命令结束后执行,主要是卸载删除Nginx的再也不被使用的依赖包。 sudo apt-get remove nginx-full nginx-common #卸载删除两个主要的包。
- sudo nginx #打开 nginx - nginx -s reload|reopen|stop|quit #从新加载配置|重启|中止|退出 nginx - nginx -t #测试配置是否有语法错误 nginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives] -?,-h : 打开帮助信息 -v : 显示版本信息并退出 -V : 显示版本和配置选项信息,而后退出 -t : 检测配置文件是否有语法错误,而后退出 -q : 在检测配置文件期间屏蔽非错误信息 -s signal : 给一个 nginx 主进程发送信号:stop(中止), quit(退出), reopen(重启), reload(从新加载配置文件) -p prefix : 设置前缀路径(默认是:/usr/local/Cellar/nginx/1.2.6/) -c filename : 设置配置文件(默认是:/usr/local/etc/nginx/nginx.conf) -g directives : 设置配置文件外的全局指令
验证配置是否正确: nginx -t
配置文件修改重装载命令:nginx -s reload
中止nginx: sudo systemctl stop nginx
启动nginx: sudo systemctl start nginx
默认,nginx是随着系统启动的时候自动运行,sudo systemctl disable nginx
能够禁止nginx开机启动.
从新配置nginx开机自动启动: sudo systemctl enable nginx
重启nginx: sudo systemctl restart nginx
平滑加载配置(不会断开用户访问):sudo systemctl reload nginx
网站文件位置
服务器配置
日志文件
所谓热部署,就是配置文件nginx.conf修改后,不须要stop Nginx,不须要中断请求,就能让配置文件生效!(nginx -s reload 从新加载/nginx -t检查配置/nginx -s stop)
经过上文咱们已经知道worker进程负责处理具体的请求,那么若是想达到热部署的效果,能够想象:
方案一: 修改配置文件nginx.conf后,主进程master负责推送给woker进程更新配置信息,woker进程收到信息后,更新进程内部的线程信息。(有点valatile的味道)
方案二: 修改配置文件nginx.conf后,从新生成新的worker进程,固然会以新的配置进行处理请求,并且新的请求必须都交给新的worker进程,至于老的worker进程,等把那些之前的请求处理完毕后,kill掉便可。
Nginx采用的就是方案二来达到热部署的!
启动Nginx后,其实就是在80端口启动了Socket服务进行监听,如图所示,Nginx涉及Master进程和Worker进程
Master进程的做用是?
Worker进程的做用是?
首先,Nginx在启动时,会解析配置文件,获得须要监听的端口与IP地址,而后在Nginx的master进程里面,先初始化好这个监控的socket(建立socket,设置addrreuse等选项,绑定到指定的IP地址端口,再listen),而后再fork(一个现有进程能够调用fork函数建立一个新进程。由fork建立的新进程被称为子进程 )出多个子进程出来,而后子进程会竞争accept新的链接。
此时,客户端就能够向Nginx发起链接了。当客户端与Nginx进行三次握手,与Nginx创建好一个链接后,某一个子进程会accept成功,获得这个创建好的链接的socket,而后建立Nginx对链接的封装,即ngx_connection_t结构体。
接着,设置读写事件处理函数并添加读写事件来与客户端进行数据的交换。最后,Nginx或客户端来主动关掉链接
上文已经说起Nginx的worker进程个数与CPU绑定、worker进程内部包含一个线程高效回环处理请求,这的确有助于效率,但这是不够的。
做为专业的程序员,咱们能够开一下脑洞:BIO/NIO/AIO、异步/同步、阻塞/非阻塞...
要同时处理那么多的请求,要知道,有的请求须要发生IO,可能须要很长时间,若是等着它,就会拖慢worker的处理速度。
Nginx采用了Linux的epoll模型,epoll模型基于事件驱动机制,它能够监控多个事件是否准备完毕,若是OK,那么放入epoll队列中,这个过程是异步的。worker只须要从epoll队列循环处理便可。
Nginx既然做为入口网关,很重要,若是出现单点问题,显然是不可接受的。
答案是:Keepalived+Nginx实现高可用。
Keepalived是一个高可用解决方案,主要是用来防止服务器单点发生故障,能够经过和Nginx配合来实现Web服务的高可用。(其实,Keepalived不只仅能够和Nginx配合,还能够和不少其余服务配合)
Keepalived+Nginx实现高可用的思路:
第一:请求不要直接打到Nginx上,应该先经过Keepalived(这就是所谓虚拟IP,VIP)
第二:Keepalived应该能监控Nginx的生命状态(提供一个用户自定义的脚本,按期检查Nginx进程状态,进行权重变化,,从而实现Nginx故障切换)