当前位置: 首页 > news >正文

作为一个后端开发,你需要了解多少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 -s stop
./sbin/nginx -s quit

#重载配置文件
./sbin/nginx -s reload

2.3 代理的相关参数

proxy_pass            #代理服务
proxy_redirect off;   #是否允许重定向
proxy_set_header Host $host;   #转发时传header参数
proxy_set_header X-Forwarded-For $remote_addr;  #设置请求的ip地址
proxy_connect_timeout 90;  #连接代理服务超时时间
proxy_send_timeout 90;  #请求发送最大时间
proxy_read_timeout 90;  #读取最大时间
#缓存相关
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;

2.4 设置代理

location /javayz/ {
    proxy_pass http://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_pass http://127.0.0.1:8080/;
}

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

(三)nginx负载均衡

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

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

@RestController
public class IndexController {
    @RequestMapping(value = "/",method = RequestMethod.GET)
    public String index(){
        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的这些概念足够理解整个架构的运行流程了。如果你同时身兼开发和运维的工作,那么这些还不够。学习总是需要不断向前,我们下期再见。

相关文章:

  • CAShapeLayer(持续更新)
  • 一个成熟的Java项目如何优雅地处理异常
  • UITableView分页
  • 分布式集群环境下,如何实现每个服务的登陆认证?
  • 【中亦安图】Oracle内存过度消耗风险提醒(6)
  • 你知道JWT是什么吗?它和Session的区别又在哪里?
  • hadoop家族成员
  • 项目经理最近感觉系统慢了,想知道整个系统每个方法的执行时间
  • 获得指定文件夹所有文件的路径
  • 面试官问我:Zookeeper实现分布式锁的原理是什么?
  • typedef与#define的区别
  • 一步步教你如何在SpringBoot项目中引入支付功能
  • OSChina 周三乱弹 ——你是有多寂寞啊,看光头强都……
  • 今天不聊技术,谈谈我眼中的程序员到底是个怎样的职业
  • 关于JVM调优,我理了一些工具和思路出来
  • JS 中的深拷贝与浅拷贝
  • [LeetCode] Wiggle Sort
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • github指令
  • input的行数自动增减
  • JDK9: 集成 Jshell 和 Maven 项目.
  • laravel with 查询列表限制条数
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • leetcode-27. Remove Element
  • Python_网络编程
  • Python十分钟制作属于你自己的个性logo
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • spring + angular 实现导出excel
  • spring boot 整合mybatis 无法输出sql的问题
  • ubuntu 下nginx安装 并支持https协议
  • Vue小说阅读器(仿追书神器)
  • 笨办法学C 练习34:动态数组
  • 前言-如何学习区块链
  • 如何实现 font-size 的响应式
  • 在Unity中实现一个简单的消息管理器
  • - 转 Ext2.0 form使用实例
  • Linux权限管理(week1_day5)--技术流ken
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​决定德拉瓦州地区版图的关键历史事件
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #ifdef 的技巧用法
  • #include
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .jks文件(JAVA KeyStore)
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布