【技术干货分享】一文了解 Nginx 反向代理与 conf 原理
Nginx 主要功能
Webservice, 反向代理, 负载均衡。
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习
逻辑上,nginx 和 server 的关系是这样的:
Nginx 和路由器/交换机有什么区别?
路由器是物理网关,nginx 是应用层网关。
物理上,他们的关系是下图这样的。
Nginx、haproxy、lvs、F5,都可以做负载均衡,有什么区别?
他们处于 tcp/ip 协议不同层。
Nginx 安装
所需要的安装包 nginx、openssl、pcre、zlib
编辑切换为居中
添加图片注释,不超过 140 字(可选)
安装命令
./configure --prefix=/usr/local/nginx --with-http_realip_module --with-http_addition_module --with-http_gzip_static_module --with-http_secure_link_module --with-http_stub_status_module --with-stream --with-pcre=/root/nginx/pcre-8.39 --with-zlib=/root/nginx/zlib-1.2.11 --with-openssl=/root/nginx/openssl-1.1.1g
启动 nginx
cd /usr/local/nginx
./sbin/nginx -c ./conf/nginx.conf
使用默认配置启动 nginx
之后通过浏览器访问 nginx。
conf 文件使用
最基本的使用如下:
配置 worker 进程数
master 进程 listen 端口,网络 io 由 worker 进程处理;对于浏览器发送的请求,会产生两个 tcp 连接,一个是 http 请求,一个是 keep-alive。
现在 C++程序员面临的竞争压力越来越大。那么,作为一名 C++程序员,怎样努力才能快速成长为一名高级的程序员或者架构师,或者说一名优秀的高级工程师或架构师应该有怎样的技术知识体系,这不仅是一个刚刚踏入职场的初级程序员,也是工作三五年之后开始迷茫的老程序员,都必须要面对和想明白的问题。为了帮助大家少走弯路,技术要做到知其然还要知其所以然。以下视频获取点击:C++架构师学习资料
配置服务
nginx 支持 http,smtp,websocket 等多种应用层协议;也可以 listen 不同的端口;
配置代理
重定向
负载均衡
提供静态服务内容
图片
视频
支持 CGI
common gateway interface, 通用网关接口。nginx 通过 stdin、stdout 也 cgi 程序进行通信。
主要用在哪里?在线编译工具。
编写一个 cgi 程序
nginx 使用 cgi,需要安装 fastcgi 和 spawn-fcgi。cgi 是一请求一进程;fastcgi 是一个进程池,通过进行管理器对 cgi 进行管理。spawn-fcgi 是 fastcgi 进行管理器,管理 cgi。
spawn-fcgi 编译
fastcgi 编译安装
通过 spawn-fcgi 启动 cgi 程序。
nginx 配置
什么是惊群?
惊群分为 3 种:
accept
epoll_wait
pthead_cond_wait
accept 惊群和 pthead_cond_wait 的惊群,内核已经解决了。
nginx 是存在 epoll_wait 惊群的,为什么呢?
所有 workder 进程都是从 master 进程 fork 出来的,都对同一个端口进行 listen,如果在所有 worker 进程中使用 epoll 对 listenfd 进行检测,必然会出现 epoll_wait 的惊群。
惊群并不会导致业务问题,只会造成很多无效的唤醒,高性能的服务器是不能接受这一点的。
nginx 是如何解决 epoll_wait 惊群的?
通过加 accept 锁,通过 shmem 共享内存实现进程锁。
为保证只有一个 worker 进程对新连接进行处理,所有 worker 进程在向 epoll 注册 listenfd 读事件前抢 accept_mutex, 抢到互斥锁的那个进程注册 listenfd 读事件,在读事件里面调用 accept 接受该连接。当一个 worker 进程在 accept 这个连接之后,就开始读取请求,解析请求,处理请求,产生 response 后,再返回给客户端,最后才断开连接。一个请求,完全由一个 worker 进程来处理,而且只在一个 worker 进程中处理。
其他没有抢到 accept 锁的 worker 进程,可以处理其他 event。
评论