前端工程师不可不知的Nginx知识
「观感度:🌟🌟🌟🌟🌟」「口味:虎皮鸡蛋」「烹饪时间:10min」历史背景互联网的全球化导致了互联网的数据量快速增长,加上在本世纪初摩尔定律在单核CPU上的失效,CPU朝着多核方向发展,而Apache显然并没有做好多核架构的准备,它的一个进程同一时间只能处理一个连接,处理完一个请求后才能处理下一个,这无疑不能应对如今互联网上海量的用户。况且进程间切换的成本是非常高的。在这种背景下,Nginx应运而生,可以轻松处理数百万、上千万的连接。Nginx优势
高并发高性能可扩展性好高可靠性热部署开源许可证Nginx主要应用场景静态资源服务,通过本地文件系统提供服务反向代理服务、负载均衡API服务、权限控制,减少应用服务器压力Nginx配置文件和目录通过rpm-qlnginx
可以查看Nginx安装的配置文件和目录。如图是我在某某云上安装的最新稳定版本的Nginx的配置文件及目录。/etc/nginx/nginx.conf核心配置文件/etc/nginx/conf.d/default.conf默认http服务器配置文件/etc/nginx/fastcgi_paramsfastcgi配置/etc/nginx/scgi_paramsscgi配置/etc/nginx/uwsgi_paramsuwsgi配置/etc/nginx/koi-utf/etc/nginx/koi-win/etc/nginx/win-utf这三个文件是编码映射文件,因为作者是俄国人/etc/nginx/mime.types设置HTTP协议的Content-Type与扩展名对应关系的文件/usr/lib/systemd/system/nginx-debug.service/usr/lib/systemd/system/nginx.service/etc/sysconfig/nginx/etc/sysconfig/nginx-debug这四个文件是用来配置守护进程管理的/etc/nginx/modules基本共享库和内核模块/usr/share/doc/nginx-1.18.0帮助文档/usr/share/doc/nginx-1.18.0/COPYRIGHT版权声明/usr/share/man/man8/nginx.8.gz手册/var/cache/nginxNginx的缓存目录/var/log/nginxNginx的日志目录/usr/sbin/nginx可执行命令/usr/sbin/nginx-debug调试执行可执行命令正向代理Forwardproxy一句话解释正向代理,正向代理的对象是客户端,服务器端看不到真正的客户端。resolver8.8.8.8#谷歌的域名解析地址server{location/{#当客户端请求我的时候,我会把请求转发给它#$http_host要访问的主机名$request_uri请求路径proxy_passhttp://$http_host$request_uri;}}
反向代理Reverseproxy一句话解释反向代理,反向代理的对象是服务端,客户端看不到真正的服务端。跨域跨域是前端工程师都会面临的场景,跨域的解决方案有很多。不过要知道在生产中,要么使用CORS、要么使用Nginx反向代理来解决跨域。在Nginx的配置文件中进行如下配置即可:server{listen80;server_namelocalhost;#用户访问localhost,反向代理到http://webcanteen.comlocation/{proxy_passhttp://webcanteen.com}}
GzipGzip是互联网上非常普遍的一种数据压缩格式,对于纯文本来说可以压缩到原大小的40%,可以节省大量的带宽。不过需要注意的是,启用Gzip所需的HTTP最低版本是1.1。location~.*\.(jpg|png|gif)${gzipoff;#关闭压缩root/data/www/images;}location~.*\.(html|js|css)${gzipon;#启用压缩gzip_min_length1k;#超过1K的文件才压缩gzip_http_version1.1;#启用gzip压缩所需的HTTP最低版本gzip_comp_level9;#压缩级别,压缩比率越高,文件被压缩的体积越小gzip_typestext/cssapplication/javascript;#进行压缩的文件类型root/data/www/html;}
请求限制对于大流量恶意的访问,会造成带宽的浪费,给服务器增加压力。往往对于同一IP的连接数以及并发数进行限制。关于请求限制主要有两种类型:limit_conn_module连接频率限制limit_req_module请求频率限制#$binary_remote_addr远程IP地址zone区域名称10m内存区域大小limit_conn_zone$binary_remote_addrzone=coon_zone:10m;server{#conn_zone设置对应的共享内存区域1是限制的数量limit_connconn_zone1;}
#$binary_remote_addr远程IP地址zone区域名称10m内存区域大小rate为请求频率1s一次limit_req_zone$binary_remote_addrzone=req_zone:10mrate=1r/s;server{location/{#设置对应的共享内存区域burst最大请求数阈值nodelay不希望超过的请求被延迟limit_reqzone=req_zoneburst=5nodelay;}}
访问控制关于访问控制主要有两种类型:-http_access_module基于IP的访问控制-http_auth_basic_module基于用户的信任登陆以下是基于IP的访问控制:server{location~^/index.html{#匹配index.html页面除了127.0.0.1以外都可以访问deny127.0.0.1;allowall;}}
ab命令ab命令全称为:Apachebench,是Apache自带的压力测试工具,也可以测试Nginx、IIS等其他Web服务器。-n总共的请求数-c并发的请求数ab-n1000-c5000http://127.0.0.1/
防盗链防盗链的原理就是根据请求头中referer得到网页来源,从而实现访问控制。这样可以防止网站资源被非法盗用,从而保证信息安全,减少带宽损耗,减轻服务器压力。location~.*\.(jpg|png|gif)${#匹配防盗链资源的文件类型#通过valid_referers定义合法的地址白名单$invalid_referer不合法的返回403valid_referersnoneblocked127.0.0.1;if($invalid_referer){return403;}}
负载均衡LoadBalance当我们的网站需要解决高并发、海量数据问题时,就需要使用负载均衡来调度服务器。将请求合理的分发到应用服务器集群中的一台台服务器上。Nginx可以为我们提供负载均衡的能力,具体配置如下:#upstream指定后端服务器地址#weight设置权重#server中会将http://webcanteen的请求转发到upstream池中upstreamwebcanteen{server127.0.0.1:66weight=10;server127.0.0.1:77weight=1;server127.0.0.1:88weight=1;}server{location/{proxy_passhttp://webcanteen}}
后端服务器状态后端服务器支持以下的状态配置:down:当前服务器不参与负载均衡backup:当其他节点都无法使用时的备用服务器max_fails:允许请求失败的次数,若到达就会休眠fail_timeout:经过max_fails次失败后,服务器的暂停时间,默认为10smax_conns:限制每个服务器的最大接收连接数upstreamwebcanteen{server127.0.0.1:66down;server127.0.0.1:77backup;server127.0.0.1:88max_fails=3fail_timeout=10s;server127.0.0.1:99max_conns=1000;}
分配方式轮询(默认),每个请求按照时间顺序轮流分配到不同的后端服务器,如果某台后端服务器宕机,Nginx轮询列表会自动将它去除掉。weight(加权轮询),轮询的加强版,weight和访问几率成正比,主要用于后端服务器性能不均的场景。ip_hash,每个请求按照访问IP的hash结果分配,这样每个访问可以固定访问一个后端服务器。url_hash,按照访问URL的hash结果来分配请求,使得每个URL定向到同一个后端服务器上,主要应用于后端服务器为缓存时的场景。自定义hash,基于任意关键字作为hashkey实现hash算法的负载均衡fair,按照后端服务器的响应时间来分配请求,响应时间短则优先分配。❤️爱心三连击1.看到这里了就点个赞支持下吧,你的「赞」是我创作的动力。2.关注公众号前端食堂,「你的前端食堂,记得按时吃饭」!