一、Java性能优化--Nginx篇(一)

Nginx 的介绍及使用 Nginx 做服务的水平扩展

一、Nginx 是什么?

  • Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布;
  • Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
  • Nginx 是高性能的 HTTP 和反向代理的web服务器,处理高并发能力是十分强大的,能经受高负载的考验;
  • Nginx支持热部署,启动简单,可以做到7*24不间断运行,几个月都不需要重新启动。

二、Nginx 能干什么?

作为一个互联网开发程序员,我们日常开发中主要将 Nginx 作为以下三块来使用:

1. 使用 Nginx 作为静态 Web 服务器

  • Nginx 设计之初就是让其可以作为一个Web静态资源服务器,来做静态资源的访问;因此在Nginx服务器部署完成之后,可以直接在其根路径 html 下 放入 HTML、CSS、JavaScript等静态资源文件,直接以静态Web服务器的方式暴露出去,给用户提供静态页面的访问。

2. 使用 Nginx 作为动静分离服务器

  • 静态资源访问:在部署完 Nginx 服务和对应的静态资源后,可以将静态请求依旧路由在本地的html目录文件中,直接以静态资源的方式返回给前端;

  • 动态资源访问:Nginx可以依托于反向代理的方式,将动态请求反向代理请求到后台服务器,来完成动态资源的获取,并且可以通过 Ajax 请求方式,返回一些固定的JSON 参数,给来完成动静分离的服务器使用。

3. 使用 Nginx 作为反向代理服务器

  • 在应用开发中 Nginx 使用反向代理来将前端获取动态资源的请求转发到后端服务器

三、Nginx 的实际应用

1. 应用场景介绍

前面说过Nginx 是什么,能干什么,现在让我们实际看看 Nginx 的使用,如下图:

在上图中,可以看到 Nginx 作为了一台 Web 服务器,从客户端(Android、IOS、H5)发送 Ajax 请求来获取服务器资源,此时请求链路主要分为以下两种:

  • 请求静态资源:客户端发起 Ajax 请求,在 Nginx 配置文件中可以配置,请求路径为 /resources 的请求默认是请求静态资源,Nginx 直接访问 html 目录下,存放本地磁盘/NAS 磁盘中 HTML 资源返回给客户端;
  • 请求动态资源:除了/resources 路径的 Ajax 请求,默认都是动态请求,Nginx 直接通过反向代理,将请求路由到后台服务器中。

上述两个请求链路就是 Nginx 反向代理以及动静分离的全过程,下面让我们来看下 Nginx 的具体配置,在这里可以直接安装 Nginx ,也可以选择安装 OpenResty,由于后期还有其他关于 Nginx 优化(有兴趣可以后续关注下),这里选择安装 OpenResty,话不多说,直接干!

2. Nginx服务部署

(1)通过在CentOS 系统中添加 openresty 仓库,便于未来安装或更新我们的软件包(通过 yum update 命令)

复制代码
sudo yum install yum-utils
arduino 复制代码
sudo yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo

(2)安装openresty,后续选项一路 y,不要怂

复制代码
sudo yum install openresty

(3)安装命令行工具 resty

复制代码
sudo yum install openresty-resty
ini 复制代码
sudo yum --disablerepo="*" --enablerepo="openresty" list available

至此安装成功,默认安装在 /usr/local/openresty

在 nginx 目录里我们可以看到有 conf 和 html 两个目录,这是我们此次的重点,conf 里面存放了 nginx.conf 里面可以配置 Nginx 动静分离以及反向代理的配置,html 用来存放前端 HTML 等静态资源文件。

3. Nginx 动静分离及反向代理配置

在上面步骤中我们部署了 Nginx,当我们进入到conf目录中可以看到 nginx.conf 配置文件,下面我们对nginx.conf 进行修改;

nginx.conf 复制代码
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;
    
    # 配置nginx反向代理真实服务器地址
    upstream backend_server{
        server xxx.xxx.xxx.xxx:8090 weight=1;
    }

    server {
        listen       80;
        server_name  localhost;

        # 配置请求/resources路径的请求都访问静态资源
        location /resources/ {
            alias  /usr/local/openresty/nginx/html/resources/;
            index  index.html index.htm;
        }

        # 其他请求正常反向代理,不使用缓存
        location / {
            proxy_pass http://backend_server;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
Nginx 配置文件中重要参数解析
  • worker_processes 1:定义 Nginx 运行的工作进程数,Nginx 启动时只会有1个master进程,master下面可以建立多个 worker 工作进程,worker 是实际处理客户端请求的地方,该参数设置通常建议根据 CPU 核心数设置,比如设置为核心数或核心数的两倍以充分利用硬件资源,这里设置为默认值 1;

  • worker_connections 1024:表示每个工作进程最大支持的并发连接数为 1024。总并发连接数 = worker_processes × worker_connections,后续 Nginx 调优,可以根据具体情况调整这个值。

  • keepalive_timeout 65:设置客户端的 keep-alive 连接超时时间为 65 秒。开启 keep-alive 可以减少 TCP 连接的建立和关闭开销;

  • listen 80:Nginx 默认的端口是80;

  • server_name localhost:指定虚拟主机的域名,这里是 localhost。可以通过域名匹配请求。

静态资源路由配置
  1. 在 /usr/local/openresty/nginx/html 路径下新建 resources 目录 并将html 目录下的文件全部迁移到 /resources 下,然后将应用需要的前端页面资源比如 HTML、CSS、JavaScript等全部放入该目录下,如图:
  1. 添加配置,让请求路径为 [http://localhost(server_name](https://link.juejin.cn?target=http%3A%2F%2Flocalhost(server_name "http://localhost(server_name") 中指定的路径)/resources 路径的请求都直接访问静态资源

效果如下:

反向代理配置

配置完,静态资源代理后,我们接着配置 Nginx 的反向代理

  1. 首先,在配置文件中,使用 upstream + 服务别名 指定反向代理的真实服务器地址,添加以下配置
反向代理,需要代理的服务器配置 复制代码
upstream backend_server{
    server xxx.xxx.xxx.xxx:8090 weight=1;
    server xxx.xxx.xxx.xxx:8090 weight=1;
}

在这个配置中,我主要有两台服务器集群,需要被 Nginx 代理,其中8090是后台服务的端口号,weight = 1,是Nginx 负载均衡策略,都相等则代表,为轮询,如下图

  1. 开启 Nginx 反向代理配置

参数说明:

  • proxy\_pass http\://backend\_server :将请求反向代理到名为 backend_server 的上游服务器组(通常在 upstream 块中定义);

  • proxy\_set\_header Host \$host:将客户端请求中的 Host 头(例如 example.com)传递给后端服务器,确保后端能正确识别请求的域名;

  • proxy\_set\_header X-Real-IP $remote_addr:将客户端的真实 IP 地址($remote_addr)添加到 X-Real-IP 请求头中,传递给后端服务器,便于后端记录客户端的真实来源;

  • proxy\_set\_header X-Forwarded-For \$proxy\_add\_x\_forwarded\_for:当请求经过 Nginx 反向代理时,后端服务器默认只能看到 Nginx 的 IP 地址。通过设置 X-Forwarded-For 请求头,Nginx 会将客户端的原始 IP 地址附加到该头字段中,使得后端服务能够获取客户端的真实 IP。

至此,我们的反向代理就已经配置好了,下面让我们使用命令启动 Nginx 服务

启动Nginx 复制代码
sbin/nginx -c conf/nginx.conf

如果在Nginx运行期间,Nginx配置还有改动可以通过以下命令,刷新配置

刷新Nginx配置 复制代码
sbin/nginx -s reload

至此,我们可以看下使用 Nginx 所在服务器的 域名或 ip + 80 + URI 路径,可以看到能正常调用后台接口,如图:

结尾寄语:本篇文章中,介绍了 Nginx 的基础信息,以及怎么使用 Nginx 实现动静分离、反向代理以及服务的水平扩展等,个人水平有限,如有不足之处,诚心接受各位大神指正与批评,谢谢🌹🌹🌹!

相关推荐
uhakadotcom3 分钟前
阿里云Tea OpenAPI:简化Java与阿里云服务交互
后端·面试·github
申雪菱25 分钟前
Scheme语言的数据挖掘
开发语言·后端·golang
程序员一诺29 分钟前
【Flask开发】嘿马文学web完整flask项目第1篇:简介【附代码文档】
后端·python·flask·框架
Bruce_Liuxiaowei36 分钟前
基于Flask的MBA考生成绩查询系统设计与实现
后端·python·flask
欧宸雅41 分钟前
HTML语言的空值合并
开发语言·后端·golang
方瑾瑜1 小时前
Visual Basic语言的物联网
开发语言·后端·golang
赖皮猫1 小时前
PIKIE-RAG 本地部署实践
后端·python·flask
Asthenia04122 小时前
面试回顾:Java RMI 问题解析(续)
后端
无名之逆2 小时前
[特殊字符] Hyperlane 框架:高性能、灵活、易用的 Rust 微服务解决方案
运维·服务器·开发语言·数据库·后端·微服务·rust
Asthenia04122 小时前
面试回顾:Java RMI 问题解析
后端