作为一个后端开发,你需要了解多少Nginx的知识?

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 最近做的一个项目在迁移公网环境的时候出了一个问题,明明服务都起来了,但是怎样都访问不进来。后来才发现是Nginx的配置出了问题。无奈自己关于Nginx的学习在大学毕业后就差不多遗忘了,当时又紧急找不到运维人员,差点就只能以失败结束迁移。因此觉得就算是干后端开发,对于基本的nginx配置依旧需要有所了解,于是写了这篇后端人员应该懂的nginx文章,希望对大家有所帮助。

听说微信搜索《Java鱼仔》会变更强哦!


本文收录于JavaStarter ,里面有我完整的Java系列文章,学习或面试都可以看看哦


(一)概述


最近做的一个项目在迁移公网环境的时候出了一个问题,明明服务都起来了,但是怎样都访问不进来。后来才发现是Nginx的配置出了问题。无奈自己关于Nginx的学习在大学毕业后就差不多遗忘了,当时又紧急找不到运维人员,差点就只能以失败结束迁移。


因此觉得就算是干后端开发,对于基本的nginx配置依旧需要有所了解,于是写了这篇后端人员应该懂的nginx文章,希望对大家有所帮助。


(二)Nginx入门


nginx是一个高性能的WEB服务器,Nginx可以实现正向代理、反向代理、负载均衡等功能。比如我现在正在做的一个项目有11台应用服务器,就是用nginx做的反向代理。


关于正向代理和反向代理,两者在概念上有区别,但是在技术实现上完全没有区别。


正向代理:代理服务器放在客户端和服务都能连接到的位置,我们通过访问代理服务器从而访问到目标服务。


反向代理:通过访问代理服务器,代理服务器将请求分发给其他服务,这就是反向代理。


但是在技术上都只需要配置location中的proxy_pass即可。


2.1 安装


这里的安装都在Linux环境下进行,nginx虽然也有window版本,但是还没有见过哪个项目把nginx放在windows服务器上的。


运行nginx需要一些环境,这里需要先安装完毕:



yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel pcre pcre-devel


接着下载nginx的压缩包,版本视情况而定,这里用的是1.14.2:


wget http://nginx.org/download/nginx-1.14.2.tar.gz


采用默认的方式安装:


./configure
make
make install


分别执行完成之后,nginx运行文件就会安装到/usr/local/nginx中


通过下面的代码检查是否成功:


/usr/local/nginx/sbin/nginx -V


2.2 基本命令


#配置文件启动./sbin/nginx-c/conf/nginx.conf#指定nginx程序目录启动./sbin/nginx-p/usr/local/nginx#停止:第二种更加优雅./sbin/nginx-sstop./sbin/nginx-squit#重载配置文件./sbin/nginx-sreload


2.3 代理的相关参数


proxy_pass#代理服务proxy_redirectoff;#是否允许重定向proxy_set_headerHost$host;#转发时传header参数proxy_set_headerX-Forwarded-For$remote_addr;#设置请求的ip地址proxy_connect_timeout90;#连接代理服务超时时间proxy_send_timeout90;#请求发送最大时间proxy_read_timeout90;#读取最大时间#缓存相关proxy_buffer_size4k;proxy_buffers432k;proxy_busy_buffers_size64k;proxy_temp_file_write_size64k;


2.4 设置代理


location/javayz/{proxy_passhttp://127.0.0.1:8080;}


设置完之后当访问 /javayz时就会代理到本机的8080端口上。


proxy_pass后的url是否加/也有讲究,如果加了/则代表绝对根路径,不带就是相对根路径,比如我访问http://127.0.0.1/javayz/index.html,按照上面的配置会转发到:


http://127.0.0.1:8080/javayz/index.html。如果配置改成这样:



location/javayz/{proxy_passhttp://127.0.0.1:8080/;}


转发后的地址变成:http://127.0.0.1:8080/index.html


(三)nginx负载均衡



nginx用的最多的就是负载均衡,通过upstream就能实现负载均衡。


首先我在服务器上部署了两个很简单的SpringBoot项目,其中一个访问8081端口时返回8081,另一个访问8082端口时返回8082


@RestControllerpublicclassIndexController {
@RequestMapping(value="/",method=RequestMethod.GET)
publicStringindex(){
return"8081";
    }
}


接着配置nginx的负载均衡:


#配置集群,这段代码写在http块中
upstream backend {
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
}
#配置在server块中
location / {
    proxy_pass http://backend/;
}


接着通过curl命令进行访问:


网络异常,图片无法展示
|


8081和8082以轮询的方式运行,如果遇到一台服务器的配置比较好,希望负载的时候更多请求打在那台服务器上,可以给不同的服务增加比重:


upstream backend {
    server 127.0.0.1:8081 weight=2;
    server 127.0.0.1:8082 weight=1;
}


再次执行curl命令:


网络异常,图片无法展示
|


upstream的相关参数如下:


server 服务ip:端口
weight 权重
max_fails  最多失败连接的次数,超过就认为主机挂掉了
fail_timeout  重新连接的时间
backup  备用服务
max_conns  允许的最大连接数
slow_start  节点恢复后,等待多少秒后再加入

(四)Nginx负载均衡算法


Nginx采用的默认负载均衡算法是轮询+权重,也就是按照设置的权重逐个轮询。除此之外,还有许多其他的负载均衡算法。


ip_hash算法:对于访问的ip,他会做一次hash运算,并对当前的负载应用数量做一次取余运算,这种算法能保证同一个ip访问的是同一台应用服务器。


upstream backend {
    ip_hash;
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
}


url_hash算法:对于请求的url进行hash运算,这种算法能保证同一个url访问的是同一台应用服务器。


upstream backend {
    url_hash;
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
}


least_conn算法:将请求分发到连接数最少的节点上。


least_time算法:将请求分配到响应最快的节点上。


(五)Nginx缓存


如果每次请求都需要反向代理给应用服务器,那对带宽和性能的压力是很大的,Nginx中有对缓存的支持,它可以将那些变化不大的前端静态页面加载到缓存中,增强整体的性能。


5.1 在http元素下添加缓存声明


该语句放在http元素下


proxy_cache_path /www/javayz/cache levels=1:2 keys_zone=cache_javayz:500m inactive=20d max_size=1g;
#proxy_cache_path  缓存存放的路径 
#levels  缓存层级及目录的位数,1:2表示两级目录,第一级目录用1位16进制表示,第二级目录用2位16进制表示
#keys_zone 缓存区内存大小
#inactive 有效期,如果缓存有效期内未使用,则删除
#max_size 存储缓存的硬盘大小


5.2 在location中设定缓存策略


该语句放在location元素中


#指定缓存区,就是上面设置的key_zone
proxy_cache cache_javayz;
#缓存的key,这里用请求的全路径md5做为key
proxy_cache_key $host$uri$is_args$args;
#对不通的http状态码设置不同的缓存时间,下面的配置表示200时才进行缓存,缓存时间12小时
proxy_cache_valid 200 12h;

5.3 访问生成缓存


可能会出现缓存生成不了的情况,这时候把user切换成root


网络异常,图片无法展示
|


访问一次后缓存文件就在上面的路径下生成了。


5.4 缓存的清除


下载模块:


wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz


解压


tar -zxvf ngx_cache_purge-2.3.tar.gz


在nginx的安装目录下配置


./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=../ngx_cache_purge-2.3


重新编译:


make


编译好后会在nginx安装目录下多出一个/objs目录,该目录下有个nginx文件,将这个文

件替换到/usr/local/nginx/sbin/中。


检查是否安装成功


网络异常,图片无法展示
|

重新运行后,只需要访问http://ip:80/clear/,即可清除缓存

网络异常,图片无法展示
|


(六)总结


如果你的公司职责区分严格,那么对于后端开发来说知道nginx的这些概念足够理解整个架构的运行流程了。如果你同时身兼开发和运维的工作,那么这些还不够。学习总是需要不断向前,我们下期再见。



相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
9天前
|
存储 缓存 负载均衡
后端开发中的性能优化策略
本文将探讨几种常见的后端性能优化策略,包括代码层面的优化、数据库查询优化、缓存机制的应用以及负载均衡的实现。通过这些方法,开发者可以显著提升系统的响应速度和处理能力,从而提供更好的用户体验。
33 4
|
22天前
|
消息中间件 API 持续交付
后端开发中的微服务架构实践####
【10月更文挑战第21天】 本文深入探讨了微服务架构在后端开发中的应用,从基本概念出发,详细阐述了微服务的核心优势、设计原则及关键技术。通过实际案例分析,揭示了微服务如何助力企业应对复杂业务需求,提升系统的可扩展性、灵活性与可靠性。同时,也指出了实施微服务过程中可能面临的挑战,并提供了相应的解决方案和最佳实践。 ####
27 3
|
15天前
|
存储 前端开发 Java
深入理解后端开发:从基础到高级
本文将带你走进后端开发的神秘世界,从基础概念到高级应用,一步步揭示后端开发的全貌。我们将通过代码示例,让你更好地理解和掌握后端开发的核心技能。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的信息和启示。
|
18天前
|
存储 缓存 监控
后端开发中的缓存机制:深度解析与最佳实践####
本文深入探讨了后端开发中不可或缺的一环——缓存机制,旨在为读者提供一份详尽的指南,涵盖缓存的基本原理、常见类型(如内存缓存、磁盘缓存、分布式缓存等)、主流技术选型(Redis、Memcached、Ehcache等),以及在实际项目中如何根据业务需求设计并实施高效的缓存策略。不同于常规摘要的概述性质,本摘要直接点明文章将围绕“深度解析”与“最佳实践”两大核心展开,既适合初学者构建基础认知框架,也为有经验的开发者提供优化建议与实战技巧。 ####
|
14天前
|
运维 监控 Java
后端开发中的微服务架构实践与挑战####
在数字化转型加速的今天,微服务架构凭借其高度的灵活性、可扩展性和可维护性,成为众多企业后端系统构建的首选方案。本文深入探讨了微服务架构的核心概念、实施步骤、关键技术考量以及面临的主要挑战,旨在为开发者提供一份实用的实践指南。通过案例分析,揭示微服务在实际项目中的应用效果,并针对常见问题提出解决策略,帮助读者更好地理解和应对微服务架构带来的复杂性与机遇。 ####
|
13天前
|
消息中间件 运维 安全
后端开发中的微服务架构实践与挑战####
在数字化转型的浪潮中,微服务架构凭借其高度的灵活性和可扩展性,成为众多企业重构后端系统的首选方案。本文将深入探讨微服务的核心概念、设计原则、关键技术选型及在实际项目实施过程中面临的挑战与解决方案,旨在为开发者提供一套实用的微服务架构落地指南。我们将从理论框架出发,逐步深入至技术细节,最终通过案例分析,揭示如何在复杂业务场景下有效应用微服务,提升系统的整体性能与稳定性。 ####
29 1
|
14天前
|
消息中间件 运维 API
后端开发中的微服务架构实践####
本文深入探讨了微服务架构在后端开发中的应用,从其定义、优势到实际案例分析,全面解析了如何有效实施微服务以提升系统的可维护性、扩展性和灵活性。不同于传统摘要的概述性质,本摘要旨在激发读者对微服务架构深度探索的兴趣,通过提出问题而非直接给出答案的方式,引导读者深入
31 1
|
15天前
|
负载均衡 监控 API
后端开发中的微服务架构实践与挑战
本文深入探讨了微服务架构在后端开发中的应用,分析了其优势和面临的挑战,并通过案例分析提出了相应的解决策略。微服务架构以其高度的可扩展性和灵活性,成为现代软件开发的重要趋势。然而,它同时也带来了服务间通信、数据一致性等问题。通过实际案例的剖析,本文旨在为开发者提供有效的微服务实施指导,以优化系统性能和用户体验。
|
21天前
|
存储 JavaScript 前端开发
深入浅出Node.js后端开发
在数字化时代的浪潮中,后端开发作为连接用户与数据的桥梁,扮演着至关重要的角色。本文将以Node.js为例,深入探讨其背后的哲学思想、核心特性以及在实际项目中的应用,旨在为读者揭示Node.js如何优雅地处理高并发请求,并通过实践案例加深理解。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和思考。
|
18天前
|
Web App开发 开发框架 JavaScript
深入浅出Node.js后端开发
本文将带你领略Node.js的魅力,从基础概念到实践应用,一步步深入理解并掌握Node.js在后端开发中的运用。我们将通过实例学习如何搭建一个基本的Web服务,探讨Node.js的事件驱动和非阻塞I/O模型,以及如何利用其强大的生态系统进行高效的后端开发。无论你是前端开发者还是后端新手,这篇文章都会为你打开一扇通往全栈开发的大门。

热门文章

最新文章